2015-10-27 12:25:17 +01:00
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# --------------------------------------------------------------
# ip2e (IP to email) - Run ip2e daemon. |
# Created by clamsawd (clamsawd@openmailbox.org) |
# Licensed by GPL v.3 |
2015-10-29 11:31:16 +01:00
# Last update: 29-10-2015 |
2015-10-27 12:25:17 +01:00
# |
# Dependences: curl, wget, sendEmail, libio-socket-ssl-perl |
# Compatible with Python 3.x |
# --------------------------------------------------------------
2015-10-29 11:31:16 +01:00
version = " 0.6-alpha "
2015-10-27 12:25:17 +01:00
#Import python-modules
import subprocess
import os
import sys
2015-10-29 11:31:16 +01:00
import time
2015-10-27 12:25:17 +01:00
#Check if your system use Python 3.x
if sys . version_info < ( 3 , 0 ) :
print ( " " )
print ( " You need python 3.x to run this program. " )
print ( " " )
exit ( 1 )
#Function to clear screen
def ClearScreen ( ) :
if os . name == " posix " :
os . system ( " clear " )
elif os . name == " nt " :
os . system ( " cls " )
else :
print ( " Error: Unable clear screen " )
#Function to pause screen
def PauseScreen ( ) :
if os . name == " posix " :
os . system ( " read pause " )
elif os . name == " nt " :
os . system ( " pause > nul " )
#Function to wait ten minutes
def WaitTenMinutes ( ) :
if os . name == " posix " :
os . system ( " sleep 600 " )
elif os . name == " nt " :
os . system ( " ping -n 600 localhost>nul " )
else :
print ( " Error waiting 10 minutes " )
#Detect system & PATH of user folder
if os . name == " posix " :
os . chdir ( os . environ [ " HOME " ] )
print ( " POSIX detected " )
elif os . name == " nt " :
os . chdir ( os . environ [ " USERPROFILE " ] )
print ( " Windows detected " )
if not os . path . exists ( " .ip2e " ) :
os . makedirs ( " .ip2e " )
os . chdir ( " .ip2e " )
if os . path . exists ( " .ip2e " ) :
os . chdir ( " .ip2e " )
#Check if exists 'ip2e-conf.py'
def createip2ecf ( ) :
ip2ecf = open ( ' ip2e-conf.py ' , ' w ' )
ip2ecf . close ( )
def writeip2ecf ( ) :
ip2ecf = open ( ' ip2e-conf.py ' , ' a ' )
ip2ecf . write ( ' # sample configuration file of ip2e \n ' )
ip2ecf . write ( ' \n ' )
ip2ecf . write ( ' FromEmail= " ip2e@daemon " \n ' )
ip2ecf . write ( ' FromEmailUser= " unknown " \n ' )
ip2ecf . write ( ' FromEmailPass= " password-here " \n ' )
ip2ecf . write ( ' SmtpFromEmail= " smtp.email.com " \n ' )
ip2ecf . write ( ' ToEmail= " unknown@email.com " \n ' )
ip2ecf . close ( )
if os . path . isfile ( " ip2e-conf.py " ) :
print ( " ip2e-conf.py exists " )
else :
print ( " ip2e-conf.py created " )
createip2ecf ( )
writeip2ecf ( )
#Check if exists 'current-ip.py'
def createip2eIPcf ( ) :
ip2eIPcf = open ( ' current-ip.py ' , ' w ' )
ip2eIPcf . close ( )
def writeip2eIPcf ( ) :
ip2eIPcf = open ( ' current-ip.py ' , ' a ' )
ip2eIPcf . write ( ' CurrentIP= " 0.0.0.0 " \n ' )
ip2eIPcf . close ( )
if os . path . isfile ( " current-ip.py " ) :
print ( " current-ip.py exists " )
else :
print ( " current-ip.py created " )
createip2eIPcf ( )
writeip2eIPcf ( )
#Check if sendEmail is installed
from subprocess import PIPE , Popen
try :
sendEmailCheck = Popen ( [ ' sendEmail ' , ' -q ' ] , stdout = PIPE , stderr = PIPE )
sendEmailCheck . stderr . close ( )
except :
ClearScreen ( )
print ( " " )
print ( " Error: ' sendEmail ' is not installed! " )
print ( " " )
print ( " Help: " )
print ( " * http://caspian.dotconf.net/menu/Software/SendEmail/ " )
print ( " " )
print ( " Press ENTER to exit " )
PauseScreen ( )
exit ( 1 )
#Check if curl is installed
try :
curlCheck = Popen ( [ ' curl ' , ' --version ' ] , stdout = PIPE , stderr = PIPE )
curlCheck . stderr . close ( )
except :
ClearScreen ( )
print ( " " )
print ( " Error: ' curl ' is not installed! " )
print ( " " )
print ( " Help: " )
print ( " * http://curl.haxx.se/download.html " )
print ( " * http://www.paehl.com/open_source/?CURL_7.45.0 " )
print ( " " )
print ( " Press ENTER to exit " )
PauseScreen ( )
exit ( 1 )
#Import variables from ip2e-conf.py
exec ( open ( " ip2e-conf.py " ) . read ( ) )
2015-10-29 16:31:45 +01:00
#Import Windows colors scheme
def GreenColor ( ) :
os . system ( " color 2 " )
def RedColor ( ) :
os . system ( " color 4 " )
def OrangeColor ( ) :
os . system ( " color 6 " )
2015-10-27 12:25:17 +01:00
#Run ip2e daemon
ClearScreen ( )
2015-10-29 11:31:16 +01:00
CurrentTime = time . strftime ( " % H: % M " )
2015-10-27 12:25:17 +01:00
if os . name == " posix " :
2015-10-29 16:31:45 +01:00
print ( chr ( 27 ) + " [1;32m " + " [ip2e-daemon] [ " + CurrentTime + " ] Initialized ip2e-daemon v " + version + " (Ctrl+C to stop) " )
elif os . name == " nt " :
GreenColor ( )
print ( " [ip2e-daemon] [ " + CurrentTime + " ] Initialized ip2e-daemon v " + version + " (Ctrl+C to stop) " )
if os . name == " posix " :
print ( chr ( 27 ) + " [1;32m " + " [ip2e-daemon] [ " + CurrentTime + " ] Log in " + os . environ [ " HOME " ] + " /.ip2e/ip2e.log " )
2015-10-27 12:25:17 +01:00
elif os . name == " nt " :
2015-10-29 16:31:45 +01:00
GreenColor ( )
2015-10-29 11:31:16 +01:00
print ( " [ip2e-daemon] [ " + CurrentTime + " ] Log in " + os . environ [ " USERPROFILE " ] + " \ .ip2e \\ ip2e.log " )
os . system ( " echo [ip2e-daemon] [ " + CurrentTime + " ] Initialized ip2e-daemon v " + version + " > ip2e.log " )
2015-10-29 16:31:45 +01:00
if os . name == " posix " :
print ( chr ( 27 ) + " [1;33m " + " [ip2e-daemon] [ " + CurrentTime + " ] Waiting 60 seconds... " )
elif os . name == " nt " :
OrangeColor ( )
print ( " [ip2e-daemon] [ " + CurrentTime + " ] Waiting 60 seconds... " )
2015-10-29 11:31:16 +01:00
os . system ( " echo [ip2e-daemon] [ " + CurrentTime + " ] Waiting 60 seconds... >> ip2e.log " )
2015-10-27 12:25:17 +01:00
if os . name == " posix " :
2015-10-27 12:54:41 +01:00
os . system ( " sleep 60 " )
2015-10-27 12:25:17 +01:00
elif os . name == " nt " :
2015-10-27 12:54:41 +01:00
os . system ( " ping -n 60 localhost>nul " )
2015-10-27 12:25:17 +01:00
PublicIP = 1
while PublicIP < = 2 :
GetCurrentIP = 1
while GetCurrentIP < = 2 :
2015-10-29 11:31:16 +01:00
CurrentTime = time . strftime ( " % H: % M " )
2015-10-29 16:31:45 +01:00
if os . name == " posix " :
print ( chr ( 27 ) + " [1;33m " + " [ip2e-daemon] [ " + CurrentTime + " ] IP Updating... " )
elif os . name == " nt " :
OrangeColor ( )
print ( " [ip2e-daemon] [ " + CurrentTime + " ] IP Updating... " )
2015-10-29 11:31:16 +01:00
os . system ( " echo [ip2e-daemon] [ " + CurrentTime + " ] IP Updating... >> ip2e.log " )
2015-10-27 19:40:06 +01:00
NewIPRaw = os . popen ( ' curl -s icanhazip.com ' ) . read ( )
NewIP = NewIPRaw . strip ( )
#NewIP = os.popen('curl -s http://ip.appspot.com/').read()
#NewIP = os.popen('curl -s ident.me').read()
#NewIPRaw = os.popen('curl -s ifconfig.me').read()
#NewIP = NewIPRaw.strip()
2015-10-27 12:25:17 +01:00
if NewIP != " " :
GetCurrentIP + = 2
else :
2015-10-29 11:31:16 +01:00
CurrentTime = time . strftime ( " % H: % M " )
2015-10-29 16:31:45 +01:00
if os . name == " posix " :
print ( chr ( 27 ) + " [1;31m " + " [ip2e-daemon] [ " + CurrentTime + " ] Error getting IP " )
print ( chr ( 27 ) + " [1;33m " + " [ip2e-daemon] [ " + CurrentTime + " ] Retrying in 5 seconds... " )
elif os . name == " nt " :
RedColor ( )
print ( " [ip2e-daemon] [ " + CurrentTime + " ] Error getting IP " )
print ( " [ip2e-daemon] [ " + CurrentTime + " ] Retrying in 5 seconds... " )
2015-10-29 11:31:16 +01:00
os . system ( " echo [ip2e-daemon] [ " + CurrentTime + " ] Error getting IP >> ip2e.log " )
os . system ( " echo [ip2e-daemon] [ " + CurrentTime + " ] Retrying in 5 seconds... >> ip2e.log " )
2015-10-27 12:25:17 +01:00
if os . name == " posix " :
os . system ( " sleep 5 " )
elif os . name == " nt " :
os . system ( " ping -n 5 localhost>nul " )
exec ( open ( " current-ip.py " ) . read ( ) )
if CurrentIP == NewIP :
2015-10-29 11:31:16 +01:00
CurrentTime = time . strftime ( " % H: % M " )
2015-10-29 16:31:45 +01:00
if os . name == " posix " :
print ( chr ( 27 ) + " [1;32m " + " [ip2e-daemon] [ " + CurrentTime + " ] IP has not changed " )
elif os . name == " nt " :
GreenColor ( )
print ( " [ip2e-daemon] [ " + CurrentTime + " ] IP has not changed " )
2015-10-29 11:31:16 +01:00
os . system ( " echo [ip2e-daemon] [ " + CurrentTime + " ] IP has not changed >> ip2e.log " )
2015-10-27 12:25:17 +01:00
else :
2015-10-29 11:31:16 +01:00
CurrentTime = time . strftime ( " % H: % M " )
2015-10-29 16:31:45 +01:00
if os . name == " posix " :
print ( chr ( 27 ) + " [1;32m " + " [ip2e-daemon] [ " + CurrentTime + " ] New IP - From " + CurrentIP + " to " + NewIP )
elif os . name == " nt " :
GreenColor ( )
print ( " [ip2e-daemon] [ " + CurrentTime + " ] New IP - From " + CurrentIP + " to " + NewIP )
2015-10-29 11:31:16 +01:00
os . system ( " echo [ip2e-daemon] [ " + CurrentTime + " ] New IP - From " + CurrentIP + " to " + NewIP + " >> ip2e.log " )
2015-10-27 20:21:14 +01:00
SendEmailOK = 1
while SendEmailOK < = 2 :
2015-10-29 11:31:16 +01:00
CurrentTime = time . strftime ( " % H: % M " )
2015-10-27 16:37:22 +01:00
if os . name == " posix " :
2015-10-29 11:31:16 +01:00
ErrorSendEmail = os . system ( " sendEmail -q -f " + FromEmail + " -t " + ToEmail + " -u ' [ip2e-daemon] [ " + CurrentTime + " ] IP has changed ' -m ' [ip2e] New IP is ' " + NewIP + " -s " + SmtpFromEmail + " -xu " + FromEmailUser + " -xp " + FromEmailPass )
2015-10-27 16:37:22 +01:00
elif os . name == " nt " :
2015-10-29 11:31:16 +01:00
ErrorSendEmail = os . system ( " sendEmail -q -f " + FromEmail + " -t " + ToEmail + " -u [ip2e-daemon] [ " + CurrentTime + " ] IP has changed -m [ip2e] New IP is " + NewIP + " -s " + SmtpFromEmail + " -xu " + FromEmailUser + " -xp " + FromEmailPass )
2015-10-27 20:21:14 +01:00
if ErrorSendEmail == 0 :
2015-10-29 11:31:16 +01:00
CurrentTime = time . strftime ( " % H: % M " )
MailMessage = " [ip2e-daemon] [ " + CurrentTime + " ] Email was sent successfully "
2015-10-29 16:31:45 +01:00
if os . name == " posix " :
print ( chr ( 27 ) + " [1;32m " + MailMessage + " ( " + ToEmail + " ) " )
elif os . name == " nt " :
GreenColor ( )
print ( MailMessage + " ( " + ToEmail + " ) " )
2015-10-27 20:21:14 +01:00
os . system ( " echo " + MailMessage + " to " + ToEmail + " >> ip2e.log " )
SendEmailOK + = 2
else :
2015-10-29 11:31:16 +01:00
CurrentTime = time . strftime ( " % H: % M " )
MailMessage = " [ip2e-daemon] [ " + CurrentTime + " ] Fail to send email "
2015-10-29 16:31:45 +01:00
if os . name == " posix " :
print ( chr ( 27 ) + " [1;31m " + MailMessage + " ( " + ToEmail + " ) " )
print ( chr ( 27 ) + " [1;33m " + " [ip2e-daemon] [ " + CurrentTime + " ] Retrying in 5 seconds... " )
elif os . name == " nt " :
RedColor ( )
print ( MailMessage + " ( " + ToEmail + " ) " )
print ( " [ip2e-daemon] [ " + CurrentTime + " ] Retrying in 5 seconds... " )
2015-10-27 20:21:14 +01:00
os . system ( " echo " + MailMessage + " to " + ToEmail + " >> ip2e.log " )
2015-10-29 11:31:16 +01:00
os . system ( " echo [ip2e-daemon] [ " + CurrentTime + " ] Retrying in 5 seconds... >> ip2e.log " )
2015-10-27 20:21:14 +01:00
if os . name == " posix " :
os . system ( " sleep 5 " )
elif os . name == " nt " :
os . system ( " ping -n 5 localhost>nul " )
2015-10-27 12:25:17 +01:00
if os . name == " posix " :
os . system ( " rm current-ip.py " )
elif os . name == " nt " :
os . system ( " del current-ip.py " )
def createNewip2eIPcf ( ) :
ip2eIPcf = open ( ' current-ip.py ' , ' w ' )
ip2eIPcf . close ( )
def writeNewip2eIPcf ( ) :
ip2eIPcf = open ( ' current-ip.py ' , ' a ' )
ip2eIPcf . write ( ' CurrentIP= " ' + NewIP + ' " \n ' )
ip2eIPcf . close ( )
createNewip2eIPcf ( )
writeNewip2eIPcf ( )
2015-10-29 11:31:16 +01:00
CurrentTime = time . strftime ( " % H: % M " )
2015-10-29 16:31:45 +01:00
if os . name == " posix " :
print ( chr ( 27 ) + " [1;33m " + " [ip2e-daemon] [ " + CurrentTime + " ] Next update in 10 minutes... " )
elif os . name == " nt " :
GreenColor ( )
print ( " [ip2e-daemon] [ " + CurrentTime + " ] Next update in 10 minutes... " )
2015-10-29 11:31:16 +01:00
os . system ( " echo [ip2e-daemon] [ " + CurrentTime + " ] Next update in 10 minutes... >> ip2e.log " )
2015-10-27 12:25:17 +01:00
WaitTenMinutes ( )