Sebelumnya saya sudah pernah menulis Update Dynamic DNS menggunakan cron pada Linux .
Pada tulisan tersebut saya menggunakan perintah telnet untuk mengambil informasi IP public pada ZTE F660.
Ternyata service telnet tsb 'kurang' reliable, karena seringkali tidak merespon perintah telnet.
Timbul pemikiran mengapa tidak mengambil informasi melalui service web (http) saja ?
Tantangannya adalah : Bagaimana cara mengambil data tsb menggunakan bash script ?
ZTE F660 yang saya miliki menggunakan Mini web server 1.0 ZTE corp 2005.
Ada yang menarik pada fasilitas web ini : Saat ada login yang aktif, maka kita dapat langsung mengambil data dengan memasukan URL tanpa perlu otentikasi meskipun dengan browser yang berbeda. Hal ini dapat dilakukan karena sistem otentikasi ZTE memanfaatkan Token.
Setlah googling sana-sini saya mendapatkan titik terang bahwa script yang saya buat harus melakukan 3 hal :
1. Mengambil nilai Token.
2. Melakukan login menggunakan User, Password dan Token yang valid
3. Mengabil data IP saat login session diatas masih valid.
Biasanya, Telkom memasang perangkat ONT tsb dengan IP standar : 192.168.1.1.
Sehingga buat yang sudah tidak sabar, berikut ini script bash-nya:
WJ_USR=admin
WJ_PWD=password
WJ_OUT=/tmp/wjgetip.out
# Ambil Nilai Token dan memasukkan dalam variable
WJ_TKN=`lynx -dump -source -connect_timeout=10 'http://192.168.1.1/' | grep 'getObj("Frm_Logintoken"'|cut -d'"' -f4`
sleep 1
# Melakukan login dengan menggunakan User,Password dan Token yang valid
echo "frashnum=&Frm_Logintoken=$WJ_TKN&Username=$WJ_USR&Password=$WJ_PWD" | lynx -post_data -connect_timeout=10 -dump http://192.168.1.1 > $WJ_OUT
sleep 1
# Mengabil data IP saat login session diatas masih valid.
lynx -connect_timeout=10 -dump "http://192.168.1.1/getpage.gch?pid=1002&nextpage=PON_status_wan_if_t.gch" >> $WJ_OUT
# Memasukkan IP yang diperoleh pada variable dan menampilkannya
WJ_IPCURR=`grep "IP Address " $WJ_OUT | awk '{print $3}'`
echo "Current IP : $WJ_IPCURR"
Ada hal yang perlu diperhatikan bila password anda menggunakan karakter spesial.
Maka variable WJ_PWD (password) harus dikonversi menggunakan ASCII Code terlebih dahulu.
Misalnya, bila password anda adalah (tanpa tanda kutip) "!23#" maka variable WJ_PWD="%2123%23"
Pada tulisan mendatang, saya akan menggabungkan scipt ini dengan script yang sebelumnya sudah saya ulas (wjdynDNS.sh).
Selamat mencoba.
Showing posts with label dynDNS. Show all posts
Showing posts with label dynDNS. Show all posts
Monday, November 21, 2016
Sunday, September 11, 2016
Update Dynamic DNS menggunakan cron pada Linux
Berikut ini script yang saya gunakan untuk mengupdate Dynamic DNS menggunakan cron pada OS Linux.
Silahkan di-co-pas dan disesuaikan dengan keperluan anda, tempatkan pada : /u/wjdynDNS/wjdynDNS.sh
Selamat mencoba
#!/bin/bash
#
# Declare host variable as the input variable
unset WJ_IPCURR WJ_IPLAST
export WJ_FILETMP=/tmp/wjtelnet.tmp
export WJ_LASTLOG=/u/wjdynDNS/log/wjtelnet.log.`date +%m` ; [ ! -f $WJ_LASTLOG ] && touch $WJ_LASTLOG
WJ_LOG()
{
#Menggunakan print agar keluarannya dapat diatur posisinya
printf "%-15s %s %-25s %s\n" $WJ_IPCURR "`date '+%a %Y-%m-%d %H:%M:%S'`" $1 >> $WJ_LASTLOG
}
export WJ_TARGET=192.168.1.1
export WJ_USER=root
export WJ_PASS=Zte521
export WJ_INTR=ppp0
# Start the expect script
(expect -c "
set timeout 10
# Start the session with the input variable and the rest of the hostname
spawn telnet $WJ_TARGET
expect \"*ogin:\"
send \"$WJ_USER\r\"
expect \"*assword:\"
send \"$WJ_PASS\r\"
expect \"*#\"
send \"ifconfig $WJ_INTR | grep addr\r\"
expect \"*#\"
send \"exit\r\"
#
# stop the expect script once the telnet session is closed
exit
") | grep 'inet addr' > $WJ_FILETMP
WJ_IPCURR="`sed -e 's/:/ /g' $WJ_FILETMP | awk '{print $3}'`"
WJ_LASTLOGx=$WJ_LASTLOG ; [ ! -s $WJ_LASTLOGx ] && WJ_LASTLOGx=${WJ_LASTLOG%.*}.`date +%m -d 'yesterday' `
WJ_IPLAST="`tail -1 $WJ_LASTLOGx | awk '{print $1}'`"
if [[ $WJ_IPCURR =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]
then
if [ "$WJ_IPCURR" = "$WJ_IPLAST" ]
then
WJ_LOG "_skipped_"
else
#Silahkan masukkan script/Dynamic DNS anda disini.
#Contoh untuk www.noip.com
#/u/noip/noip2 -c /u/noip/noip2.conf
WJ_LOG "_executed_"
fi
else
WJ_LOG "-get_IP_failed-"
fi
Dan ini crontab-nya :
# Minute Hour Day of Month Month Day of Week Command
# (0-59) (0-23) (1-31) (1-12 or Jan-Dec) (0-6 or Sun-Sat) (full path)
#-------+------+------------+-----------------+----------------+------------------------------------------------------------+
0-59/15 * * * * /u/wjdynDNS/wjdynDNS.sh
Silahkan di-co-pas dan disesuaikan dengan keperluan anda, tempatkan pada : /u/wjdynDNS/wjdynDNS.sh
Selamat mencoba
#!/bin/bash
#
# Declare host variable as the input variable
unset WJ_IPCURR WJ_IPLAST
export WJ_FILETMP=/tmp/wjtelnet.tmp
export WJ_LASTLOG=/u/wjdynDNS/log/wjtelnet.log.`date +%m` ; [ ! -f $WJ_LASTLOG ] && touch $WJ_LASTLOG
WJ_LOG()
{
#Menggunakan print agar keluarannya dapat diatur posisinya
printf "%-15s %s %-25s %s\n" $WJ_IPCURR "`date '+%a %Y-%m-%d %H:%M:%S'`" $1 >> $WJ_LASTLOG
}
export WJ_TARGET=192.168.1.1
export WJ_USER=root
export WJ_PASS=Zte521
export WJ_INTR=ppp0
# Start the expect script
(expect -c "
set timeout 10
# Start the session with the input variable and the rest of the hostname
spawn telnet $WJ_TARGET
expect \"*ogin:\"
send \"$WJ_USER\r\"
expect \"*assword:\"
send \"$WJ_PASS\r\"
expect \"*#\"
send \"ifconfig $WJ_INTR | grep addr\r\"
expect \"*#\"
send \"exit\r\"
#
# stop the expect script once the telnet session is closed
exit
") | grep 'inet addr' > $WJ_FILETMP
WJ_IPCURR="`sed -e 's/:/ /g' $WJ_FILETMP | awk '{print $3}'`"
WJ_LASTLOGx=$WJ_LASTLOG ; [ ! -s $WJ_LASTLOGx ] && WJ_LASTLOGx=${WJ_LASTLOG%.*}.`date +%m -d 'yesterday' `
WJ_IPLAST="`tail -1 $WJ_LASTLOGx | awk '{print $1}'`"
if [[ $WJ_IPCURR =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]
then
if [ "$WJ_IPCURR" = "$WJ_IPLAST" ]
then
WJ_LOG "_skipped_"
else
#Silahkan masukkan script/Dynamic DNS anda disini.
#Contoh untuk www.noip.com
#/u/noip/noip2 -c /u/noip/noip2.conf
WJ_LOG "_executed_"
fi
else
WJ_LOG "-get_IP_failed-"
fi
Dan ini crontab-nya :
# Minute Hour Day of Month Month Day of Week Command
# (0-59) (0-23) (1-31) (1-12 or Jan-Dec) (0-6 or Sun-Sat) (full path)
#-------+------+------------+-----------------+----------------+------------------------------------------------------------+
0-59/15 * * * * /u/wjdynDNS/wjdynDNS.sh
Subscribe to:
Posts (Atom)