#! /usr/bin/python

# prosty skrypcik sprawdzajacy aktualny ip i w razie zmiany wysylajacy info na maila
# wersja 1.0, 29 lutego 2004
# autor: Bartlomiej Gorny (bartek@gorny.najlepsze.pl, www.spoko.neostrada.pl)

## ustawienia
# lokalizacja ifconfig
ifconfig_path='/sbin'

# logfile
logfile='ip_log'
loguj_niezmienione=1
# plik z zapisanym adresem
picklefile='currentip'

# mail
from_addr='xxxxx'
to_addr='xxxxxl'
subject='zmiana adresu ip'
msg_template='Adres ip zmienil sie z %s na %s'
serwer='xxxxx'
zalogowanie=1 # lub zero
login='xxxx'
passwd='xxxx'

# moduly

import commands
import os
import re
import sys
import pickle
import time
import smtplib
import socket

# wlasciwy prog

def log(logf,tekst):
	string=time.strftime('%Y-%m-%d %H:%M:%S')+'\t'+tekst+'\n'
	logf.write(string)
	

# przyg. do logowania
try:
	logf=open(logfile,'a')
except IOError:
	commands.getstatusoutput('touch '+logfile)
	logf=open(logfile,'a')


ifconf=os.path.join(ifconfig_path,'ifconfig')

ifc=commands.getstatusoutput(ifconf+' | grep P-t-P')

if ifc[0]!=0:
	log(logf,'ERROR: blad przy wykonywaniu polecenia ifconfig')
	logf.close()
	sys.exit(1)

reg=re.compile(r'inet addr:(\d+\.\d+\.\d+\.\d+)')
res=re.findall(reg,ifc[1])
try:
	curadr=res[0]
except IndexError:
	log(logf,'ERROR: nie udalo sie ustalic adresu ip')
	logf.close()
	sys.exit(1)


try:
	file=open(picklefile,'r')
	oldadr=pickle.load(file)
	file.close()
except IOError:
	commands.getstatusoutput('touch '+picklefile)
	oldadr=''
#oldadr='3434'
if curadr==oldadr:
	if loguj_niezmienione==1:
		log(logf,'adres %s - nie zmieniony' % curadr)
	logf.close()
	sys.exit(0)

log(logf,'adres zmieniony z %s na %s' % (oldadr,curadr))
file=open(picklefile,'w')
pickle.dump(curadr,file)
file.close()

# bedziemy wysylac
try:
	sender=smtplib.SMTP(serwer)
except socket.gaierror:
	log(logf,'nie udalo sie uzyskac polaczenia')
	logf.close()
	sys.exit(1)

if zalogowanie==1:
	res=sender.login(login,passwd)
	if res[0]==503:
		log(logf,'nie udalo sie zalogowac do serwera smtp')
		logf.close()
		sys.exit(1)

msg=msg_template % (oldadr,curadr)
mailtpl='From: %s\r\nTo:%s\r\nSubject:%s\r\n%s'
mail=mailtpl % (from_addr,to_addr,subject,msg)
res=sender.sendmail(from_addr,to_addr,mail)
if len(res)>0:
	log(logf,'cos poszlo nie tak z wysylaniem')
else:
	log(logf,'zawiadomienie wyslane')
logf.close()