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.
This commit is contained in:
Steve Lawrence 2010-06-21 17:04:40 -04:00 committed by Panu Matilainen
parent 85d89bafdc
commit f3bcf9a18c
6 changed files with 71 additions and 2 deletions

View File

@ -19,9 +19,9 @@ endif
if WITH_LUAEXT if WITH_LUAEXT
SUBDIRS += luaext SUBDIRS += luaext
endif 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 pkgconfigdir = $(libdir)/pkgconfig

View File

@ -811,5 +811,6 @@ AC_CONFIG_FILES([Makefile
python/Makefile python/Makefile
luaext/Makefile luaext/Makefile
tests/Makefile tests/Makefile
plugins/Makefile
]) ])
AC_OUTPUT AC_OUTPUT

View File

@ -1159,6 +1159,11 @@ done \
%__urlhelper_proxyopts %{?_httpproxy:--proxy %{_httpproxy}%{?_httpport::%{_httpport}}}%{!?_httpproxy:%{nil}} %__urlhelper_proxyopts %{?_httpproxy:--proxy %{_httpproxy}%{?_httpport::%{_httpport}}}%{!?_httpproxy:%{nil}}
%_urlhelper %{__urlhelpercmd} %{?__urlhelper_localopts} %{?__urlhelper_proxyopts} %{__urlhelperopts} %_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 # \endverbatim
#*/ #*/

19
plugins/Makefile.am Normal file
View File

@ -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

12
plugins/collection.h Normal file
View File

@ -0,0 +1,12 @@
#include "system.h"
#include <rpm/rpmlib.h>
#include <rpm/rpmlog.h>
#include <rpm/rpmts.h>
#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);

32
plugins/exec.c Normal file
View File

@ -0,0 +1,32 @@
#include "collection.h"
#include <sys/wait.h>
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;
}