I intend to put my Raspberry Pies to work as intelligent controllers.
As long as they stay at home I can easily keep track of the IP addresses they get from my modem.
However as soon as my Pies start roaming the world and get connected to strange networks it is not that simple any more.
This little script will help you determine the IP address the Raspberry Pi has received.
As soon as the Raspberry Pi receives an IP address from the network's DHCP server it will send a Tweet, telling what IP address it has received.
It can even tell you with what IP address it is now connected to the internet if you want to.
Below you see the listing of the tweetmyip.sh script. Copy and paste it in your Pi's text editor and change 2 or 3 of the configuration variables. RPINAME holds a name with which you can identify your Raspberry Pi's tweets, just in case you've got more than one tweeting Raspberry Pi. TWEET holds the name of your twitter sending script, including its path, which can be found elsewhere on my site. If you want to use a specific identity to tweet from you can include the -i identity argument at the end of this variable. PUBLICIP holds either "yes" or something else. If it holds "yes" your Pi will tweet both its private and public IP addresses. If it holds something else, like "no", it will only tweet its private IP address.
#! /bin/bash # tweetmyip.sh # # This script sends a tweet every time the network comes up. # The tweet contains a time stamp and the obtained IP address. # # Use: tweetmyip.sh [interfacename] # # Author: San Bergmans # www.sbprojects.net # # Configuration variables RPINAME="MyPi" TWEET="/home/pi/bin/twitter.py -i identity -m" SHOWPUBLICIP="no" # Get interface name from parameters if [ $# -eq 0 ] then IFC="eth0" else IFC="$1" fi ifconfig $IFC &> /dev/null if [ $? -ne 0 ] then exit 1 fi # Get current private IP address for select interface PRIVATE=$(ifconfig $IFC | grep "inet addr:" | awk '{ print $2 }') PRIVATE=${PRIVATE:5} IPV6=$(ifconfig $IFC | grep "Scope:Global") | awk '{ print $3 }' | awk -F/ '{ print $1 }' # Exit if IP address is empty if [ -z $PRIVATE ] then exit 0 fi # Wait about 2 minutes for the RTC to be set after boot (in steps of 10 seconds) for I in {1..12} do sleep 10 if [ $(date +%Y) != "1970" ] then # Yes! The clock is set. Now it's time to send the tweet if [ $SHOWPUBLICIP = "yes" ] then PUBLIC=$(curl -s checkip.dyndns.org|sed -e 's/.*Current IP Address: //' -e 's/<.*$//') MSG="$(date +%F\ %T) $RPINAME $IFC now has IP-Address $PRIVATE. Its public address is $PUBLIC." else MSG="$(date +%F\ %T) $RPINAME $IFC now has IP-Address $PRIVATE" fi $TWEET "$MSG" exit 0 fi done
First the script will try to find out what network card's IP address you're interested in.
If you didn't provide a network card when calling the script, it will default to eth0.
The script will simply end if you provide a non existent network card name.
Then the script filters the private IP address from the output of the ifconfig command.
In case no IP address has been received, the script will simply exit.
No IP address means no connection to the internet.
No connection to the internet means we won't be able to tweet anyway.
Then the script enters a for loop, which is repeated a maximum of 12 times.
Each loop lasts 10 seconds, which means that the loop can take up to 2 minutes to execute.
During this delay we wait for the Real Time Clock to get a valid time.
Just after booting the Raspberry Pi will have an invalid time (date is 1970) because it has no hardware clock.
The script will tweet the current IP address as soon as the date is no longer 1970.
After that the script will exit.
If the clock isn't set within 2 minutes the script will end, without tweeting anything.
The script also collects the IPv6 address of your Raspberry Pi, however it won't tweet that.
I don't like my private address to be tweeted, for obvious security reasons.
A global IPv6 address can be just as dangerous to reveal to the world as your public IPv4 address.
If you don't mind that your public address is known to the entire universe, feel free to add the IPv6 address to the output too.
So far we've got a script, but that won't run of its own accord. Previously I have used the so called if-up hook directory. This is a special directory called /etc/network/if-up.d. Any script put in there will be run whenever a network card comes up, any network card. This limits your control on what network cards you're interested in. I'm not interested in the lo network card for instance.
I now call the script by the post-up in /etc/network/interfaces Below you'll find an example interfaces file. Simply add the post-up line after every interface you're interested in.
auto lo iface lo inet loopback auto eth0 iface eth0 inet dhcp post-up /home/pi/bin/tweetmyip.sh eth0 & auto wlan0 allow-hotplug wlan0 iface wlan0 inet manual wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf iface default inet dhcp post-up /home/pi/bin/tweetmyip.sh wlan0 &
Important note: The auto ... lines are necessary for the post-up scripts to be executed!
Please note that this is only an example file, showing you where and how to call the tweetmyip.sh script.