A
long time ago,
I wrote:
In these days of VPN, IPsec, dynamic routing, tunnels, IPv6,
and autoconfiguration protocols, one would expect that it would be
possible to configure a laptop to find all kinds of hosts automatically,
both for those that are network-specific (proxy servers, NNTP-servers),
and for those that are not (mail servers, version control systems,
...).
I then went on to say that I could not, at the time, expect my laptop
to find those networks by itself; every time I logged on to some
network, I had to set up at least two SSH tunnels.
I received a lot of feedback to that post, and I now do have my
laptop set up so that it configures itself automatically if necessary.
Well, almost; see below. This is what I've done:
I don't use ifupdown on my laptop anymore. The package is installed
and configures my
lo interface, but that's it—nothing
else. Instead, I'm using
whereami to
configure my network cards. Whereami is an excellent piece of software
that is configured through two configuration files:
detect.conf
and
whereami.conf. The former has a pretty peculiar syntaxis,
which you'll need to get used to at first; but it's very powerful. There
are a few things you can do in detect.conf:
- Run tests. A test will check whether a condition is true, and
set a
location
based on the result. An example of a test could
be
testmii eth0 lan
which checks whether the MII detects a cable (testmii
)
on eth0, and will set the lan
location if that is true.
Tests are the raison d' tre of detect.conf; the point is to run
as many relevant tests as possible, to get as much information as
possible about the location where you are; that way, you can configure
the system later on from whereami.conf (see below). There's other things
like testdhcp (check for the presence and/or the returned IP
address of a DHCP server), testap (test for the presence of an
Access Point), testmodule (check whether something
loaded a given kernel module), or even testarp if you're
desperate (to test whether a node with a given MAC address lives on the
network).
- Checking locations. For instance, you might want to run
testdhcp on eth0 only if the location lan is
set already. This way, you don't get timeouts if you're on the train or
anything. Checking locations is done with if <location> ...
elif <location> ... else ... fi. Which is to say, you get a
multi-line block of if structures, in which you can then run
other tests conditionally. I'm just too lazy to write it out here
:-)
Unfortunately, it is not possible to nest if
structures in detect.conf; but I don't think it's actually necessary for
the detection (it might be nice for whereami.conf later on, but
there the issues can be worked around).
- There's also the possibility to do things like setting environment
variables, default locations, and some similar housekeeping things.
It is possible to set more than one location from
detect.conf; for example, right now my laptop claims it's at
werk,dhcp,lan. At home, it detects it's at
thuis,dhcp,lan—unless I use my wireless interface, in
which case it detects it's at
zd1211,thuis,wlan,dhcp,wdhcp
After whereami finished the tests in
detect.conf, your
network should be working (provided you have a network cable plugged in,
or are in the vicinity of an AP that you can connect to). Next, it will
process
whereami.conf. The genius of
whereami probably
lies in
whereami.conf: this is a simple shellscript, but every
line can be preceded by one of +, -, or =, followed by a location. For
example, I have (amongst other things) this set up in my
whereami.conf:
+lan ln -sf /etc/news/leafnode/config.generic /etc/news/leafnode/config
+werk ln -sf /etc/news/leafnode/config.werk /etc/news/leafnode/config
+thuis ln -sf /etc/news/leafnode/config.thuis /etc/news/leafnode/config
Whereami will check this file for any lines that start with '+'
followed by a location it's going to,
or '-' followed by a
location it's leaving from,
or '=' followed by a location it's
either leaving from, going to, or staying at. It then removes the +/-/=
plus the location, and dumps the rest of the line to a file; that file
is then ran as a shell script. In other words, the above code will
overwrite my /etc/news/leafnode/config with an appropriate
configuration, depending on what network I'm entering.
I don't have to reconfigure NNTP servers anymore. Nor do I need to
set up any tunnels—whereami does all of this for me, and more.
Next, since a few weeks, I've also added ifplugd. Previously, when I
would get my laptop to resume from swsusp, I would need to manually run
whereami afterwards; with ifplugd, this is no longer
necessary—I just removed the ifupdown script in
/etc/ifplugd/action.d, and replaced it with a whereami script that I
quickly wrote myself (not as if it's hard, obviously).
There's just one thing left: the proxy server. There are just way too
many programs that one needs to configure to use a proxy server (or not)
in Linux; and though it's possible to configure a proxy server by
letting firefox "detect" it, I have no clue how that's done.
Additionally, programs that use proxy servers through environment
variables can
not be reconfigured, unless one logs off and on
again.
I guess I'm looking for something that will do transparent proxying
if there's a proxy server on the network, or just forward the requests
to the remote server if not. But that's for another time.