Créer son propre Cloud – Partie 7 bis – Notification de changement d’IP

Publié le 27 août 2011 par Psyphi

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('your_account@gmail.com', 'password')
    mailServer.sendmail('your_account@gmail.com', 'your_account@gmail.com', 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:

  1. Se connecter en root
  2. Changer le groupe du dossier crontab pour users
  3. Changer le groupe du dossier tmp pour users
  4. Ajouter votre utilisateur au groupe users
  5. Redémarrer cron
  6. Déconnecter root
su
chgrp users /usr/bin/crontab
chgrp users /tmp
usermod -G users 
/etc/init.d/cron restart
exit