static inline lagopus_result_t s_parse_begin_call(datastore_interp_t *iptr, lagopus_dstring_t *result) { lagopus_result_t ret = LAGOPUS_RESULT_ANY_FAILURES; char file_name[PATH_MAX]; /* copy file name. */ lagopus_mutex_lock(&lock); if (strlen(save_tmp_dir) + strlen(TMP_FILE) < PATH_MAX) { snprintf(file_name, sizeof(file_name), "%s%s", save_tmp_dir, TMP_FILE); ret = datastore_interp_atomic_begin(iptr, file_name, result); if (ret != LAGOPUS_RESULT_OK) { ret = datastore_json_result_set(result, ret, NULL); } } else { ret = datastore_json_result_string_setf( result, LAGOPUS_RESULT_TOO_LONG, "Bad file name."); } lagopus_mutex_unlock(&lock); return ret; }
static lagopus_result_t tmp_dir_opt_parse(const char *const *argv[], void *c, void *out_configs, lagopus_dstring_t *result) { lagopus_result_t ret = LAGOPUS_RESULT_ANY_FAILURES; char *path = NULL; (void) out_configs; (void) c; if (argv != NULL && out_configs != NULL && result != NULL) { if (*(*argv + 1) != NULL) { (*argv)++; if (IS_VALID_STRING(*(*argv)) == true) { ret = flow_cmd_dump_tmp_dir_set(*(*argv)); if (ret != LAGOPUS_RESULT_OK) { ret = datastore_json_result_string_setf(result, ret, "Bad opt value = %s.", *(*argv)); } } else { ret = datastore_json_result_string_setf(result, ret, "Bad opt value = %s.", *(*argv)); } } else { if ((ret = flow_cmd_dump_tmp_dir_get(&path)) == LAGOPUS_RESULT_OK) { if ((ret = lagopus_dstring_appendf(result, "{")) != LAGOPUS_RESULT_OK) { lagopus_perror(ret); goto done; } if ((ret = datastore_json_string_append( result, ATTR_NAME_GET(opt_strs, OPT_TMP_DIR), path, false)) != LAGOPUS_RESULT_OK) { lagopus_perror(ret); goto done; } if ((ret = lagopus_dstring_appendf(result, "}")) != LAGOPUS_RESULT_OK) { lagopus_perror(ret); goto done; } } else { ret = datastore_json_result_string_setf(result, ret, "Can't get tmp dir."); } } } else { ret = datastore_json_result_set(result, LAGOPUS_RESULT_INVALID_ARGS, NULL); } done: free(path); return ret; }
static lagopus_result_t del_sub_cmd_parse(datastore_interp_t *iptr, datastore_interp_state_t state, size_t argc, const char *const argv[], char *name, lagopus_hashmap_t *hptr, datastore_update_proc_t proc, void *out_configs, lagopus_dstring_t *result) { lagopus_result_t ret = LAGOPUS_RESULT_ANY_FAILURES; uint64_t dpid; (void) state; (void) argc; (void) hptr; (void) proc; if (iptr != NULL && argv != NULL && name != NULL && out_configs != NULL && result != NULL) { if (bridge_exists(name) == true) { if ((ret = datastore_bridge_get_dpid(name, true, &dpid)) == LAGOPUS_RESULT_OK) { ret = flow_cmd_mod_del_cmd_parse(iptr, state, argc, argv, name, out_configs, dpid, result); } else { ret = datastore_json_result_string_setf(result, ret, "Can't get dpid."); } } else { ret = datastore_json_result_string_setf(result, LAGOPUS_RESULT_NOT_FOUND, "Not found. name = %s.", name); } } else { ret = datastore_json_result_set(result, LAGOPUS_RESULT_INVALID_ARGS, NULL); } return ret; }
static lagopus_result_t with_stats_opt_parse(const char *const *argv[], void *c, void *out_configs, lagopus_dstring_t *result) { lagopus_result_t ret = LAGOPUS_RESULT_ANY_FAILURES; configs_t *configs = NULL; if (argv != NULL && c != NULL && out_configs != NULL && result != NULL) { configs = (configs_t *) out_configs; configs->is_with_stats = true; ret = LAGOPUS_RESULT_OK; } else { ret = datastore_json_result_set(result, LAGOPUS_RESULT_INVALID_ARGS, NULL); } return ret; }
static inline lagopus_result_t s_parse_begin_show(lagopus_dstring_t *result) { lagopus_result_t ret = LAGOPUS_RESULT_ANY_FAILURES; lagopus_dstring_t show_result = NULL; char *str = NULL; /* show. */ if ((ret = lagopus_dstring_create(&show_result)) == LAGOPUS_RESULT_OK) { if ((ret = lagopus_dstring_appendf(&show_result, "{")) != LAGOPUS_RESULT_OK) { lagopus_perror(ret); goto done; } if ((ret = datastore_json_string_append( &show_result, ATTR_NAME_GET(opt_strs, OPT_TMP_DIR), save_tmp_dir, false)) != LAGOPUS_RESULT_OK) { lagopus_perror(ret); goto done; } if ((ret = lagopus_dstring_appendf(&show_result, "}")) != LAGOPUS_RESULT_OK) { lagopus_perror(ret); goto done; } ret = lagopus_dstring_str_get(&show_result, &str); if (ret == LAGOPUS_RESULT_OK) { ret = datastore_json_result_set(result, LAGOPUS_RESULT_OK, str); } } else { lagopus_perror(ret); } done: free(str); lagopus_dstring_destroy(&show_result); return ret; }
static lagopus_result_t table_id_opt_parse(const char *const *argv[], void *c, void *out_configs, lagopus_dstring_t *result) { lagopus_result_t ret = LAGOPUS_RESULT_ANY_FAILURES; flow_conf_t *conf = NULL; union cmd_uint cmd_uint; if (argv != NULL && c != NULL && out_configs != NULL && result != NULL) { conf = (flow_conf_t *) c; if (*(*argv + 1) != NULL) { if ((ret = cmd_uint_parse(*(++(*argv)), CMD_UINT8, &cmd_uint)) == LAGOPUS_RESULT_OK) { conf->table_id = cmd_uint.uint8; ret = LAGOPUS_RESULT_OK; } else { ret = datastore_json_result_string_setf(result, ret, "Bad opt value = %s.", *(*argv)); } } else { ret = datastore_json_result_string_setf(result, LAGOPUS_RESULT_INVALID_ARGS, "Bad opt value."); } } else { ret = datastore_json_result_set(result, LAGOPUS_RESULT_INVALID_ARGS, NULL); } return ret; }
static inline lagopus_result_t s_parse_datastore(datastore_interp_t *iptr, datastore_interp_state_t state, size_t argc, const char *const argv[], lagopus_hashmap_t *hptr, datastore_update_proc_t u_proc, datastore_enable_proc_t e_proc, datastore_serialize_proc_t s_proc, datastore_destroy_proc_t d_proc, lagopus_dstring_t *result) { lagopus_result_t ret = LAGOPUS_RESULT_ANY_FAILURES; size_t i; (void)iptr; (void)argc; (void)hptr; (void)u_proc; (void)e_proc; (void)s_proc; (void)d_proc; for (i = 0; i < argc; i++) { lagopus_msg_debug(1, "argv[" PFSZS(4, u) "]:\t'%s'\n", i, argv[i]); } argv++; if (argc == 1) { return s_current_all(result); } else { while (IS_VALID_STRING(*argv) == true) { if (strcmp(*argv, "-addr") == 0) { argv++; if (IS_VALID_STRING(*argv) == true) { ret = s_opt_parse_addr(state, argv, result); if (ret != LAGOPUS_RESULT_OK) { return ret; } } else { return s_current_addr(result); } } else if (strcmp(*argv, "-port") == 0) { argv++; if (IS_VALID_STRING(*argv) == true) { ret = s_opt_parse_port(state, argv, result); if (ret != LAGOPUS_RESULT_OK) { return ret; } } else { return s_current_port(result); } } else if (strcmp(*argv, "-protocol") == 0) { argv++; if (IS_VALID_STRING(*argv) == true) { ret = s_opt_parse_protocol(state, argv, result); if (ret != LAGOPUS_RESULT_OK) { return ret; } } else { return s_current_protocol(result); } } else if (strcmp(*argv, "-tls") == 0) { argv++; if (IS_VALID_STRING(*argv) == true) { ret = s_opt_parse_tls(state, argv, result); if (ret != LAGOPUS_RESULT_OK) { return ret; } } else { return s_current_tls(result); } } else { return datastore_json_result_string_setf(result, LAGOPUS_RESULT_INVALID_ARGS, "Unknown option '%s'", *argv); } argv++; } // setter result return datastore_json_result_set(result, ret, NULL); } }
STATIC lagopus_result_t flow_cmd_parse(datastore_interp_t *iptr, datastore_interp_state_t state, size_t argc, const char *const argv[], lagopus_hashmap_t *hptr, datastore_update_proc_t u_proc, datastore_enable_proc_t e_proc, datastore_serialize_proc_t s_proc, datastore_destroy_proc_t d_proc, lagopus_dstring_t *result) { lagopus_result_t ret = LAGOPUS_RESULT_ANY_FAILURES; lagopus_result_t ret_for_json = LAGOPUS_RESULT_ANY_FAILURES; size_t i; void *sub_cmd_proc; char *name = NULL; char *fullname = NULL; char *str = NULL; flow_conf_t conf = {NULL, OFPTT_ALL}; configs_t out_configs = {false, false}; lagopus_dstring_t conf_result = NULL; (void) u_proc; (void) e_proc; (void) s_proc; (void) d_proc; for (i = 0; i < argc; i++) { lagopus_msg_debug(1, "argv[" PFSZS(4, u) "]:\t'%s'\n", i, argv[i]); } if (iptr != NULL && argv != NULL && result != NULL) { if ((ret = lagopus_dstring_create(&conf_result)) == LAGOPUS_RESULT_OK) { argv++; if (IS_VALID_STRING(*argv) == true) { if ((ret = lagopus_hashmap_find( &sub_cmd_not_name_table, (void *)(*argv), &sub_cmd_proc)) == LAGOPUS_RESULT_OK) { /* parse sub cmd. */ if (sub_cmd_proc != NULL) { ret_for_json = ((sub_cmd_proc_t) sub_cmd_proc)(iptr, state, argc, argv, NULL, hptr, u_proc, (void *) &out_configs, result); } } if (ret == LAGOPUS_RESULT_NOT_FOUND && ret_for_json != LAGOPUS_RESULT_OK) { if ((ret = lagopus_str_unescape(*argv, "\"'", &name)) < 0) { goto done; } else { argv++; if ((ret = namespace_get_fullname(name, &fullname)) == LAGOPUS_RESULT_OK) { if (IS_VALID_STRING(*argv) == true) { if ((ret = lagopus_hashmap_find( &sub_cmd_table, (void *)(*argv), &sub_cmd_proc)) == LAGOPUS_RESULT_OK) { /* parse sub cmd. */ if (sub_cmd_proc != NULL) { ret_for_json = ((sub_cmd_proc_t) sub_cmd_proc)(iptr, state, argc, argv, fullname, hptr, u_proc, (void *) &out_configs, result); } else { ret = LAGOPUS_RESULT_NOT_FOUND; lagopus_perror(ret); goto done; } } else if (ret == LAGOPUS_RESULT_NOT_FOUND) { /* parse dump cmd. */ ret_for_json = dump_sub_cmd_parse(iptr, argv, fullname, &conf, &out_configs, result); } else { ret_for_json = datastore_json_result_string_setf( result, LAGOPUS_RESULT_INVALID_ARGS, "sub_cmd = %s.", *argv); } } else { /* parse dump cmd. */ ret_for_json = dump_sub_cmd_parse(iptr, argv, fullname, &conf, &out_configs, result); } } else { ret_for_json = datastore_json_result_string_setf( result, ret, "Can't get fullname %s.", name); } } } } else { /* parse dump all cmd. */ ret_for_json = dump_sub_cmd_parse(iptr, argv, NULL, &conf, &out_configs, result); } /* create jsno for LAGOPUS_RESULT_OK. */ if (ret_for_json == LAGOPUS_RESULT_OK && out_configs.is_dump == false) { ret = lagopus_dstring_str_get(result, &str); if (ret != LAGOPUS_RESULT_OK) { goto done; } if (IS_VALID_STRING(str) == true) { ret = datastore_json_result_set(result, LAGOPUS_RESULT_OK, str); } else { ret = datastore_json_result_set(result, LAGOPUS_RESULT_OK, NULL); } } else { ret = ret_for_json; } } done: /* free. */ free(name); free(fullname); free(str); lagopus_dstring_destroy(&conf_result); } else { ret = LAGOPUS_RESULT_INVALID_ARGS; } return ret; }
static inline lagopus_result_t dump_sub_cmd_parse(datastore_interp_t *iptr, const char *const argv[], char *name, flow_conf_t *conf, configs_t *configs, lagopus_dstring_t *result) { lagopus_result_t ret = LAGOPUS_RESULT_ANY_FAILURES; char *str = NULL; void *opt_proc; if (argv != NULL && conf != NULL && configs != NULL && result != NULL) { configs->is_dump = true; if (name == NULL) { ret = LAGOPUS_RESULT_OK; } else { if (bridge_exists(name) == true) { conf->name = name; if (*argv != NULL) { while (*argv != NULL) { if (IS_VALID_STRING(*(argv)) == true) { if ((ret = lagopus_hashmap_find(&dump_opt_table, (void *)(*argv), &opt_proc)) == LAGOPUS_RESULT_OK) { /* parse opt. */ if (opt_proc != NULL) { ret = ((opt_proc_t) opt_proc)(&argv, (void *) conf, (void *) configs, result); if (ret != LAGOPUS_RESULT_OK) { goto done; } } else { ret = LAGOPUS_RESULT_NOT_FOUND; lagopus_perror(ret); goto done; } } else { ret = datastore_json_result_string_setf(result, LAGOPUS_RESULT_INVALID_ARGS, "opt = %s.", *argv); goto done; } } else { ret = datastore_json_result_set(result, LAGOPUS_RESULT_INVALID_ARGS, NULL); goto done; } argv++; } } else { ret = LAGOPUS_RESULT_OK; } } else { ret = datastore_json_result_string_setf(result, LAGOPUS_RESULT_NOT_FOUND, "name = %s", name); } } if (ret == LAGOPUS_RESULT_OK) { /* dump flow. */ if ((ret = flow_cmd_dump_thread_start(conf, configs, iptr, result)) != LAGOPUS_RESULT_OK) { ret = datastore_json_result_string_setf( result,ret, "Can't start flow dump thread."); } } } else { ret = datastore_json_result_set(result, LAGOPUS_RESULT_INVALID_ARGS, NULL); } done: free(str); return ret; }
static lagopus_result_t config_sub_cmd_parse(datastore_interp_t *iptr, datastore_interp_state_t state, size_t argc, const char *const argv[], char *name, lagopus_hashmap_t *hptr, datastore_update_proc_t proc, void *out_configs, lagopus_dstring_t *result) { lagopus_result_t ret = LAGOPUS_RESULT_ANY_FAILURES; configs_t *configs = NULL; void *opt_proc; (void) state; (void) argc; (void) name; (void) hptr; (void) proc; if (iptr != NULL && argv != NULL && out_configs != NULL && result != NULL) { configs = (configs_t *) out_configs; if (*(argv + 1) != NULL) { argv++; while (*argv != NULL) { if (IS_VALID_STRING(*(argv)) == true) { if ((ret = lagopus_hashmap_find(&config_opt_table, (void *)(*argv), &opt_proc)) == LAGOPUS_RESULT_OK) { /* parse opt. */ if (opt_proc != NULL) { ret = ((opt_proc_t) opt_proc)(&argv, (void *) NULL, (void *) configs, result); if (ret != LAGOPUS_RESULT_OK) { goto done; } } else { ret = LAGOPUS_RESULT_NOT_FOUND; lagopus_perror(ret); goto done; } } else if (ret == LAGOPUS_RESULT_NOT_FOUND) { goto done; } else { ret = datastore_json_result_string_setf(result, LAGOPUS_RESULT_INVALID_ARGS, "opt = %s.", *argv); goto done; } } else { ret = datastore_json_result_set(result, LAGOPUS_RESULT_INVALID_ARGS, NULL); goto done; } argv++; } } else { ret = tmp_dir_opt_parse(&argv, (void *) NULL, (void *) configs, result); } } else { ret = datastore_json_result_set(result, LAGOPUS_RESULT_INVALID_ARGS, NULL); } done: return ret; }
static inline lagopus_result_t s_parse_load(datastore_interp_t *iptr, datastore_interp_state_t state, size_t argc, const char *const argv[], lagopus_hashmap_t *hptr, datastore_update_proc_t u_proc, datastore_enable_proc_t e_proc, datastore_serialize_proc_t s_proc, datastore_destroy_proc_t d_proc, lagopus_dstring_t *result) { lagopus_result_t ret = LAGOPUS_RESULT_ANY_FAILURES; size_t i; const char *cname = NULL; char *filepath = NULL; (void)state; (void)argc; (void)hptr; (void)u_proc; (void)e_proc; (void)s_proc; (void)d_proc; for (i = 0; i < argc; i++) { lagopus_msg_debug(1, "argv[" PFSZS(4, u) "]:\t'%s'\n", i, argv[i]); } argv++; if (IS_VALID_STRING(*argv) == false) { ret = datastore_json_result_set(result, LAGOPUS_RESULT_OK, NULL); } else { if (IS_VALID_STRING(*argv) == true) { if ((ret = lagopus_str_unescape(*argv, "\"'", &filepath)) > 0) { if (s_is_readable(filepath) == LAGOPUS_RESULT_OK) { ret = datastore_interp_get_current_configurater(iptr, &cname); if (ret == LAGOPUS_RESULT_OK && IS_VALID_STRING(cname) == true) { ret = datastore_interp_load_file(iptr, cname, filepath, result); if (ret == LAGOPUS_RESULT_OK) { ret = datastore_json_result_set(result, ret, NULL); } } else { ret = datastore_json_result_string_setf(result, ret, CMD_ERR_MSG_LOAD_FAILED, "internal error."); } } else { ret = datastore_json_result_string_setf(result, LAGOPUS_RESULT_INVALID_ARGS, CMD_ERR_MSG_UNREADABLE, filepath); } } else { ret = datastore_json_result_string_setf(result, LAGOPUS_RESULT_INVALID_ARGS, CMD_ERR_MSG_INVALID_OPT_VALUE, *argv); } } else { ret = datastore_json_result_string_setf(result, LAGOPUS_RESULT_INVALID_ARGS, CMD_ERR_MSG_INVALID_OPT, *argv); } } free((void *) filepath); return ret; }
static inline lagopus_result_t s_parse_dryrun(datastore_interp_t *iptr, datastore_interp_state_t state, size_t argc, const char *const argv[], lagopus_hashmap_t *hptr, datastore_update_proc_t u_proc, datastore_enable_proc_t e_proc, datastore_serialize_proc_t s_proc, datastore_destroy_proc_t d_proc, lagopus_dstring_t *result) { lagopus_result_t ret = LAGOPUS_RESULT_ANY_FAILURES; size_t i; (void)iptr; (void)hptr; (void)u_proc; (void)e_proc; (void)s_proc; (void)d_proc; for (i = 0; i < argc; i++) { lagopus_msg_debug(1, "argv[" PFSZS(4, u) "]:\t'%s'\n", i, argv[i]); } if (argc == 1) { (void)lagopus_dstring_clear(result); ret = lagopus_dstring_appendf(result, "{\"ret\":\"OK\",\n" "\"data\":{\"dryrun\": "); if (ret == LAGOPUS_RESULT_OK) { if (state == DATASTORE_INTERP_STATE_DRYRUN) { ret = lagopus_dstring_appendf(result, "true}}"); } else { ret = lagopus_dstring_appendf(result, "false}}"); } if (ret != LAGOPUS_RESULT_OK) { ret = datastore_json_result_string_setf(result, LAGOPUS_RESULT_ANY_FAILURES, "dstring append failed."); } } else { ret = datastore_json_result_string_setf(result, LAGOPUS_RESULT_ANY_FAILURES, "dstring append failed."); } } else if (argc == 2) { argv++; if (strcmp(*argv, "begin") == 0) { ret = dryrun_begin(); if (ret != LAGOPUS_RESULT_OK) { ret = datastore_json_result_string_setf(result, ret, "dryrun begin failed."); } } else if (strcmp(*argv, "end") == 0) { ret = dryrun_end(); if (ret != LAGOPUS_RESULT_OK) { ret = datastore_json_result_string_setf(result, ret, "dryrun end failed."); } } else { ret = datastore_json_result_string_setf(result, LAGOPUS_RESULT_INVALID_ARGS, "Unknown option '%s'.", *argv); } if (ret != LAGOPUS_RESULT_DATASTORE_INTERP_ERROR) { ret = datastore_json_result_set(result, ret, NULL); } } else { ret = datastore_json_result_string_setf(result, LAGOPUS_RESULT_INVALID_ARGS, "Unknown option."); } return ret; }
static inline lagopus_result_t s_parse_atomic(datastore_interp_t *iptr, datastore_interp_state_t state, size_t argc, const char *const argv[], lagopus_hashmap_t *hptr, datastore_update_proc_t u_proc, datastore_enable_proc_t e_proc, datastore_serialize_proc_t s_proc, datastore_destroy_proc_t d_proc, lagopus_dstring_t *result) { lagopus_result_t ret = LAGOPUS_RESULT_ANY_FAILURES; bool is_show = false; size_t i; (void)state; (void)argc; (void)hptr; (void)u_proc; (void)e_proc; (void)s_proc; (void)d_proc; for (i = 0; i < argc; i++) { lagopus_msg_debug(1, "argv[" PFSZS(4, u) "]:\t'%s'\n", i, argv[i]); } argv++; if (IS_VALID_STRING(*argv) == false) { return datastore_json_result_set(result, LAGOPUS_RESULT_OK, NULL); } else { if (strcmp(*argv, "begin") == 0) { ret = s_parse_begin(iptr, state, argc, argv, &is_show, result); } else if (strcmp(*argv, "abort") == 0) { if (state == DATASTORE_INTERP_STATE_DRYRUN) { ret = LAGOPUS_RESULT_OK; } else { ret = datastore_interp_atomic_abort(iptr, result); } } else if (strcmp(*argv, "commit") == 0) { if (state == DATASTORE_INTERP_STATE_DRYRUN) { ret = LAGOPUS_RESULT_OK; } else { ret = datastore_interp_atomic_commit(iptr, result); } } else if (strcmp(*argv, "rollback-force") == 0) { if (state == DATASTORE_INTERP_STATE_DRYRUN) { ret = LAGOPUS_RESULT_OK; } else { ret = datastore_interp_atomic_rollback(iptr, result, true); } } else { return datastore_json_result_string_setf(result, LAGOPUS_RESULT_INVALID_ARGS, "Unknown option '%s'", *argv); } if (ret != LAGOPUS_RESULT_DATASTORE_INTERP_ERROR && is_show == false) { ret = datastore_json_result_set(result, ret, NULL); } return ret; } }