Hello community, here is the log from the commit of package audit checked in at Fri Sep 1 01:23:26 CEST 2006. -------- --- audit/audit-libs-python.changes 2006-08-16 16:19:29.000000000 +0200 +++ audit/audit-libs-python.changes 2006-08-31 22:59:12.000000000 +0200 @@ -1,0 +2,5 @@ +Thu Aug 31 22:57:52 CEST 2006 - tonyj@suse.de + +- Upgrade to 1.2.6-1 + +------------------------------------------------------------------- audit.changes: same change Old: ---- audit-1.1.3-apparmor.patch audit-1.1.3-disable-syscall-contexts.patch audit-1.1.3-move-audisp.patch audit-1.1.3-no-errormessage.patch audit-1.1.3-no_python.patch audit-1.1.3-warning-on-connrefused.patch audit-1.1.3.tar.bz2 audit-fix-broken-kernels.patch audit-fixes.patch audit.no.__KERNEL__.patch New: ---- README-BEFORE-ADDING-PATCHES audit-1.2.6.tar.bz2 audit-auparse_missing_return.patch audit-disable-syscall-contexts.patch audit-move-audisp.patch audit-no_kernelconfig.patch audit-no_kernelconfig2.patch audit-no_python.patch audit-no_syscall_hdr.patch ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ audit-libs-python.spec ++++++ --- /var/tmp/diff_new_pack.EuoEdo/_old 2006-09-01 01:21:33.000000000 +0200 +++ /var/tmp/diff_new_pack.EuoEdo/_new 2006-09-01 01:21:33.000000000 +0200 @@ -1,5 +1,5 @@ # -# spec file for package audit-libs-python (Version 1.1.3) +# spec file for package audit-libs-python (Version 1.2.6) # # Copyright (c) 2006 SUSE LINUX Products GmbH, Nuernberg, Germany. # This file and all modifications and additions to the pristine @@ -14,19 +14,18 @@ %define _name audit BuildRequires: audit-devel gcc-c++ python-devel swig Summary: Python bindings for libaudit -Version: 1.1.3 -Release: 3 +Version: 1.2.6 +Release: 1 License: GPL Group: System/Monitoring URL: http://people.redhat.com/sgrubb/audit/ Source0: audit-%{version}.tar.bz2 -Patch0: %_name-%version-move-audisp.patch -Patch1: %_name-fixes.patch -Patch2: %_name-%version-apparmor.patch -Patch3: %_name-fix-broken-kernels.patch -Patch4: %_name-%version-warning-on-connrefused.patch -Patch5: %_name-%version-no-errormessage.patch -Patch6: %_name-%version-disable-syscall-contexts.patch +Patch0: audit-move-audisp.patch +Patch1: audit-disable-syscall-contexts.patch +Patch2: audit-no_kernelconfig.patch +Patch3: audit-no_kernelconfig2.patch +Patch4: audit-no_syscall_hdr.patch +Patch5: audit-auparse_missing_return.patch BuildRoot: %{_tmppath}/%{name}-%{version}-build Requires: audit-libs = %{version}-%{release} PreReq: %insserv_prereq %fillup_prereq @@ -49,7 +48,6 @@ %patch3 -p1 %patch4 -p1 %patch5 -p1 -%patch6 -p1 %build autoreconf -fv --install @@ -72,5 +70,7 @@ /%{_libdir}/python%{py_ver}/site-packages/* %changelog -n audit-libs-python +* Thu Aug 31 2006 - tonyj@suse.de +- Upgrade to 1.2.6-1 * Wed Aug 16 2006 - cthiel@suse.de - split off package ++++++ audit.spec ++++++ --- /var/tmp/diff_new_pack.EuoEdo/_old 2006-09-01 01:21:33.000000000 +0200 +++ /var/tmp/diff_new_pack.EuoEdo/_new 2006-09-01 01:21:33.000000000 +0200 @@ -1,5 +1,5 @@ # -# spec file for package audit (Version 1.1.3) +# spec file for package audit (Version 1.2.6) # # Copyright (c) 2006 SUSE LINUX Products GmbH, Nuernberg, Germany. # This file and all modifications and additions to the pristine @@ -13,23 +13,21 @@ Name: audit BuildRequires: gcc-c++ Summary: User Space Tools for 2.6 Kernel Auditing -Version: 1.1.3 -Release: 25 +Version: 1.2.6 +Release: 1 License: GPL Group: System/Monitoring URL: http://people.redhat.com/sgrubb/audit/ Source0: %{name}-%{version}.tar.bz2 Source1: auditd.init Source2: auditd.sysconfig -Patch0: %name-%version-move-audisp.patch -Patch1: %name-fixes.patch -Patch2: %name-%version-apparmor.patch -Patch3: %name-fix-broken-kernels.patch -Patch4: %name-%version-warning-on-connrefused.patch -Patch5: %name-%version-no-errormessage.patch -Patch6: %name-%version-disable-syscall-contexts.patch -Patch7: %name-%version-no_python.patch -Patch8: audit.no.__KERNEL__.patch +Patch0: audit-move-audisp.patch +Patch1: audit-no_python.patch +Patch2: audit-disable-syscall-contexts.patch +Patch3: audit-no_kernelconfig.patch +Patch4: audit-no_kernelconfig2.patch +Patch5: audit-no_syscall_hdr.patch +Patch6: audit-auparse_missing_return.patch BuildRoot: %{_tmppath}/%{name}-%{version}-build Requires: %{name}-libs = %{version}-%{release} PreReq: %insserv_prereq %fillup_prereq @@ -86,14 +84,12 @@ %patch4 -p1 %patch5 -p1 %patch6 -p1 -%patch7 -%patch8 -p1 %build autoreconf -fv --install export CFLAGS="%{optflags} -fno-strict-aliasing" export CXXFLAGS="$CFLAGS" -./configure --prefix=%{_prefix} --sbindir=/sbin --mandir=%{_mandir} --libdir=/%{_lib} --sysconfdir=/etc +./configure --prefix=%{_prefix} --sbindir=/sbin --mandir=%{_mandir} --libdir=/%{_lib} --sysconfdir=/etc --with-apparmor pushd src/mt make libaudit.h popd @@ -112,10 +108,11 @@ # We manually install this since Makefile doesn't install -m 0644 lib/libaudit.h $RPM_BUILD_ROOT/%{_includedir} # This winds up in the wrong place when libtool is involved -rm $RPM_BUILD_ROOT/%{_lib}/libaudit.so +rm $RPM_BUILD_ROOT/%{_lib}/libaudit.so $RPM_BUILD_ROOT/%{_lib}/libauparse.so ln -sf /%{_lib}/libaudit.so.0 $RPM_BUILD_ROOT%{_libdir}/libaudit.so -mv $RPM_BUILD_ROOT/%{_lib}/libaudit.a $RPM_BUILD_ROOT%{_libdir} -rm $RPM_BUILD_ROOT/%{_lib}/libaudit.la +ln -sf /%{_lib}/libauparse.so.0 $RPM_BUILD_ROOT%{_libdir}/libauparse.so +mv $RPM_BUILD_ROOT/%{_lib}/libaudit.a $RPM_BUILD_ROOT/%{_lib}/libauparse.a $RPM_BUILD_ROOT%{_libdir} +rm $RPM_BUILD_ROOT/%{_lib}/libaudit.la $RPM_BUILD_ROOT/%{_lib}/libauparse.la mkdir -p $RPM_BUILD_ROOT/var/adm/fillup-templates cp %{SOURCE2} $RPM_BUILD_ROOT/var/adm/fillup-templates/sysconfig.auditd # delete redhat script, use ours @@ -126,6 +123,10 @@ ln -s /etc/init.d/auditd $RPM_BUILD_ROOT/sbin/rcauditd mkdir -p $RPM_BUILD_ROOT/var/log/audit/ touch $RPM_BUILD_ROOT/var/log/audit/audit.log +# don't use /etc/audit +mv $RPM_BUILD_ROOT/etc/audit/auditd.conf $RPM_BUILD_ROOT/etc/auditd.conf +mv $RPM_BUILD_ROOT/etc/audit/audit.rules $RPM_BUILD_ROOT/etc/audit.rules +rm -rf $RPM_BUILD_ROOT/etc/audit %clean rm -rf $RPM_BUILD_ROOT @@ -147,10 +148,13 @@ %files libs %defattr(-,root,root) /%{_lib}/libaudit.* +/%{_lib}/libauparse.* +%config(noreplace) %attr(640,root,root) /etc/libaudit.conf %files devel %defattr(-,root,root) %{_libdir}/libaudit.* +%{_libdir}/libauparse.* %{_includedir}/libaudit.h %{_mandir}/man3/* @@ -173,6 +177,8 @@ %ghost /var/log/audit/audit.log %changelog -n audit +* Thu Aug 31 2006 - tonyj@suse.de +- Upgrade to 1.2.6-1 * Sat Aug 26 2006 - olh@suse.de - do not define __KERNEL__ in userland apps - remove unused sys/syscall.h include ++++++ audit-1.1.3.tar.bz2 -> audit-1.2.6.tar.bz2 ++++++ ++++ 20763 lines of diff (skipped) ++++++ audit-auparse_missing_return.patch ++++++ From: tonyj@suse.de References: none Patch-upstream: no Disable unused functions which are tripping the abuild garbage return code detection. --- audit-1.2.6/auparse/auparse.c.xx 2006-08-31 21:24:46.000000000 +0200 +++ audit-1.2.6/auparse/auparse.c 2006-08-31 21:30:48.000000000 +0200 @@ -177,6 +177,7 @@ } +#if 0 time_t auparse_get_time(auparse_state_t *au) { } @@ -190,6 +191,7 @@ unsigned long auparse_get_serial(auparse_state_t *au) { } +#endif /* not used, disable to avoid abuild garbage return error */ const char *auparse_get_node(auparse_state_t *au) @@ -198,9 +200,11 @@ } +#if 0 int auparse_timestamp_compare(event_t *e1, event_t *e2) { } +#endif /* not used, disable to avoid abuild garbage return error */ /* Functions that traverse records in the same event */ @@ -260,9 +264,11 @@ } +#if 0 int auparse_get_field_int(auparse_state_t *au) { } +#endif /* not used, disable to avoid abuild garbage return error */ const char *auparse_interpret_field(auparse_state_t *au) ++++++ audit-disable-syscall-contexts.patch ++++++ From: sbeattie@suse.de References: 172154 Upstream: no Disable syscall audit context creation by default. This patch needs to be reevaluated in light of kernel performance improvements to audit comitted around ~2.6.18 --- audit-1.2.6/src/auditd.c.xx 2006-07-27 19:06:08.000000000 +0200 +++ audit-1.2.6/src/auditd.c 2006-08-31 20:02:57.000000000 +0200 @@ -36,6 +36,7 @@ #include <sys/wait.h> #include <fcntl.h> #include <pthread.h> +#include <getopt.h> #include "libaudit.h" #include "auditd-config.h" @@ -69,7 +70,7 @@ */ static void usage(void) { - puts("Usage: auditd [ -f ]"); + puts("Usage: auditd [ -f ] [ -n ]"); exit(2); } @@ -281,18 +282,28 @@ struct rlimit limit; int hup_info_requested = 0, usr1_info_requested = 0; int i; + int opt_foreground = 0; + int opt_enabled = 1; + int c; /* Get params && set mode */ - if (argc > 2) - usage(); - if (argc == 2) { - if (strcmp(argv[1], "-f") == 0) { - config.daemonize = D_FOREGROUND; - set_aumessage_mode(MSG_STDERR, DBG_YES); - } else + while ((c = getopt(argc, argv, "fn")) != -1) { + switch (c) { + case 'f': + opt_foreground = 1; + break; + case 'n': + opt_enabled = 0; + break; + default: usage(); + } } - else { + + if (opt_foreground) { + config.daemonize = D_FOREGROUND; + set_aumessage_mode(MSG_STDERR, DBG_YES); + } else { config.daemonize = D_BACKGROUND; set_aumessage_mode(MSG_SYSLOG, DBG_NO); (void) umask( umask( 077 ) | 022 ); @@ -429,7 +440,7 @@ tell_parent(SUCCESS); /* Enable auditing just in case it was off */ - if (audit_set_enabled(fd, 1) < 0) { + if (audit_set_enabled(fd, opt_enabled) < 0) { char emsg[128]; snprintf(emsg, sizeof(emsg), "auditd error halt, auid=%u pid=%d res=failed", @@ -558,6 +569,7 @@ /* Write message to log that we are going down */ int rc; + audit_set_enabled(fd, 0); rc = audit_request_signal_info(fd); if (rc > 0) { struct audit_reply trep; --- audit-1.2.6/docs/auditd.8.xx 2006-04-06 23:21:14.000000000 +0200 +++ audit-1.2.6/docs/auditd.8 2006-08-31 20:02:47.000000000 +0200 @@ -4,6 +4,7 @@ .SH SYNOPSIS .B auditd [ \fI-f \fR] +[ \fI-n \fR] .SH DESCRIPTION auditd is the userspace component to the Linux Auditing System. It's responsible for writing audit records to the disk. Viewing the logs is done with the .B ausearch @@ -18,6 +19,10 @@ .TP \fB\-f\fR leave the audit daemon in the foreground for debugging. Messages also go to stderr rather than the audit log. +.TP +\fB-n\fR +start the audit daemon, but do not enabled system call auditing in the kernel. +This can be done separately by using \fBauditctl -e\fR. .SH SIGNALS \fB\SIGHUP\fR causes auditd to reconfigure. This means that auditd re-reads the configuration file. If there are no syntax errors, it will proceed to implement the requested changes. If the reconfigure is successful, a DAEMON_CONFIG event is recorded in the logs. If not successful, error handling is controlled by space_left_action, admin_space_left_action, disk_full_action, and disk_error_action parameters in auditd.conf. ++++++ audit-move-audisp.patch ++++++ From: tonyj@suse.de References: unknown Upstream: no Since libstdc++ is in /usr, audispd must move also --- audit-1.2.6/init.d/auditd.conf.xx 2006-08-31 18:18:11.000000000 +0200 +++ audit-1.2.6/init.d/auditd.conf 2006-08-31 18:19:00.000000000 +0200 @@ -8,7 +8,7 @@ flush = INCREMENTAL freq = 20 num_logs = 4 -dispatcher = /sbin/audispd +dispatcher = /usr/sbin/audispd DISP_qos = lossy max_log_file = 5 max_log_file_action = ROTATE ++++++ audit-no_kernelconfig.patch ++++++ From: meissner@suse.de Date: Mon Mar 6 14:21:06 CET 2006 References: 152733 Upstream: unknown Do not output diagnostics to stderr on auditd startup if kernel has no audit support (kernel returns ECONNREFUSED). --- audit-1.2.6/src/auditctl.c.xx 2006-08-31 19:33:20.000000000 +0200 +++ audit-1.2.6/src/auditctl.c 2006-08-31 19:34:18.000000000 +0200 @@ -848,9 +848,11 @@ /* handle reply or send rule */ if (rc != -3) { if (handle_request(rc) == -1) { - fprintf(stderr, - "There was an error in line %d of %s\n", - lineno, file); + /* audit not compiled into kernel. */ + if (errno != ECONNREFUSED) + fprintf(stderr, + "There was an error in line %d of %s\n", + lineno, file); if (!ignore) { fclose(f); return -1; ++++++ audit-no_kernelconfig2.patch ++++++ From: meissner@suse.de Date: Mon Mar 6 14:21:06 CET 2006 References: 152733 Upstream: unknown Demote messages to debug if kernel does not include audit support. --- audit-1.2.6/lib/libaudit.c.xx 2006-08-26 19:37:26.000000000 +0200 +++ audit-1.2.6/lib/libaudit.c 2006-08-31 19:54:51.000000000 +0200 @@ -89,20 +89,21 @@ { NULL, NULL } }; +/* If they've compiled their own kernel and did not include + * the audit susbsystem, they will get ECONNREFUSED. We'll + * demote the message to debug so its not lost entirely. */ +static int _get_warnprio(int xerrno) { + if (xerrno == ECONNREFUSED) + return LOG_DEBUG; + else + return LOG_WARNING; +} int audit_request_status(int fd) { int rc = audit_send(fd, AUDIT_GET, NULL, 0); if (rc < 0) { - /* If they've compiled their own kernel and did not include - * the audit susbsystem, they will get ECONNREFUSED. We'll - * demote the message to debug so its not lost entirely. */ - int priority; - if (errno == ECONNREFUSED) - priority = LOG_DEBUG; - else - priority = LOG_WARNING; - audit_msg(priority, "Error sending status request (%s)", + audit_msg(_get_warnprio(errno), "Error sending status request (%s)", strerror(-rc)); } return rc; @@ -330,7 +331,7 @@ s.enabled = enabled; rc = audit_send(fd, AUDIT_SET, &s, sizeof(s)); if (rc < 0) - audit_msg(LOG_WARNING, "Error sending enable request (%s)", + audit_msg(_get_warnprio(errno), "Error sending enable request (%s)", strerror(-rc)); return rc; } @@ -403,7 +404,7 @@ s.failure = failure; rc = audit_send(fd, AUDIT_SET, &s, sizeof(s)); if (rc < 0) - audit_msg(LOG_WARNING, + audit_msg(_get_warnprio(errno), "Error sending failure mode request (%s)", strerror(-rc)); return rc; @@ -424,7 +425,7 @@ s.pid = pid; rc = audit_send(fd, AUDIT_SET, &s, sizeof(s)); if (rc < 0) { - audit_msg(LOG_WARNING, + audit_msg(_get_warnprio(errno), "Error sending failure mode request (%s)", strerror(-rc)); return rc; @@ -456,7 +457,7 @@ s.rate_limit = limit; rc = audit_send(fd, AUDIT_SET, &s, sizeof(s)); if (rc < 0) - audit_msg(LOG_WARNING, "Error sending rate limit request (%s)", + audit_msg(_get_warnprio(errno), "Error sending rate limit request (%s)", strerror(-rc)); return rc; } @@ -471,7 +472,7 @@ s.backlog_limit = limit; rc = audit_send(fd, AUDIT_SET, &s, sizeof(s)); if (rc < 0) - audit_msg(LOG_WARNING, + audit_msg(_get_warnprio(errno), "Error sending backlog limit request (%s)", strerror(-rc)); return rc; @@ -481,7 +482,7 @@ { int rc = audit_send(fd, AUDIT_LIST, NULL, 0); if (rc < 0) - audit_msg(LOG_WARNING, "Error sending rule list request (%s)", + audit_msg(_get_warnprio(errno), "Error sending rule list request (%s)", strerror(-rc)); return rc; } @@ -490,7 +491,7 @@ { int rc = audit_send(fd, AUDIT_LIST_RULES, NULL, 0); if (rc < 0 && rc != -EINVAL) - audit_msg(LOG_WARNING, "Error sending rule list request (%s)", + audit_msg(_get_warnprio(errno), "Error sending rule list request (%s)", strerror(-rc)); return rc; } @@ -499,7 +500,7 @@ { int rc = audit_send(fd, AUDIT_SIGNAL_INFO, NULL, 0); if (rc < 0) - audit_msg(LOG_WARNING, + audit_msg(_get_warnprio(errno), "Error sending signal_info request (%s)", strerror(-rc)); return rc; @@ -593,7 +594,7 @@ rule->action = action; rc = audit_send(fd, AUDIT_ADD, rule, sizeof(struct audit_rule)); if (rc < 0) - audit_msg(LOG_WARNING, + audit_msg(_get_warnprio(errno), "Error sending add rule request (%s)", errno == EEXIST ? "Rule exists" : strerror(-rc)); @@ -610,7 +611,7 @@ rc = audit_send(fd, AUDIT_ADD_RULE, rule, sizeof(struct audit_rule_data) + rule->buflen); if (rc < 0) - audit_msg(LOG_WARNING, + audit_msg(_get_warnprio(errno), "Error sending add rule request (%s)", errno == EEXIST ? "Rule exists" : strerror(-rc)); @@ -626,10 +627,10 @@ rc = audit_send(fd, AUDIT_DEL, rule, sizeof(struct audit_rule)); if (rc < 0) { if (rc == -ENOENT) - audit_msg(LOG_WARNING, + audit_msg(_get_warnprio(errno), "Error sending delete rule request (No rule matches)"); else - audit_msg(LOG_WARNING, + audit_msg(_get_warnprio(errno), "Error sending delete rule request (%s)", strerror(-rc)); } @@ -647,10 +648,10 @@ sizeof(struct audit_rule_data) + rule->buflen); if (rc < 0) { if (rc == -ENOENT) - audit_msg(LOG_WARNING, + audit_msg(_get_warnprio(errno), "Error sending delete rule request (No rule matches)"); else - audit_msg(LOG_WARNING, + audit_msg(_get_warnprio(errno), "Error sending delete rule request (%s)", strerror(-rc)); } @@ -726,7 +727,7 @@ if (fd >= 0) { int rc = audit_send(fd, type, message, strlen(message)+1); if (rc < 0) - audit_msg(LOG_WARNING, + audit_msg(_get_warnprio(errno), "Error sending user message request (%s)", strerror(-rc)); return rc; ++++++ audit-no_python.patch ++++++ From: tonyj@suse.de Date: unknown Upstream: no This patch is used by audit.spec to disable use of Python. Necessary Python files are built seperately by audit-libs-python.spec --- audit-1.2.6/audisp/Makefile.xx 2006-08-31 20:53:16.000000000 +0200 +++ audit-1.2.6/audisp/Makefile 2006-08-31 20:54:23.000000000 +0200 @@ -1,8 +1,6 @@ # Installation directories. PREFIX ?= $(DESTDIR)/usr -LIBDIR ?= $(PREFIX)/lib/python2.4/site-packages SBINDIR ?= $(DESTDIR)/sbin -LIB=AuditMsg.py TARGETS=audispd @@ -12,7 +10,6 @@ -mkdir -p $(SBINDIR) -mkdir -p $(LIBDIR) install -m 755 $(TARGETS) $(SBINDIR) - install -m 644 $(LIB) $(LIBDIR) distclean: clean: --- audit-1.2.6/configure.ac.xx 2006-07-13 23:02:17.000000000 +0200 +++ audit-1.2.6/configure.ac 2006-08-31 20:52:49.000000000 +0200 @@ -39,7 +39,7 @@ AM_INIT_AUTOMAKE AM_PROG_LIBTOOL AC_SUBST(LIBTOOL_DEPS) -AM_PATH_PYTHON(2.4) +#AM_PATH_PYTHON(2.4) echo . echo Checking for programs @@ -105,7 +105,8 @@ if test x$use_apparmor != xno ; then AC_DEFINE(WITH_APPARMOR,1,[Define if you want to enable AppArmor events.])fi -AC_OUTPUT(Makefile lib/Makefile auparse/Makefile src/Makefile src/mt/Makefile swig/Makefile docs/Makefile init.d/Makefile) +#AC_OUTPUT(Makefile lib/Makefile auparse/Makefile src/Makefile src/mt/Makefile swig/Makefile docs/Makefile init.d/Makefile) +AC_OUTPUT(Makefile lib/Makefile auparse/Makefile src/Makefile src/mt/Makefile docs/Makefile init.d/Makefile) echo . echo " --- audit-1.2.6/Makefile.am.xx 2006-07-13 22:24:35.000000000 +0200 +++ audit-1.2.6/Makefile.am 2006-08-31 20:52:49.000000000 +0200 @@ -22,7 +22,8 @@ # #SUBDIRS = lib auparse src/mt src audisp audisp/tests swig init.d docs -SUBDIRS = lib auparse src/mt src audisp swig init.d docs +#SUBDIRS = lib auparse src/mt src audisp swig init.d docs +SUBDIRS = lib auparse src/mt src audisp init.d docs EXTRA_DIST = ChangeLog AUTHORS NEWS README sample.rules contrib/capp.rules contrib/lspp.rules contrib/skeleton.c README-install audit.spec CONFIG_CLEAN_FILES = Makefile.in aclocal.m4* config.h.* configure debug*.list config/* ++++++ audit-no_syscall_hdr.patch ++++++ From: olh@suse.de Date: Sat Aug 26 09:01:50 CEST 2006 References: unknown Upstream: unknown Remove unused/invalid sys/syscall.h include --- audit-1.2.6/lib/lookup_table.c.xx 2006-08-31 19:58:28.000000000 +0200 +++ audit-1.2.6/lib/lookup_table.c 2006-08-31 19:58:36.000000000 +0200 @@ -29,7 +29,6 @@ #include "libaudit.h" #include "private.h" -#include <sys/syscall.h> struct transtab { int value; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Remember to have fun... --------------------------------------------------------------------- To unsubscribe, e-mail: opensuse-commit+unsubscribe@opensuse.org For additional commands, e-mail: opensuse-commit+help@opensuse.org
participants (1)
-
root@suse.de