diff options
author | Luke Shumaker <lukeshu@sbcglobal.net> | 2016-07-08 22:22:10 -0400 |
---|---|---|
committer | Luke Shumaker <lukeshu@sbcglobal.net> | 2016-07-08 22:22:10 -0400 |
commit | 74c8f507cc4b5a16312da7a3c02a26d19abbdb02 (patch) | |
tree | b5babf0068628265ecd829bdf5e78e8e0282029d | |
parent | 7d7ffaef3f628af20278c37513819f2456d7b49f (diff) |
work on it
-rwxr-xr-x | 50pristine-etc-keeper.post-install | 6 | ||||
-rwxr-xr-x | pristine-etc-keeper | 91 | ||||
-rw-r--r-- | pristine-etc-keeper.service | 8 | ||||
-rw-r--r-- | pristine-etc-keeper.timer | 4 |
4 files changed, 85 insertions, 24 deletions
diff --git a/50pristine-etc-keeper.post-install b/50pristine-etc-keeper.post-install index 5031ec3..34c4f77 100755 --- a/50pristine-etc-keeper.post-install +++ b/50pristine-etc-keeper.post-install @@ -1,6 +1,10 @@ #!/usr/bin/env bash # Copyright 2016 Luke Shumaker -# see /etc/etckeeper/pristine-etc-keeper + +exec 8>/var/lib/pristine-etc/lock +flock -x -n 8 +echo 'etckeeper post-install' >> /var/lib/pristine-etc/spool +exec 8>&- systemctl reset-failed pristine-etc-keeper.service &>/dev/null || true systemctl start pristine-etc-keeper.service diff --git a/pristine-etc-keeper b/pristine-etc-keeper index 68798e2..2a1d51f 100755 --- a/pristine-etc-keeper +++ b/pristine-etc-keeper @@ -3,33 +3,78 @@ # # This script gets called by the etckeeper post-install hook. -# TODO: this script does not handle creating /var/lib/pristine-etc; it -# assumes that it already exists. Especially note setting up .git/hooks/pre-commit +# TODO: better error handling -cd /var/lib/pristine-etc +commit() ( + local msg="$1" -umask 0022 + cd /var/lib/pristine-etc + if ! [[ -d etc.git ]]; then + mkdir -p etc + (cd etc && etckeeper init -d "$PWD") + mv etc/.git etc.git + ln -sr etc.git etc/.git + fi + + rm -rf etc/ + + pacman -Q | while read -r pkgname pkgver; do + file=("/var/cache/pacman/pkg/$pkgname-$pkgver"-*.pkg.tar.*) + pacman -Qlq "$pkgname"|grep ^/etc/|sed "s|^/|$file |" + done | while read -r tarfile etcfile; do + if [[ "$etcfile" = */ ]]; then + mkdir -p "$etcfile" + else + bsdtar xpfv "$tarfile" "$etcfile" + fi + done + + touch etc/.gitignore + ln -sr etc.git etc/.git + + cd etc/ + if etckeeper unclean -d "$PWD"; then + etckeeper commit -d "$PWD" "$msg" + fi +) + +pull() ( + cd /etc + git remote add pristine /var/lib/pristine-etc/etc &>/dev/null || true + git fetch pristine +) + +lock() { + exec 8>/var/lib/pristine-etc/lock + flock -x -n 8 +} -mv -T etc/.git etc.git -rm -rf etc/ +unlock() { + exec 8>&- +} -pacman -Q | while read -r pkgname pkgver; do - file=("/var/cache/pacman/pkg/$pkgname-$pkgver"-*.pkg.tar.*) - pacman -Qlq "$pkgname"|grep ^/etc/|sed "s|^/|$file |" -done | while read -r tarfile etcfile; do - if [[ "$etcfile" = */ ]]; then - mkdir -p "$etcfile" - else - bsdtar xpfv "$tarfile" "$etcfile" +main() { + set -e + umask 0022 + + if [[ $# -gt 0 ]]; then + lock + printf '%s\n' "$*" >> /var/lib/pristine-etc/spool + unlock fi -done -touch etc/.gitignore -mv -T etc.git etc/.git -cd etc/ -if etckeeper unclean -d "$PWD"; then - etckeeper commit -d "$PWD" 'pristine commit' -fi + while true; do + lock + if ! [[ -f /var/lib/pristine-etc/spool ]]; then + exit 0 + fi + msg="$(cat /var/lib/pristine-etc/spool)" + rm -f /var/lib/pristine-etc/spool + unlock + + commit "$msg" + pull + done +} -cd /etc -git fetch --all +main "$@" diff --git a/pristine-etc-keeper.service b/pristine-etc-keeper.service index f4f57e5..2d3dc51 100644 --- a/pristine-etc-keeper.service +++ b/pristine-etc-keeper.service @@ -1,6 +1,14 @@ # Copyright 2016 Luke Shumaker [Unit] Description=Autocommit of changes in pristine /etc directory +Documentation=man:pristine-etc-keeper(8) +DefaultDependencies=no +Conflicts=shutdown.target +After=local-fs.target time-sync.target +Before=shutdown.target [Service] +# Can't use Type=oneshot because that would block when starting +Type=simple ExecStart=/etc/etckeeper/pristine-etc-keeper +IOSchedulingClass=idle diff --git a/pristine-etc-keeper.timer b/pristine-etc-keeper.timer index 1ee6b11..c08ccbc 100644 --- a/pristine-etc-keeper.timer +++ b/pristine-etc-keeper.timer @@ -1,4 +1,8 @@ # Copyright 2016 Luke Shumaker + +# This unit shouldn't be nescessary; the etckeeper post-install hook +# should take care of everthing, but have this just to be safe. + [Unit] Description=Weekly autocommit of changes in pristine /etc directory Documentation=man:pristine-etc-keeper(8) |