Pseudo dynamiczny DNS w Pythonie i PHP.
Od wtorku ciesze się przyzwoitym łączem, w przyzwoitej cenie. Zmiana okupiona była masą problemów w każdym razie jestem już szczęśliwym posiadaczem nowego łącza – tym razem ADSL. Niestety (a może i dobrze) nie zaznaczyłem opcji stałego adresu IP u dostawcy - dlatego musiałem uzbroić się w program do aktualizacji rekordów DNS odpowiedzialnych za host mojego komputera.
Moja domena quex.pl (zresztą jak wszystkie pozostałe) utrzymywana jest na serwerach panic.pl - więc jakiekolwiek kłopoty z aktualizacją odpadły automatycznie. Idea jest bardzo prosta – żądanie/zapytanie do serwera który sprawdza w bazie czy IP hosta jest inny niż IP nadawcy i ewentualnie zmienia rekord. Wszystko odbywa się dzięki XML RPC skrypt klienta napisany w Pythonie na bazie skryptu Piotra Kucharskiego, skrypt serwera napisany w PHP z użyciem biblioteki PHP-RPC. Gdy miałem już dwa skrypty wystarczyło zmienić TTL rekordowi oraz dodać skrypt klienta do crona.
Muszę przyznać że było to moje pierwsze starcie z Pythonem. Sam nie wiem co o tym myśleć w każdym razie zamieszczę skrypt który udało mi napisać (na bazie skryptu Piotra Kucharskiego):
-
#!/usr/bin/python
-
import xmlrpclib, getopt, sys, datetime, os
-
-
server = "http://quex.pl/xmlrpc.php" # adres serwera
-
domain = "dev.quex.pl" # zmieniany rekord
-
passwd = "****" # jakieś tam zabezpieczenie :)
-
-
-
def main():
-
global server, passwd, domain
-
-
print "updating host: %s" % domain
-
client = xmlrpclib.Server(server)
-
result = client.edit(passwd, domain)
-
-
print "........ %s" % result
-
-
os.system("echo [%s] %s >> /var/log/dyndns.log" %(datetime.datetime.now(), result) )
-
-
if __name__ == "__main__":
-
main()
Część napisana w PHP odpowiedzialna jest za edycję rekordu w bazie. Skrypt jako serwer odbiera zapytanie XML RPC i stosuje się do niego.
-
require_once 'xmlrpc.library.php';
-
-
-
// funkcja obsługująca zdarzenie edit
-
function edit($argumenty) {
-
if($argumenty[0] == 'tajne_haslo') {
-
// operacje na bazie etc.
-
return 'ok';
-
}
-
else {
-
return 'error';
-
}
-
}
-
-
-
'edit' => 'edit',
-
-
));
Jeszcze dla kompletu listingów crontab:
-
0-59/20 * * * * /root/dyndns.py # wywoływany co 20 min
Może nie jest to najlepszy sposób – a już na pewno jeżeli chodzi o Pythona i wykonywanie exec() oraz operacje z datą. Zrobiłem to najszybciej jak umiałem i jak nie umiałem, a google podpowiedziało. Zależało mi na logowaniu aktualizacji adresu dla własnej informacji jak częste są padnięcia modemu.


Odpowiedzi
Dodaj nową odpowiedź