#!/usr/bin/perl use strict; use IO::Socket; my ($Config_Datei)="/etc/ipactive_client.conf"; my ($PID_Datei)="/var/run/ipactive.pid"; my ($EOT)=""; my ($pl_Benutzerkennung)=""; my ($T_Ben)= "&B="; my ($pl_Passwort)="", my ($T_Pass)="&P="; my ($pl_IP)=""; my ($T_IP)="&IP="; my ($pl_Logon_off_flag)="1"; my ($T_Flag)="&F="; my ($pl_new_IP)=""; my ($OPT_l)="1"; # Logging ins Syslog aktiv my ($OPT_k)="0"; # ipactive Client beenden my ($OPT_c)="0"; # ipactive Client konfigurieren my ($OPT_o)="1"; # Logon_off_flag setzen my ($OPT_s)="1"; # Logging von Stillalive Paketen my ($OPT_h)="0"; # Help angefordert my ($request)=""; my ($pid); my ($EOT)=""; my ($crlf)=chr(13) . chr(10); my ($Logon_Server)="logon.ipactive.de"; my ($Logon_URL) = "GET /cgi-bin/logon_off.pl?V=2.1"; my ($Get_IP_URL)="GET /cgi-bin/get_ip.pl"; my ($End_URL)= " HTTP/1.1".$crlf."Host: " . $Logon_Server . $crlf. "Connection: Keep-Alive" . $crlf . $crlf; my ($UserURL)=""; &Get_Options; if ($OPT_k) { &Beende_Client; } if ($OPT_h) { print " ip\@ctive DDNS Client für Linux v0.2 Copyright ©2001, 2003 ip\active GbR \n Kurzübersicht über die Befehlszeilenparameter (Defaultwerte sind mit '*' gekennzeichnet)\n -c : Fordert zur Eingabe von Benutzerkennung und Passwort auf und speichert diese ab -o1 :* meldet Client an ip\@ctive DDNS an -o0 : meldet Client von ip\@ctive DDNS ab und beendet den Client -l0 : Gibt Loggingmeldung auf die Konsole (STDOUT) aus -l1 :* Gibt Loggingmeldung auf SYSLOG aus -s0 : Logging von Stillalivepaketen ausschalten -s1 :* Logging von Stillalivepaketen einschalten -k : Killt den ip\@ctive Clientdaemon -h : Gibt diese Kurzübersicht aus \n"; exit (0); } if ($OPT_l && $OPT_o) { close(STDOUT); } if ((not &Client_running) or (not $OPT_o)) { if ($OPT_c) { &Hole_Benutzerdaten; exit(0); } if ($OPT_l) { use Sys::Syslog qw(:DEFAULT setlogsock); sub logger; $^O eq "linux" && setlogsock ('unix'); } if (-e "$Config_Datei") { open (UID , "<$Config_Datei"); $pl_Benutzerkennung = ; chomp($pl_Benutzerkennung); $pl_Passwort = ; chomp($pl_Passwort); close (UID); if (defined ($request = IO::Socket::INET->new(Proto => 'tcp' , PeerAddr => $Logon_Server . ':80'))) { $UserURL= $Get_IP_URL . $End_URL; print $request "$UserURL"; while (<$request>) { if ($_ =~ /REMOTE_ADDR/g) { $pl_IP= substr($_,14,15); $pl_IP =~ s/ //g; &logger("IP-Adresse = $pl_IP"); } if ($_ =~ /EOT/) { close ($request); } } close ($request); if ($pl_IP eq '') { &logger('Fehler bei IP-Addressdiscovery'); exit(0); } } else { &logger("Could not connect to $Logon_Server"); } if ($OPT_o) { $pl_Logon_off_flag ="1"; if (&SendeDaten) { if ($pid = fork()) { &logger("ip\@ctive Client Daemon erfolgreich gestartet: (PID $pid)"); open (PID , ">$PID_Datei"); print (PID "$pid"); close (PID); exit (0); } elsif (!defined $pid) { die "ip\@ctive Client nicht gestartet: $!\n"; } close ($request); while (1 eq 1) { sleep (270); if (defined ($request = IO::Socket::INET->new(Proto => 'tcp' , PeerAddr => $Logon_Server . ':80'))) { $UserURL= $Logon_URL . $T_Ben . $pl_Benutzerkennung . $T_Pass . $pl_Passwort . $T_IP . $pl_IP . $T_Flag . "9 " . $End_URL; print $request "$UserURL"; if ($OPT_s) { &logger("Stillalive Paket an ip\@ctive gesendet"); } while (<$request>) { if ($_ =~ /REMOTE_ADDR/g) { $pl_new_IP= substr($_,14,15); $pl_new_IP =~ s/ //g; if ($pl_IP ne $pl_new_IP) { $pl_IP = $pl_new_IP; &logger("Neue IP-Adresse = $pl_IP"); } } if ($_ =~ /EOT/) { close ($request); } } } else { &logger("Konnte keine Verbindung zu $Logon_Server herstellen"); } } } else { &logger("Fehler bei Verbindung zu $Logon_Server"); } } else { $pl_Logon_off_flag ="0"; if (&SendeDaten) { &Beende_Client; } else { &logger("Fehler bei Verbindung zu $Logon_Server"); } } } else { print "\nKeine Benutzerdaten gespeichert.\n"; print "Bitte geben Sie nachfolgend Benutzerkennung und Passwort ein!\n"; &Hole_Benutzerdaten; print "Benutzerdaten in \\etc\\ipactive_client.conf gespeichert \n"; print "Bitte starten Sie den ip\@ctive Client erneut.\n"; } } else { print "ip\@ctive Client bereits gestartet !\n"; } sub Get_Options { my ($counter) = 0; my ($max_opt)=0; my ($opt)=""; while ($ARGV[$counter]) { $opt=lc($ARGV[$counter]); if ($opt eq "-k") { $OPT_k="1"; $max_opt=1; } elsif ($opt eq "-l0") { $OPT_l="0"; } elsif ($opt eq "-l1") { $OPT_l="1"; } elsif ($opt eq "-c") { $OPT_c="1"; $max_opt=1; } elsif ($opt eq "-o0") { $OPT_o="0"; } elsif ($opt eq "-o1") { $OPT_o="1"; } elsif ($opt eq "-s") { $OPT_s="0"; } elsif ($opt eq "-h") { $OPT_h="1"; $max_opt=1; } ++$counter; } if ($max_opt) { if (($counter ) gt $max_opt) { print "Zuviele Parameter ! \n-c, -h und -k nur einzeln erlaubt\n"; exit(1); } } } sub logger { my($Logtext)= shift(@_); if ($OPT_l) { openlog ('ipactive_client', 'cons,pid', 'user'); syslog ('info',$Logtext); closelog(); } else { print $Logtext ."\n"; } } sub Client_running { if (-e "$PID_Datei") { open (PID , "<$PID_Datei"); $pid = ; close (PID); if (kill (0, $pid) ==1) { return 1; } else { return 0; } } else { return 0; } } sub Beende_Client { if (-e "$PID_Datei") { open (PID , "<$PID_Datei"); $pid = ; close (PID); if (kill (9, $pid) ==1) { &logger("ip\@ctive Client beendet"); print "ip\@ctive Client beendet\n"; } else { print "ip\@ctive Client nicht gestartet\n"; } unlink ("$PID_Datei"); exit (0); } else { die "ip\@ctive Client nicht gestartet\n"; } } sub Hole_Benutzerdaten { print "Benutzerkennung eingeben: "; $pl_Benutzerkennung = ; print "Passwort eingeben: "; $pl_Passwort = ; open (UID , ">$Config_Datei"); print UID $pl_Benutzerkennung; print UID $pl_Passwort; close (UID); } sub SendeDaten { if (defined ($request = IO::Socket::INET->new(Proto => 'tcp' , PeerAddr => $Logon_Server . ':80'))) { $UserURL= $Logon_URL . $T_Ben . $pl_Benutzerkennung . $T_Pass . $pl_Passwort . $T_IP . $pl_IP . $T_Flag . $pl_Logon_off_flag . $End_URL; print $request "$UserURL"; while (<$request>) { if ($_ =~ /DDNS-OK: J/g) { &logger('DDNS freigeschaltet'); } elsif ($_ =~ /DDNS-OK: N/g) { &logger('DDNS nicht freigeschaltet'); return 0; } elsif ($_ =~ /DDNS-Status: 1/g) { &logger('Erfolgreich an DDNS angemeldet'); } elsif ($_ =~ /DDNS-Status: 0/g) { &logger('Nicht an DDNS angemeldet'); } elsif ($_ =~ /Fehler/g) { &logger($_); return 0; } elsif ($_ =~ /HTTP\/1.1 (4|5)/g) { &logger("URL falsch oder Serverfehler"); return 0; } if ($_ =~ /EOT/) { close ($request); } } return 1; } else { return 0; } }