novi upstream verzije 2.8.3
[ossec-hids.git] / src / config / client-config.c
1 /*   $OSSEC, client-config.c, v0.1, 2005/04/01, Daniel B. Cid$   */
2
3 /* Copyright (C) 2009 Trend Micro Inc.
4  * All right 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
12
13
14 #include "shared.h"
15 #include "client-config.h"
16 #include "os_net/os_net.h"
17
18
19 int Read_Client(XML_NODE node, void *d1, void *d2)
20 {
21     int i = 0;
22
23     /* XML definitions */
24     char *xml_client_ip = "server-ip";
25     char *xml_client_hostname = "server-hostname";
26     char *xml_local_ip = "local_ip";
27     char *xml_client_port = "port";
28     char *xml_ar_disabled = "disable-active-response";
29     char *xml_notify_time = "notify_time";
30     char *xml_max_time_reconnect_try = "time-reconnect";
31
32     /* cmoraes */
33     char *xml_profile_name = "config-profile";
34
35     agent *logr;
36
37     logr = (agent *)d1;
38
39     logr->notify_time = 0;
40     logr->max_time_reconnect_try = 0;
41
42     while(node[i])
43     {
44         if(!node[i]->element)
45         {
46             merror(XML_ELEMNULL, ARGV0);
47             return(OS_INVALID);
48         }
49         else if(!node[i]->content)
50         {
51             merror(XML_VALUENULL, ARGV0, node[i]->element);
52             return(OS_INVALID);
53         }
54         /* Getting local ip. */
55         else if(strcmp(node[i]->element, xml_local_ip) == 0)
56         {
57             os_strdup(node[i]->content, logr->lip);
58             if(OS_IsValidIP(logr->lip, NULL) != 1)
59             {
60                 merror(INVALID_IP, ARGV0, logr->lip);
61                 return(OS_INVALID);
62             }
63         }
64         /* Getting server ip */
65         else if(strcmp(node[i]->element,xml_client_ip) == 0)
66         {
67             int ip_id = 0;
68
69             /* Getting last ip */
70             if(logr->rip)
71             {
72                 while(logr->rip[ip_id])
73                 {
74                     ip_id++;
75                 }
76             }
77             os_realloc(logr->rip, (ip_id + 2) * sizeof(char*), logr->rip);
78             logr->rip[ip_id] = NULL;
79             logr->rip[ip_id +1] = NULL;
80
81             os_strdup(node[i]->content, logr->rip[ip_id]);
82             if(OS_IsValidIP(logr->rip[ip_id], NULL) != 1)
83             {
84                 merror(INVALID_IP, ARGV0, logr->rip[ip_id]);
85                 return(OS_INVALID);
86             }
87             logr->rip_id++;
88         }
89         else if(strcmp(node[i]->element,xml_client_hostname) == 0)
90         {
91             int ip_id = 0;
92             char *s_ip;
93             char f_ip[128];
94
95
96             /* Getting last ip. */
97             if(logr->rip)
98             {
99                 while(logr->rip[ip_id])
100                 {
101                     ip_id++;
102                 }
103             }
104
105             os_realloc(logr->rip, (ip_id + 2) * sizeof(char*),
106                        logr->rip);
107
108
109             s_ip = OS_GetHost(node[i]->content, 5);
110             if(!s_ip)
111             {
112                 merror("%s: WARN: Unable to get hostname for '%s'.",
113                        ARGV0, node[i]->content);
114                 merror(AG_INV_HOST, ARGV0, node[i]->content);
115
116                 os_strdup("invalid_ip", s_ip);
117             }
118
119
120             f_ip[127] = '\0';
121             snprintf(f_ip, 127, "%s/%s", node[i]->content, s_ip);
122
123             os_strdup(f_ip, logr->rip[ip_id]);
124             logr->rip[ip_id +1] = NULL;
125
126             free(s_ip);
127
128             logr->rip_id++;
129         }
130         else if(strcmp(node[i]->element,xml_client_port) == 0)
131         {
132             if(!OS_StrIsNum(node[i]->content))
133             {
134                 merror(XML_VALUEERR,ARGV0,node[i]->element,node[i]->content);
135                 return(OS_INVALID);
136             }
137             logr->port = atoi(node[i]->content);
138
139             if(logr->port <= 0 || logr->port > 65535)
140             {
141                 merror(PORT_ERROR, ARGV0, logr->port);
142                 return(OS_INVALID);
143             }
144         }
145         else if(strcmp(node[i]->element,xml_notify_time) == 0)
146         {
147             if(!OS_StrIsNum(node[i]->content))
148             {
149                 merror(XML_VALUEERR,ARGV0,node[i]->element,node[i]->content);
150                 return(OS_INVALID);
151             }
152             logr->notify_time = atoi(node[i]->content);
153         }
154         else if(strcmp(node[i]->element,xml_max_time_reconnect_try) == 0)
155         {
156             if(!OS_StrIsNum(node[i]->content))
157             {
158                 merror(XML_VALUEERR,ARGV0,node[i]->element,node[i]->content);
159                 return(OS_INVALID);
160             }
161             logr->max_time_reconnect_try = atoi(node[i]->content);
162         }
163         else if(strcmp(node[i]->element,xml_ar_disabled) == 0)
164         {
165             if(strcmp(node[i]->content, "yes") == 0)
166                 logr->execdq = -1;
167             else if(strcmp(node[i]->content, "no") == 0)
168                 logr->execdq = 0;
169             else
170             {
171                 merror(XML_VALUEERR,ARGV0,node[i]->element,node[i]->content);
172                 return(OS_INVALID);
173             }
174         }
175         /* cmoraes */
176         else if(strcmp(node[i]->element,xml_profile_name) == 0)
177         {
178             /* profile name can be anything hence no validation */
179             os_strdup(node[i]->content, logr->profile);
180         }
181         else
182         {
183             merror(XML_INVELEM, ARGV0, node[i]->element);
184             return(OS_INVALID);
185         }
186         i++;
187     }
188
189     if(!logr->rip)
190     {
191         return(OS_INVALID);
192     }
193
194     return(0);
195 }
196
197
198 /* EOF */