Imported Upstream version 2.7
[ossec-hids.git] / src / config / agentlessd-config.c
1 /* @(#) $Id: ./src/config/agentlessd-config.c, 2011/09/08 dcid Exp $
2  */
3
4 /* Copyright (C) 2009 Trend Micro Inc.
5  * All right 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
13 /* Functions to handle the configuration files
14  */
15
16
17 #include "shared.h"
18 #include "agentlessd-config.h"
19
20
21 int Read_CAgentless(XML_NODE node, void *config, void *config2)
22 {
23     int i = 0,j = 0,s = 0;
24
25     /* XML definitions */
26     char *xml_lessd_server = "host";
27     char *xml_lessd_port = "port";
28     char *xml_lessd_type = "type";
29     char *xml_lessd_frequency = "frequency";
30     char *xml_lessd_state = "state";
31     char *xml_lessd_command = "run_command";
32     char *xml_lessd_options = "arguments";
33
34
35     agentlessd_config *lessd_config = (agentlessd_config *)config;
36
37
38     /* Getting any configured entry. */
39     if(lessd_config->entries)
40     {
41         while(lessd_config->entries[s])
42             s++;
43     }
44
45
46     /* Allocating the memory for the config. */
47     os_realloc(lessd_config->entries, (s + 2) * sizeof(agentlessd_entries *),
48                lessd_config->entries);
49     os_calloc(1, sizeof(agentlessd_entries), lessd_config->entries[s]);
50     lessd_config->entries[s + 1] = NULL;
51
52
53     /* Zeroing the elements. */
54     lessd_config->entries[s]->server = NULL;
55     lessd_config->entries[s]->command = NULL;
56     lessd_config->entries[s]->options = "";
57     lessd_config->entries[s]->type = NULL;
58     lessd_config->entries[s]->frequency = 86400;
59     lessd_config->entries[s]->state = 0;
60     lessd_config->entries[s]->current_state = 0;
61     lessd_config->entries[s]->port = 0;
62     lessd_config->entries[s]->error_flag = 0;
63
64
65     /* Reading the XML. */
66     while(node[i])
67     {
68         if(!node[i]->element)
69         {
70             merror(XML_ELEMNULL, ARGV0);
71             return(OS_INVALID);
72         }
73         else if(!node[i]->content)
74         {
75             merror(XML_VALUENULL, ARGV0, node[i]->element);
76             return(OS_INVALID);
77         }
78         else if(strcmp(node[i]->element, xml_lessd_frequency) == 0)
79         {
80             if(!OS_StrIsNum(node[i]->content))
81             {
82                 merror(XML_VALUEERR,ARGV0,node[i]->element,node[i]->content);
83                 return(OS_INVALID);
84             }
85
86             lessd_config->entries[s]->frequency = atoi(node[i]->content);
87         }
88         else if(strcmp(node[i]->element, xml_lessd_port) == 0)
89         {
90             if(!OS_StrIsNum(node[i]->content))
91             {
92                 merror(XML_VALUEERR,ARGV0,node[i]->element,node[i]->content);
93                 return(OS_INVALID);
94             }
95
96             lessd_config->entries[s]->port = atoi(node[i]->content);
97         }
98         else if(strcmp(node[i]->element, xml_lessd_server) == 0)
99         {
100             char s_content[1024 +1];
101             s_content[1024] = '\0';
102
103             /* Getting any configured entry. */
104             j = 0;
105             if(lessd_config->entries[s]->server)
106             {
107                 while(lessd_config->entries[s]->server[j])
108                     j++;
109             }
110
111             os_realloc(lessd_config->entries[s]->server, (j + 2) *
112                        sizeof(char *),
113                        lessd_config->entries[s]->server);
114             if(strncmp(node[i]->content, "use_su ", 7) == 0)
115             {
116                 snprintf(s_content, 1024, "s%s", node[i]->content +7);
117             }
118             else if(strncmp(node[i]->content, "use_sudo ", 9) == 0)
119             {
120                 snprintf(s_content, 1024, "o%s", node[i]->content +9);
121             }
122             else
123             {
124                 snprintf(s_content, 1024, " %s", node[i]->content);
125             }
126
127             os_strdup(s_content,
128                       lessd_config->entries[s]->server[j]);
129             lessd_config->entries[s]->server[j + 1] = NULL;
130         }
131         else if(strcmp(node[i]->element, xml_lessd_type) == 0)
132         {
133             char script_path[1024 +1];
134
135             script_path[1024] = '\0';
136             snprintf(script_path, 1024, "%s/%s", AGENTLESSDIRPATH,
137                                          node[i]->content);
138
139             if(File_DateofChange(script_path) <= 0)
140             {
141                 merror("%s: ERROR: Unable to find '%s' at '%s'.",
142                        ARGV0, node[i]->content, AGENTLESSDIRPATH);
143                 merror(XML_VALUEERR,ARGV0, node[i]->element, node[i]->content);
144                 return(OS_INVALID);
145             }
146             os_strdup(node[i]->content, lessd_config->entries[s]->type);
147         }
148         else if(strcmp(node[i]->element, xml_lessd_command) == 0)
149         {
150             os_strdup(node[i]->content, lessd_config->entries[s]->command);
151         }
152         else if(strcmp(node[i]->element, xml_lessd_options) == 0)
153         {
154             os_strdup(node[i]->content, lessd_config->entries[s]->options);
155         }
156         else if(strcmp(node[i]->element, xml_lessd_state) == 0)
157         {
158             if(strcmp(node[i]->content, "periodic") == 0)
159             {
160                 lessd_config->entries[s]->state |= LESSD_STATE_PERIODIC;
161             }
162             else if(strcmp(node[i]->content, "stay_connected") == 0)
163             {
164                 lessd_config->entries[s]->state |= LESSD_STATE_CONNECTED;
165             }
166             else if(strcmp(node[i]->content, "periodic_diff") == 0)
167             {
168                 lessd_config->entries[s]->state |= LESSD_STATE_PERIODIC;
169                 lessd_config->entries[s]->state |= LESSD_STATE_DIFF;
170             }
171             else
172             {
173                 merror(XML_VALUEERR,ARGV0,node[i]->element,node[i]->content);
174                 return(OS_INVALID);
175             }
176         }
177         else
178         {
179             merror(XML_INVELEM, ARGV0, node[i]->element);
180             return(OS_INVALID);
181         }
182         i++;
183     }
184
185
186     /* We must have at least one entry set */
187     if(!lessd_config->entries[s]->server ||
188        !lessd_config->entries[s]->state ||
189        !lessd_config->entries[s]->type)
190     {
191         merror(XML_INV_MISSOPTS, ARGV0);
192         return(OS_INVALID);
193     }
194
195
196     if((lessd_config->entries[s]->state == LESSD_STATE_PERIODIC) &&
197        !lessd_config->entries[s]->frequency)
198     {
199         merror(XML_INV_MISSFREQ, ARGV0);
200         return(OS_INVALID);
201     }
202
203     return(0);
204 }
205
206
207 /* EOF */