The preseed_fetch script takes a source and destination address, and
copies the specified file from the source to the destination. It also
takes an optional checksum as a third parameter.
fetch-url from di-utils actually does the heavy lifting, with
preseed_fetch only adding the relative path functionality.
preseed_fetch accepts the same options (-r -c) as fetch-url which are
documented in the debian-installer-utils source, in the README file.
The source can be a fully qualified URL, an absolute path, or a relative path.
If the source is not a full URL, the contents of /var/run/preseed.last_location
is used to construct one before proceeding further.
This is done as follows:
if the source is a relative path, the contents of preseed.last_location
is stripped of its last slash and beyond, and the relative path is
appended to it.
if the source starts with a /, and preseed.last_location does not
contain '/./' anywhere in it, the content of preseed.last_location is
truncated at the start of the path component, and the source is appended
If on the other hand, the content of preseed.last_location does contain
'/./', this is used as the point to truncate it at. This allows a
chroot-style offset into the directory tree.
source last_location actual source
====== ============= =============
http://foo.com/bar/baz whatever http://foo.com/bar/baz
/local/path http://foo.com/bar/baz http://foo.com/local/path
local/path http://foo.com/bar/baz http://foo.com/bar/local/path
/local/path http://foo.com/wibble/./bar/baz http://foo.com/wibble/local/path
/local/path file:///bar/baz file:///local/path
Once the full URL is known, we select a method based on it, source its
file, and execute the protocol_fetch function defined therein.
As seen with the floppy method, if special processing is needed to ensure
that the files are available, this can be done thus:
floppy://foo/bar which mounts the floppy (to /media), then does a file copy
BTW the value of preseed/last_location defaults to file:///, which
should ensure vaguely normal behaviour if it is somehow invoked before
one of the preseed postinst scripts. Once we get into preseeding via
the preseed.sh script, it will get set to the most recently fetched
preseed/include. There are some slight wrinkles to this at present:
if you invoke preseed_fetch in a preseed/include_command you'll probably
have to specify a full path, or be very careful about the order that
things get done, because you'll probably be using the last_location
one older than you might expect (but using preseed_fetch in such a place
would be very naughty, so just don't :-)