ASPN ActiveState Programmer Network  
ActiveState, a division of Sophos
/ Home / Perl / PHP / Python / Tcl / XSLT /
/ Safari / My ASPN /
Cookbooks | Documentation | Mailing Lists | Modules | News Feeds | Products | User Groups
Submit Recipe
My Recipes

All Recipes
All Cookbooks


View by Category

Title: IPy Notify
Submitter: Charles Nichols (other recipes)
Last Updated: 2002/11/19
Version no: 1.5
Category:

 

5 stars 2 vote(s)


Description:

Use: To notify whomever that your IP address has
changed if you have a non-static IP address and run
a web server, game server, etc. Utilizes nested
functions.

Source: Text Source

'****************************************************'
'Created by C. Nichols #B0)~                         '
'E-mail: oldnich@digitaldarknet.net                  '
'Created: 11/16/02                                   '
'Updated! 11/19/02                                   '
'Version: Python 2+                                  '
'Desc: IPy Notify for Micro$oft Windoze              '
'Use: To notify whomever that your IP address has    '
'changed if you have a non-static IP address and run '
'a web server, game server, etc.                     '
'****************************************************'
'                                                    '
'                                                    '
'                        #                           '
'                       0 0                          '
'~~~~~~~~~~~~~~~~~uuu~~~~U~~~~uuu~~~~~~~~~~~~~~~~~~~~'
"!!!!!!!!!!!!HERE'S LOOKING AT YOU KID!!!!!!!!!!!!!!!"
'****************************************************'
import os, os.path, string, time
import smtplib, socket
import win32api
# GLOBALS --------------------------------------------
(head,tail) = os.path.split(win32api.GetSystemDirectory()) # Get the win path.
(ldrive,os_root) = os.path.split(head) # Now get the local drive.

# The path will generally, if not always be c:\
# Path_log = ldrive+'\yourdir\IPy_Notify.log'
# will specify a dir of your choice - dir must be created.
Path_dat = ldrive+'IPy_Notify.dat' # Program requires this file to run properly.
Path_log = ldrive+'IPy_Notify.log'

Name = win32api.GetComputerName() # Get actual machine name.

#Add your server name, mail server, and email addresses receiving notification.
MailServer = 'smtp.yourprovider.com'
Address    = ['yourmail@yourprovider.com']
#Address    = ['yourmail@yourprovider.com','yourfriend@something.com'] # Multiple Addresses - uncomment will override above.
Frm_add    = 'yourmail@yourprovider.com' # From must be a valid e-mail address or the mail function will fail.

# If your ISP requires authentication, leave blank if unsure and test.
User       = ''
Pass       = ''

# Functions ------------------------------------------

def mail(to='',frm='',subj='',body='',server=''):
    try:
        message='From: %s\r\nTo: %s\r\nSubject: %s\r\n%s'%(frm,to,subj,body)            
        mail=smtplib.SMTP(server)
        mail.sendmail(frm,to,message)
        mail.close()
    except:
        try:
            # Logon to the server... If needed
            message='From: %s\r\nTo: %s\r\nSubject: %s\r\n%s'%(frm,to,subj,body)            
            mail=smtplib.SMTP(server)
            mail.login(User,Pass) 
            mail.sendmail(frm,to,message)
            mail.close()
        except:
            print 'ERROR: Unable to send notification! - '+time.ctime()
            open(Path_log,'a').write(time.ctime()+' \nERROR: Unable to send notification!')

def start():
    def getIP(name, path):
        print 'IPy Notify by C. Nichols, 2002.\n'
        ip = socket.gethostbyname(name)
        print 'Current ip: '+str(ip)
        open(path,'w').write(ip) #Save the current IP address.
        out(name,Path_dat)

    def out(name, path, stat=1):
        while stat:
            cur_ip = open(path,'r').readline()
            new_ip = str(socket.gethostbyname(name))
            if cur_ip==new_ip:
                print 'Sleeping...'
                time.sleep(15) # Sleep in seconds - adjust polling interval to your taste.
                print 'Polling: '+new_ip+', '+time.ctime()
            else:
                print 'IP address has changed: '+new_ip
                open(Path_log,'a').write(time.ctime()+'\nINFO: IP address has changed: '+new_ip)

                print 'sending notification...'
                for add in Address:
                    mail(to=add,frm=Frm_add,subj='Message from '+name,body='New IP address: '+new_ip+' assigned to '+name, server=MailServer)
                getIP(name,Path_dat) 
                stat=0

    getIP(Name,Path_dat)
    
# Run ------------------------------------------------
# Make sure this is started via the command line or
# by a .cmd file in startup - The command window can
# be hidden from a cmd file if you hate it like I do.
# Download Python @ www.python.org or PythonWin
# (active python) from www.activestate.com.
try:
    open(Path_log,'a').write(time.ctime()+' START: IP Polling\n------------------------------------------\n')
    start()
except:
    open(Path_log,'a').write(time.ctime()+' \nERROR: IPy Notify failed!')

Discussion:



Add comment

Number of comments: 7

Nice., Justin Shaw, 2003/01/31

Add comment

Tony C, 2004/10/08
Can you update this so it works if you have DSL or Cable modem, or if you are behind a router ? Gethostbyname() will only return the INTERNAL address of your machine, which is not addressable from the outside world, UNLESS you know your cable/DSL modem address.
Add comment

Give this a try ;), Charles Nichols, 2004/12/13
This will give you the ip or the gateway, which is what you need. Just replace ip=socket.gethostbyname(blah) with this code.

import os,string
address={}
cmd = 'c:/windows/system32/ipconfig.exe /all' # whatever your path
junk, txtOut = os.popen2(cmd)
for x in txtOut.readlines():
 if x.find('IP Address') != -1:
  address.setdefault('ip',x.split(':')[-1].strip())
 if x.find('Default Gateway') != -1:
  address.setdefault('gate',x.split(':')[-1].strip())
print address['gate']
ip=address['gate'] #replace the old ip way with this.
print address['ip']

Add comment

Detect current ip using http://checkip.dyndns.org, Jorge Besada, 2005/01/26
I added this function to read the ip address from http://checkip.dyndns.org def readip(): import re, urllib f = urllib.urlopen('http://checkip.dyndns.org') s = f.read() m = re.search('([\d]*\.[\d]*\.[\d]*\.[\d]*)', s) return m.group(0) and changed the calls to socket.gethostbyname(name) by calls to the new function. The start() function ended up like this: def start(): def getIP(name, path): ip = readip() print 'Current ip: '+str(ip) open(path,'w').write(ip) #Save the current IP address. out(name,Path_dat) def out(name, path, stat=1): while stat: cur_ip = open(path,'r').readline() new_ip = readip() if cur_ip==new_ip: print 'Sleeping...' time.sleep(15) # Sleep in seconds - adjust polling interval to your taste. print 'Polling: '+new_ip+', '+time.ctime() else: print 'IP address has changed: '+new_ip open(Path_log,'a').write(time.ctime()+'\nINFO: IP address has changed: '+new_ip) print 'sending notification...' for add in Address: mail(to=add,frm=Frm_add,subj='Message from '+name,body='New IP address: '+new_ip+' assigned to '+name, server=MailServer) getIP(name,Path_dat) stat=0 getIP(Name,Path_dat) Thanks for posting this useful program! Later I will work on updating the entry in www.dyndns.org, to have the complete package: detection of the IP change and update of the dns record in www.dyndns.org.
Add comment

Detect current ip using http://checkip.dyndns.org - fixed format, Jorge Besada, 2005/01/26

My previous post did not display well, this is the fixed and shortened version.
I added this function to read the ip address from
http://checkip.dyndns.org
There are other places that provide the same service (free); the function should work with many of them with minor o none modifications: it will parse the first occurrance of an ip-address like string and return it.

def readip():
import re, urllib
f = urllib.urlopen('http://checkip.dyndns.org')
s = f.read()
m = re.search('([\d]*\.[\d]*\.[\d]*\.[\d]*)', s)
return m.group(0)

I changed the calls to socket.gethostbyname(name) by calls to the new function readip()

Thanks for posting this useful program! Later I will work on updating the entry in www.dyndns.org, to have the complete package: detection of the IP change and update of the dns record in www.dyndns.org.


Add comment

How can i check the change of ip adrress of a remote machine, muttu math, 2006/09/13
I have some 10 machines in my network, and two machines ip adresses are overlapping with each other, so i want to know which are the two machines among those 10 machines that have the same ip adresses. Yogi
Add comment

Re: Detect current ip using http://checkip.dyndns.org, Ayaz Ahmed Khan, 2007/04/04
This piece of code is simpler and cleaner:

In [18]: import urllib2
In [20]: urllib2.urlopen('http://whatismyip.org').read()
Out[20]: 'xxx.yyy.zzz.www'
--
Ayaz Ahmed Khan
Add comment



Highest rated recipes:

1. A simple XML-RPC server

2. Web service accessible ...

3. Wrapping template engine ...

4. Assignment in expression

5. SOLVING THE METACLASS ...

6. Povray for python

7. Calling Windows API ...

8. Generic filter logic ...

9. Function Decorators by ...

10. MS SQL Server log monitor




Privacy Policy | Email Opt-out | Feedback | Syndication
© 2006 ActiveState Software Inc. All rights reserved.