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):

  1. #!/usr/bin/python
  2. import xmlrpclib, getopt, sys, datetime, os
  3.  
  4. server = "http://quex.pl/xmlrpc.php" # adres serwera
  5. domain = "dev.quex.pl"               # zmieniany rekord
  6. passwd = "****"                      # jakieś tam zabezpieczenie :)
  7.  
  8.  
  9. def main():
  10.         global server, passwd, domain
  11.  
  12.         print "updating host: %s" % domain
  13.         client = xmlrpclib.Server(server)
  14.         result = client.edit(passwd, domain)
  15.  
  16.         print "........ %s" % result
  17.  
  18.         os.system("echo [%s] %s >> /var/log/dyndns.log" %(datetime.datetime.now(), result) )
  19.  
  20. if __name__ == "__main__":
  21.         main()

Część napisana w PHP odpowiedzialna jest za edycję rekordu w bazie. Skrypt jako serwer odbiera zapytanie XML RPC i stosuje się do niego.

  1. require_once 'xmlrpc.library.php';
  2.  
  3.  
  4. // funkcja obsługująca zdarzenie edit
  5. function edit($argumenty) {
  6.         if($argumenty[0] == 'tajne_haslo') {
  7.                 // operacje na bazie etc.
  8.                 return 'ok';
  9.         }
  10.         else {
  11.                 return 'error';
  12.         }
  13. }
  14.  
  15. $server = new IXR_Server(array(
  16.  
  17.         'edit' => 'edit',
  18.  
  19. ));

Jeszcze dla kompletu listingów crontab:

  1. 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ź

Zawartość pola nie będzie udostępniana publicznie.
  • Adresy internetowe są automatycznie zamieniane w odnośniki, które można kliknąć.
  • Dozwolone znaczniki HTML: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Znaki końca linii i akapitu dodawane są automatycznie.
  • Dostępne jest formatowanie fragmentów kodu źródłowego używając tagów: <code>, <blockcode>, <bash>, <c>, <cpp>, <css>, <drupal5>, <drupal6>, <html>, <java>, <js>, <perl>, <php>, <python>, <ruby>, <sql>.

Więcej informacji na temat formatowania

    _      ___      _  __      __ __   __
/_\ / __| _ | | \ \ / / \ \ / /
/ _ \ | (__ | || | \ \/\/ / \ V /
/_/ \_\ \___| \__/ \_/\_/ |_|
Proszę wpisać litery (tylko wielkie litery) z napisu w stylu ASCII.