#!/usr/bin/perl ##################################################################################################### # # # Script écrit par Marc Fiasse : http://marcfiasse.com/ # # # # Script initial écrit le 30 octobre 2010 # # # # Mises à jour : # # # # 16 fev 2011 -> test si l'ip est identique, alors pas d'update # # 02 mai 2011 -> modif. des configurations qui sont désormais regroupées dans un seul paragraphe # # # # Vous pouvez toujours modifier le script sans problème. Il est libre et gratuit. # # # # Merci de laisser cette entête. # # # ##################################################################################################### ################################################ # # Configurations # -------------- # # Paramètres à compléter suivant vos données... # $to = 'login.nom@domain.ext'; # adresse email pour reception du mail $from = 'login.nom@domain.ext'; # adresse email marquée de l'envoyeur du mail # # Paramètres pour les sites dynamiques # # Pour ovh.com ( maximum 5 ) Laisser vide(s) si pas utilisé(s). # # domaine associé au dyndns ovh : exemple : # $ovh_nom_domain_1 = "domain.tld"; # $ovh_login_1 = login de dyndns ovh pour domaine 1 # $ovh_mdd_1 = mot de passe de dyndns ovh pour domaine 1 # Tous ces logins / mots de passes sont, en principe, différents... $ovh_nom_domain_1 = ""; $ovh_login_1 = ""; $ovh_mdd_1 = ""; $ovh_nom_domain_2 = ""; $ovh_login_2 = ""; $ovh_mdd_2 = ""; $ovh_nom_domain_3 = ""; $ovh_login_3 = ""; $ovh_mdd_3 = ""; $ovh_nom_domain_4 = ""; $ovh_login_4 = ""; $ovh_mdd_4 = ""; $ovh_nom_domain_5 = ""; $ovh_login_5 = ""; $ovh_mdd_5 = ""; # # Pour dyndns.org # # domaines associés aux dyndns de dyndns.org : exemple : # $noms_de_domaine = "domain1.dyndns.org,domain2.dnsalias.org"; # $dyndns_login = login de dyndns.org # $dynsdns_mdd = mot de passe de dyndns.org $noms_de_domaine = ""; # séparer les noms de domaines sur le meme compte par une virgule $dyndns_login = ""; $dynsdns_mdd = ""; # # Pour no-ip.com # # domaines associés aux dyndns de no-ip.com : exemple : # $hostname = "domain1.no-ip.org,domain2.zapto.org,domain3.no-ip.org"; # $username = login de no-ip.com sous cette forme : "nom\@domain.ext" # $password = mot de passe de no-ip.com $hostname = ""; # séparer les noms de domaines sur le meme compte par une virgule $username = ""; # il faut un antislash avant le arobase pour l'adresse email $password = ""; # # # # # Options : Paramètres modifiables. # $deca2 = 1; # décalage GMT $mailing = '1'; # mail = à '1' pour envoi de mail de mise à jour $majsite = '1'; # maj des domaines = à '1' pour envoi de l'update sur les serveurs $ttp = 10 ; # temps entre 2 mises à jour possibles en minutes ! (dyndns.org, par exemple, n'est pas content avec des updates en un court laps de temps !) # # Fin des configurations # # Ne plus rien modifier par la suite ... # ################################################ ################################################ # # chemin des fichiers : ne pas modifier # # chemin de sendmail # $LIBSENDMAIL = '/usr/sbin/sendmail'; $valu1 = `pwd`; $valu1 =~ s/\s+//g; # enlève les espaces $valu2 = $valu1; $valu2 =~ s/\/cgi-bin//; # revenir au rep avant cgi-bin d'apres la phrase qu'on a $ipadress = $valu1.'/modem-address.dat'; $updater1 = $valu2.'/statistiques/update.log'; $timemaj = $valu1.'/maj-time.dat'; use 5.005_03; # numéro de version numérique use LWP::UserAgent; use HTTP::Request::Common; use HTTP::Response; # ################################################ ######################## # # Sous programme d'appels des sites de mises à jour DNS : ne pas modifier # ######################## # # celui - ci est chez ovh.com sub GetDoc1 { local ($Chemin2) = @_; $Complet_URL2 = "http://" . $Chemin2; my $ua = new LWP::UserAgent; $ua->agent('Mozilla/4.0 (compatible; MSIE 4.01; Windows 98)'); $req = HTTP::Request->new(GET=>$Complet_URL2); $req->authorization_basic($ovh_login_1, $ovh_mdd_1); $response = $ua->request($req); if ($response->is_success) { $Resultat = $response->content; } $Resultat; } ######################## # celui - ci est chez ovh.com sub GetDoc2 { local ($Chemin2) = @_; $Complet_URL2 = "http://" . $Chemin2; my $ua = new LWP::UserAgent; $ua->agent('Mozilla/4.0 (compatible; MSIE 4.01; Windows 98)'); $req = HTTP::Request->new(GET=>$Complet_URL2); $req->authorization_basic($ovh_login_2, $ovh_mdd_2); $response = $ua->request($req); if ($response->is_success) { $Resultat = $response->content; } $Resultat; } ######################## # celui - ci est chez ovh.com sub GetDoc3 { local ($Chemin2) = @_; $Complet_URL2 = "http://" . $Chemin2; my $ua = new LWP::UserAgent; $ua->agent('Mozilla/4.0 (compatible; MSIE 4.01; Windows 98)'); $req = HTTP::Request->new(GET=>$Complet_URL2); $req->authorization_basic($ovh_login_3, $ovh_mdd_3); $response = $ua->request($req); if ($response->is_success) { $Resultat = $response->content; } $Resultat; } ######################## # celui - ci est chez ovh.com sub GetDoc4 { local ($Chemin2) = @_; $Complet_URL2 = "http://" . $Chemin2; my $ua = new LWP::UserAgent; $ua->agent('Mozilla/4.0 (compatible; MSIE 4.01; Windows 98)'); $req = HTTP::Request->new(GET=>$Complet_URL2); $req->authorization_basic($ovh_login_4, $ovh_mdd_4); $response = $ua->request($req); if ($response->is_success) { $Resultat = $response->content; } $Resultat; } ######################## # celui - ci est chez ovh.com sub GetDoc5 { local ($Chemin2) = @_; $Complet_URL2 = "http://" . $Chemin2; my $ua = new LWP::UserAgent; $ua->agent('Mozilla/4.0 (compatible; MSIE 4.01; Windows 98)'); $req = HTTP::Request->new(GET=>$Complet_URL2); $req->authorization_basic($ovh_login_5, $ovh_mdd_5); $response = $ua->request($req); if ($response->is_success) { $Resultat = $response->content; } $Resultat; } ######################## # ceux-ci sont chez dyndns.org sub GetDoc20 { local ($Chemin2) = @_; $Complet_URL2 = "http://" . $Chemin2; my $ua = new LWP::UserAgent; $ua->agent('Mozilla/4.0 (compatible; MSIE 4.01; Windows 98)'); $req = HTTP::Request->new(GET=>$Complet_URL2); $req->authorization_basic($dyndns_login, $dynsdns_mdd); $response = $ua->request($req); if ($response->is_success) { $Resultat = $response->content; } $Resultat; } ######################## # ceux-ci sont chez no-ip.com # l'identification se fait dans l'url à appeler chez no-ip sub GetDoc30 { local ($Chemin) = @_; # On reconstitut l'URL à partir du chemin: www.domaine.ext/répertoire/ $Complet_URL = "http://" . $Chemin; my $ua = new LWP::UserAgent; # C'est ici que l'on devient internet explorer 4 sous windows 98 $ua->agent('Mozilla/4.0 (compatible; MSIE 4.01; Windows 98)'); # Envoi de la demande, récupération de la réponse du serveur $res = $ua->request(GET $Complet_URL); if ($res->is_success) { $Resultat = $res->content; } $Resultat; } # ######################## # # Fin du sous programme d'appels des sites de mises à jour DNS. # ######################## use CGI; if ($ENV{'REQUEST_METHOD'} eq "POST") { $mes = "Méthode non admise !"; &open_error; } if ($ENV{'REQUEST_METHOD'} eq "GET") { my($cgi) = new CGI; $force = $cgi->param('force'); } ######################## # # Mise à jour de l'ip : ne pas modifier # # Enregistrement de l'ip dans un fichier et différents tests ! # ######################## # if ( $force eq "1" ) { &open_error5; &open_error3; } $mes = "Le programme ne trouve pas le fichier"; open (PAS8, "<$timemaj") || open_error4($timemaj); flock(PAS8, 1); @lines8 = ; flock(PAS8, 8); close PAS8; sub open_error4 { open (USER11, ">$timemaj") || &open_error1($timemaj); flock(USER11, 2); print USER11 ""; flock(USER11, 8); close USER11; } $mes = "Le programme ne trouve pas le fichier"; open (PAS81, "<$ipadress") || open_error5($ipadress); flock(PAS81, 1); @lines81 = ; flock(PAS81, 8); close PAS81; sub open_error5 { open (USER81, ">$ipadress") || &open_error1($ipadress); flock(USER81, 2); print USER81 ""; flock(USER81, 8); close USER81; } sub GetDoc { local ($Chemin) = @_; # On reconstitut l'URL à partir du chemin: www.domaine.ext/répertoire/ $Complet_URL = "http://" . $Chemin; my $ua = new LWP::UserAgent; # C'est ici que l'on devient internet explorer 4 sous windows 98 $ua->agent('Mozilla/4.0 (compatible; MSIE 4.01; Windows 98)'); # Envoi de la demande, récupération de la réponse du serveur $res = $ua->request(GET $Complet_URL); if ($res->is_success) { $Resultat = $res->content; } $Resultat; } $MonDocument=GetDoc("checkip.dyndns.org/"); $MonDocument =~ s/Current IP Check<\/title><\/head><body>Current IP Address://g; # on enleve ce qui n'est pas utile $MonDocument =~ s/<\/body><\/html>//g; # on enleve ce qui n'est pas utile $MonDocument =~ s/\n//g; # on enleve saut de ligne $MonDocument =~ s/ //g; # on enleve les espaces # petit test pour voir si on a 3 points dans ce qui est lu. # forcément en ipv4, il y a 3 points. $c = ''; $e = 0; foreach $c (split //, $MonDocument) { if ($c eq ".") { $e++; } } if ($e != 3 ) { # if ( $MonDocument eq "" ) { $MonDocument = "aucune ip lue" ; } $mes = "Il semble que l'adresse IP lue sur <a href='http://checkip.dyndns.org/' target=_blank>http://checkip.dyndns.org/</a> ne soit pas correctement formée ! <br><br>Adresse lue : ".$MonDocument."<br><br>"; $test_m = "1"; &open_error; exit; } # on teste s'il y a > 10 minutes entre 2 tests open (PAS8, "<$timemaj") || open_error1($timemaj); flock(PAS8, 1); @lines8 = <PAS8>; flock(PAS8, 8); close PAS8; ($line9) = @lines8; chomp $line9[0]; $line9 =~ s/ //g; # on enleve les espaces $second = time(); $line12 = $line9 + ($ttp*60) ; # on teste si l'ip a changé... open (PAS, "<$ipadress") || &open_error($ipadress); flock(PAS, 1); @lines = <PAS>; foreach $line1 (@lines) { chomp $line1; $classeA = (split (/\./, $line1))[0]; $classeB = (split (/\./, $line1))[1]; $classeC = (split (/\./, $line1))[2]; $classeD = (split (/\./, $line1))[3]; } # fin de foreach flock(PAS, 8); close PAS; ($line) = @lines; chomp $line[0]; $line =~ s/ //g; # on enleve les espaces if ( $line eq $MonDocument ) { $mes = "L'ip n'a pas changé !<br><br>Pas d'action effectuée !<br><br>"; $test_m = "2"; &open_error; exit; } if ( $line12 > $second ) { $mes = "La Limite de temps entre 2 mises à jour est de ".$ttp." minutes<br><br>Ce temps n'est pas écoulé ! <br><br>"; $test_m = "3"; &open_error; exit; } # on continue si l'ip a changé et que le temps > 10 minutes... $mes = "Le programme ne trouve pas le fichier"; open (USER1, ">$ipadress") || &open_error1($ipadress); flock(USER1, 2); print USER1 "$MonDocument\n"; flock(USER1, 8); close USER1; open (PAS, "<$ipadress") || &open_error1($ipadress); flock(PAS, 1); @lines = <PAS>; foreach $line1 (@lines) { chomp $line1; $classeA = (split (/\./, $line1))[0]; $classeB = (split (/\./, $line1))[1]; $classeC = (split (/\./, $line1))[2]; $classeD = (split (/\./, $line1))[3]; } # fin de foreach flock(PAS, 8); close PAS; ($line) = @lines; chomp $line[0]; $line =~ s/ //g; # on enleve les espaces $mes = 'Le programme ne trouve pas le fichier'; open (USER11, ">$timemaj") || open_error1($timemaj); flock(USER11, 2); print USER11 "$second\n"; flock(USER11, 8); close USER11; # ######################## # # Fin de l'enregistrement de l'ip dans un fichier et des tests ! # ######################## ######################## # # Appels des sites de mises à jour DNS : ne pas modifier # ######################## # if ($majsite eq '1') { # pour ovh.com domaine 1 # forme adoptée exemple : www.ovh.com/nic/update?system=dyndns&hostname=domaine1.tld&myip=xxx.xxx.xxx.xxx if ($ovh_nom_domain_1 ne '') { $MonDocument1=GetDoc1("www.ovh.com/nic/update?system=dyndns&hostname=$ovh_nom_domain_1&myip=$line"); } # sleep(2); # pour ovh.com domaine 2 # forme adoptée exemple : www.ovh.com/nic/update?system=dyndns&hostname=domaine2.tld&myip=xxx.xxx.xxx.xxx if ($ovh_nom_domain_2 ne '') { $MonDocument2=GetDoc2("www.ovh.com/nic/update?system=dyndns&hostname=$ovh_nom_domain_2&myip=$line"); } # sleep(2); # pour ovh.com domaine 3 # forme adoptée exemple : www.ovh.com/nic/update?system=dyndns&hostname=domaine3.tld&myip=xxx.xxx.xxx.xxx if ($ovh_nom_domain_3 ne '') { $MonDocument3=GetDoc3("www.ovh.com/nic/update?system=dyndns&hostname=$ovh_nom_domain_3&myip=$line"); } # sleep(2); # pour ovh.com domaine 4 # forme adoptée exemple : www.ovh.com/nic/update?system=dyndns&hostname=domaine4.tld&myip=xxx.xxx.xxx.xxx if ($ovh_nom_domain_4 ne '') { $MonDocument4=GetDoc4("www.ovh.com/nic/update?system=dyndns&hostname=$ovh_nom_domain_4&myip=$line"); } # sleep(2); # pour ovh.com domaine 5 # forme adoptée exemple : www.ovh.com/nic/update?system=dyndns&hostname=domaine5.tld&myip=xxx.xxx.xxx.xxx if ($ovh_nom_domain_5 ne '') { $MonDocument5=GetDoc5("www.ovh.com/nic/update?system=dyndns&hostname=$ovh_nom_domain_5&myip=$line"); } # pour dyndns.org # on sépare les noms de domaine par une virgule # forme adoptée exemple : members.dyndns.org/nic/update?system=dyndns&hostname=nom_domaine1.dyndns.org,nom_domaine2.dnsalias.org&myip=xxx.xxx.xxx.xxx&wildcard=ON if ($noms_de_domaine ne '') { $MonDocument20=GetDoc20("members.dyndns.org/nic/update?system=dyndns&hostname=$noms_de_domaine&myip=$line&wildcard=ON"); } # pour no-ip.com # on sépare les noms de domaine par une virgule # forme adoptée exemple : dynupdate.no-ip.com/dns?username=email-login\@domaine.tld&password=mot_de_passe&hostname=domaine1.no-ip.org,domaine2.no-ip.org,domaine3.zapto.org&ip=xxx.xxx.xxx.xxx if ($hostname ne '') { $MonDocument30=GetDoc30("dynupdate.no-ip.com/dns?username=$username&password=$password&hostname=$hostname&ip=$line"); } } # fin de condition # ######################## # # fin d'Appels des sites de mises à jour DNS. # ######################## ######################## # # Envoi de l'email de confirmation : ne pas modifier # ######################## # On récupère la date et l'heure (du serveur) : my $date=&getdate2; # Envoi de l'E-Mail : # On commence par préparer le texte à envoyer $message="L'adresse du serveur vient d'être mise à jour avec cette IP : $line\n\n"; $message.="Date et Heure de ce changement : $date\n\n\n"; $message.="Statut de réponse pour le site checkip.dyndns.org : \n$MonDocument\n"; $message.="---\n\n"; $MonDocu = "\n\nAucune mise à jour effectuée... \n\nVérifiez les configurations des sites dynamiques...\n\n"; if ( $ovh_nom_domain_1 ne '' ) { $message.="Statut de réponse pour un domaine sur dyndns sur ovh.com : \n$MonDocument1\n"; $message.="---\n\n"; $MonDocu=""; } if ( $ovh_nom_domain_2 ne '' ) { $message.="Statut de réponse pour un domaine sur dyndns sur ovh.com : \n$MonDocument2\n"; $message.="---\n\n"; $MonDocu=""; } if ( $ovh_nom_domain_3 ne '' ) { $message.="Statut de réponse pour un domaine sur dyndns sur ovh.com : \n$MonDocument3\n"; $message.="---\n\n"; $MonDocu=""; } if ( $ovh_nom_domain_4 ne '' ) { $message.="Statut de réponse pour un domaine sur dyndns sur ovh.com : \n$MonDocument4\n"; $message.="---\n\n"; $MonDocu=""; } if ( $ovh_nom_domain_5 ne '' ) { $message.="Statut de réponse pour un domaine sur dyndns sur ovh.com : \n$MonDocument5\n"; $message.="---\n\n"; $MonDocu=""; } if ( $noms_de_domaine ne '' ) { $message.="Statut de réponse pour les domaines sur dyndns.org : \n$MonDocument20\n"; $message.="---\n\n"; $MonDocu=""; } if ( $hostname ne '' ) { $message.="Statut de réponse pour les domaines sur no-ip.com : \n$MonDocument30\n"; $message.="---\n\n"; $MonDocu=""; } $message.= $MonDocu; $m6=''; $m6.="[Rapport UPDATE de l'IP du serveur]"; $mege = $message; $subject = $m6; if ($mailing eq '1') { open (MAIL, "|$LIBSENDMAIL -t -f \"$from\""); print MAIL ("To: $to\n"); print MAIL ("From: $from\n"); print MAIL ("Subject: $subject\n\n"); print MAIL ("$mege"); close (MAIL); } # copie d'un log open (USER1, ">>$updater1") || &open_error1($updater1); flock(USER1, 2); print USER1 "Update le $date : Nouvelle IP : $line\n"; flock(USER1, 8); close USER1; # # et pour terminer, la page html de confirmation # $MonDocu = "<br><br>Aucune mise à jour effectuée... <br><br>Vérifiez les configurations des sites dynamiques...<br><br>"; if ( $ovh_nom_domain_1 ne '' ) { $MonDocu1="<br><br>Réponse du serveur ovh.com :<br>".$MonDocument1; $MonDocu = ""; } if ( $ovh_nom_domain_2 ne '' ) { $MonDocu2="<br><br>Réponse du serveur ovh.com :<br>".$MonDocument2; $MonDocu = ""; } if ( $ovh_nom_domain_3 ne '' ) { $MonDocu3="<br><br>Réponse du serveur ovh.com :<br>".$MonDocument3; $MonDocu = ""; } if ( $ovh_nom_domain_4 ne '' ) { $MonDocu4="<br><br>Réponse du serveur ovh.com :<br>".$MonDocument4; $MonDocu = ""; } if ( $ovh_nom_domain_5 ne '' ) { $MonDocu5="<br><br>Réponse du serveur ovh.com :<br>".$MonDocument5; $MonDocu = ""; } if ( $noms_de_domaine ne '' ) { $MonDocu20="<br><br>Réponse du serveur dyndns.org :<br>".$MonDocument20; $MonDocu = ""; } if ( $hostname ne '' ) { $MonDocu30="<br><br>Réponse du serveur no-ip.com :<br>".$MonDocument30; $MonDocu = ""; } print "Content-Type: text/html\n\n"; print <<"SOT"; <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <title>Réponses update serveurs

Réponse du site http://checkip.dyndns.org/ :
$MonDocument $MonDocu $MonDocu1 $MonDocu2 $MonDocu3 $MonDocu4 $MonDocu5 $MonDocu20 $MonDocu30


Script écrit par Marc Fiasse



Update le $date -- Nouvelle IP : $line SOT exit; ######################## # # Fin de l'envoi de l'email de confirmation # ######################## ######################## # # Sous programmes fonctions sub time et errors : ne pas modifier # ######################## sub getdate2 { my (@jour)=('Dimanche','Lundi','Mardi','Mercredi','Jeudi','Vendredi','Samedi'); my (@mois)=('','Janvier','Février','Mars','Avril','Mai','Juin','Juillet','Août','Septembre','Octobre','Novembre','Décembre'); # On récupère l'heure locale du serveur my ($sec,$min,$heure,$numjour,$mois,$annee,$joursem,$jouran,$isdst) =(gmtime()); my ($sec1,$min1,$heure1,$numjour1,$mois1,$annee1,$joursem1,$jouran1,$isdst1) =(localtime()); # 0 1 2 3 4 5 6 7 8 $mois++; # Les mois sont renvoyés de 0 à 11 $annee+=1900; $ete="hiver"; # L'année est donnée par rapport à 1900, et on veut pas de bogue de l'an 2000 ! if($isdst1==1) {$deca2++;$ete="ete";} #adaptation heure hiver ete $heure=$heure+$deca2; if ($heure>=24){$heure=$heure-24;$numjour++;$joursem++;$jouran++;} if (($mois==1||$mois==3||$mois==5||$mois==7||$mois==8||$mois==10||$mois==12)&&$numjour>31){$numjour=1;$mois++;} if (($mois==4||$mois==6||$mois==9||$mois==11)&&$numjour>30){$numjour=1;$mois++;} if ($mois==2&&($annee==2001||$annee==2002||$annee==2003)&&$numjour>28){$numjour=1;$mois++;} if ($mois==2&&($annee==2004||$annee==2008||$annee==2012||$annee==2016)&&$numjour>29){$numjour=1;$mois++;} if ($mois==2&&($annee==2005||$annee==2006||$annee==2007)&&$numjour>28){$numjour=1;$mois++;} if ($mois==2&&($annee==2009||$annee==2010||$annee==2011)&&$numjour>28){$numjour=1;$mois++;} if ($mois==2&&($annee==2013||$annee==2014||$annee==2015)&&$numjour>28){$numjour=1;$mois++;} if ($mois>12){$mois=1;$annee++;} if ($joursem>6){$joursem=0;} return (sprintf ("%s %d %s %d à %02d hr %02d mn %02d s",$jour[$joursem],$numjour,$mois[$mois],$annee,$heure,$min,$sec)); } ################################################ sub open_error { $mes2 = ""; if ( $test_m eq "2" ) { $mes2 = "

Forcer la mise à jour

"; } if ( $test_m eq "1" ) { $mes2 = '

Nouvel essai dans quelques secondes ou Forcer la mise à jour

'; } print "Content-Type: text/html\n\n"; print <<"EOT"; Oups !
Oups !

$mes $mes2


EOT exit; } ### sub open_error1 { print "Content-Type: text/html\n\n"; print <<"EOT"; Erreur !
Erreur !

Erreur ouverture du fichier suivant :

maj-time.dat
ou modem-address.dat
ou update.log


EOT exit; } ### sub open_error3 { print "Content-Type: text/html\n\n"; print <<"EOT"; Redirection !

Redirection... Patience un moment... EOT exit; } 0;