Browse Source
url-lib adds some functions for dealing with URLs (mostly for fetching files, for the moment). It uses curl to handle http/https/ftp URLs, but it can be extended by other modules at runtime by using the "add_url_handler" function. Signed-off-by: Will Woods <wwoods@redhat.com>master


2 changed files with 90 additions and 0 deletions
@ -0,0 +1,24 @@ |
|||||||
|
#!/bin/bash |
||||||
|
# module-setup for url-lib |
||||||
|
|
||||||
|
check() { |
||||||
|
command -v curl >/dev/null || return 1 |
||||||
|
return 255 |
||||||
|
} |
||||||
|
|
||||||
|
depends() { |
||||||
|
echo network |
||||||
|
return 0 |
||||||
|
} |
||||||
|
|
||||||
|
install() { |
||||||
|
inst "$moddir/url-lib.sh" "/lib/url-lib.sh" |
||||||
|
dracut_install curl |
||||||
|
mkdir -m 0755 -p "$initdir/etc/ssl/certs" |
||||||
|
if ! inst_any -t /etc/ssl/certs/ca-bundle.crt \ |
||||||
|
/etc/ssl/certs/ca-bundle.crt \ |
||||||
|
/etc/ssl/certs/ca-certificates.crt; then |
||||||
|
dwarn "Couldn't find SSL CA cert bundle; HTTPS won't work." |
||||||
|
fi |
||||||
|
} |
||||||
|
|
@ -0,0 +1,66 @@ |
|||||||
|
#!/bin/bash |
||||||
|
# url-lib.sh - functions for handling URLs (file fetching etc.) |
||||||
|
# |
||||||
|
# Authors: |
||||||
|
# Will Woods <wwoods@redhat.com> |
||||||
|
|
||||||
|
type mkuniqdir >/dev/null 2>&1 || . /lib/dracut-lib.sh |
||||||
|
|
||||||
|
# fetch_url URL [OUTFILE] |
||||||
|
# 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. |
||||||
|
# the return values are as follows: |
||||||
|
# 0: success |
||||||
|
# 253: unknown error (file missing) |
||||||
|
# 254: unhandled URL scheme / protocol |
||||||
|
# 255: bad arguments / unparseable URLs |
||||||
|
# other: fetch command failure (whatever curl/mount/etc return) |
||||||
|
fetch_url() { |
||||||
|
local url="$1" outloc="$2" |
||||||
|
local handler="$(get_url_handler $url)" |
||||||
|
[ -n "$handler" ] || return 254 |
||||||
|
[ -n "$url" ] || return 255 |
||||||
|
$handler "$url" "$outloc" |
||||||
|
} |
||||||
|
|
||||||
|
# get_url_handler URL |
||||||
|
# returns the first HANDLERNAME corresponding to the URL's scheme |
||||||
|
get_url_handler() { |
||||||
|
local scheme="${1%%:*}" item="" |
||||||
|
for item in $url_handler_map; do |
||||||
|
[ "$scheme" = "${item%%:*}" ] && echo "${item#*:}" && return 0 |
||||||
|
done |
||||||
|
return 1 |
||||||
|
} |
||||||
|
|
||||||
|
# add_url_handler HANDLERNAME SCHEME [SCHEME...] |
||||||
|
# associate the named handler with the named scheme(s). |
||||||
|
add_url_handler() { |
||||||
|
local handler="$1"; shift |
||||||
|
local schemes="$@" scheme="" |
||||||
|
set -- |
||||||
|
for scheme in $schemes; do |
||||||
|
set -- "$@" "$scheme:$handler" |
||||||
|
done |
||||||
|
set -- $@ $url_handler_map # add new items to *front* of list |
||||||
|
url_handler_map="$@" |
||||||
|
} |
||||||
|
|
||||||
|
curl_args="--location --retry 3 --fail --show-error" |
||||||
|
curl_fetch_url() { |
||||||
|
local url="$1" outloc="$2" |
||||||
|
if [ -n "$outloc" ]; then |
||||||
|
curl $curl_args --output "$outloc" "$url" || return $? |
||||||
|
else |
||||||
|
local outdir="$(mkuniqdir /tmp curl_fetch_url)" |
||||||
|
local cwd="$(pwd)" |
||||||
|
cd "$outdir" |
||||||
|
curl $curl_args --remote-name "$url" || return $? |
||||||
|
cd "$cwd" |
||||||
|
outloc="$(echo $outdir/*)" |
||||||
|
fi |
||||||
|
[ -f "$outloc" ] || return 253 |
||||||
|
echo "$outloc" |
||||||
|
} |
||||||
|
add_url_handler curl_fetch_url http https ftp |
Loading…
Reference in new issue