OpenPKG CVS Repository
http://cvs.openpkg.org/
____________________________________________________________________________
Server: cvs.openpkg.org Name: Ralf S. Engelschall
Root: /e/openpkg/cvs Email: [EMAIL PROTECTED]
Module: openpkg-src Date: 01-Jul-2004 18:30:26
Branch: HEAD Handle: -NONE-
Added files:
openpkg-src/openpkg-audit
audit-rpm.c audit.sh openpkg-audit.spec
Log:
new package: openpkg-audit 0.9.0 (OpenPKG Administration Auditing)
Summary:
Revision Changes Path
1.1 +279 -0 openpkg-src/openpkg-audit/audit-rpm.c
1.1 +162 -0 openpkg-src/openpkg-audit/audit.sh
1.1 +87 -0 openpkg-src/openpkg-audit/openpkg-audit.spec
____________________________________________________________________________
patch -p0 <<'@@ .'
Index: openpkg-src/openpkg-audit/audit-rpm.c
============================================================================
$ cvs diff -u -r0 -r1.1 audit-rpm.c
--- /dev/null 2004-07-01 18:30:26.000000000 +0200
+++ audit-rpm.c 2004-07-01 18:30:26.000000000 +0200
@@ -0,0 +1,279 @@
+/*
+** rpm.c -- OpenPKG RPM Auditing Wrapper
+** Copyright (c) 2004 The OpenPKG Project <http://www.openpkg.org/>
+** Copyright (c) 2004 Ralf S. Engelschall <[EMAIL PROTECTED]>
+** Copyright (c) 2004 Cable & Wireless <http://www.cw.com/>
+**
+** Permission to use, copy, modify, and distribute this software for
+** any purpose with or without fee is hereby granted, provided that
+** the above copyright notice and this permission notice appear in all
+** copies.
+**
+** THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+** WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+** MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+** IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
+** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+** USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+** ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+** OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+** SUCH DAMAGE.
+*/
+
+/* This is a small OpenPKG RPM command wrapper which provides minimal
+ auditing/logging possibilities to an OpenPKG instance by writing
+ a <prefix>/RPM/DB/Audit logfile containing the RPM commands which
+ actually led to a RPM database change. */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <time.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <pwd.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <sys/wait.h>
+#include <sys/time.h>
+#include <sys/resource.h>
+
+/* utility function for fatal program termination under error condition */
+void die(const char *fmt, ...)
+{
+ va_list ap;
+
+ va_start(ap, fmt);
+ fprintf(stderr, "openpkg-audit: rpm: ERROR: ");
+ vfprintf(stderr, fmt, ap);
+ fprintf(stderr, "\n");
+ va_end(ap);
+ exit(1);
+}
+
+/* the auditing logfile */
+#ifndef LOGFILE
+#define LOGFILE "/var/openpkg-audit/openpkg-audit.log"
+#endif
+
+/* the RPM database directory and owner/permission */
+#define RPMDB_DIR "RPM/DB"
+
+/* list of RPM database files to check */
+static char *RPMDB_files[] = {
+ "Basenames",
+ "Conflictname",
+ "Depends",
+ "Dirnames",
+ "Filemd5s",
+ "Group",
+ "Installtid",
+ "Name",
+ "Packages",
+ "Providename",
+ "Provideversion",
+ "Pubkeys",
+ "Requirename",
+ "Requireversion",
+ "Sha1header",
+ "Sigmd5",
+ "Triggername"
+};
+
+/* utility function for making a concatenated string out of multiple arguments */
+static char *mkstr(const char *pad, const char *s1, ...)
+{
+ va_list ap;
+ va_list apbak;
+ int n;
+ const char *cp;
+ char *str;
+
+ va_start(ap, s1);
+ va_copy(apbak, ap);
+ n = 0;
+ for (cp = s1; cp != NULL; cp = (const char *)va_arg(ap, const char *))
+ n += strlen(cp);
+ n++;
+ va_copy(ap, apbak);
+ if ((str = (char *)malloc(n)) == NULL)
+ die("failed to allocate %d bytes of memory", n);
+ str[0] = '\0';
+ for (cp = s1; cp != NULL; cp = (const char *)va_arg(ap, const char *)) {
+ if (pad != NULL && str[0] != '\0')
+ strcat(str, pad);
+ strcat(str, cp);
+ }
+ va_end(ap);
+ return str;
+}
+
+/* utility function for making a concatenated string out of an array */
+static char *mkstra(const char *pad, char **sa)
+{
+ int n, i;
+ char *str;
+
+ n = 0;
+ for (i = 0; sa[i] != NULL; i++)
+ n += strlen(sa[i]);
+ n++;
+ if ((str = (char *)malloc(n)) == NULL)
+ die("failed to allocate %d bytes of memory", n);
+ str[0] = '\0';
+ for (i = 0; sa[i] != NULL; i++) {
+ if (pad != NULL && str[0] != '\0')
+ strcat(str, pad);
+ strcat(str, sa[i]);
+ }
+ return str;
+}
+
+/* utility function for determining the maximum mtime of the RPM database */
+static time_t rpmdb_mtime(const char *cpPrefix)
+{
+ time_t mtime = 0;
+ int i;
+ char *cp;
+ struct stat sb;
+
+ for (i = 0; i < sizeof(RPMDB_files)/sizeof(RPMDB_files[0]); i++) {
+ cp = mkstr(NULL, cpPrefix, "/", RPMDB_DIR, "/", RPMDB_files[i], NULL);
+ if (stat(cp, &sb) == 0) {
+ if (mtime < sb.st_mtime)
+ mtime = sb.st_mtime;
+ }
+ free(cp);
+ }
+ return mtime;
+}
+
+/* main procedure */
+int main(int argc, char *argv[])
+{
+ char *cpPrefix;
+ char *cpToolsCmdProg;
+ char *cpToolsCmdName;
+ int i, j;
+ char **argv2;
+ FILE *fp;
+ char *cpLogfile;
+ struct tm *tm;
+ time_t t;
+ struct passwd *pw;
+ char *cpCmd;
+ time_t mtime_before;
+ time_t mtime_after;
+ char *cp;
+ pid_t pid;
+ int status;
+ int rv;
+ int fd;
+ struct stat sb;
+
+ /* determine OpenPKG run-time information
+ (provided by <prefix>/bin/openpkg execution wrapper) */
+ if ((cpPrefix = getenv("OPENPKG_PREFIX")) == NULL)
+ die("$OPENPKG_PREFIX not set");
+ if ((cpToolsCmdProg = getenv("OPENPKG_TOOLS_CMDPROG")) == NULL)
+ die("$OPENPKG_TOOLS_CMDPROG not set");
+ if ((cpToolsCmdName = getenv("OPENPKG_TOOLS_CMDNAME")) == NULL)
+ die("$OPENPKG_TOOLS_CMDNAME not set");
+
+ /* determine argument vector for real OpenPKG RPM command
+ argv: <prefix>/lib/openpkg-audit/rpm <arg1> <arg2> ...
+ argv2: <prefix>/bin/openpkg rpm <arg1> <arg2> ... */
+ if ((argv2 = (char **)malloc((2+argc+1) * sizeof(char *))) == NULL)
+ die("cannot malloc");
+ j = 0;
+ argv2[j++] = cpToolsCmdProg;
+ argv2[j++] = cpToolsCmdName;
+ i = 1;
+ while (i < argc)
+ argv2[j++] = argv[i++];
+ argv2[j++] = NULL;
+
+ /* determine whether access to the RPM database is possible
+ and it not, short-circuit processing */
+ cp = mkstr(NULL, cpPrefix, "/", RPMDB_DIR, "/", RPMDB_files[0], NULL);
+ if (access(cp, R_OK|W_OK) != 0) {
+ /* pass-through execution to real OpenPKG RPM command */
+ execvp(argv2[0], argv2);
+ /* NEVER REACHED */
+ abort();
+ }
+ free(cp);
+
+ /* determine maximum modification time (before operation) */
+ mtime_before = rpmdb_mtime(cpPrefix);
+
+ /* execute real OpenPKG RPM command */
+ if ((pid = fork()) == 0) {
+ /* pass-through execution to real OpenPKG RPM command */
+ execvp(argv2[0], argv2);
+ /* NEVER REACHED */
+ abort();
+ }
+
+ /* wait for child to terminate */
+ if (waitpid(pid, &status, 0) < 0)
+ die("failed to wait for child process with PID %d\n", pid);
+
+ /* determine return code */
+ rv = (WIFEXITED(status) ? WEXITSTATUS(status) : -1);
+
+ /* determine maximum modification time (after operation) */
+ mtime_after = rpmdb_mtime(cpPrefix);
+
+ /* if an operation was performed which has not changed the RPM
+ database we short-circuit processing and exit without logging */
+ if (mtime_after == mtime_before)
+ exit(rv);
+
+ /* determine time */
+ t = time(NULL);
+ if ((tm = localtime(&t)) == NULL)
+ die("cannot determine local time");
+
+ /* determine user */
+ if ((pw = getpwuid(getuid())) == NULL)
+ die("cannot determine user information");
+
+ /* determine command */
+ cpCmd = mkstra(" ", &argv2[1]);
+
+ /* optionally give up any root privileges to make sure
+ the file is written with the OpenPKG RPM database user/group */
+ cp = mkstr(NULL, cpPrefix, "/", RPMDB_DIR, "/", RPMDB_files[0], NULL);
+ if (stat(cp, &sb) < 0)
+ die("unable to stat the RPM database file %s", cp);
+ free(cp);
+ setgid(sb.st_gid); setegid(sb.st_gid);
+ setuid(sb.st_uid); seteuid(sb.st_uid);
+
+ /* write entry to logfile */
+ cpLogfile = mkstr(NULL, cpPrefix, "/", LOGFILE, NULL);
+ if ((fd = open(cpLogfile, O_CREAT|O_RDWR|O_APPEND, sb.st_mode)) == -1)
+ die("cannot open logfile \"%s\"", cpLogfile);
+ free(cpLogfile);
+ if ((fp = fdopen(fd, "a")) == NULL)
+ die("cannot open filedescriptor");
+ fprintf(fp, "%04d-%02d-%02d %02d:%02d:%02d user=%s, command=\"%s\",
return=%d\n",
+ tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
+ tm->tm_hour, tm->tm_min, tm->tm_sec,
+ pw->pw_name,
+ cpCmd, rv);
+ fclose(fp);
+ close(fd);
+
+ /* cleanup */
+ free(argv2);
+ free(cpCmd);
+
+ exit(0);
+}
+
@@ .
patch -p0 <<'@@ .'
Index: openpkg-src/openpkg-audit/audit.sh
============================================================================
$ cvs diff -u -r0 -r1.1 audit.sh
--- /dev/null 2004-07-01 18:30:26.000000000 +0200
+++ audit.sh 2004-07-01 18:30:26.000000000 +0200
@@ -0,0 +1,162 @@
[EMAIL PROTECTED]@/lib/openpkg/bash
+##
+## audit -- OpenPKG Tool Chain "audit" command
+## Copyright (c) 2004 The OpenPKG Project <http://www.openpkg.org/>
+## Copyright (c) 2004 Ralf S. Engelschall <[EMAIL PROTECTED]>
+## Copyright (c) 2004 Cable & Wireless <http://www.cw.com/>
+##
+## Permission to use, copy, modify, and distribute this software for
+## any purpose with or without fee is hereby granted, provided that
+## the above copyright notice and this permission notice appear in all
+## copies.
+##
+## THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+## WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+## MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+## IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
+## CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+## USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+## ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+## OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+## OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+## SUCH DAMAGE.
+##
+
+# configuration
+logfile="@l_prefix@/var/openpkg-audit/openpkg-audit.log"
+
+# command line parsing
+opt_m=""
+opt_r=no
+opt_h=no
+opt_l=no
+opt_n=0
+opt_f=no
+OPTIND=1
+while getopts m:rln:fh opt; do
+ case ${opt} in
+ m ) opt_m=$OPTARG ;;
+ r ) opt_r=yes ;;
+ l ) opt_l=yes ;;
+ n ) opt_n=$OPTARG ;;
+ f ) opt_f=yes ;;
+ h ) opt_h=yes ;;
+ * ) echo "openpkg:audit:ERROR: invalid option \"${opt}\"" 1>&2; exit 1 ;;
+ esac
+done
+shift $(($OPTIND - 1))
+
+# dispatch into commands
+if [ ".${opt_h}" = .yes ]; then
+ # show usage message
+ echo "Usage: openpkg audit [-m <message>] [-r] [-l] [-n <lines>] [-f] [-h]" 1>&2
+elif [ ".${opt_l}" = .yes ]; then
+ # show logfile
+ if [ ".${opt_f}" = .yes ]; then
+ tail -f ${logfile}
+ elif [ ".${opt_n}" != .0 ]; then
+ tail -n ${opt_n} ${logfile}
+ else
+ cat ${logfile}
+ fi
+elif [ ".${opt_m}" != . ]; then
+ # add manual administrator entry to logfile
+ if [ ! -w $logfile ]; then
+ echo "openpkg:audit:ERROR: unsufficient privileges to write to
\"$logfile\"" 1>&2
+ exit 1
+ fi
+
+ # determine date and user
+ date=`date '+%Y-%m-%d %H:%M:%S'`
+ [EMAIL PROTECTED]@/lib/openpkg/shtool echo -e '%u'`
+
+ # create logfile entry
+ if [ ".${opt_r}" = .yes ]; then
+ echo "$date user=$user, $opt_m" >>$logfile
+ else
+ echo "$date user=$user, message=\"$opt_m\"" >>$logfile
+ fi
+fi
+exit 0
+
+##
+## MANUAL PAGE
+##
+
+=pod
+
+=head1 NAME
+
+B<openpkg audit> - OpenPKG Auditing Facility
+
+=head1 SYNOPSIS
+
+B<openpkg audit> [B<-m> I<message>] [B<-r>]
+
+B<openpkg audit> [B<-l>] [B<-n> I<lines>] [B<-f>]
+
+B<openpkg audit> [B<-h>]
+
+=head1 DESCRIPTION
+
+The B<openpkg audit> command is the frontend to the OpenPKG auditing
+logfile which is currently written by the B<openpkg rpm>
+command in case the RPM database was changed.
+
+=head1 OPTIONS
+
+The following command line options exist:
+
+=over 4
+
+=item B<-m> I<message>
+
+Adds I<message> to the auditing logfile as a C<message="..."> entry.
+
+=item B<-r>
+
+In conjunction with B<-m>, adds I<message> to the auditing logfile as a
+raw message.
+
+=item B<-l>
+
+Shows the auditing logfile.
+
+=item B<-n> I<lines>
+
+In conjunction with B<-l>, shows only the last I<lines> number of lines.
+
+=item B<-f>
+
+In conjunction with B<-l>, follows the logfile.
+
+=item B<-h>
+
+Shows a command usage.
+
+=back
+
+=head1 FILES
+
+The following paths are used by B<openpkg audit>:
+
+=over 4
+
+=item F<@l_prefix@/bin/openpkg>
+
+=item F<@l_prefix@/var/openpkg-audit/openpkg-audit.log>
+
+=back
+
+=head1 SEE ALSO
+
+C<openpkg man rpm>.
+
+=head1 AUTHOR
+
+Ralf S. Engelschall E<lt>[EMAIL PROTECTED]<gt>
+
+=cut
+
@@ .
patch -p0 <<'@@ .'
Index: openpkg-src/openpkg-audit/openpkg-audit.spec
============================================================================
$ cvs diff -u -r0 -r1.1 openpkg-audit.spec
--- /dev/null 2004-07-01 18:30:26.000000000 +0200
+++ openpkg-audit.spec 2004-07-01 18:30:26.000000000 +0200
@@ -0,0 +1,87 @@
+##
+## openpkg-audit.spec -- OpenPKG RPM Specification
+## Copyright (c) 2000-2004 The OpenPKG Project <http://www.openpkg.org/>
+## Copyright (c) 2000-2004 Ralf S. Engelschall <[EMAIL PROTECTED]>
+## Copyright (c) 2000-2004 Cable & Wireless <http://www.cw.com/>
+##
+## Permission to use, copy, modify, and distribute this software for
+## any purpose with or without fee is hereby granted, provided that
+## the above copyright notice and this permission notice appear in all
+## copies.
+##
+## THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+## WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+## MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+## IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
+## CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+## USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+## ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+## OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+## OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+## SUCH DAMAGE.
+##
+
+# package information
+Name: openpkg-audit
+Summary: OpenPKG Administration Auditing
+URL: http://www.openpkg.org/
+Vendor: The OpenPKG Project
+Packager: The OpenPKG Project
+Distribution: OpenPKG
+Class: EVAL
+Group: Bootstrap
+License: MIT-style
+Version: 0.9.0
+Release: 20040701
+
+# list of sources
+Source0: audit.sh
+Source1: audit-rpm.c
+
+# build information
+Prefix: %{l_prefix}
+BuildRoot: %{l_buildroot}
+BuildPreReq: OpenPKG, openpkg >= 20040701
+PreReq: OpenPKG, openpkg >= 20040701
+AutoReq: no
+AutoReqProv: no
+
+%description
+ This is the OpenPKG administration auditing package. It provides
+ a wrapper for the "openpkg rpm" command which logs all commands
+ the administrator performs on the OpenPKG instance plus a "openpkg
+ audit" command as a frontend to the log entries.
+
+%track
+ prog openpkg-audit = {
+ disabled
+ version = %{version}
+ url = ftp://ftp.openpkg.org/
+ regex = .*
+ }
+
+%prep
+ %setup -q -T -c
+
+%build
+ %{l_cc} %{l_cflags -O} %{l_cppflags} %{l_ldflags} \
+ -o rpm %{SOURCE audit-rpm.c}
+
+%install
+ rm -rf $RPM_BUILD_ROOT
+ %{l_shtool} mkdir -f -p -m 755 \
+ $RPM_BUILD_ROOT%{l_prefix}/libexec/openpkg-audit \
+ $RPM_BUILD_ROOT%{l_prefix}/var/openpkg-audit
+ %{l_shtool} install -c -m 755 %{l_value -s -a} \
+ %{SOURCE audit.sh} $RPM_BUILD_ROOT%{l_prefix}/libexec/openpkg-audit/
+ %{l_shtool} install -c -s -m 755 \
+ rpm $RPM_BUILD_ROOT%{l_prefix}/libexec/openpkg-audit/
+ %{l_rpmtool} files -v -ofiles -r$RPM_BUILD_ROOT %{l_files_std}
+
+%files -f files
+
+%clean
+ rm -rf $RPM_BUILD_ROOT
+
@@ .
______________________________________________________________________
The OpenPKG Project www.openpkg.org
CVS Repository Commit List [EMAIL PROTECTED]