-
-
Save Morrolan/2987424 to your computer and use it in GitHub Desktop.
#!/usr/bin/python | |
# The idea behind this script is if plugging a RaspberryPi into a foreign network whilst running it headless | |
# (i.e. without a monitor/TV), you need to know what the IP address is to SSH into it. | |
# | |
# This script emails you the IP address if it detects an ethernet address other than it's usual address | |
# that it normally has, i.e. on your home network. | |
import smtplib, string, subprocess, time | |
################################################ | |
###### Remember to set all constants here ###### | |
################################################ | |
FIXED_IP = '10.0.1.2' | |
IP_FILEPATH = '/home/pi/current_ip.txt' | |
SMTP_USERNAME = '[email protected]' | |
SMTP_PASSWORD = 'password' | |
SMTP_RECIPIENT = '[email protected]' | |
SMTP_SERVER = 'smtp.gmail.com' | |
SSL_PORT = 465 | |
################################################ | |
adapter = 'eth0:' | |
ipaddr_string = 'ip -4 addr > ' + IP_FILEPATH | |
subprocess.call(ipaddr_string, shell=True) | |
inet_string = '' | |
ip_file = file(IP_FILEPATH, 'r') | |
for line in ip_file: | |
if adapter in line: | |
inet_line = ip_file.next() | |
_time = time.asctime() | |
inet_string = inet_line[9:(inet_line.index('/'))] | |
if inet_string != FIXED_IP: | |
p = subprocess.Popen(["runlevel"], stdout=subprocess.PIPE) | |
out, err=p.communicate() | |
print out | |
print out[2] | |
if out[2] == '0': | |
print 'Halt detected' | |
exit(0) | |
if out [2] == '6': | |
print 'Shutdown detected' | |
exit(0) | |
SUBJECT = 'IP Address from Raspberry Pi at: %s' % time.asctime() | |
TO = SMTP_RECIPIENT | |
FROM = SMTP_USERNAME | |
text = 'The IP address is: %s' % inet_string | |
BODY = string.join(( | |
'From: %s' % FROM, | |
'To: %s' % TO, | |
'Subject: %s' % SUBJECT, | |
'', | |
text | |
), '\r\n') | |
server = smtplib.SMTP_SSL(SMTP_SERVER, SSL_PORT) | |
server.login(SMTP_USERNAME, SMTP_PASSWORD) | |
server.sendmail(FROM, [TO], BODY) | |
server.quit() | |
print '[' + '\033[36;1m' + 'info' + '\033[0m' + ']' + ' Emailing eth0 IP address ' + inet_string + ' to ' + TO + ' from ' + FROM | |
elif inet_string == FIXED_IP: | |
print '[' + '\033[32;1m' + ' ok ' + '\033[0m' + ']' + ' Normal IP address' + inet_string + 'found' | |
else: | |
print '[' + '\033[31;1m' + 'warning' + '\033[0m' + ']' + adapter +' not found in file!' | |
ip_file.close() | |
Problem - you forget to import the modules you need up at the start.
Also as-is it sent me multiple mails, most w/ blank IP. So I add a check to make sure the IP is non-blank before sending it.
Finally it seems to mail me twice. Like it runs 2 times during boot. Weirdness.
Hi - I've slightly rewritten the original gist to make it a little clearer - when it prints at startup it also prints coloured text like the proper boot procedure.
Samuel - please see this gist I've created for you - it doesn't require SSL as it uses plain SMTP - hopefully this should fix your problem.
https://gist.github.com/3201741
sdcharle - have you set the script to run in .bashrc or .bash_profile at all? If it is mailing you twice, delete the scripts from /etc/init.d/ completely, then try again. If it stops emailing you at that point, try going through the process again.
Hope this helps!
FeersumEndjinn / Morrolan
sdcharle - please can you send me your ammendment to check for a blank IP, and I'll add it into this gist?
Regards,
Morrolan
Hi, which lines do I have to change for the following?
-my ISP has a SMTP server that doesn't work over SSL and it doesn't need authentication
-I'd like it to always send me the IP, no matter what