66 #include <debug/sahtrace.h>
67 #include <debug/sahtrace_macros.h>
69 #include <amxc/amxc.h>
70 #include <amxp/amxp.h>
71 #include <amxd/amxd_dm.h>
72 #include <amxo/amxo.h>
74 #include <amxd/amxd_object.h>
75 #include <amxc/amxc_macros.h>
76 #include <amxo/amxo_save.h>
80 #define UNUSED __attribute__((unused))
87 amxo_parser_t* parser);
90 static const char* types[] = {
98 sah_trace_type type_id = TRACE_TYPE_SYSLOG;
101 for(i = 0; types[i] != NULL; i++) {
102 if(strcmp(type, types[i]) == 0) {
107 if(types[i] != NULL) {
109 type_id = daemon? TRACE_TYPE_SYSLOG:TRACE_TYPE_STDERR;
111 type_id = (sah_trace_type) i;
119 uint32_t default_log_level = GET_UINT32(&
trace_parser->config,
"default_log_level");
120 return default_log_level != 0 ? default_log_level : 200;
124 uint32_t default_trace_zone_level = GET_UINT32(&
trace_parser->config,
"default_trace_zone_level");
125 return default_trace_zone_level != 0 ? default_trace_zone_level : 200;
129 amxc_var_t* sahtrace_opts,
130 const char* opt_name,
131 const char* alt_name) {
132 amxc_var_t* var = amxc_var_get_key(sahtrace_opts,
134 AMXC_VAR_FLAG_DEFAULT);
136 var = amxc_var_get_key(opts,
138 AMXC_VAR_FLAG_DEFAULT);
145 const char* type_name,
146 amxc_var_t* file_var,
149 if(type_id != TRACE_TYPE_FILE) {
150 sahTraceOpen(name, type_id);
152 if(amxc_var_type_of(file_var) == AMXC_VAR_ID_CSTRING) {
153 const char* file_name = amxc_var_constcast(cstring_t, file_var);
154 sahTraceOpenFile(name, file_name);
160 const char* name = GET_CHAR(options,
"name");
161 const char* type_name =
"auto";
162 amxc_var_t* sahtrace_opts = amxc_var_get_key(options,
164 AMXC_VAR_FLAG_DEFAULT);
168 "level",
"log-level");
171 bool daemon = GET_BOOL(options,
"daemon");
174 if((type_var != NULL) &&
175 ( amxc_var_type_of(type_var) == AMXC_VAR_ID_CSTRING)) {
176 type_name = amxc_var_constcast(cstring_t, type_var);
180 identity = strdup(name == NULL ?
"mod_sahtrace" : name);
184 if(level_var != NULL) {
185 level = amxc_var_dyncast(uint32_t, level_var);
187 sahTraceSetLevel(level);
193 "trace-zones",
"log-zones");
194 amxc_var_t* sahtrace_opts = amxc_var_get_key(options,
196 AMXC_VAR_FLAG_DEFAULT);
198 "level",
"log-level");
201 when_null(zones_var, exit);
203 if(level_var != NULL) {
204 level = amxc_var_dyncast(uint32_t, level_var);
207 if(amxc_var_type_of(zones_var) == AMXC_VAR_ID_LIST) {
208 amxc_var_for_each(zone, zones_var) {
209 const char* zone_name = amxc_var_constcast(cstring_t, zone);
210 if(amxc_var_type_of(zone) != AMXC_VAR_ID_CSTRING) {
213 sahTraceAddZone(level, zone_name);
217 if(amxc_var_type_of(zones_var) == AMXC_VAR_ID_HTABLE) {
218 const amxc_htable_t* zones = amxc_var_constcast(amxc_htable_t, zones_var);
219 amxc_htable_for_each(it, zones) {
220 const char* zone_name = amxc_htable_it_get_key(it);
221 amxc_var_t* var_level = amxc_var_from_htable_it(it);
222 uint32_t zone_level = amxc_var_dyncast(uint32_t, var_level);
223 sahTraceAddZone(zone_level, zone_name);
232 const char* path = GETP_CHAR(&
trace_parser->config,
"config-storage-file");
233 amxd_status_t status = amxd_status_unknown_error;
234 amxc_var_t* trace_zones = NULL;
238 amxc_var_set_type(&
config, AMXC_VAR_ID_HTABLE);
239 trace_zones = amxc_var_add_key(amxc_htable_t, &
config,
"trace-zones", NULL);
240 amxc_var_copy(trace_zones, GET_ARG(&
trace_parser->config,
"trace-zones"));
243 when_failed_trace(status, exit, ERROR,
"Failed to save parser config file: %s", path);
251 UNUSED amxd_function_t* func,
254 const char* zone = GET_CHAR(args,
"zone");
255 uint32_t level = GET_UINT32(args,
"level");
256 uint32_t log_levels[] = {0, 100, 200, 300, 350, 400, 500};
257 int length =
sizeof(log_levels) /
sizeof(log_levels[0]);
258 amxd_status_t status = amxd_status_unknown_error;
259 amxc_var_t trace_table;
260 amxc_var_t* current_zone = NULL;
261 amxc_var_t* var = amxo_parser_get_config(
trace_parser,
"trace-zones");
262 amxc_var_init(&trace_table);
265 amxc_var_set_type(&trace_table, AMXC_VAR_ID_HTABLE);
267 amxc_var_copy(&trace_table, var);
270 for(
int i = 0; i < length; i++) {
271 if(level == log_levels[i]) {
272 status = amxd_status_ok;
276 when_failed_trace(status, exit, ERROR,
"Invalid level value: %d", level);
278 current_zone = GET_ARG(&trace_table, zone);
279 if(current_zone == NULL) {
280 amxc_var_add_key(uint32_t, &trace_table, zone, level);
282 amxc_var_set(uint32_t, current_zone, level);
285 status = amxo_parser_set_config(
trace_parser,
"trace-zones", &trace_table);
286 when_failed_trace(status, exit, ERROR,
"Failed to add zone to config: %s %d", zone, level);
290 amxc_var_clean(&trace_table);
296 UNUSED amxd_function_t* func,
299 amxd_status_t rc = amxd_status_unknown_error;
300 amxc_var_set_type(ret, AMXC_VAR_ID_HTABLE);
301 amxc_var_t* var = amxo_parser_get_config(
trace_parser,
"trace-zones");
302 amxc_var_copy(ret, var);
309 amxd_status_t rc = amxd_status_unknown_error;
310 amxd_function_t* set_function = NULL;
311 amxd_function_t* list_function = NULL;
312 amxd_object_t*
object = amxd_object_get_base(amxd_dm_get_root(dm));
317 amxc_var_init(&def_val);
320 when_null(
object, exit);
322 rc = amxd_function_new(&set_function,
"set_trace_zone", AMXC_VAR_ID_NULL, set_impl);
323 when_failed(rc, exit);
325 rc = amxd_function_new(&list_function,
"list_trace_zones", AMXC_VAR_ID_HTABLE, list_impl);
326 when_failed(rc, exit);
328 rc = amxd_function_new_arg(set_function,
"zone", AMXC_VAR_ID_CSTRING, NULL);
329 when_failed(rc, exit);
330 amxd_function_arg_set_attr(set_function,
"zone", amxd_aattr_in,
true);
331 rc = amxd_function_new_arg(set_function,
"level", AMXC_VAR_ID_UINT32, &def_val);
332 when_failed(rc, exit);
333 amxd_function_arg_set_attr(set_function,
"level", amxd_aattr_in,
true);
335 rc = amxd_object_add_function(
object, set_function);
336 when_failed(rc, exit);
338 rc = amxd_object_add_function(
object, list_function);
339 when_failed(rc, exit);
342 amxc_var_clean(&def_val);
343 if(rc != amxd_status_ok) {
344 amxd_function_delete(&set_function);
345 amxd_function_delete(&list_function);
353 amxo_parser_t* parser) {
358 amxd_object_t* root = amxd_dm_get_root(dm);
359 const char*
dir = GET_CHAR(&parser->config,
"config-storage-dir");
360 const char* path = GET_CHAR(&parser->config,
"config-storage-file");
362 if((
dir != NULL) && (*
dir != 0)) {
364 int rv = stat(
dir, &stats);
367 if((rv != 0) || !S_ISDIR(stats.st_mode)) {
368 syslog(LOG_USER | LOG_WARNING,
"Trace config folder not found: %s",
dir);
static void mod_sahtrace_open(const char *name, const char *type_name, amxc_var_t *file_var, bool daemon)
static void mod_sahtrace_init(amxc_var_t *options)
amxo_parser_t * trace_parser
int _main(int reason, amxd_dm_t *dm, amxo_parser_t *parser)
static uint32_t mod_sahtrace_get_default_trace_zone_level(void)
static int mod_sahtrace_save_config(void)
static void mod_sahtrace_add_zones(amxc_var_t *options)
amxd_status_t set_trace_zone(__attribute__((unused)) amxd_object_t *object, __attribute__((unused)) amxd_function_t *func, amxc_var_t *args, __attribute__((unused)) amxc_var_t *ret)
static sah_trace_type mod_sahtrace_type_to_id(const char *type, bool daemon)
static amxc_var_t * mod_sahtrace_get(amxc_var_t *opts, amxc_var_t *sahtrace_opts, const char *opt_name, const char *alt_name)
amxd_status_t list_trace_zone(__attribute__((unused)) amxd_object_t *object, __attribute__((unused)) amxd_function_t *func, __attribute__((unused)) amxc_var_t *args, amxc_var_t *ret)
int mod_sahtrace_add_sahtrace_functions(amxd_dm_t *dm)
static uint32_t mod_sahtrace_get_default_log_level(void)
global config storage dir