So far, our laptop will configure its interfaces for any combination of docked/undocked and PCMCIA ethercard inserted/removed. This is good, but not quite a solution to the problem. We need to keep the PCMCIA card from being configured if the laptop is in the docking station. This seems difficult, given that ifupdown processes each interface individually and provides no context information.
Fortunately, the iface stanza provides the pre-up command. The pre-up command tells ifupdown to run an arbitrary program before brining an interface up. If the command fails, ifupdown will abort the operation and not even attempt to bring that interface up. It seems, then, that we should be able to run some kind of "dock query" in the card configuration to check for the absence of the dock before proceeding. For example:
iface card inet dhcp pre-up check-nodockBut what facilities are available to check for the dock? Again, the provided examples give us a start. The check-mac-address.sh example script takes a kernel interface name and MAC address and uses ifconfig to compare them. It returns success if they match, failure otherwise. If we create a script, ncheck-mac-address.sh, that, instead, returns success only if they don't match, then we could do this:
iface card inet dhcp pre-up /usr/local/sbin/ncheck-mac-address.sh eth0 00:20:E0:64:0B:28which works for our specific case but would break if the docking ethernet interface were assigned to eth1 (say, after a kernel recompile). A solution might exist, however, by revisiting our mapping. We can distinguish the exact interface with which our dock might be associated by using:
mapping eth0
script /usr/local/sbin/get-mac-address.sh
map 00:50:DA:EB:41:73 card0
map 00:20:E0:64:0B:28 dock
mapping eth1
script /usr/local/sbin/get-mac-address.sh
map 00:50:DA:EB:41:73 card1
map 00:20:E0:64:0B:28 dock
This gives us two logical interfaces for the PCMCIA card, card0 and
card1, which express which kernel interface is assigned to the
card (and thus, which one isn't assigned to the dock).
Now the rest is pretty easy. Create two card iface stanzas that check for the presence of the dock on the opposite interface:
# card found on eth0
iface card0 inet dhcp
# check that eth1 is not dock
pre-up /usr/local/sbin/ncheck-mac-address.sh eth1 00:20:E0:64:0B:28
# card found on eth1
iface card1 inet dhcp
# check that eth0 is not dock
pre-up /usr/local/sbin/ncheck-mac-address.sh eth0 00:20:E0:64:0B:28
# always configure dock if its there.
iface dock inet static
address 10.177.100.97
netmask 255.255.255.0
gateway 10.177.100.1
Voila! The PCMCIA card won't be configured unless the the laptop is
undocked.
10/08/2002 Greg Wiley