Tapping the Power of Unix from Within Director - Part 1
December 22, 2004
by Cole Tierney
So _system.environmentPropList.internetConnected = #online. But are we really online? This system property tells us that the machine in question is capable of connecting to the internet. But this could be a laptop currently out of range of a wireless access point or otherwise not connected to a network. Or worse, this may be a machine with a dialup internet connection that happens to be offline at the time. Using GetNetText to sniff a text file on the internet may be sufficient most of the time, but what about modem users?
One solution is to use _system.environmentPropList.internetConnected in conjunction with DirectConnection xtra. But there is currently no MacOSX version available. Which brings me to the real purpose of this article. How to access the FreeBSD sub system of MacOSX with Valentin's shell xtra: http://valentin.dasdeck.com/xtras/shell_xtra/. This is just one example of the many goodies to be had under the hood of OSX!
First let's take a look at the command, netstat. This displays information about the machine's network status. The -r option will display the contents of the routing tables. (To get documentation on this command, open the terminal app and enter 'man netstat'. The 'man' keyword stands for 'manual'. You can use it with any command to see the documentation on that command).
When a network interface becomes active, the route daemon will update the routing tables. If the interface has a connection to the internet, a default route will be added. Here are my results while having an active connection: put shell_cmd("netstat -r")
-- "Routing tables Internet: Destination Gateway Flags Refs Use Netif Expire default 192.168.1.1 UGSc 7 1 en1 127 localhost UCS 0 0 lo0 localhost localhost UH 38 46834 lo0 169.254 link#5 UCS 0 0 en1 192.168.1 link#5 UCS 2 0 en1 192.168.1.1 0:c:42:d1:a4:ab UHLW 8 18 en1 743 192.168.1.50 localhost UHS 0 3 lo0 192.168.1.100 0:31:67:28:1f:6d UHLW 0 0 en1 637 [snip]
Now it may be tempting to crunch through this text with lingo's rich set of string functions, but unix has a sea of text handling functionality. The command 'grep' is a good example. Grep's purpose in life is to print lines containing certain patterns: Globally search for the Regular Expression and Print. Also unix lets you redirect the output of one command to the input of another with the pipe character, '|'. So here's how we could filter the output of the above command with grep. This statement will echo any line that starts with 'default' (case sensitive):
put shell_cmd("netstat -r | grep '^default'") -- "default 192.168.1.1 UGSc 7 1 en1"
If you're currently not connected to a TCP/IP network, the string should be empty. So the next natural step is to wrap it with a little more lingo:
on connected(me) return (shell_cmd("netstat -r | grep '^default'")) <> EMPTY) end
Parting notes: In your journeys, you may want to checkout the command, apropos. This comes in handy when you're looking for a command and you can't remember the exact wording. Just try something like 'apropos ifc'. Also install Apple's developer tools, if you haven't already. It includes lots of extra unix commands for dealing with mac files and resources. You'll also be able to compile open source projects.
Copyright 1997-2024, Director Online. Article content copyright by respective authors.