Suite à un commentaire de l’article précédent, j’ai décidé d’exposer une méthode plus fiable.
La première chose à faire est de supprimer la boucle infinie du script python et de le simplifier de cette manière:
#!/usr/bin/python ''' Created on Aug. 10 2011 @author: Thomas Bores ''' import urllib2 import time, datetime import smtplib from email.mime.text import MIMEText def get_localTime(): # Get current local time return str(datetime.datetime.now().strftime("%Y-%m-%d %H:%M")) def send_mail(ip): # 1. Prepare mail content mailContent = localtime + "\nIP changed\nNew IP is: " + ip msg = MIMEText(mailContent) print "IP changed, send a notification by email with the following content:" print mailContent # 2. Add a subject msg['Subject'] = 'Cloud has a new IP - '+ip # 3. Use my gmail account to send the mail mailServer = smtplib.SMTP("smtp.gmail.com", 587) mailServer.ehlo() # 4. Of course, we use a secure connection mailServer.starttls() mailServer.ehlo() mailServer.login('[email protected]', 'password') mailServer.sendmail('[email protected]', '[email protected]', msg.as_string()) mailServer.close() # *** main program *** saved_ip = None # Check if we already have a saved ip try: fSavedIp = open("CloudIpChecker.ip", "r") except IOError: print "Couldn't open CloudIpChecker.ip for reading saved ip, create the file." else: print "CloudIpChecker.ip found, read saved ip." saved_ip = fSavedIp.readline().rstrip("\n"); fSavedIp.close() # Connect to a website that returns the ip # Please avoid to overload my website, use your own url = 'http://www.bores.fr/ip.php' ip = urllib2.urlopen(url).read() if saved_ip != ip : #Save the new ip saved_ip = ip # Notice me by email about ip change send_mail(ip) # Save the new ip try: fSavedIp = open("CloudIpChecker.ip", "w") except IOError: print "Couldn't create CloudIpChecker.ip for writing new ip!\n" else: fSavedIp.write(ip+"\n") fSavedIp.close() else : print "IP still the same"
Ensuite nous créons un script de lancement qui se nomme CloudIpChecker.sh
#!/bin/sh
python CloudIpChecker.py
Enfin nous allons utiliser cron, pour ordonnancer le lancement du script b. Mon but étant de faire une vérification toutes les heures, je vais utiliser la chaine de caractère spéciale: @hourly dans mon fichier crontab.
Pour rappel, la commande pour éditer le fichier crontab d’un utilisateur est la suivante:
crontab -e
et le contenu de crontab celui-ci:
Attention pour les utilisateurs du TonidoPlug, sur ce dernier il ne m’était pas possible d’utiliser cron en étant utilisateur, seul root avait l’autorisation d’avoir une crontab. Pour permettre aux utilisateurs de l’utiliser aussi, il faut faire les manipulations suivantes:- Se connecter en root
- Changer le groupe du dossier crontab pour users
- Changer le groupe du dossier tmp pour users
- Ajouter votre utilisateur au groupe users
- Redémarrer cron
- Déconnecter root
su chgrp users /usr/bin/crontab chgrp users /tmp usermod -G users /etc/init.d/cron restart exit