new upstream release (3.3.0); modify package compatibility for Stretch
[ossec-hids.git] / src / config / agentlessd-config.c
1 /* Copyright (C) 2009 Trend Micro Inc.
2  * All right reserved.
3  *
4  * This program is a free software; you can redistribute it
5  * and/or modify it under the terms of the GNU General Public
6  * License (version 2) as published by the FSF - Free Software
7  * Foundation
8  */
9
10 #include "shared.h"
11 #include "agentlessd-config.h"
12 #include "config.h"
13
14
15 int Read_CAgentless(XML_NODE node, void *config, __attribute__((unused)) void *config2)
16 {
17     unsigned int i = 0, j = 0, s = 0;
18
19     /* XML definitions */
20     const char *xml_lessd_server = "host";
21     const char *xml_lessd_port = "port";
22     const char *xml_lessd_type = "type";
23     const char *xml_lessd_frequency = "frequency";
24     const char *xml_lessd_state = "state";
25     const char *xml_lessd_command = "run_command";
26     const char *xml_lessd_options = "arguments";
27
28     agentlessd_config *lessd_config = (agentlessd_config *)config;
29
30     /* Get any configured entry */
31     if (lessd_config->entries) {
32         while (lessd_config->entries[s]) {
33             s++;
34         }
35     }
36
37     /* Allocate the memory for the config */
38     os_realloc(lessd_config->entries, (s + 2) * sizeof(agentlessd_entries *),
39                lessd_config->entries);
40     os_calloc(1, sizeof(agentlessd_entries), lessd_config->entries[s]);
41     lessd_config->entries[s + 1] = NULL;
42
43     /* Zero the elements */
44     lessd_config->entries[s]->server = NULL;
45     lessd_config->entries[s]->command = NULL;
46     lessd_config->entries[s]->options = "";
47     lessd_config->entries[s]->type = NULL;
48     lessd_config->entries[s]->frequency = 86400;
49     lessd_config->entries[s]->state = 0;
50     lessd_config->entries[s]->current_state = 0;
51     lessd_config->entries[s]->port = 0;
52     lessd_config->entries[s]->error_flag = 0;
53
54     /* Read the XML */
55     while (node[i]) {
56         if (!node[i]->element) {
57             merror(XML_ELEMNULL, __local_name);
58             return (OS_INVALID);
59         } else if (!node[i]->content) {
60             merror(XML_VALUENULL, __local_name, node[i]->element);
61             return (OS_INVALID);
62         } else if (strcmp(node[i]->element, xml_lessd_frequency) == 0) {
63             if (!OS_StrIsNum(node[i]->content)) {
64                 merror(XML_VALUEERR, __local_name, node[i]->element, node[i]->content);
65                 return (OS_INVALID);
66             }
67
68             lessd_config->entries[s]->frequency = atoi(node[i]->content);
69         } else if (strcmp(node[i]->element, xml_lessd_port) == 0) {
70             if (!OS_StrIsNum(node[i]->content)) {
71                 merror(XML_VALUEERR, __local_name, node[i]->element, node[i]->content);
72                 return (OS_INVALID);
73             }
74
75             lessd_config->entries[s]->port = atoi(node[i]->content);
76         } else if (strcmp(node[i]->element, xml_lessd_server) == 0) {
77             char s_content[1024 + 1];
78             s_content[1024] = '\0';
79
80             /* Get any configured entry */
81             j = 0;
82             if (lessd_config->entries[s]->server) {
83                 while (lessd_config->entries[s]->server[j]) {
84                     j++;
85                 }
86             }
87
88             os_realloc(lessd_config->entries[s]->server, (j + 2) *
89                        sizeof(char *),
90                        lessd_config->entries[s]->server);
91             if (strncmp(node[i]->content, "use_su ", 7) == 0) {
92                 snprintf(s_content, 1024, "s%s", node[i]->content + 7);
93             } else if (strncmp(node[i]->content, "use_sudo ", 9) == 0) {
94                 snprintf(s_content, 1024, "o%s", node[i]->content + 9);
95             } else {
96                 snprintf(s_content, 1024, " %s", node[i]->content);
97             }
98
99             os_strdup(s_content,
100                       lessd_config->entries[s]->server[j]);
101             lessd_config->entries[s]->server[j + 1] = NULL;
102         } else if (strcmp(node[i]->element, xml_lessd_type) == 0) {
103             char script_path[1024 + 1];
104
105             script_path[1024] = '\0';
106             snprintf(script_path, 1024, "%s/%s", AGENTLESSDIRPATH,
107                      node[i]->content);
108
109             if (File_DateofChange(script_path) <= 0) {
110                 merror("%s: ERROR: Unable to find '%s' at '%s'.",
111                        __local_name, node[i]->content, AGENTLESSDIRPATH);
112                 merror(XML_VALUEERR, __local_name, node[i]->element, node[i]->content);
113                 return (OS_INVALID);
114             }
115             os_strdup(node[i]->content, lessd_config->entries[s]->type);
116         } else if (strcmp(node[i]->element, xml_lessd_command) == 0) {
117             os_strdup(node[i]->content, lessd_config->entries[s]->command);
118         } else if (strcmp(node[i]->element, xml_lessd_options) == 0) {
119             os_strdup(node[i]->content, lessd_config->entries[s]->options);
120         } else if (strcmp(node[i]->element, xml_lessd_state) == 0) {
121             if (strcmp(node[i]->content, "periodic") == 0) {
122                 lessd_config->entries[s]->state |= LESSD_STATE_PERIODIC;
123             } else if (strcmp(node[i]->content, "stay_connected") == 0) {
124                 lessd_config->entries[s]->state |= LESSD_STATE_CONNECTED;
125             } else if (strcmp(node[i]->content, "periodic_diff") == 0) {
126                 lessd_config->entries[s]->state |= LESSD_STATE_PERIODIC;
127                 lessd_config->entries[s]->state |= LESSD_STATE_DIFF;
128             } else {
129                 merror(XML_VALUEERR, __local_name, node[i]->element, node[i]->content);
130                 return (OS_INVALID);
131             }
132         } else {
133             merror(XML_INVELEM, __local_name, node[i]->element);
134             return (OS_INVALID);
135         }
136         i++;
137     }
138
139     /* We must have at least one entry set */
140     if (!lessd_config->entries[s]->server ||
141             !lessd_config->entries[s]->state ||
142             !lessd_config->entries[s]->type) {
143         merror(XML_INV_MISSOPTS, __local_name);
144         return (OS_INVALID);
145     }
146
147     if ((lessd_config->entries[s]->state == LESSD_STATE_PERIODIC) &&
148             !lessd_config->entries[s]->frequency) {
149         merror(XML_INV_MISSFREQ, __local_name);
150         return (OS_INVALID);
151     }
152
153     return (0);
154 }
155