new upstream release (3.3.0); modify package compatibility for Stretch
[ossec-hids.git] / src / monitord / main.c
old mode 100755 (executable)
new mode 100644 (file)
index e3f4d5d..fdf18e6
@@ -1,6 +1,3 @@
-/* @(#) $Id: ./src/monitord/main.c, 2011/09/08 dcid Exp $
- */
-
 /* Copyright (C) 2009 Trend Micro Inc.
  * All rights reserved.
  *
  * Foundation
  */
 
-
 #include "shared.h"
 #include "config/config.h"
 #include "monitord.h"
 #include "os_net/os_net.h"
 
+/* Prototypes */
+static void help_monitord(void) __attribute__((noreturn));
+
+
+/* Print help statement */
+static void help_monitord()
+{
+    print_header();
+    print_out("  %s: -[Vhdtf] [-u user] [-g group] [-c config] [-D dir]", ARGV0);
+    print_out("    -V          Version and license message");
+    print_out("    -h          This help message");
+    print_out("    -d          Execute in debug mode. This parameter");
+    print_out("                can be specified multiple times");
+    print_out("                to increase the debug level.");
+    print_out("    -t          Test configuration");
+    print_out("    -f          Run in foreground");
+    print_out("    -u <user>   User to run as (default: %s)", USER);
+    print_out("    -g <group>  Group to run as (default: %s)", GROUPGLOBAL);
+    print_out("    -c <config> Configuration file to use (default: %s)", DEFAULTCPATH);
+    print_out("    -D <dir>    Directory to chroot into (default: %s)", DEFAULTDIR);
+    print_out(" ");
+    exit(1);
+}
 
 int main(int argc, char **argv)
 {
     int c, test_config = 0, run_foreground = 0;
-    int uid=0,gid=0;
-    char *dir  = DEFAULTDIR;
-    char *user = USER;
-    char *group = GROUPGLOBAL;
-    char *cfg = DEFAULTCPATH;
-
-    /* Initializing global variables */
+    uid_t uid;
+    gid_t gid;
+    const char *dir  = DEFAULTDIR;
+    const char *user = USER;
+    const char *group = GROUPGLOBAL;
+    const char *cfg = DEFAULTCPATH;
+
+    /* Initialize global variables */
     mond.a_queue = 0;
 
-    /* Setting the name */
+    /* Set the name */
     OS_SetName(ARGV0);
 
-
-    while((c = getopt(argc, argv, "Vdhtfu:g:D:c:")) != -1){
-        switch(c){
+    while ((c = getopt(argc, argv, "Vdhtfu:g:D:c:")) != -1) {
+        switch (c) {
             case 'V':
                 print_version();
                 break;
             case 'h':
-                help(ARGV0);
+                help_monitord();
                 break;
             case 'd':
                 nowDebug();
@@ -48,166 +67,151 @@ int main(int argc, char **argv)
                 run_foreground = 1;
                 break;
             case 'u':
-                if(!optarg)
-                    ErrorExit("%s: -u needs an argument",ARGV0);
-                user=optarg;
+                if (!optarg) {
+                    ErrorExit("%s: -u needs an argument", ARGV0);
+                }
+                user = optarg;
                 break;
             case 'g':
-                if(!optarg)
-                    ErrorExit("%s: -g needs an argument",ARGV0);
-                group=optarg;
+                if (!optarg) {
+                    ErrorExit("%s: -g needs an argument", ARGV0);
+                }
+                group = optarg;
                 break;
             case 'D':
-                if(!optarg)
-                    ErrorExit("%s: -D needs an argument",ARGV0);
-                dir=optarg;
+                if (!optarg) {
+                    ErrorExit("%s: -D needs an argument", ARGV0);
+                }
+                dir = optarg;
                 break;
             case 'c':
-                if(!optarg)
-                    ErrorExit("%s: -c needs an argument",ARGV0);
+                if (!optarg) {
+                    ErrorExit("%s: -c needs an argument", ARGV0);
+                }
                 cfg = optarg;
                 break;
             case 't':
                 test_config = 1;
                 break;
             default:
-                help(ARGV0);
+                help_monitord();
                 break;
         }
 
     }
 
-    /* Starting daemon */
-    debug1(STARTED_MSG,ARGV0);
+    /* Start daemon */
+    debug1(STARTED_MSG, ARGV0);
 
     /*Check if the user/group given are valid */
     uid = Privsep_GetUser(user);
     gid = Privsep_GetGroup(group);
-    if((uid < 0)||(gid < 0))
-        ErrorExit(USER_ERROR,ARGV0,user,group);
-
-
-    /* Getting config options */
-    mond.day_wait = getDefine_Int("monitord",
-                                  "day_wait",
-                                  5,240);
-    mond.compress = getDefine_Int("monitord",
-                                  "compress",
-                                  0,1);
-    mond.sign = getDefine_Int("monitord","sign",0,1);
-
-    mond.monitor_agents = getDefine_Int("monitord","monitor_agents",0,1);
+    if (uid == (uid_t) - 1 || gid == (gid_t) - 1) {
+        ErrorExit(USER_ERROR, ARGV0, user, group);
+    }
 
+    /* Get config options */
+    mond.day_wait = (unsigned short) getDefine_Int("monitord", "day_wait", 5, 240);
+    mond.compress = (short) getDefine_Int("monitord", "compress", 0, 1);
+    mond.sign = (short) getDefine_Int("monitord", "sign", 0, 1);
+    mond.monitor_agents = (short) getDefine_Int("monitord", "monitor_agents", 0, 1);
+    mond.notify_time = getDefine_Int("monitord", "notify_time", 60, 3600);
     mond.agents = NULL;
     mond.smtpserver = NULL;
     mond.emailfrom = NULL;
     mond.emailidsname = NULL;
 
-
     c = 0;
-    c|= CREPORTS;
-    if(ReadConfig(c, cfg, &mond, NULL) < 0)
-    {
+    c |= CREPORTS;
+    if (ReadConfig(c, cfg, &mond, NULL) < 0) {
         ErrorExit(CONFIG_ERROR, ARGV0, cfg);
     }
 
     /* If we have any reports configured, read smtp/emailfrom */
-    if(mond.reports)
-    {
+    if (mond.reports) {
         OS_XML xml;
         char *tmpsmtp;
 
-        const char *(xml_smtp[])={"ossec_config", "global", "smtp_server", NULL};
-        const char *(xml_from[])={"ossec_config", "global", "email_from", NULL};
-        const char *(xml_idsname[])={"ossec_config", "global", "email_idsname", NULL};
+        const char *(xml_smtp[]) = {"ossec_config", "global", "smtp_server", NULL};
+        const char *(xml_from[]) = {"ossec_config", "global", "email_from", NULL};
+        const char *(xml_idsname[]) = {"ossec_config", "global", "email_idsname", NULL};
 
-        if(OS_ReadXML(cfg, &xml) < 0)
-        {
+        if (OS_ReadXML(cfg, &xml) < 0) {
             ErrorExit(CONFIG_ERROR, ARGV0, cfg);
         }
 
-        tmpsmtp = OS_GetOneContentforElement(&xml,xml_smtp);
-        mond.emailfrom = OS_GetOneContentforElement(&xml,xml_from);
-        mond.emailidsname = OS_GetOneContentforElement(&xml,xml_idsname);
+        tmpsmtp = OS_GetOneContentforElement(&xml, xml_smtp);
+        mond.emailfrom = OS_GetOneContentforElement(&xml, xml_from);
+        mond.emailidsname = OS_GetOneContentforElement(&xml, xml_idsname);
 
-        if(tmpsmtp && mond.emailfrom)
-        {
+        if (tmpsmtp && mond.emailfrom) {
             mond.smtpserver = OS_GetHost(tmpsmtp, 5);
-            if(!mond.smtpserver)
-            {
+            if (!mond.smtpserver) {
                 merror(INVALID_SMTP, ARGV0, tmpsmtp);
-                if(mond.emailfrom) free(mond.emailfrom);
+                if (mond.emailfrom) {
+                    free(mond.emailfrom);
+                }
                 mond.emailfrom = NULL;
                 merror("%s: Invalid SMTP server.  Disabling email reports.", ARGV0);
             }
-        }
-        else
-        {
-            if(tmpsmtp) free(tmpsmtp);
-            if(mond.emailfrom) free(mond.emailfrom);
+        } else {
+            if (tmpsmtp) {
+                free(tmpsmtp);
+            }
+            if (mond.emailfrom) {
+                free(mond.emailfrom);
+            }
 
             mond.emailfrom = NULL;
-
             merror("%s: SMTP server or 'email from' missing. Disabling email reports.", ARGV0);
         }
 
         OS_ClearXML(&xml);
     }
 
-
     /* Exit here if test config is set */
-    if(test_config)
+    if (test_config) {
         exit(0);
+    }
 
-
-    if (!run_foreground)
-    {
+    if (!run_foreground) {
         /* Going on daemon mode */
         nowDaemon();
         goDaemon();
     }
 
-
     /* Privilege separation */
-    if(Privsep_SetGroup(gid) < 0)
-        ErrorExit(SETGID_ERROR,ARGV0,group);
-
+    if (Privsep_SetGroup(gid) < 0) {
+        ErrorExit(SETGID_ERROR, ARGV0, group, errno, strerror(errno));
+    }
 
-    /* chrooting */
-    if(Privsep_Chroot(dir) < 0)
-        ErrorExit(CHROOT_ERROR,ARGV0,dir);
+    /* chroot */
+    if (Privsep_Chroot(dir) < 0) {
+        ErrorExit(CHROOT_ERROR, ARGV0, dir, errno, strerror(errno));
+    }
 
     nowChroot();
 
+    /* Change user */
+    if (Privsep_SetUser(uid) < 0) {
+        ErrorExit(SETUID_ERROR, ARGV0, user, errno, strerror(errno));
+    }
 
-
-    /* Changing user */
-    if(Privsep_SetUser(uid) < 0)
-        ErrorExit(SETUID_ERROR,ARGV0,user);
-
-
-    debug1(PRIVSEP_MSG,ARGV0,dir,user);
-
-
+    debug1(CHROOT_MSG, ARGV0, dir);
+    debug1(PRIVSEP_MSG, ARGV0, user);
 
     /* Signal manipulation */
     StartSIG(ARGV0);
 
-
-
-    /* Creating PID files */
-    if(CreatePID(ARGV0, getpid()) < 0)
-        ErrorExit(PID_ERROR,ARGV0);
-
+    /* Create PID files */
+    if (CreatePID(ARGV0, getpid()) < 0) {
+        ErrorExit(PID_ERROR, ARGV0);
+    }
 
     /* Start up message */
     verbose(STARTUP_MSG, ARGV0, (int)getpid());
 
-
-    /* the real daemon now */
+    /* The real daemon now */
     Monitord();
     exit(0);
 }
-
-
-/* EOF */