Imported Upstream version 2.3
[ossec-hids.git] / src / syscheckd / syscheck.c
1 /* @(#) $Id: syscheck.c,v 1.49 2009/11/18 19:07:42 dcid Exp $ */
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 3) 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 /* Definitions only used in here. */
33 #define SYSCHECK_DB     SYSCHECK_DIR "/syschecklocal.db"
34 #define SYS_WIN_DB      "syscheck/syschecklocal.db"
35
36 int dump_syscheck_entry(config *syscheck, char *entry, int vals, int reg);
37
38
39
40 /* void read_internal()
41  * Reads syscheck internal options.
42  */
43 void read_internal()
44 {
45     syscheck.tsleep = getDefine_Int("syscheck","sleep",0,64);
46     syscheck.sleep_after = getDefine_Int("syscheck","sleep_after",1,9999);
47
48     return;
49 }
50
51
52 #ifdef WIN32
53 /* int Start_win32_Syscheck()
54  * syscheck main for windows
55  */
56 int Start_win32_Syscheck()
57 {
58     int r = 0;
59     char *cfg = DEFAULTCPATH;
60
61
62     /* Zeroing the structure */
63     syscheck.workdir = DEFAULTDIR;
64
65
66     /* Checking if the configuration is present */
67     if(File_DateofChange(cfg) < 0)
68         ErrorExit(NO_CONFIG, ARGV0, cfg);
69
70
71     /* Read syscheck config */
72     if((r = Read_Syscheck_Config(cfg)) < 0)
73     {
74         ErrorExit(CONFIG_ERROR, ARGV0, cfg);
75     }
76     /* Disabled */
77     else if((r == 1) || (syscheck.disabled == 1))
78     {
79         if(!syscheck.dir)
80         {
81             merror(SK_NO_DIR, ARGV0);
82             dump_syscheck_entry(&syscheck, "", 0, 0);
83         }
84         else if(!syscheck.dir[0])
85         {
86             merror(SK_NO_DIR, ARGV0);
87         }
88         syscheck.dir[0] = NULL;
89
90         if(!syscheck.registry)
91         {
92             dump_syscheck_entry(&syscheck, "", 0, 1);
93         }
94         syscheck.registry[0] = NULL;
95
96         merror("%s: WARN: Syscheck disabled.", ARGV0);
97     }
98
99
100     /* Reading internal options */
101     read_internal();
102
103
104     /* Rootcheck config */
105     if(rootcheck_init(0) == 0)
106     {
107         syscheck.rootcheck = 1;
108     }
109     else
110     {
111         syscheck.rootcheck = 0;
112         merror("%s: WARN: Rootcheck module disabled.", ARGV0);
113     }
114                                                             
115
116
117     /* Opening syscheck db file */
118     os_calloc(1024,sizeof(char), syscheck.db);
119     snprintf(syscheck.db,1023,"%s",SYS_WIN_DB);
120
121
122     /* Printing options */
123     r = 0;
124     while(syscheck.registry[r] != NULL)
125     {
126         verbose("%s: INFO: Monitoring registry entry: '%s'.", 
127                 ARGV0, syscheck.registry[r]);
128         r++;
129     }
130     
131     r = 0;
132     while(syscheck.dir[r] != NULL)
133     {
134         verbose("%s: INFO: Monitoring directory: '%s'.",
135                 ARGV0, syscheck.dir[r]);
136         r++;
137     }
138
139
140     /* Start up message */
141     verbose(STARTUP_MSG, ARGV0, getpid());
142             
143         
144         
145     /* Some sync time */
146     sleep(syscheck.tsleep + 10);
147
148
149     /* Waiting if agent started properly. */
150     os_wait();
151
152     
153     /* Start the daemon checking against the syscheck.db */
154     start_daemon();
155
156
157     exit(0);
158 }                
159 #endif
160
161
162
163 /* Syscheck unix main.
164  */
165 #ifndef WIN32 
166 int main(int argc, char **argv)
167 {
168     int c,r;
169     int test_config = 0,run_foreground = 0;
170     
171     char *cfg = DEFAULTCPATH;
172     
173     
174     /* Zeroing the structure */
175     syscheck.workdir = NULL;
176
177
178     /* Setting the name */
179     OS_SetName(ARGV0);
180         
181     
182     while((c = getopt(argc, argv, "VtdhfD:c:")) != -1)
183     {
184         switch(c)
185         {
186             case 'V':
187                 print_version();
188                 break;
189             case 'h':
190                 help(ARGV0);
191                 break;
192             case 'd':
193                 nowDebug();
194                 break;
195             case 'f':
196                 run_foreground = 1;
197                 break;
198             case 'D':
199                 if(!optarg)
200                     ErrorExit("%s: -D needs an argument",ARGV0);
201                 syscheck.workdir = optarg;
202                 break;
203             case 'c':
204                 if(!optarg)
205                     ErrorExit("%s: -c needs an argument",ARGV0);
206                 cfg = optarg;
207                 break;
208             case 't':
209                 test_config = 1;
210                 break;        
211             default:
212                 help(ARGV0);
213                 break;   
214         }
215     }
216
217
218     /* Checking if the configuration is present */
219     if(File_DateofChange(cfg) < 0)
220         ErrorExit(NO_CONFIG, ARGV0, cfg);
221
222
223     /* Read syscheck config */
224     if((r = Read_Syscheck_Config(cfg)) < 0)
225     {
226         ErrorExit(CONFIG_ERROR, ARGV0, cfg);
227     }
228     else if((r == 1) || (syscheck.disabled == 1))
229     {
230         if(!syscheck.dir)
231         {
232             if(!test_config)
233                 merror(SK_NO_DIR, ARGV0);
234             dump_syscheck_entry(&syscheck, "", 0, 0);
235         }
236         else if(!syscheck.dir[0])
237         {
238             if(!test_config)
239                 merror(SK_NO_DIR, ARGV0);
240         }
241         syscheck.dir[0] = NULL;
242         if(!test_config)
243         {
244             merror("%s: WARN: Syscheck disabled.", ARGV0);
245         }
246     }
247
248
249     /* Reading internal options */
250     read_internal();
251         
252     
253
254     /* Rootcheck config */
255     if(rootcheck_init(test_config) == 0)
256     {
257         syscheck.rootcheck = 1;
258     }
259     else
260     {
261         syscheck.rootcheck = 0;
262         merror("%s: WARN: Rootcheck module disabled.", ARGV0);
263     }
264
265         
266     /* Exit if testing config */
267     if(test_config)
268         exit(0);
269
270         
271     /* Setting default values */
272     if(syscheck.workdir == NULL)
273         syscheck.workdir = DEFAULTDIR;
274
275
276     /* Creating a temporary fp */
277     syscheck.db = (char *)calloc(1024,sizeof(char));
278     if(syscheck.db == NULL)
279         ErrorExit(MEM_ERROR,ARGV0);
280         
281     snprintf(syscheck.db,1023,"%s%s-%d%d.tmp",
282                               syscheck.workdir,
283                               SYSCHECK_DB,
284                               (int)time(NULL),
285                               (int)getpid());    
286
287
288
289     if (!run_foreground) 
290     {
291         nowDaemon();
292         goDaemon();
293     }
294    
295     /* Initial time to settle */
296     sleep(syscheck.tsleep + 2); 
297     
298     
299     /* Connect to the queue  */
300     if((syscheck.queue = StartMQ(DEFAULTQPATH,WRITE)) < 0)
301     {   
302         merror(QUEUE_ERROR, ARGV0, DEFAULTQPATH, strerror(errno));
303
304         sleep(5);
305         if((syscheck.queue = StartMQ(DEFAULTQPATH,WRITE)) < 0)
306         {
307             /* more 10 seconds of wait.. */
308             merror(QUEUE_ERROR, ARGV0, DEFAULTQPATH, strerror(errno));
309             sleep(10);
310             if((syscheck.queue = StartMQ(DEFAULTQPATH,WRITE)) < 0)
311                 ErrorExit(QUEUE_FATAL,ARGV0,DEFAULTQPATH);
312         }
313     }
314
315
316     /* Start the signal handling */
317     StartSIG(ARGV0);
318     
319
320     /* Creating pid */
321     if(CreatePID(ARGV0, getpid()) < 0)
322         merror(PID_ERROR,ARGV0);
323
324
325     /* Start up message */
326     verbose(STARTUP_MSG, ARGV0, (int)getpid());
327
328     if(syscheck.rootcheck)
329     {
330         verbose(STARTUP_MSG, "ossec-rootcheck", (int)getpid());
331     }
332
333
334     /* Printing directories to be monitored. */
335     r = 0;
336     while(syscheck.dir[r] != NULL)
337     {
338         verbose("%s: INFO: Monitoring directory: '%s'.",
339                 ARGV0, syscheck.dir[r]);
340         r++;
341     }
342
343     /* Checking directories set for real time. */
344     r = 0;
345     while(syscheck.dir[r] != NULL)
346     {
347         if(syscheck.opts[r] & CHECK_REALTIME)
348         {
349             #ifdef USEINOTIFY
350             verbose("%s: INFO: Directory set for real time monitoring: "
351                     "'%s'.", ARGV0, syscheck.dir[r]);
352             #elif WIN32
353             verbose("%s: INFO: Directory set for real time monitoring: "
354                     "'%s'.", ARGV0, syscheck.dir[r]);
355             #else
356             verbose("%s: WARN: Ignoring flag for real time monitoring on "
357                     "directory: '%s'.", ARGV0, syscheck.dir[r]);
358             #endif
359         }
360         r++;
361     }
362         
363     
364     /* Some sync time */
365     sleep(syscheck.tsleep + 10);
366
367
368     /* Start the daemon */
369     start_daemon();
370
371     return(0);        
372 }
373 #endif /* ifndef WIN32 */
374
375
376 /* EOF */