Срипты CHANGE-IP на новых версиях ПО 6.x

Обсуждение ПО и его настройки
Ответить
Sergey-K
Сообщения: 15
Зарегистрирован: 10 июл 2012, 07:21

Доброго дня!

На новых версиях ПО 6.x mipsbe не могу отладить скрипт CHANGE-IP
скрипт-1

Код: Выделить всё

# Параметры подключения к NO-IP.com
:local ddnsuser "xxxlog"
:local ddnspass "xxxxpass"
:local ddnshostname "xxxxxxxxx.redirectme.net"
:local ddnsinterface "pptp-out2"

# Описание глобальных переменных
:global ddnslastip
:local str
:local ddnsip
:local ip

:if ([ :typeof $ddnslastip ] = nil ) do={ :global ddnslastip "0" }

:local ddnsip [ /ip address get [/ip address find interface=$ddnsinterface ] address ]

:if ([ :typeof $ddnsip ] = nil ) do={
   :log info ("ServiceDNS: No ip address on $ddnsinterface .")
} else={

# Из полученного на интерфейсе IP адреса исключаем маску
   :for i from=( [:len $ddnsip] - 1) to=0 do={
      :if ( [:pick $ddnsip $i] = "/") do={
       :set ddnsip [:pick $ddnsip 0 $i];
      }
   }

  :if ($ddnsip != $ddnslastip) do={

    :log info ("ServiceDNS: $ddnshostname -> $ddnsip")

# Отправляем новый IP адрес на сервис No-IP с помощью HTTP запроса
    :local str "/nic/update?hostname=$ddnshostname&myip=$ddnsip"
    /tool fetch url="http://dynupdate.no-ip.com/$str" mode=http user=$ddnsuser password=$ddnspass \ dst-path=("/ServiceDNS.".$ddnshostname)
    :delay 1

# Сохраняем результаты в лог файлах
    :local str [/file find name="ServiceDNS.$ddnshostname"];
    :log info [/file get $str contents];
    /file remove $str
    :global ddnslastip $ddnsip

  }

}


Пробывал альтернативный скрипт

Код: Выделить всё

#############Script Settings##################

:local NOIPUser "xxxlog"
:local NOIPPass "xxxpass"
:local WANInter "pptp-out2"
:local NOIPDomain "xxxxxx.redirectme.net"

###############################################

:local IpCurrent [/ip address get [find interface=$WANInter] address];
:for i from=( [:len $IpCurrent] - 1) to=0 do={
  :if ( [:pick $IpCurrent $i] = "/") do={
    :local NewIP [:pick $IpCurrent 0 $i];
    :if ([:resolve $NOIPDomain] != $NewIP) do={
      /tool fetch mode=http user=$NOIPUser password=$NOIPPass url="http://dynupdate.no-ip.com/nic/update\3Fhostname=$NOIPDomain&myip=$NewIP" keep-result=no
      :log info "NO-IP Update: $NOIPDomain - $NewIP"
     }
   }
}


Оба скрипта не обновляют ip в dns сервиса no-ip.org .
В терминале команда

Код: Выделить всё

[admin@MikroTik] > system script environment print
 # NAME               VALUE                                                   
[admin@MikroTik] >


Делал вот по этой статье http://www.technotrade.com.ua/Articles/mikrotik_and_no-ip_setup_2012-05-28.php

Может у кого были подобные проблемы?
Более на раннем ПО работал успешно скрипт вот такой

Код: Выделить всё

# Имя сервиса DYNDNS или NOIP
:local SRVNAME "NOIP"
# Определяем данные учетной записи на сервисе
# Имя пользователя
:local USER "USER"
# Пароль пользователя
:local PASS "PASSS"
# Доменное имя
:local HOSTNAME "name.no-ip.org"
# Имя внешнего интерфеса (WAN)
:local INTERFACE "ether1"

# Последний IP адрес привязанный к доменному имени на сервисе
# (определяем глобальный параметр)
:global LASTIP
# Текущий IP адрес на внешнем интерфейсе
:local IP

# Определяем имя файла результата HTTP запроса обновления IP адреса
:local LOG
# Определяем HTTP запрос
:local REQ

# Начало процедуры синхронизации адреса
:log info ("#================| Начало процедуры обновления адреса |================#")

# Если IP адрес еще ни разу не определялся (т.е. это первый запуск скрипта), то задаем адрес равный 0
:if ( [ :typeof $LASTIP ] = nil ) do={ :set LASTIP 0 }
# Выводим последний адрес, привязанный к доменному имени
:log info ("Последний адрес, привязанный к доменному имени: $LASTIP")
# Определяем текущий IP адрес
:set IP [ /ip address get [ find interface=$INTERFACE ] address ]
# Если IP адрес не удается определить, то
:if ( [ :typeof $IP ] = nil ) do={
# Выводим соответствующее сообщение в лог
   :log error ("Невозможно опеределить адрес для $INTERFACE!!!")
# В противном случае
} else={
# Исключаем маску подсети из текущего адреса
   :set IP [ :pick $IP 0 ( [ :len $IP ] - 3 ) ]
# Если адрес изменился, то
   :if ( $IP != $LASTIP ) do={
# Выводим соответствующее сообщение в лог
      :log warning ("Для домена $HOSTNAME измениля адрес с $LASTIP на $IP!!!")
# Если сервис DynDNS.org, то запрос имеет вид
      :if ( $SRVNAME = "DYNDNS") do={ :set REQ "http://members.dyndns.org /nic/update?hostname=$HOSTNAME&myip=$IP&wildcard=NOCHG&mx=NOCHG&backmx=NOCHG"
# В противном случае запрос имеет вид
      } else={
         :set REQ "http://dynupdate.no-ip.com/nic/update?hostname=$HOSTNAME&myip=$IP"
      }

# Обновляем информацию на сервисе с помощью HTTP запроса
      /tool fetch url=$REQ mode=http user=$USER password=$PASS dst-path=("/DDNS-" . $HOSTNAME)
# Делаем задрежку на 1 секунду для загрузки файла результата обновления IP адреса
      :delay 1

# Определяем файл результата запроса по имени
      :set LOG [ /file find name="DDNS-$HOSTNAME" ]
# Выводим содержимое файла в лог
      :log info "Результат выполнения запроса:"
      :log warning [ /file get $LOG contents ]
# Удаляем файла результата запроса
      /file remove $LOG
# Обновляем последний связанный адрес
      :set LASTIP $IP
   }
}

# Завершение процедуры синхронизации адреса
:log info ("#==============| Завершение процедуры обновления адреса |==============#")


Но он увы перестал работать.
Скрипт-1 как бы обновляет ip похоже во время перезагрузки роутера.
Может какие мысли будут у кого на этот счет.
Спасибо!


Sergey-K
Сообщения: 15
Зарегистрирован: 10 июл 2012, 07:21

Пожалуй отвечу сам себе...
Скрипт из форума http://forum.mikrotik.com/viewtopic.php?f=9&t=65013

Автор aldoir

Код: Выделить всё

#************************************************************************************************
# Parameters
#************************************************************************************************
:local username "<your username>"
:local password "<your password>"
:local hostname "<subdomain.yourprovider.net>"

#availabe options: "http" or "iface"
# - http: will query an external server and discover you public ip (userful for NATted connections)
# - iface: will use the ip address assigned to the $iface interface (see below)

:local discoverBy "iface"

# interface used to get ip address from (only if discoverBy = iface)

:local iface "public-dsl"

# current available services: "dyndns", "noip" and "changeip"
:local service "changeip"

# number of days to force an update if your IP did not change (helps keeping your account active)
:local forceUpdate 15

#************************************************************************************************
# do not change below this unless you know what you are doing
#************************************************************************************************

:local force
:global lastUpdate
:local currentIP

:if ($discoverBy="http") do={
   /tool fetch mode=http address="checkip.dyndns.org" src-path="/" dst-path="/dyndns.checkip.html"
   :local result [/file get dyndns.checkip.html contents]
   :local resultLen [:len $result]
   :local startLoc [:find $result ": " -1]
   :set startLoc ($startLoc + 2)
   :local endLoc [:find $result "</body>" -1]
   :set currentIP [:pick $result $startLoc $endLoc]
} else={
   :set currentIP [ /ip address get [find interface=$iface disabled=no] address ]
   :for i from=( [:len $currentIP] - 1) to=0 do={
      :if ( [:pick $currentIP $i] = "/") do={ :set currentIP [:pick $currentIP 0 $i] }
   }
}

#get IP from DynDNS for our hostname
:local resolvedIP [:resolve $hostname]

# get current date in format mm/DD/YYYY
:local date [ /system clock get date ]

# convert to YYYYMMDD
:local months ("jan","feb","mar","apr","may","jun","jul","aug","sep","oct","nov","dec");
:local month [ :pick $date 0 3 ]; :local day [ :pick $date 4 6 ]; :local year [ :pick $date 7 11 ];
:local mm ([ :find $months $month -1 ] + 1);
:if ($mm < 10) do={ :set month ("0" . $mm); } else={ :set month $mm; }
:set date ($year . $month . $day);

:if ([ :typeof $lastUpdate ]=[:nothing] || (($date-$lastUpdate) >= $forceUpdate  && $forceUpdate > 0)) do={
   :set force true
}

:put ("Current IP: $currentIP ($discoverBy), Last update: $lastUpdate")

# Determine if dyndns update is needed
:if (($currentIP != $resolvedIP) || ($force = true)) do={
   
    :if ($service = "dyndns") do={
       /tool fetch user=$username password=$password mode=http address="members.dyndns.org" \
            src-path="/nic/update?hostname=$hostname&myip=$currentIP" dst-path="/output.txt"
    }
    :if ($service = "noip") do={
       /tool fetch user=$username password=$password mode=http address="dynupdate.no-ip.com" \
            src-path="/nic/update?hostname=$hostname&myip=$currentIP" dst-path="/output.txt"
    }
    :if ($service = "changeip") do={
       /tool fetch user=$username password=$password mode=http address="nic.changeip.com" \
            src-path="/nic/update?hostname=$hostname&myip=$currentIP" dst-path="/output.txt"
    }
   
    :local result [/file get output.txt contents]
    :log info ("dynamic-dns-updater: Service = $service, Hostname = $hostname")
    :log info ("dynamic-dns-updater: CurrentIP = $currentIP, Resolved IP = $resolvedIP")
    :log info ("dynamic-dns-updater: Update result: ".$result)
    /ip dns cache flush
    :set lastUpdate $date
}




Пока полет нормальный!


Ответить