Imported Upstream version 2.7
[ossec-hids.git] / src / syscheckd / syscheck.c
1 /* @(#) $Id: ./src/syscheckd/syscheck.c, 2011/09/08 dcid Exp $
2  */
3
4 /* Copyright (C) 2009 Trend Micro Inc.
5  * All rights reserved.
6  *
7  * This program is a free software; you can redistribute it
8  * and/or modify it under the terms of the GNU General Public
9  * License (version 2) as published by the FSF - Free Software
10  * Foundation.
11  *
12  * License details at the LICENSE file included with OSSEC or
13  * online at: http://www.ossec.net/en/licensing.html
14  */
15
16
17 /*
18  * Syscheck v 0.3
19  * Copyright (C) 2003 Daniel B. Cid <daniel@underlinux.com.br>
20  * http://www.ossec.net
21  *
22  * syscheck.c, 2004/03/17, Daniel B. Cid
23  */
24
25 /* Inclusion of syscheck into OSSEC */
26
27
28 #include "shared.h"
29 #include "syscheck.h"
30
31 #include "rootcheck/rootcheck.h"
32
33 int dump_syscheck_entry(config *syscheck, char *entry, int vals, int reg, char *restrictfile);
34
35
36
37 /* void read_internal()
38  * Reads syscheck internal options.
39  */
40 void read_internal()
41 {
42     syscheck.tsleep = getDefine_Int("syscheck","sleep",0,64);
43     syscheck.sleep_after = getDefine_Int("syscheck","sleep_after",1,9999);
44
45     return;
46 }
47
48
49 #ifdef WIN32
50 /* int Start_win32_Syscheck()
51  * syscheck main for windows
52  */
53 int Start_win32_Syscheck()
54 {
55     int r = 0;
56     char *cfg = DEFAULTCPATH;
57
58
59     /* Zeroing the structure */
60     syscheck.workdir = DEFAULTDIR;
61
62
63     /* Checking if the configuration is present */
64     if(File_DateofChange(cfg) < 0)
65         ErrorExit(NO_CONFIG, ARGV0, cfg);
66
67
68     /* Read syscheck config */
69     if((r = Read_Syscheck_Config(cfg)) < 0)
70     {
71         ErrorExit(CONFIG_ERROR, ARGV0, cfg);
72     }
73     /* Disabled */
74     else if((r == 1) || (syscheck.disabled == 1))
75     {
76         if(!syscheck.dir)
77         {
78             merror(SK_NO_DIR, ARGV0);
79             dump_syscheck_entry(&syscheck, "", 0, 0, NULL);
80         }
81         else if(!syscheck.dir[0])
82         {
83             merror(SK_NO_DIR, ARGV0);
84         }
85         syscheck.dir[0] = NULL;
86
87         if(!syscheck.registry)
88         {
89             dump_syscheck_entry(&syscheck, "", 0, 1, NULL);
90         }
91         syscheck.registry[0] = NULL;
92
93         merror("%s: WARN: Syscheck disabled.", ARGV0);
94     }
95
96
97     /* Reading internal options */
98     read_internal();
99
100
101     /* Rootcheck config */
102     if(rootcheck_init(0) == 0)
103     {
104         syscheck.rootcheck = 1;
105     }
106     else
107     {
108         syscheck.rootcheck = 0;
109         merror("%s: WARN: Rootcheck module disabled.", ARGV0);
110     }
111
112
113
114     /* Printing options */
115     r = 0;
116     while(syscheck.registry[r] != NULL)
117     {
118         verbose("%s: INFO: Monitoring registry entry: '%s'.",
119                 ARGV0, syscheck.registry[r]);
120         r++;
121     }
122
123     r = 0;
124     while(syscheck.dir[r] != NULL)
125     {
126         verbose("%s: INFO: Monitoring directory: '%s'.",
127                 ARGV0, syscheck.dir[r]);
128         r++;
129     }
130
131
132     /* Start up message */
133     verbose(STARTUP_MSG, ARGV0, getpid());
134
135
136
137     /* Some sync time */
138     sleep(syscheck.tsleep + 10);
139
140
141     /* Waiting if agent started properly. */
142     os_wait();
143
144
145     start_daemon();
146
147
148     exit(0);
149 }
150 #endif
151
152
153
154 /* Syscheck unix main.
155  */
156 #ifndef WIN32
157 int main(int argc, char **argv)
158 {
159     int c,r;
160     int test_config = 0,run_foreground = 0;
161
162     char *cfg = DEFAULTCPATH;
163
164
165     /* Zeroing the structure */
166     syscheck.workdir = NULL;
167
168
169     /* Setting the name */
170     OS_SetName(ARGV0);
171
172
173     while((c = getopt(argc, argv, "VtdhfD:c:")) != -1)
174     {
175         switch(c)
176         {
177             case 'V':
178                 print_version();
179                 break;
180             case 'h':
181                 help(ARGV0);
182                 break;
183             case 'd':
184                 nowDebug();
185                 break;
186             case 'f':
187                 run_foreground = 1;
188                 break;
189             case 'D':
190                 if(!optarg)
191                     ErrorExit("%s: -D needs an argument",ARGV0);
192                 syscheck.workdir = optarg;
193                 break;
194             case 'c':
195                 if(!optarg)
196                     ErrorExit("%s: -c needs an argument",ARGV0);
197                 cfg = optarg;
198                 break;
199             case 't':
200                 test_config = 1;
201                 break;
202             default:
203                 help(ARGV0);
204                 break;
205         }
206     }
207
208
209     /* Checking if the configuration is present */
210     if(File_DateofChange(cfg) < 0)
211         ErrorExit(NO_CONFIG, ARGV0, cfg);
212
213
214     /* Read syscheck config */
215     if((r = Read_Syscheck_Config(cfg)) < 0)
216     {
217         ErrorExit(CONFIG_ERROR, ARGV0, cfg);
218     }
219     else if((r == 1) || (syscheck.disabled == 1))
220     {
221         if(!syscheck.dir)
222         {
223             if(!test_config)
224                 merror(SK_NO_DIR, ARGV0);
225             dump_syscheck_entry(&syscheck, "", 0, 0, NULL);
226         }
227         else if(!syscheck.dir[0])
228         {
229             if(!test_config)
230                 merror(SK_NO_DIR, ARGV0);
231         }
232         syscheck.dir[0] = NULL;
233         if(!test_config)
234         {
235             merror("%s: WARN: Syscheck disabled.", ARGV0);
236         }
237     }
238
239
240     /* Reading internal options */
241     read_internal();
242
243
244
245     /* Rootcheck config */
246     if(rootcheck_init(test_config) == 0)
247     {
248         syscheck.rootcheck = 1;
249     }
250     else
251     {
252         syscheck.rootcheck = 0;
253         merror("%s: WARN: Rootcheck module disabled.", ARGV0);
254     }
255
256
257     /* Exit if testing config */
258     if(test_config)
259         exit(0);
260
261
262     /* Setting default values */
263     if(syscheck.workdir == NULL)
264         syscheck.workdir = DEFAULTDIR;
265
266
267     if(!run_foreground)
268     {
269         nowDaemon();
270         goDaemon();
271     }
272
273     /* Initial time to settle */
274     sleep(syscheck.tsleep + 2);
275
276
277     /* Connect to the queue  */
278     if((syscheck.queue = StartMQ(DEFAULTQPATH,WRITE)) < 0)
279     {
280         merror(QUEUE_ERROR, ARGV0, DEFAULTQPATH, strerror(errno));
281
282         sleep(5);
283         if((syscheck.queue = StartMQ(DEFAULTQPATH,WRITE)) < 0)
284         {
285             /* more 10 seconds of wait.. */
286             merror(QUEUE_ERROR, ARGV0, DEFAULTQPATH, strerror(errno));
287             sleep(10);
288             if((syscheck.queue = StartMQ(DEFAULTQPATH,WRITE)) < 0)
289                 ErrorExit(QUEUE_FATAL,ARGV0,DEFAULTQPATH);
290         }
291     }
292
293
294     /* Start the signal handling */
295     StartSIG(ARGV0);
296
297
298     /* Creating pid */
299     if(CreatePID(ARGV0, getpid()) < 0)
300         merror(PID_ERROR,ARGV0);
301
302
303     /* Start up message */
304     verbose(STARTUP_MSG, ARGV0, (int)getpid());
305
306     if(syscheck.rootcheck)
307     {
308         verbose(STARTUP_MSG, "ossec-rootcheck", (int)getpid());
309     }
310
311
312     /* Printing directories to be monitored. */
313     r = 0;
314     while(syscheck.dir[r] != NULL)
315     {
316         verbose("%s: INFO: Monitoring directory: '%s'.",
317                 ARGV0, syscheck.dir[r]);
318         r++;
319     }
320
321     /* Checking directories set for real time. */
322     r = 0;
323     while(syscheck.dir[r] != NULL)
324     {
325         if(syscheck.opts[r] & CHECK_REALTIME)
326         {
327             #ifdef USEINOTIFY
328             verbose("%s: INFO: Directory set for real time monitoring: "
329                     "'%s'.", ARGV0, syscheck.dir[r]);
330             #elif WIN32
331             verbose("%s: INFO: Directory set for real time monitoring: "
332                     "'%s'.", ARGV0, syscheck.dir[r]);
333             #else
334             verbose("%s: WARN: Ignoring flag for real time monitoring on "
335                     "directory: '%s'.", ARGV0, syscheck.dir[r]);
336             #endif
337         }
338         r++;
339     }
340
341
342     /* Some sync time */
343     sleep(syscheck.tsleep + 10);
344
345
346     /* Start the daemon */
347     start_daemon();
348
349     return(0);
350 }
351 #endif /* ifndef WIN32 */
352
353
354 /* EOF */