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