1 /* @(#) $Id: ./src/config/agentlessd-config.c, 2011/09/08 dcid Exp $
4 /* Copyright (C) 2009 Trend Micro Inc.
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
13 /* Functions to handle the configuration files
18 #include "agentlessd-config.h"
21 int Read_CAgentless(XML_NODE node, void *config, void *config2)
23 int i = 0,j = 0,s = 0;
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";
35 agentlessd_config *lessd_config = (agentlessd_config *)config;
38 /* Getting any configured entry. */
39 if(lessd_config->entries)
41 while(lessd_config->entries[s])
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;
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;
65 /* Reading the XML. */
70 merror(XML_ELEMNULL, ARGV0);
73 else if(!node[i]->content)
75 merror(XML_VALUENULL, ARGV0, node[i]->element);
78 else if(strcmp(node[i]->element, xml_lessd_frequency) == 0)
80 if(!OS_StrIsNum(node[i]->content))
82 merror(XML_VALUEERR,ARGV0,node[i]->element,node[i]->content);
86 lessd_config->entries[s]->frequency = atoi(node[i]->content);
88 else if(strcmp(node[i]->element, xml_lessd_port) == 0)
90 if(!OS_StrIsNum(node[i]->content))
92 merror(XML_VALUEERR,ARGV0,node[i]->element,node[i]->content);
96 lessd_config->entries[s]->port = atoi(node[i]->content);
98 else if(strcmp(node[i]->element, xml_lessd_server) == 0)
100 char s_content[1024 +1];
101 s_content[1024] = '\0';
103 /* Getting any configured entry. */
105 if(lessd_config->entries[s]->server)
107 while(lessd_config->entries[s]->server[j])
111 os_realloc(lessd_config->entries[s]->server, (j + 2) *
113 lessd_config->entries[s]->server);
114 if(strncmp(node[i]->content, "use_su ", 7) == 0)
116 snprintf(s_content, 1024, "s%s", node[i]->content +7);
118 else if(strncmp(node[i]->content, "use_sudo ", 9) == 0)
120 snprintf(s_content, 1024, "o%s", node[i]->content +9);
124 snprintf(s_content, 1024, " %s", node[i]->content);
128 lessd_config->entries[s]->server[j]);
129 lessd_config->entries[s]->server[j + 1] = NULL;
131 else if(strcmp(node[i]->element, xml_lessd_type) == 0)
133 char script_path[1024 +1];
135 script_path[1024] = '\0';
136 snprintf(script_path, 1024, "%s/%s", AGENTLESSDIRPATH,
139 if(File_DateofChange(script_path) <= 0)
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);
146 os_strdup(node[i]->content, lessd_config->entries[s]->type);
148 else if(strcmp(node[i]->element, xml_lessd_command) == 0)
150 os_strdup(node[i]->content, lessd_config->entries[s]->command);
152 else if(strcmp(node[i]->element, xml_lessd_options) == 0)
154 os_strdup(node[i]->content, lessd_config->entries[s]->options);
156 else if(strcmp(node[i]->element, xml_lessd_state) == 0)
158 if(strcmp(node[i]->content, "periodic") == 0)
160 lessd_config->entries[s]->state |= LESSD_STATE_PERIODIC;
162 else if(strcmp(node[i]->content, "stay_connected") == 0)
164 lessd_config->entries[s]->state |= LESSD_STATE_CONNECTED;
166 else if(strcmp(node[i]->content, "periodic_diff") == 0)
168 lessd_config->entries[s]->state |= LESSD_STATE_PERIODIC;
169 lessd_config->entries[s]->state |= LESSD_STATE_DIFF;
173 merror(XML_VALUEERR,ARGV0,node[i]->element,node[i]->content);
179 merror(XML_INVELEM, ARGV0, node[i]->element);
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)
191 merror(XML_INV_MISSOPTS, ARGV0);
196 if((lessd_config->entries[s]->state == LESSD_STATE_PERIODIC) &&
197 !lessd_config->entries[s]->frequency)
199 merror(XML_INV_MISSFREQ, ARGV0);