59 #include "amxo_parser.tab.h"
66 action_object_validate,
68 action_object_describe,
69 action_object_add_inst,
70 action_object_del_inst,
71 action_object_destroy,
80 action_param_validate,
82 action_param_describe,
108 e->
path = amxd_object_get_path(pctx->
object, AMXD_OBJECT_TERMINATE | AMXD_OBJECT_INDEXED);
109 amxc_var_init(&e->
data);
115 amxd_param_t*
const param,
116 amxd_action_t reason,
117 UNUSED const amxc_var_t*
const args,
118 UNUSED amxc_var_t*
const retval,
120 amxd_status_t status = amxd_status_ok;
121 amxc_var_t* data = (amxc_var_t*) priv;
127 if(reason == action_object_destroy) {
129 amxc_var_delete(&data);
134 amxc_var_delete(&data);
143 amxd_action_t action,
146 amxd_status_t status = amxd_status_ok;
148 status = amxd_param_add_action_cb(param, action, fn, data);
149 if((data != NULL) && (status == amxd_status_ok)) {
150 status = amxd_param_add_action_cb(param,
151 action_param_destroy,
154 if(status != amxd_status_ok) {
155 amxd_param_remove_action_cb(param, action, fn);
163 amxd_action_t action,
166 amxd_status_t status = amxd_status_ok;
168 status = amxd_object_add_action_cb(
object, action, fn, data);
169 if((data != NULL) && (status == amxd_status_ok)) {
170 status = amxd_object_add_action_cb(
object,
171 action_object_destroy,
174 if(status != amxd_status_ok) {
175 amxd_object_remove_action_cb(
object, action, fn);
185 UNUSED amxc_var_t* data) {
187 amxd_action_t dm_action = (amxd_action_t)
sync_actions[action];
204 pctx->
status = amxd_status_invalid_action;
205 amxo_parser_msg(pctx,
"Invalid synchronisation action (action id = %d)", action);
209 retval = pctx->
status == amxd_status_ok? 0:-1;
219 amxd_action_t dm_action = (amxd_action_t)
param_actions[action];
222 if(dm_action == action_invalid) {
223 pctx->
status = amxd_status_invalid_action;
224 amxo_parser_msg(pctx,
"Invalid parameter action (action id = %d)", action);
234 if(pctx->
status == amxd_status_ok) {
238 amxo_parser_msg(pctx,
"Invalid parameter action (action id = %d)", action);
253 if(dm_action == action_invalid) {
254 pctx->
status = amxd_status_invalid_action;
255 amxo_parser_msg(pctx,
"Invalid object action (action id = %d)", action);
265 if(pctx->
status == amxd_status_ok) {
277 int64_t obj_attrs = 0;
279 obj_attrs |= SET_BIT(amxd_oattr_read_only);
282 obj_attrs |= SET_BIT(amxd_oattr_persistent);
285 obj_attrs |= SET_BIT(amxd_oattr_private);
288 obj_attrs |= SET_BIT(amxd_oattr_protected);
297 amxd_object_type_t type) {
298 amxd_object_t*
object = NULL;
299 const char* type_name = type == amxd_object_mib ?
"mib" :
"object";
301 pctx->
status = amxd_object_new(&
object, type, name);
302 if(pctx->
status != amxd_status_ok) {
306 if(type == amxd_object_mib) {
307 pctx->
status = amxd_dm_store_mib(dm,
object);
309 amxd_object_set_attrs(
object, oattrs,
true);
310 pctx->
status = amxd_object_add_object(pctx->
object,
object);
319 amxd_object_type_t type) {
321 const char* type_name = type == amxd_object_mib ?
"mib" :
"object";
323 "define-behavior.existing-object",
325 pctx->
status = amxd_status_ok;
329 pctx->
status = amxd_status_duplicate;
339 amxc_var_t* params) {
340 amxd_object_t*
object = NULL;
342 "populate-behavior.duplicate-instance",
348 amxp_expr_t* expr = NULL;
349 amxd_object_new_key_expr(pctx->
object, &expr, params);
350 object = amxd_object_find_instance(pctx->
object, expr);
351 amxp_expr_delete(&expr);
354 object = amxd_object_get_instance(pctx->
object, name, index);
362 amxp_signal_mngr_t*
const sig_mngr,
363 const char*
const signal_name,
364 bool signal_is_regexp,
365 const char*
const expression,
369 if(signal_is_regexp) {
370 retval = amxp_slot_connect_filtered(sig_mngr,
376 retval = amxp_slot_connect(sig_mngr,
384 pctx->
status = amxd_status_invalid_value;
385 if(expression != NULL) {
403 amxd_object_t*
object,
404 amxc_var_t* params) {
408 case amxd_status_invalid_name:
409 amxo_parser_msg(pctx,
"Failed to create instance %s - invalid name", name);
411 case amxd_status_invalid_type:
413 "Failed to create instance %s - parent is not a template object",
416 case amxd_status_duplicate:
419 pctx->
status = amxd_status_ok;
422 case amxd_status_missing_key:
423 amxo_parser_msg(pctx,
"Failed to create instance %s - missing key(s)", name);
436 if(amxd_object_get_type(
object) == amxd_object_template) {
438 amxc_string_prependf(expr,
440 amxd_object_get_name(
object, AMXD_OBJECT_NAMED));
442 amxc_string_prependf(expr,
444 amxd_object_get_name(
object, AMXD_OBJECT_NAMED));
446 object = amxd_object_get_parent(
object);
448 while(
object != NULL && amxd_object_get_parent(
object) != NULL) {
449 switch(amxd_object_get_type(
object)) {
450 case amxd_object_template:
452 amxc_string_prependf(expr,
454 amxd_object_get_name(
object, AMXD_OBJECT_NAMED));
456 case amxd_object_singleton:
457 amxc_string_prependf(expr,
459 amxd_object_get_name(
object, AMXD_OBJECT_NAMED));
464 object = amxd_object_get_parent(
object);
468 amxc_string_prepend(expr,
"(path matches '^", 16);
469 amxc_string_append(expr,
"$')", 3);
471 amxc_string_replace(expr,
"\\",
"", UINT32_MAX);
472 amxc_string_prepend(expr,
"(path == '", 10);
473 amxc_string_append(expr,
"')", 2);
480 amxc_var_t* option = amxc_var_get_path(&pctx->
config,
482 AMXC_VAR_FLAG_DEFAULT);
483 const char* value = NULL;
484 value = amxc_var_constcast(cstring_t, option);
490 return strcmp(value, check) == 0;
495 amxc_var_clean(&e->
data);
503 int attr_mask = ~bitmask;
505 int check_attr = attributes | attr_mask;
506 pctx->
status = (check_attr != attr_mask) ? amxd_status_ok : amxd_status_invalid_attr;
507 retval = (check_attr != attr_mask);
516 amxd_object_set_attrs(pctx->
object, oattrs, enable);
522 int64_t attr_bitmask,
523 amxd_object_type_t type) {
524 amxd_object_t*
object = NULL;
525 amxc_string_t res_name;
528 amxd_dm_t* dm = amxd_object_get_dm(pctx->
object);
530 amxc_string_init(&res_name, 0);
532 if(amxc_string_set_resolved(&res_name, name, &pctx->
config) > 0) {
533 name = amxc_string_get(&res_name, 0);
536 pctx->
status = amxd_status_ok;
537 if(type == amxd_object_mib) {
538 object = amxd_dm_get_mib(dm, name);
540 object = amxd_object_findf(pctx->
object,
"%s", name);
544 when_null(
object, exit);
547 when_true(retval < 0, exit);
548 amxd_object_set_attrs(
object, oattrs,
true);
559 amxc_string_clean(&res_name);
566 amxc_var_t* params) {
567 amxd_object_t*
object = NULL;
568 amxd_object_t* parent_obj = pctx->
object;
570 amxc_string_t res_name;
571 amxc_string_init(&res_name, 0);
573 if(amxc_string_set_resolved(&res_name, name, &pctx->
config) > 0) {
574 name = amxc_string_get(&res_name, 0);
577 pctx->
status = amxd_object_add_instance(&
object,
583 when_null(
object, exit);
584 when_failed(pctx->
status, exit);
586 amxd_object_get_name(
object, AMXD_OBJECT_NAMED));
593 amxc_string_clean(&res_name);
594 amxc_var_delete(¶ms);
600 amxd_object_t*
object = NULL;
602 amxc_string_t res_path;
603 amxc_string_init(&res_path, 0);
605 if(amxc_string_set_resolved(&res_path, path, &pctx->
config) > 0) {
606 path = amxc_string_get(&res_path, 0);
609 pctx->
status = amxd_status_ok;
610 object = amxd_object_findf(pctx->
object,
"%s", path);
612 char* parent_path = amxd_object_get_path(pctx->
object, AMXD_OBJECT_NAMED);
614 "Object %s not found (start searching from \"%s\")",
616 parent_path == NULL ?
"root" : parent_path);
618 pctx->
status = amxd_status_object_not_found;
630 amxc_string_clean(&res_path);
636 amxd_object_type_t type = amxd_object_get_type(pctx->
object);
637 const char* type_name = (type == amxd_object_mib) ?
"mib" :
"object";
642 amxc_var_init(&args);
643 amxc_var_set_type(&args, AMXC_VAR_ID_HTABLE);
645 if(pctx->
status != amxd_status_ok) {
648 amxd_object_get_name(pctx->
object, AMXD_OBJECT_NAMED));
652 amxd_dm_invoke_action(pctx->
object, NULL, action_object_write, &args, NULL);
660 amxc_var_clean(&args);
665 const char* param_name) {
667 amxc_string_t res_param_name;
668 amxc_string_init(&res_param_name, 0);
670 if(amxc_string_set_resolved(&res_param_name, param_name, &pctx->
config) > 0) {
671 param_name = amxc_string_get(&res_param_name, 0);
674 pctx->
status = amxd_object_set_counter(pctx->
object, param_name);
675 if(pctx->
status != amxd_status_ok) {
676 char* path = amxd_object_get_path(pctx->
object, AMXD_OBJECT_NAMED);
678 "Failed to to set instance counter %s on %s",
681 pctx->
status = amxd_status_duplicate;
691 amxc_string_clean(&res_param_name);
697 bool event_is_regexp,
699 bool path_is_regexp) {
701 amxc_string_t res_path;
702 amxc_string_t expression;
703 const char* expr = NULL;
704 amxd_dm_t* dm = amxd_object_get_dm(pctx->
object);
705 amxp_slot_fn_t fn = (amxp_slot_fn_t) pctx->
resolved_fn;
707 amxc_string_init(&expression, 0);
708 amxc_string_init(&res_path, 0);
715 "No event subscription created - no function was resolved");
716 pctx->
status = amxd_status_ok;
720 if(amxc_string_set_resolved(&res_path, path, &pctx->
config) > 0) {
721 path = amxc_string_get(&res_path, 0);
724 amxc_string_appendf(&expression,
"object matches \"%s\" || path matches \"%s\"", path, path);
726 amxc_string_appendf(&expression,
"object starts with \"%s\" || path starts with \"%s\"", path, path);
728 expr = amxc_string_get(&expression, 0);
732 amxc_string_clean(&expression);
733 amxc_string_clean(&res_path);
740 bool event_is_regexp,
741 const char* full_expr) {
743 amxd_dm_t* dm = amxd_object_get_dm(pctx->
object);
744 amxp_slot_fn_t fn = (amxp_slot_fn_t) pctx->
resolved_fn;
751 "No event subscription created - no function was resolved");
752 pctx->
status = amxd_status_ok;
756 if(full_expr != NULL) {
757 amxc_string_t res_expr;
758 amxc_string_init(&res_expr, 0);
759 if(amxc_string_set_resolved(&res_expr, full_expr, &pctx->
config) > 0) {
760 full_expr = amxc_string_get(&res_expr, 0);
763 amxc_string_clean(&res_expr);
774 bool event_is_regexp,
775 const char* full_expr) {
777 amxd_dm_t* dm = amxd_object_get_dm(pctx->
object);
778 amxp_slot_fn_t fn = (amxp_slot_fn_t) pctx->
resolved_fn;
779 amxc_string_t path_expr;
781 amxc_string_init(&path_expr, 0);
788 "No event subscription created - no function was resolved");
789 pctx->
status = amxd_status_ok;
794 if((full_expr != NULL) && (*full_expr != 0)) {
795 if(amxc_string_is_empty(&path_expr)) {
796 amxc_string_set(&path_expr, full_expr);
798 amxc_string_appendf(&path_expr,
" && (%s)", full_expr);
805 amxc_string_get(&path_expr, 0),
809 amxc_string_clean(&path_expr);
820 pctx->
status = amxd_status_ok;
824 }
else if(pctx->
param != NULL) {
832 pctx->
status = amxd_status_file_not_found;
833 amxo_parser_msg(pctx,
"Action %d not set - no function resolved", action);
837 if((retval != 0) || !resolve) {
838 amxc_var_delete(&data);
844 const char* mib_name) {
846 amxd_dm_t* dm = amxd_object_get_dm(pctx->
object);
847 amxd_object_t* mib = NULL;
848 amxc_string_t res_mib_name;
849 amxc_string_init(&res_mib_name, 0);
851 if(amxc_string_set_resolved(&res_mib_name, mib_name, &pctx->
config) > 0) {
852 mib_name = amxc_string_get(&res_mib_name, 0);
857 if(amxd_object_has_mib(pctx->
object, mib_name)) {
862 mib = amxd_dm_get_mib(dm, mib_name);
867 mib = amxd_dm_get_mib(dm, mib_name);
871 pctx->
status = amxd_status_object_not_found;
876 pctx->
status = amxd_object_add_mib(pctx->
object, mib_name);
877 if(pctx->
status != amxd_status_ok) {
879 "Failed to add MIB %s on object %s",
881 amxd_object_get_name(pctx->
object, AMXD_OBJECT_NAMED));
890 amxc_string_clean(&res_mib_name);
static int amxo_parser_set_param_action(amxo_parser_t *pctx, amxo_action_t action, const char *name, amxc_var_t *data)
bool amxo_parser_set_counter(amxo_parser_t *pctx, const char *param_name)
bool amxo_parser_push_object(amxo_parser_t *pctx, const char *path)
int amxo_parser_subscribe_path(amxo_parser_t *pctx, const char *event, bool event_is_regexp, const char *path, bool path_is_regexp)
static int amxo_parser_connect(amxo_parser_t *pctx, amxp_signal_mngr_t *const sig_mngr, const char *const signal_name, bool signal_is_regexp, const char *const expression, amxp_slot_fn_t fn)
static void amxo_parser_push_event(amxo_parser_t *pctx, event_id_t event)
void amxo_parser_free_event(amxc_llist_it_t *it)
static int object_actions[]
static int amxo_parser_can_update_object(amxo_parser_t *pctx, const char *name, amxd_object_type_t type)
static amxd_status_t amxo_parser_set_param_action_impl(amxd_param_t *param, amxd_action_t action, amxd_action_fn_t fn, amxc_var_t *data)
int amxo_parser_subscribe_object(amxo_parser_t *pctx, const char *event, bool event_is_regexp, const char *full_expr)
static amxd_status_t amxo_cleanup_data(amxd_object_t *const object, amxd_param_t *const param, amxd_action_t reason, UNUSED const amxc_var_t *const args, UNUSED amxc_var_t *const retval, void *priv)
int amxo_parser_subscribe(amxo_parser_t *pctx, const char *event, bool event_is_regexp, const char *full_expr)
static int amxo_parser_set_sync_action(amxo_parser_t *pctx, amxo_action_t action, UNUSED const char *name, UNUSED amxc_var_t *data)
int amxo_parser_set_action(amxo_parser_t *pctx, amxo_action_t action, const char *name, amxc_var_t *data)
bool amxo_parser_add_instance(amxo_parser_t *pctx, uint32_t index, const char *name, amxc_var_t *params)
static amxd_object_t * amxd_parser_add_instance_msg(amxo_parser_t *pctx, uint32_t index, const char *name, amxd_object_t *object, amxc_var_t *params)
bool amxo_parser_check_attr(amxo_parser_t *pctx, int64_t attributes, int64_t bitmask)
static int sync_actions[]
bool amxo_parser_pop_object(amxo_parser_t *pctx)
static int64_t amxo_attr_2_object_attr(int64_t attributes)
static amxd_status_t amxo_parser_set_object_action_impl(amxd_object_t *object, amxd_action_t action, amxd_action_fn_t fn, amxc_var_t *data)
static amxd_object_t * amxo_parser_can_update_instance(amxo_parser_t *pctx, uint32_t index, const char *name, amxc_var_t *params)
int amxo_parser_create_object(amxo_parser_t *pctx, const char *name, int64_t attr_bitmask, amxd_object_type_t type)
static void amxo_parser_build_path_expr(amxd_object_t *object, amxc_string_t *expr)
static int amxo_parser_set_object_action(amxo_parser_t *pctx, amxo_action_t action, const char *name, amxc_var_t *data)
static amxd_object_t * amxo_parser_new_object(amxo_parser_t *pctx, amxd_dm_t *dm, const char *name, int64_t oattrs, amxd_object_type_t type)
bool amxo_parser_check_config(amxo_parser_t *pctx, const char *path, const char *check)
static int param_actions[]
bool amxo_parser_set_object_attrs(amxo_parser_t *pctx, uint64_t attr, bool enable)
bool amxo_parser_add_mib(amxo_parser_t *pctx, const char *mib_name)
PRIVATE void amxo_hooks_add_mib(amxo_parser_t *parser, const char *mib)
PRIVATE void amxo_hooks_set_counter(amxo_parser_t *parser, const char *param_name)
PRIVATE void amxo_hooks_select_object(amxo_parser_t *parser, const char *path)
PRIVATE void amxo_hooks_create_object(amxo_parser_t *parser, const char *name, int64_t attr_bitmask, amxd_object_type_t type)
PRIVATE void amxo_hooks_add_instance(amxo_parser_t *parser, uint32_t index, const char *name)
PRIVATE void amxo_hooks_set_action_cb(amxo_parser_t *parser, amxd_object_t *object, amxd_param_t *param, amxd_action_t action_id, const char *action_name, const amxc_var_t *data)
PRIVATE void amxo_hooks_end_object(amxo_parser_t *parser)
PRIVATE amxd_status_t amxo_parser_sync_set_action(amxo_parser_t *pctx, amxs_action_cb_t cb)
PRIVATE amxd_status_t amxo_parser_sync_set_translator(amxo_parser_t *pctx, amxs_translation_cb_t cb)
PRIVATE bool amxo_parser_no_resolve(amxo_parser_t *parser)
PRIVATE void amxo_parser_msg(amxo_parser_t *parser, const char *format,...) __attribute__((format(printf
PRIVATE int amxo_parser_include(amxo_parser_t *pctx, const char *file_path)
enum _amxo_action amxo_action_t
PRIVATE bool amxo_parser_is_sync_item(amxo_parser_t *pctx)
enum _event_id event_id_t
const char * amxo_parser_get_mib_file(amxo_parser_t *parser, const char *mib_name)
Get full path and file name of odl file describing a mib.
The ODL parser structure.
amxo_fn_ptr_t resolved_fn
amxc_astack_t object_stack
amxc_llist_t function_names
amxc_string_t * resolved_fn_name
amxc_llist_t * sync_contexts