summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuke Shumaker <lukeshu@sbcglobal.net>2016-07-08 22:22:10 -0400
committerLuke Shumaker <lukeshu@sbcglobal.net>2016-07-08 22:22:10 -0400
commit74c8f507cc4b5a16312da7a3c02a26d19abbdb02 (patch)
treeb5babf0068628265ecd829bdf5e78e8e0282029d
parent7d7ffaef3f628af20278c37513819f2456d7b49f (diff)
work on it
-rwxr-xr-x50pristine-etc-keeper.post-install6
-rwxr-xr-xpristine-etc-keeper91
-rw-r--r--pristine-etc-keeper.service8
-rw-r--r--pristine-etc-keeper.timer4
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)