From f3bcf9a18c967e9979b7933d3204300618ad3821 Mon Sep 17 00:00:00 2001 From: Steve Lawrence Date: Mon, 21 Jun 2010 17:04:40 -0400 Subject: [PATCH] Add a generic plugin for use by simple Collections This patch adds a generic plugin, exec.so, that should be sufficient for the majority of Collection actions. After all packages in a Collection have been installed/removed, this plugin executes the arguments by calling system(3), allowing for a very generic and powerful method to perform many actions. This also adds two sample macros as examples of the format, using the exec.so plugin. --- Makefile.am | 4 ++-- configure.ac | 1 + macros.in | 5 +++++ plugins/Makefile.am | 19 +++++++++++++++++++ plugins/collection.h | 12 ++++++++++++ plugins/exec.c | 32 ++++++++++++++++++++++++++++++++ 6 files changed, 71 insertions(+), 2 deletions(-) create mode 100644 plugins/Makefile.am create mode 100644 plugins/collection.h create mode 100644 plugins/exec.c diff --git a/Makefile.am b/Makefile.am index 9daf00a11..25cee709d 100644 --- a/Makefile.am +++ b/Makefile.am @@ -19,9 +19,9 @@ endif if WITH_LUAEXT SUBDIRS += luaext endif -SUBDIRS += rpmio lib build python scripts fileattrs doc . tests +SUBDIRS += rpmio lib build python scripts fileattrs doc . tests plugins -DIST_SUBDIRS = po misc luaext rpmio lib build python scripts fileattrs doc tests +DIST_SUBDIRS = po misc luaext rpmio lib build python scripts fileattrs doc tests plugins pkgconfigdir = $(libdir)/pkgconfig diff --git a/configure.ac b/configure.ac index e5fd6ba74..99290460d 100644 --- a/configure.ac +++ b/configure.ac @@ -811,5 +811,6 @@ AC_CONFIG_FILES([Makefile python/Makefile luaext/Makefile tests/Makefile + plugins/Makefile ]) AC_OUTPUT diff --git a/macros.in b/macros.in index 927f240e1..bf49d04ff 100644 --- a/macros.in +++ b/macros.in @@ -1159,6 +1159,11 @@ done \ %__urlhelper_proxyopts %{?_httpproxy:--proxy %{_httpproxy}%{?_httpport::%{_httpport}}}%{!?_httpproxy:%{nil}} %_urlhelper %{__urlhelpercmd} %{?__urlhelper_localopts} %{?__urlhelper_proxyopts} %{__urlhelperopts} +#------------------------------------------------------------------------------ +# Collection specific macros +%__plugindir %{_rpmconfigdir}/plugins +%__collection_font %{__plugindir}/exec.so /usr/bin/fc-cache +%__collection_java %{__plugindir}/exec.so /usr/bin/rebuild-gcj-db # \endverbatim #*/ diff --git a/plugins/Makefile.am b/plugins/Makefile.am new file mode 100644 index 000000000..b0af6b99c --- /dev/null +++ b/plugins/Makefile.am @@ -0,0 +1,19 @@ +# Makefile for rpm library. + +include $(top_srcdir)/rpm.am + +AM_CPPFLAGS = -I$(top_builddir) -I$(top_srcdir) -I$(top_builddir)/include/ +AM_CPPFLAGS += -I$(top_srcdir)/misc +AM_CPPFLAGS += -DLOCALEDIR="\"$(localedir)\"" +AM_CPPFLAGS += -DSYSCONFDIR="\"$(sysconfdir)\"" +AM_CPPFLAGS += -DLOCALSTATEDIR="\"$(localstatedir)\"" +AM_CPPFLAGS += -DLIBRPMALIAS_FILENAME="\"rpmpopt-${VERSION}\"" + +AM_LDFLAGS = -avoid-version -module -shared + +pluginsdir = $(rpmconfigdir)/plugins + +plugins_LTLIBRARIES = exec.la + +exec_la_SOURCES = collection.h ../lib/rpmchroot.c exec.c +exec_la_LIBADD = $(top_builddir)/lib/librpm.la $(top_builddir)/rpmio/librpmio.la diff --git a/plugins/collection.h b/plugins/collection.h new file mode 100644 index 000000000..e0818d6cf --- /dev/null +++ b/plugins/collection.h @@ -0,0 +1,12 @@ +#include "system.h" + +#include +#include +#include + +#include "lib/collections.h" +#include "lib/rpmchroot.h" + +rpmRC COLLHOOK_POST_ANY_FUNC(rpmts ts, const char * collname, const char * options); +rpmRC COLLHOOK_POST_ADD_FUNC(rpmts ts, const char * collname, const char * options); +rpmRC COLLHOOK_PRE_REMOVE_FUNC(rpmts ts, const char * collname, const char * options); diff --git a/plugins/exec.c b/plugins/exec.c new file mode 100644 index 000000000..ab2536fb9 --- /dev/null +++ b/plugins/exec.c @@ -0,0 +1,32 @@ +#include "collection.h" + +#include + +rpmCollHook COLLECTION_HOOKS = COLLHOOK_POST_ANY; + +rpmRC COLLHOOK_POST_ANY_FUNC(rpmts ts, const char *collname, + const char *options) +{ + int rc = RPMRC_FAIL; + + if (rpmChrootIn()) { + goto exit; + } + + if (options) { + int status = system(options); + if (!WIFEXITED(status) || WEXITSTATUS(status)) { + rpmlog(RPMLOG_ERR, "%s collection action failed\n", collname); + goto exit; + } + } + + rc = RPMRC_OK; + + exit: + if (rpmChrootOut()) { + rc = RPMRC_FAIL; + } + + return rc; +}