[pmg-devel] [PATCH pmg-api 1/2] Use ucf to handle template overrides.

Fabian Grünbichler f.gruenbichler at proxmox.com
Tue Apr 7 20:04:23 CEST 2020


On March 25, 2020 7:42 pm, Stoiko Ivanov wrote:
> 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 net effect would be the same, modulo that existence of the file in 
/etc now implies some manual/explicit action by the admin, and would not 
in the other variant - correct?

Both sound okay to me.

> 
> The changes in the maintainer scripts are based on the generated ones from
> dh_ucf (1), with the replacement of `which ucf` by the (more portable)
> `command -v ucf` in the postrm script.
> 
> Signed-off-by: Stoiko Ivanov <s.ivanov at proxmox.com>
> ---
>  debian/postinst | 20 +++++++++++++++++++-
>  debian/postrm   | 26 ++++++++++++++++++++++++++
>  src/Makefile    |  1 +
>  3 files changed, 46 insertions(+), 1 deletion(-)
>  create mode 100644 debian/postrm
> 
> diff --git a/debian/postinst b/debian/postinst
> index 5e4db3a..9118dff 100644
> --- a/debian/postinst
> +++ b/debian/postinst
> @@ -3,6 +3,17 @@
>  set -e
>  
>  
> +ucf_register_templates() {
> +    PMG_TEMPLATES=""

it's very non-obvious that this is a placeholder that gets set via make.
we usually add '.in' to the filename, and use some placeholder syntax 
like

PMG_TEMPLATES="@PMG_TEMPLATE_FILES@"

> +
> +    for template in ${PMG_TEMPLATES}; do
> +	if [ -e "/etc/pmg/templates/${template}" ]; then
> +	    ucf "/var/lib/pmg/templates/${template}" "/etc/pmg/templates/${template}"
> +	    ucfr pmg-api "/etc/pmg/templates/${template}"
> +	fi
> +    done

but I am not sure we need that here - couldn't we just

for template in /etc/pmg/templates/*; do
  if [ -e "/var/lib/pmg/templates/$(basename $template)" ]; then
    ... ucf thing ...
  else
    echo "template '$(basename $template)' no longer shipped by pmg-api, consider removing it.."
    ucf unregister/purge ... (possibly? not sure :-P whether that makes sense or not)
  fi
done

it's even less work in the default case :-P the semantics are not quite 
the same though, so maybe I am missing something.

> +}
> +
>  case "$1" in
>      triggered)
>  
> @@ -24,6 +35,8 @@ case "$1" in
>  
>  	    pmgconfig init
>  	    pmgdb init
> +
> +	    ucf_register_templates
>  	    pmgconfig sync --restart
>  
>  	    if [ -z "$2" ]; then
> @@ -36,13 +49,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..1c14ce7
> --- /dev/null
> +++ b/debian/postrm
> @@ -0,0 +1,26 @@
> +#!/bin/sh
> +
> +set -e
> +
> +if [ "$1" = "purge" ]; then
> +    PMG_TEMPLATES=""

same here, and 

> +
> +    for template in ${PMG_TEMPLATES}; do
> +	for ext in .ucf-new .ucf-old .ucf-dist ""; do
> +	    rm -f "/etc/pmg/templates/${template}${ext}"

here as well - these could just be globbed/'find .. -delete'd? we want 
to remove them, no matter whether they are for templates which were 
shipped by the last installed version?

> +	done
> +	if command -v ucf >/dev/null 2>&1; then
> +	    ucf --purge "/etc/pmg/templates/${template}"
> +	fi
> +	if command -v ucfr >/dev/null 2>&1; then
> +	    ucfr --purge pmg-api "/etc/pmg/templates/${template}"

according to "man 1 ucrf", the recommended way to do this is (with a 
slight fixup, since the example does not purge :-P)

    ucfq -w pmg-api | cut -d : -f 1 | while read cfile ; do ucfr --purge $cfile ; done

and since all templates in /etc that ucf knows about should be 
registered, the loop can be extended to call 'ucf --purge' as well, and 
the postrm script does not need to hardcode the template file names.


> +	fi
> +    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

this would then not be needed anymore AFAICT ?

>  
>  .PHONY: check
>  check:
> -- 
> 2.20.1
> 
> 
> _______________________________________________
> pmg-devel mailing list
> pmg-devel at pve.proxmox.com
> https://pve.proxmox.com/cgi-bin/mailman/listinfo/pmg-devel
> 
> 



More information about the pmg-devel mailing list