# fetch the given URL to a locally-visible location.
# if OUTFILE is given, the URL will be fetched to that filename,
# overwriting it if present.
+# If the URL is something mountable (e.g. nfs://) and no OUTFILE is given,
+# the server will be left mounted until pre-pivot.
# the return values are as follows:
# 0: success
# 253: unknown error (file missing)
url_handler_map="$@"
}
+### HTTP, HTTPS, FTP #################################################
+
curl_args="--location --retry 3 --fail --show-error"
curl_fetch_url() {
local url="$1" outloc="$2"
echo "$outloc"
}
add_url_handler curl_fetch_url http https ftp
+
+### NFS ##############################################################
+
+. /lib/nfs-lib.sh
+
+nfs_fetch_url() {
+ local url="$1" outloc="$2" nfs="" server="" path="" options=""
+ nfs_to_var "$url" || return 255
+ local filepath="${path%/*}" filename="${path##*/}"
+
+ # TODO: check to see if server:/filepath is already mounted
+ local mntdir="$(mkuniqdir /run nfs_mnt)"
+ mount_nfs $nfs:$server:$path${options:+:$options} $mntdir
+ # FIXME: schedule lazy unmount during pre-pivot hook
+
+ if [ -z "$outloc" ]; then
+ outloc="$mntdir/$filename"
+ else
+ cp -f "$mntdir/$filename" "$outloc" || return $?
+ fi
+ [ -f "$outloc" ] || return 253
+ echo "$outloc"
+}
+add_url_handler nfs_fetch_url nfs nfs4