OpenBSD efficient packages updater
https://dataswamp.org/~solene/2021-08-15-openbsd-pkgupdate.html
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
114 lines
2.5 KiB
114 lines
2.5 KiB
#!/bin/sh |
|
|
|
INSTALLURL=$(awk '/^./ && ! /^#/ { print ; exit }' /etc/installurl) |
|
export PKG_PATH="${INSTALLURL}/$(uname -r)/packages-stable/$(machine)/" |
|
|
|
CACHE_DIR=/var/cache/pkgupdate/ |
|
SILENT=0 |
|
|
|
|
|
# hide output if SILENT is activated |
|
silent() { |
|
if [ "$SILENT" -eq 0 ] |
|
then |
|
echo "$1" |
|
fi |
|
} |
|
|
|
# curl can only be used for http:// , it's quite complicated with https:// |
|
# due to the way pkg_add calls $FETCH_CMD |
|
def_curl() { |
|
if type curl 2> /dev/null >/dev/null |
|
then |
|
export FETCH_CMD="/usr/local/bin/curl -L -s -q -N" |
|
fi |
|
} |
|
|
|
check_cache() { |
|
# creating cache directory |
|
if ! install -d -o root -g wheel -m 755 ${CACHE_DIR} |
|
then |
|
echo "Error when creating the cache directory ${CACHE_DIR}" |
|
exit 1 |
|
fi |
|
|
|
ftp -o - "$PKG_PATH" 2>/dev/null | grep tgz > ${CACHE_DIR}/index.now |
|
if [ $? -eq 0 ] |
|
then |
|
|
|
# check if we already used pkgupdate |
|
if [ ! -f ${CACHE_DIR}/index.previous ] |
|
then |
|
# first time we use it |
|
mv ${CACHE_DIR}/index.now ${CACHE_DIR}/index.previous |
|
else |
|
# compare current output with the previous one |
|
# if they are identical, no changes has been done |
|
if cmp ${CACHE_DIR}/index.now ${CACHE_DIR}/index.previous |
|
then |
|
rm ${CACHE_DIR}/index.now |
|
silent "No changes on the mirror." |
|
exit 0 |
|
else |
|
mv ${CACHE_DIR}/index.now ${CACHE_DIR}/index.previous |
|
fi |
|
fi |
|
else |
|
echo "error when downloading the index, return $?" |
|
exit 1 |
|
fi |
|
} |
|
|
|
do_http() { |
|
silent "Updating using $1 protocol" |
|
check_cache |
|
def_curl |
|
pkg_add -u 2>&1 | grep -v "^Couldn't find updates for " |
|
} |
|
|
|
do_https() { |
|
silent "Updating using $1 protocol" |
|
check_cache |
|
pkg_add -u 2>&1 | grep -v "^Couldn't find updates for " |
|
} |
|
|
|
unsupported() { |
|
echo "protocol not supported: $1" |
|
exit 1 |
|
} |
|
|
|
unknown() { |
|
echo "protocol not known for $1" |
|
exit 1 |
|
} |
|
|
|
|
|
if [ "$(id -u)" -ne 0 ] |
|
then |
|
echo "You need to run $0 as root" |
|
exit 1 |
|
fi |
|
|
|
if [ "$1" = "-q" ] |
|
then |
|
SILENT=1 |
|
fi |
|
|
|
if sysctl kern.version | grep -E -- "(-current|-beta)" >/dev/null |
|
then |
|
silent "Enabling -current mode" |
|
export PKG_PATH="${INSTALLURL}/snapshots/packages/$(machine)/" |
|
fi |
|
|
|
case "$INSTALLURL" in |
|
http://*) do_http "http://" |
|
;; |
|
https://*) do_https "https://" |
|
;; |
|
ftp://*) unsupported ftp |
|
;; |
|
scp://*) unsupported scp |
|
;; |
|
*) unknown "$INSTALLURL" |
|
;; |
|
esac
|
|
|