]> git.ipfire.org Git - ipfire-2.x.git/blobdiff - src/misc-progs/logwatch.c
Merge branch 'next' of ssh://git.ipfire.org/pub/git/ipfire-2.x into next-suricata
[ipfire-2.x.git] / src / misc-progs / logwatch.c
index 8b78a68250db76de3f158ae3a145235354234f06..fc950b1baaabecaafed477a20ae663d89db4215c 100644 (file)
-/* This file is part of the IPCop Firewall.\r
- *\r
- * This program is distributed under the terms of the GNU General Public\r
- * Licence.  See the file COPYING for details.\r
- *\r
- * Copyright (C) 2003-07-12 Robert Kerr <rkerr@go.to>\r
- *\r
- * $Id: logwatch.c,v 1.2 2003/12/11 11:25:54 riddles Exp $\r
- *\r
- */\r
-\r
-#include <stdio.h>\r
-#include <unistd.h>\r
-#include <stdlib.h>\r
-#include <string.h>\r
-#include <grp.h>\r
-#include <pwd.h>\r
-#include <sys/types.h>\r
-#include "libsmooth.h"\r
-#include "setuid.h"\r
-\r
-/* Lots of distros just run logwatch as root from cron, but logwatch doesn't\r
- * need any root privs, just the ability to access it's filter scripts\r
- * (/etc/log.d/) and the log files (under /var/log/). By creating a logwatch\r
- * user and group and ensuring it has read access to the logs we can run\r
- * logwatch unprivileged. Apart from the principle of least privilege running\r
- * logwatch as root turns out to be doubly a bad idea because a flaw in the way\r
- * it works:\r
- *\r
- *   http://www.securityfocus.com/archive/1/327833/2003-07-01/2003-07-07/0\r
- *\r
- * This wrapper program should be run as root, but not installed setuid root,\r
- * it's basic aim is to allow a root cron job to safely run logcheck; as such\r
- * it will drop privileges, becoming the locheck user & group then run\r
- * logcheck. In many ways this is much the same as getting cron to run\r
- *    su -s /etc/log.d/scripts/logwatch.pl\r
- * the wrapper however is able to read configuration info from /var/ipcop and\r
- * pass the correct args to logwatch\r
- */\r
-\r
-int main(void)\r
-{\r
-   char buffer[STRING_SIZE];\r
-   struct keyvalue *kv = NULL;\r
-   struct passwd *pw;\r
-   gid_t groups[2];\r
-   char * argv[4];\r
-\r
-   if(getuid())\r
-   {\r
-      fprintf(stderr, "logwatch should be ran by root\n");\r
-      exit(1);\r
-   }\r
-\r
-   /* Read in and verify config */\r
-   kv=initkeyvalues();\r
-\r
-   if (!readkeyvalues(kv, CONFIG_ROOT "/logging/settings"))\r
-   {\r
-      fprintf(stderr, "Cannot read syslog settings\n");\r
-      exit(1);\r
-   }\r
-\r
-   if (!findkey(kv, "LOGWATCH_LEVEL", buffer))\r
-   {\r
-      fprintf(stderr, "Cannot read LOGWATCH_LEVEL\n");\r
-      exit(1);\r
-   }\r
-\r
-   if (strcmp(buffer,"Low") && strcmp(buffer,"Med") && strcmp(buffer,"High"))\r
-   {\r
-      fprintf(stderr, "Bad LOGWATCH_LEVEL: %s\n", buffer);\r
-      exit(1);\r
-   }\r
-\r
-   freekeyvalues(kv);\r
-\r
-\r
-   /* lookup logwatch user */\r
-   if(!(pw = getpwnam("logwatch")))\r
-   {\r
-      fprintf(stderr,"Couldn't find logwatch user.\n");\r
-      exit(1);\r
-   }\r
-   /* paranoia... */\r
-   memset(pw->pw_passwd, 0, strlen(pw->pw_passwd));\r
-   endpwent();\r
-\r
-   /* more paranoia */\r
-   if(!pw->pw_uid || !pw->pw_gid)\r
-   {\r
-      fprintf(stderr,"logwatch user appears to be UID or GID 0, aborting.\n");\r
-      exit(1);\r
-   }\r
-\r
-   /* drop privs */\r
-   groups[0] = groups[1] = pw->pw_gid;\r
-   if (setgroups(1,groups)) { perror("Couldn't clear group list"); exit(1); }\r
-   if (setgid(pw->pw_gid))  { perror("Couldn't setgid(logwatch)"); exit(1); }\r
-   if (setuid(pw->pw_uid))  { perror("Couldn't setuid(logwatch)"); exit(1); }\r
-\r
-   /* ok, spawn logwatch */\r
-   argv[0] = "logwatch.pl";\r
-   argv[1] = "--detail";\r
-   argv[2] = buffer;\r
-   argv[3] = NULL;\r
-   execve("/etc/log.d/scripts/logwatch.pl", argv, trusted_env);\r
-\r
-   /* shouldn't get here - execve replaces current running process */\r
-   perror("logwatch: execve failed");\r
-   exit(1);\r
-}\r
+/* This file is part of the IPCop Firewall.
+ *
+ * This program is distributed under the terms of the GNU General Public
+ * Licence.  See the file COPYING for details.
+ *
+ * Copyright (C) 2003-07-12 Robert Kerr <rkerr@go.to>
+ *
+ * $Id: logwatch.c,v 1.2 2003/12/11 11:25:54 riddles Exp $
+ *
+ */
+
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+#include <grp.h>
+#include <pwd.h>
+#include <sys/types.h>
+#include "libsmooth.h"
+#include "setuid.h"
+
+/* Lots of distros just run logwatch as root from cron, but logwatch doesn't
+ * need any root privs, just the ability to access it's filter scripts
+ * (/etc/log.d/) and the log files (under /var/log/). By creating a logwatch
+ * user and group and ensuring it has read access to the logs we can run
+ * logwatch unprivileged. Apart from the principle of least privilege running
+ * logwatch as root turns out to be doubly a bad idea because a flaw in the way
+ * it works:
+ *
+ *   http://www.securityfocus.com/archive/1/327833/2003-07-01/2003-07-07/0
+ *
+ * This wrapper program should be run as root, but not installed setuid root,
+ * it's basic aim is to allow a root cron job to safely run logcheck; as such
+ * it will drop privileges, becoming the locheck user & group then run
+ * logcheck. In many ways this is much the same as getting cron to run
+ *    su -s /etc/log.d/scripts/logwatch.pl
+ * the wrapper however is able to read configuration info from /var/ipcop and
+ * pass the correct args to logwatch
+ */
+
+int main(void)
+{
+   char buffer[STRING_SIZE];
+   struct keyvalue *kv = NULL;
+   struct passwd *pw;
+   gid_t groups[2];
+   char * argv[4];
+
+   if(getuid())
+   {
+      fprintf(stderr, "logwatch should be ran by root\n");
+      exit(1);
+   }
+
+   /* Read in and verify config */
+   kv=initkeyvalues();
+
+   if (!readkeyvalues(kv, CONFIG_ROOT "/logging/settings"))
+   {
+      fprintf(stderr, "Cannot read syslog settings\n");
+      exit(1);
+   }
+
+   if (!findkey(kv, "LOGWATCH_LEVEL", buffer))
+   {
+      fprintf(stderr, "Cannot read LOGWATCH_LEVEL\n");
+      exit(1);
+   }
+
+   if (strcmp(buffer,"Low") && strcmp(buffer,"Med") && strcmp(buffer,"High"))
+   {
+      fprintf(stderr, "Bad LOGWATCH_LEVEL: %s\n", buffer);
+      exit(1);
+   }
+
+   freekeyvalues(kv);
+
+
+   /* lookup logwatch user */
+   if(!(pw = getpwnam("logwatch")))
+   {
+      fprintf(stderr,"Couldn't find logwatch user.\n");
+      exit(1);
+   }
+   /* paranoia... */
+   memset(pw->pw_passwd, 0, strlen(pw->pw_passwd));
+   endpwent();
+
+   /* more paranoia */
+   if(!pw->pw_uid || !pw->pw_gid)
+   {
+      fprintf(stderr,"logwatch user appears to be UID or GID 0, aborting.\n");
+      exit(1);
+   }
+
+   /* drop privs */
+   groups[0] = groups[1] = pw->pw_gid;
+   if (setgroups(1,groups)) { perror("Couldn't clear group list"); exit(1); }
+   if (setgid(pw->pw_gid))  { perror("Couldn't setgid(logwatch)"); exit(1); }
+   if (setuid(pw->pw_uid))  { perror("Couldn't setuid(logwatch)"); exit(1); }
+
+   /* ok, spawn logwatch */
+   argv[0] = "logwatch.pl";
+   argv[1] = "--detail";
+   argv[2] = buffer;
+   argv[3] = NULL;
+   execve("/usr/share/logwatch/scripts/logwatch.pl", argv, trusted_env);
+
+   /* shouldn't get here - execve replaces current running process */
+   perror("logwatch: execve failed");
+   exit(1);
+}