1 /* Copyright (C) 2009 Trend Micro Inc.
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
11 #include "agentlessd-config.h"
15 int Read_CAgentless(XML_NODE node, void *config, __attribute__((unused)) void *config2)
17 unsigned int i = 0, j = 0, s = 0;
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";
28 agentlessd_config *lessd_config = (agentlessd_config *)config;
30 /* Get any configured entry */
31 if (lessd_config->entries) {
32 while (lessd_config->entries[s]) {
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;
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;
56 if (!node[i]->element) {
57 merror(XML_ELEMNULL, __local_name);
59 } else if (!node[i]->content) {
60 merror(XML_VALUENULL, __local_name, node[i]->element);
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);
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);
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';
80 /* Get any configured entry */
82 if (lessd_config->entries[s]->server) {
83 while (lessd_config->entries[s]->server[j]) {
88 os_realloc(lessd_config->entries[s]->server, (j + 2) *
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);
96 snprintf(s_content, 1024, " %s", node[i]->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];
105 script_path[1024] = '\0';
106 snprintf(script_path, 1024, "%s/%s", AGENTLESSDIRPATH,
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);
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;
129 merror(XML_VALUEERR, __local_name, node[i]->element, node[i]->content);
133 merror(XML_INVELEM, __local_name, node[i]->element);
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);
147 if ((lessd_config->entries[s]->state == LESSD_STATE_PERIODIC) &&
148 !lessd_config->entries[s]->frequency) {
149 merror(XML_INV_MISSFREQ, __local_name);