[pmg-devel] [PATCH pmg-api v2] Use ucf to handle template overrides.

Stoiko Ivanov s.ivanov at proxmox.com
Wed Apr 8 19:40:51 CEST 2020


ucf(1) is a utility to track changes in config files which are not shipped in
the debian package (but e.g. get generated through the postinst script)

While the template overriding mechanism of PMG does not directly write those
config files - users who override a config-file currently need to manually
compare the templates shipped in '/var/lib/pmg/templates' on every upgrade.

By selectively registering the existing template overrides with ucf, users get
asked once upon the next upgrade regarding their changes, and then will
always get prompted when the shipped default template changes.

The alternative of unconditionally registering all templates with ucf, as done
by dh_ucf (1), would copy all templates to /etc/pmg/templates, which I deemed
less elegant.

The postrm script's check for the existance of 'ucf' only should be sufficient,
since the other ucf executables used ('ucfq' and 'ucfr' are all shipped with
the 'ucf' package)

Signed-off-by: Stoiko Ivanov <s.ivanov at proxmox.com>
---
v1 -> v2
* incorporated Fabian's feedback (much thanks! it looks quite a bit tidier now)
* tested with putting an unrelated file in /etc/pmg/templates

 debian/postinst | 24 +++++++++++++++++++++++-
 debian/postrm   | 21 +++++++++++++++++++++
 src/Makefile    |  1 +
 3 files changed, 45 insertions(+), 1 deletion(-)
 create mode 100644 debian/postrm

diff --git a/debian/postinst b/debian/postinst
index 5e4db3a..d3b17cf 100644
--- a/debian/postinst
+++ b/debian/postinst
@@ -3,6 +3,21 @@
 set -e
 
 
+ucf_register_templates() {
+    for template in /etc/pmg/templates/*; do
+	template_base=$(basename "${template}")
+	if echo "${template_base}" | grep -q '\.ucf-'; then
+		continue
+	fi
+	if [ -e "/var/lib/pmg/templates/${template_base}" ]; then
+	    ucf "/var/lib/pmg/templates/${template_base}" "${template}"
+	    ucfr pmg-api "${template}"
+	else
+	    echo "template '${template}' not shipped by pmg-api."
+	fi
+    done
+}
+
 case "$1" in
     triggered)
 
@@ -24,6 +39,8 @@ case "$1" in
 
 	    pmgconfig init
 	    pmgdb init
+
+	    ucf_register_templates
 	    pmgconfig sync --restart
 
 	    if [ -z "$2" ]; then
@@ -36,13 +53,18 @@ case "$1" in
 	    pmgdb update  >/dev/null 2>&1 &
 
 	    update-mime-database /usr/share/mime
+
 	else
 	    # rewrite banner
 	    pmgbanner || true
 	fi
     ;;
 
-    abort-upgrade|abort-remove|abort-deconfigure)
+    abort-upgrade)
+	ucf_register_templates
+    ;;
+
+    abort-remove|abort-deconfigure)
     ;;
 
     *)
diff --git a/debian/postrm b/debian/postrm
new file mode 100644
index 0000000..9d95ae7
--- /dev/null
+++ b/debian/postrm
@@ -0,0 +1,21 @@
+#!/bin/sh
+
+set -e
+
+if [ "$1" = "purge" ] && command -v ucf >/dev/null 2>&1; then
+
+	ucfq -w pmg-api | cut -d : -f 1 | while read -r cfile ; do
+		ucfr pmg-api --purge "$cfile"
+		ucf --purge "$cfile"
+		for ext in .ucf-new .ucf-old .ucf-dist ""; do
+			rm -f "${cfile}${ext}"
+		done
+	done
+fi
+
+# dh_installdeb will replace this with shell code automatically
+# generated by other debhelper scripts.
+
+#DEBHELPER#
+
+
diff --git a/src/Makefile b/src/Makefile
index b5e4c9f..3617f05 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -192,6 +192,7 @@ install: ${SOURCES} $(addsuffix .service-bash-completion, ${SERVICES}) $(addsuff
 	install -d -m 0755 ${DESTDIR}/lib/systemd/system
 	for i in ${TIMER_UNITS}; do install -m 0644 $$i ${DESTDIR}/lib/systemd/system/; done
 	install -D -m 0644 pmg-initramfs.conf ${DESTDIR}/etc/initramfs-tools/conf.d/pmg-initramfs.conf
+	sed -ri 's/^    PMG_TEMPLATES=.*$$/PMG_TEMPLATES="${TEMPLATES}"/' debian/postinst debian/postrm
 
 .PHONY: check
 check:
-- 
2.20.1




More information about the pmg-devel mailing list