3eddfc30860d8de8ae95c2fa334637792544e65b
[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
30     agent *logr;
31
32     logr = (agent *)d1;
33
34
35     while(node[i])
36     {
37         if(!node[i]->element)
38         {
39             merror(XML_ELEMNULL, ARGV0);
40             return(OS_INVALID);
41         }
42         else if(!node[i]->content)
43         {
44             merror(XML_VALUENULL, ARGV0, node[i]->element);
45             return(OS_INVALID);
46         }
47         /* Getting local ip. */
48         else if(strcmp(node[i]->element, xml_local_ip) == 0)
49         {
50             os_strdup(node[i]->content, logr->lip);
51             if(OS_IsValidIP(logr->lip, NULL) != 1)
52             {
53                 merror(INVALID_IP, ARGV0, logr->lip);
54                 return(OS_INVALID);
55             }
56         }
57         /* Getting server ip */
58         else if(strcmp(node[i]->element,xml_client_ip) == 0)
59         {
60             int ip_id = 0;
61
62             /* Getting last ip */
63             if(logr->rip)
64             {
65                 while(logr->rip[ip_id])
66                 {
67                     ip_id++;
68                 }
69             }
70             os_realloc(logr->rip, (ip_id + 2) * sizeof(char*), logr->rip);
71             logr->rip[ip_id] = NULL;
72             logr->rip[ip_id +1] = NULL;
73             
74             os_strdup(node[i]->content, logr->rip[ip_id]);
75             if(OS_IsValidIP(logr->rip[ip_id], NULL) != 1)
76             {
77                 merror(INVALID_IP, ARGV0, logr->rip[ip_id]);
78                 return(OS_INVALID);
79             }
80             logr->rip_id++;
81         }
82         else if(strcmp(node[i]->element,xml_client_hostname) == 0)
83         {
84             int ip_id = 0;
85             char *s_ip;
86             char f_ip[128];
87
88
89             /* Getting last ip. */
90             if(logr->rip)
91             {
92                 while(logr->rip[ip_id])
93                 {
94                     ip_id++;
95                 }
96             }
97
98             os_realloc(logr->rip, (ip_id + 2) * sizeof(char*),
99                        logr->rip);
100
101             
102             s_ip = OS_GetHost(node[i]->content, 5);
103             if(!s_ip)
104             {
105                 merror("%s: WARN: Unable to get hostname for '%s'.",
106                        ARGV0, node[i]->content);
107                 merror(AG_INV_HOST, ARGV0, node[i]->content);
108
109                 os_strdup("invalid_ip", s_ip);
110             }
111             
112
113             f_ip[127] = '\0';
114             snprintf(f_ip, 127, "%s/%s", node[i]->content, s_ip);
115
116             os_strdup(f_ip, logr->rip[ip_id]);
117             logr->rip[ip_id +1] = NULL;
118
119             free(s_ip);
120
121             logr->rip_id++;
122         }
123         else if(strcmp(node[i]->element,xml_client_port) == 0)
124         {
125             if(!OS_StrIsNum(node[i]->content))
126             {
127                 merror(XML_VALUEERR,ARGV0,node[i]->element,node[i]->content);
128                 return(OS_INVALID);
129             }
130             logr->port = atoi(node[i]->content);
131
132             if(logr->port <= 0 || logr->port > 65535)
133             {
134                 merror(PORT_ERROR, ARGV0, logr->port);
135                 return(OS_INVALID);
136             }
137         }
138         else if(strcmp(node[i]->element,xml_ar_disabled) == 0)
139         {
140             if(strcmp(node[i]->content, "yes") == 0)
141                 logr->execdq = -1;
142             else if(strcmp(node[i]->content, "no") == 0)
143                 logr->execdq = 0;
144             else
145             {
146                 merror(XML_VALUEERR,ARGV0,node[i]->element,node[i]->content);
147                 return(OS_INVALID);
148             }
149         }
150         else
151         {
152             merror(XML_INVELEM, ARGV0, node[i]->element);
153             return(OS_INVALID);
154         }
155         i++;
156     }
157
158     if(!logr->rip)
159     {
160         return(OS_INVALID);
161     }
162
163     return(0);
164 }
165
166
167 /* EOF */