itoutline.me

 

Unblock.us automatyczna aktualizacja

Wchodzenie na stronę unblock.us i aktualizowanie bieżącego adresu IP zaczęło mnie naprawdę męczyć. Na szczęście można tego uniknąć dosyć prosto. Wystarczy prosty skrypt na routerze (czy dowolnym serwerze linuxowym jaki mamy w domu, chyba każdy ma coś na poziomie minimum rpi w dzisiejszych czasach ;), który będzie sprawdzał co jakiś czas adres zewnętrzny i aktualizował go w unblock.us.

update_unblock.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#!/usr/bin/env bash
# --==itoutline.me==--

SCRIPT_NAME="$(basename $0)"
IP_ADDR=/tmp/active_ip_addr
IP_STATUS=/tmp/ip_update_status

CURRENT_IP=$(dig +short myip.opendns.com @resolver1.opendns.com)

function update_ip {
    curl -s -o $IP_STATUS "https://api.unblock-us.com/login?adres_email:hasło"
    logger "[$SCRIPT_NAME]: IP updated: $CURRENT_IP; Response: $(cat $IP_STATUS)"
    echo $CURRENT_IP > $IP_ADDR
}

if [[ "$CURRENT_IP" =~ ^[0-9]{2,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]] ; then
    if [ ! -f $IP_ADDR ] ; then
        update_ip
    else
        OLD_IP=$(cat $IP_ADDR)
        if [[ "$CURRENT_IP" != "$OLD_IP" ]] ; then
            update_ip
        fi
    fi
else
    logger "[$SCRIPT_NAME]: Network error or incorrect answer from the IP provider"
fi

W miejscach adres_email i hasło trzeba podać swoje dane oraz dorzucić skrypt do crona.

*/2 * * * * /root/update_unblock.sh  2>&1 |logger

Skrypt będzie się wykonywał co dwie minuty.

Skrypt można również wykorzystać do innych serwisów, w przypadku darmowego tvunblock.com polecenie curl z funkcji update_ip należałoby zastąpić:

curl -s -o $IP_STATUS "https://activate.tvunblock.com/"

Zastąpienie odpytywania zewnętrznego serwisu o publiczny adres IP

Serwisów dostarczających za pomocą jakiegoś web api zewnętrzny adres ip jest dużo ale nie zawsze trzeba z nich korzystać. Jeśli router/modem pozwala na pobieranie z niego informacji o adresie WAN, dlaczego tego nie użyć? W przypadku Liveboxa/Funboxa zmienną CURRENT_IP można ustawić w ten sposób:

CURRENT_IP=$(curl -silent -A "application/x-sah-ws-4-call+json" "http://192.168.1.1/sysbus/NMC:getWANStatus" -d"{\"parameters\":{}}" | sed -n -e 's/^.*\(IPAddress":"\)\([0-9]*.[0-9]*.[0-9]*.[0-9]*\)\(.*\)$/\2/p')

W praktyce (jak widać nie tylko adres ip portu WAN można podejrzeć):

Crontab tuning

Rozwiązania, które opierają się na crontabie i czesto są uruchamiane zaśmiecają sysloga:

Nov  8 16:49:01 bananapi /USR/SBIN/CRON[27209]: (root) CMD (/root/update_unblock.sh  2>&1 |logger)
Nov  8 16:51:01 bananapi /USR/SBIN/CRON[27221]: (root) CMD (/root/update_unblock.sh  2>&1 |logger)
Nov  8 16:53:01 bananapi /USR/SBIN/CRON[27233]: (root) CMD (/root/update_unblock.sh  2>&1 |logger)
Nov  8 16:55:01 bananapi /USR/SBIN/CRON[27244]: (root) CMD (/root/update_unblock.sh  2>&1 |logger)
Nov  8 16:57:01 bananapi /USR/SBIN/CRON[27255]: (root) CMD (/root/update_unblock.sh  2>&1 |logger)
Nov  8 16:59:01 bananapi /USR/SBIN/CRON[27266]: (root) CMD (/root/update_unblock.sh  2>&1 |logger)

Dlatego kiedy już wiadomo, że skrypt działa poprawnie można pokusić się o wyłączenie logowania crona. Na Debianie to modyfikacja pliku /etc/rsyslog.conf:

rsyslog.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
###############
#### RULES ####
###############

#
# First some standard log files.  Log by facility.
#
auth,authpriv.*         -/var/log/auth.log
*.*;auth,authpriv.none,cron.none        -/var/log/syslog
#cron.*             -/var/log/cron.log
daemon.*            -/var/log/daemon.log
kern.*              -/var/log/kern.log
lpr.*               -/var/log/lpr.log
mail.*              -/var/log/mail.log
user.*              -/var/log/user.log

Dorzucenie cron.none i restart usługi sudo /etc/init.d/rsyslog restart wyciszy crontaba. Można również przekierować logi do osobnego pliku cron.log ale szkoda karty SD. Od tej pory syslog nie jest floodowany z powodu skryptu i mamy tylko informacje kiedy faktcznie skrypt wykona jakąś pracę:

Nov  8 20:16:02 bananapi logger: [update_unblock.sh]: IP updated: 178.42.100.100; Response: active

Comments