init
This commit is contained in:
parent
111af1d71f
commit
0e3787b8c1
2
LICENSE
2
LICENSE
|
@ -1,4 +1,4 @@
|
||||||
Copyright (c) <year> <owner> All rights reserved.
|
Copyright (c) 2021 Solène Rapenne All rights reserved.
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
|
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
|
39
README.md
39
README.md
|
@ -1,3 +1,38 @@
|
||||||
# pkgupdate
|
# Presentation
|
||||||
|
|
||||||
OpenBSD efficient stable updater
|
**pkgupdate** is a simple shell script meant for OpenBSD users of the stable branchs (people following releases) to easily keep their packages up to date.
|
||||||
|
|
||||||
|
It is meant to be run daily by cron on servers on at boot time for workstations (you can obviously configure it how you prefer).
|
||||||
|
|
||||||
|
# How?
|
||||||
|
|
||||||
|
**pkgupdate** uses 3 tricks to speed up the process, this is particularily important for workstations updating during the boot process:
|
||||||
|
|
||||||
|
- fetch the index of packages and compare it between runs (using a cache in `/var/cache/pkgupdate/`)
|
||||||
|
- if the index changed, which mean everytime a new package is updated, then it only try to update the packages available in the `packages-stable` directory
|
||||||
|
- if curl is installed, use curl instead of ftp(1) command
|
||||||
|
|
||||||
|
# Why?
|
||||||
|
|
||||||
|
This tool is based on solene@ previous work [faster packages updates](https://dataswamp.org/~solene/2021-08-06-openbsd-pkgadd-tuning-updates.html) and [pkg_add performance analysis](https://dataswamp.org/~solene/2021-07-08-openbsd-pkg_add_performance_analysis.html).
|
||||||
|
|
||||||
|
In my opinion, workstations should be updated as soon as possible, at boot time, to update packages at boot before using anything from the user session, avoiding a boring reboot.
|
||||||
|
|
||||||
|
As for servers, making the process faster is always welcome.
|
||||||
|
|
||||||
|
# Setup
|
||||||
|
|
||||||
|
First, use `git clone https://tildegit.org/solene/pkgupdate.git` and copy `pkgupdate` in `/usr/local/bin/`.
|
||||||
|
|
||||||
|
Best way to manage this is to use root's crontab. As root, type `crontab -e` to edit its tab.
|
||||||
|
|
||||||
|
```
|
||||||
|
# for updating on boot
|
||||||
|
@reboot /usr/local/bin/pkgupdate
|
||||||
|
|
||||||
|
# for updating every hour
|
||||||
|
@hourly /usr/local/bin/pkgupdate
|
||||||
|
|
||||||
|
# for updating every 6 hours
|
||||||
|
0 */6 * * * /usr/local/bin/pkgupdate
|
||||||
|
```
|
||||||
|
|
|
@ -0,0 +1,88 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
INSTALLURL=$(grep -v ^# /etc/installurl | head -n 1)
|
||||||
|
export PKG_PATH="${INSTALLURL}/$(uname -r)/packages-stable/$(machine)/"
|
||||||
|
|
||||||
|
CACHE_DIR=/var/cache/pkgupdate/
|
||||||
|
|
||||||
|
|
||||||
|
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
|
||||||
|
echo "No changes on the mirror."
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "error when downloading the index, return $?"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
do_http() {
|
||||||
|
echo "Updating using $1 protocol"
|
||||||
|
check_cache
|
||||||
|
def_curl
|
||||||
|
pkg_add -u 2>&1 | grep -v "^Couldn't find updates for "
|
||||||
|
}
|
||||||
|
|
||||||
|
do_https() {
|
||||||
|
do_http "https://"
|
||||||
|
}
|
||||||
|
|
||||||
|
unsupported() {
|
||||||
|
echo "protocol not supported: $1"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
unknown() {
|
||||||
|
echo "protocol not known for $1"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if sysctl kern.version | grep -- "-current" >/dev/null
|
||||||
|
then
|
||||||
|
echo "You can't use this on -current"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
case "$INSTALLURL" in
|
||||||
|
http://*) do_http "http://"
|
||||||
|
;;
|
||||||
|
https://*) do_https "https://"
|
||||||
|
;;
|
||||||
|
ftp://*) unsupported ftp
|
||||||
|
;;
|
||||||
|
scp://*) unsupported scp
|
||||||
|
;;
|
||||||
|
*) unknown "$INSTALLURL"
|
||||||
|
;;
|
||||||
|
esac
|
Loading…
Reference in New Issue