From 6c4f45de554aa0fd57450960e7bb5e4a28613bff Mon Sep 17 00:00:00 2001 From: Catalin Iacob Date: Mon, 6 Aug 2012 22:15:24 +0200 Subject: Add zypper plugin for openSUSE This uses zypp_plugin, a Python helper for implementing the protocol between zypper and plugins. --- Makefile | 3 +++ etckeeper.conf | 2 +- zypper-etckeeper.py | 38 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 42 insertions(+), 1 deletion(-) create mode 100755 zypper-etckeeper.py diff --git a/Makefile b/Makefile index 677d59f..cb1ca18 100644 --- a/Makefile +++ b/Makefile @@ -35,6 +35,9 @@ endif ifeq ($(HIGHLEVEL_PACKAGE_MANAGER),yum) $(INSTALL_DATA) yum-etckeeper.py $(DESTDIR)$(prefix)/lib/yum-plugins/etckeeper.py $(INSTALL_DATA) yum-etckeeper.conf $(DESTDIR)$(etcdir)/yum/pluginconf.d/etckeeper.conf +endif +ifeq ($(HIGHLEVEL_PACKAGE_MANAGER),zypper) + $(INSTALL_DATA) zypper-etckeeper.py $(DESTDIR)$(prefix)/lib/zypp/plugins/commit/zypper-etckeeper.py endif -./etckeeper-bzr/__init__.py install --root=$(DESTDIR) ${PYTHON_INSTALL_OPTS} || echo "** bzr support not installed" echo "** installation successful" diff --git a/etckeeper.conf b/etckeeper.conf index c95f377..4d6dd8a 100644 --- a/etckeeper.conf +++ b/etckeeper.conf @@ -30,7 +30,7 @@ DARCS_COMMIT_OPTIONS="-a" #AVOID_COMMIT_BEFORE_INSTALL=1 # The high-level package manager that's being used. -# (apt, pacman-g2, yum etc) +# (apt, pacman-g2, yum, zypper etc) HIGHLEVEL_PACKAGE_MANAGER=apt # The low-level package manager that's being used. diff --git a/zypper-etckeeper.py b/zypper-etckeeper.py new file mode 100755 index 0000000..b21f23d --- /dev/null +++ b/zypper-etckeeper.py @@ -0,0 +1,38 @@ +#!/usr/bin/env python + +import errno +import subprocess +import zypp_plugin + + +def _call_etckeeper(install_arg): + # zypper interprets the plugin's stdout as described in + # http://doc.opensuse.org/projects/libzypp/HEAD/zypp-plugins.html so it's + # important that we don't write anything to it. We therefore redirect + # etckeeper's stdout to the plugin's stderr. Since zypper writes the + # stderr of plugins to its log file, etckeeper's stdout will go there as + # well. + + subprocess.call(['etckeeper', install_arg], stdout=2) + + +class EtckeeperPlugin(zypp_plugin.Plugin): + def PLUGINBEGIN(self, headers, body): + _call_etckeeper('pre-install') + self.ack() + + def PLUGINEND(self, headers, body): + try: + _call_etckeeper('post-install') + except OSError as e: + # if etckeeper was just removed, executing it will fail with + # ENOENT + if e.errno != errno.ENOENT: + # reraise so that we don't hide other errors than etckeeper + # not existing + raise + self.ack() + + +plugin = EtckeeperPlugin() +plugin.main() -- cgit v1.2.3