Let experimenters customize prepare, and interface and hosts file setup.
The prepare script now supports pre and post hooks. It runs all hooks in rc order, from the DYNRUNDIR/prepare.pre.d and BINDIR/prepare.pre.d dirs (rc order in this case is the BSD order, or my version of it --- any file prefixed with a number is run in numeric order; other files are run sorted alphabetically following numeric files). Post hooks are in prepare.post.d, and are run at the end of prepare. (DYNRUNDIR is always /var/run/emulab . STATICRUNDIR is usually /etc/emulab/run but could be /etc/testbed/run, depending on the clientside installation.) We now allow users to override our default interface configuration -- and if they do, and tell us about it by writing a file in either $DYNRUNDIR or $STATICRUNDIR named interface-done-$mac , we will not attempt to configure it, and will assume they have done it! If they are nice to us and write $iface $ipaddr $mac into the file, we will parse that and put it into the @ifacemap and %mac2iface structures in doboot(). We do *not* attempt to provide them the ifconfig info in env vars or anything; they have to grok our ifconfig file format, in all its potential glory. We read the hosts.head file(s) from /etc, DYNRUNDIR, and STATICRUNDIR, and prepend them to our Emulab hosts content. Then, we append the content of the hosts.tail file(s) from /etc, DYNRUNDIR, and STATICDIR --- and that file becomes the new /etc/hosts file. getmanifest() has become getrcmanifest() to avoid confusion with the GENI manifest. Also, it now supports local manifests embedded in the filesystem from $DYNRUNDIR and $STATICRUNDIR (priority is manifest from exp, then DYNRUNDIR, then STATICRUNDIR). All manifests read and applied. Local manifests may also reference local files instead of blob ids, of course. It is important to support local manifests so that experimenters can hook our services by default in the disk image.