I have a MacBook running osx that I want to use as an nfs client. The server will be a linux box with a wake on lan card. Here's the idea. Run a cron command on the mac every minute that checks if I am on my home wireless network (the linux box is wired to the same router as the macbook gets wireless from). If this is true then check if the NFS mount from the linux box is mounted. If not ping the linux box. If the Macbook gets no ping send the magic packet to linux box and wake it up then wait for the linux box to boot and then mount the necessary NFS mounts.
When the linux box is on, run a cron command every minute to see if it is exporting NFS to the said Macbook (or i could just ping the macbook) If not (or no ping) have the linux box shut down in to a wakeable on lan state.
It looks as if I can pull the info as to wether or not my macbook is on my home wireless network from reading a line in traceroute. Then running showmount and then reading from the output if the NFS mount on the linux box is up. if neither of these are true then run ping, if no response send the magic packet to the linux box and start it up.
My main questions:
Has anyone already done this so I don't have to write the script?
Which sort of scripting should I use bash? pearl? python?
Are there any good tutorials out there that would help a newbee scripter accomplish this?
does anyone know what command i could run to see if the linux box is sucessufully exporting to the macbook, or would it just be easier to ping the macbook? and then use the response to shut down the linux box.
Here is something that might help you or get started:
/bin/ping -c 1 <Linux IP>
echo $?
if [ $? -ne 0 ] ; then
echo "Ping unsuccessful"
echo "Do other things here"
# run wake on lan command
showmount -e #to check for nfs
fi
Don't display status code before testing it, your test will test the status code of the echo command.
/bin/ping -c 1 <Linux IP>
ping_sts=$?
echo $ping_sts
if [ $ping_sts -ne 0 ] ; then
echo "Ping unsuccessful"
echo "Do other things here"
# run wake on lan command
showmount -e #to check for nfs
fi
Jean-Pierre: Sorry about that. I was just giving him some pointers, you are right, it will show echo's exit code.
So here is the explanaiton:
The ping sends just one packet to your desired IP address. It then gets an exit code on completion (like any other Unix program). You can then put the code in a variable (look at Jean-Pierre's post), other wise shell will forget about it.
"echo $ping_sts" displays the code.
If code is not zero, then there was a problem. An exit of zero means that program or utility ran without any problems, which is usually good. I'm being very general here, you may want to read up more on exit codes.
So "if $ping_sts is not equal to zero" then wake up the linux box and check for nfs exports.
Run "showmount -e <Linux IP>" on Mac, and it'll display exported shares on Linux. I have Mac, but I don't know any CLI utlity for Wake on Lan, you can find it on some Mac site. I have a Wake on lan for Linux, and I usually use my Linux to wake up the Mac.
Note: You cannot wake up systems using wireless cards, it's a wireless protocol limit. But you can wake up a wired system from a wireless system.
I'm still trying to get my head aroud the exit code so i understand it fully. Seems like I could have halved the amount of code if i used it. I'll try fiddling with it and get the script to work using exit codes instead of the half ass way I've got it running now.
but,
Here is what i ended up doing. This is my first script that is over about 3 lines long. I know there is a lot of room for improvement and that the writing to a file is a bit of a hack and, I'm sure full of security holes. Suggestions for improvement would be great. ( i did not include the NFS mount command as I have'nt got NFS working on the Apple yet)
#
# Script that checkins if computer is connected to a specific wireless network (dd-wrt
)
# and then checks to see if a specific ip adress is up(192.168.1.110)
# if the ip adress is down the magic packet is broadcasted in order boot the #approprate machine.
#
NETWORKCOMP="dd-wrt"
/usr/sbin/traceroute umu.se | grep dd-wrt > /tmp/netchk
grep "dd-wrt" /tmp/netchk | awk '{print $2}' > /tmp/netchk2
NETWORK=`cat /tmp/netchk2` # Set the network variable
if [ "$NETWORK" == "$NETWORKCOMP" ]; then
echo "You have access!"
# Remove the temp files
rm /tmp/netchk
rm /tmp/netchk2
GOODPING="icmp_seq=0"
/sbin/ping -c 1 192.168.1.110 | grep icmp > /tmp/pingchk
grep "icmp_seq=0" /tmp/pingchk | awk '{print $5}' > /tmp/pingchk2
REALPING=`cat /tmp/pingchk2`
if [ "$GOODPING" == "$REALPING" ]; then
echo "host is alive, no need to wake up!"
# Remove the temp files
rm /tmp/pingchk
rm /tmp/pingchk2
else
# Remove the temp files
rm /tmp/pingchk
rm /tmp/pingchk2
echo "Host is dead, CLEAR!!"
pythonw /sbin/wol.py
fi
else
echo "Network not found!"
# Remove the temp files
rm /tmp/netchk
rm /tmp/netchk2
fi