Пример #1
0
static inline lagopus_result_t
s_opt_parse_port(datastore_interp_state_t state,
                 const char *const argv[], lagopus_dstring_t *result) {
  lagopus_result_t ret = LAGOPUS_RESULT_ANY_FAILURES;
  uint16_t tmp = 0;

  if (IS_VALID_STRING(*argv) == true) {
    if ((ret = lagopus_str_parse_uint16(*argv, &tmp)) ==
        LAGOPUS_RESULT_OK) {
      if (state != DATASTORE_INTERP_STATE_DRYRUN) {
        s_port = tmp;
      }
      ret = LAGOPUS_RESULT_OK;
    } else {
      ret = datastore_json_result_string_setf(result,
                                              LAGOPUS_RESULT_INVALID_ARGS,
                                              "\"can't parse '%s' as a "
                                              "uint16_t integer.\"",
                                              *argv);
    }
  } else {
    ret = datastore_json_result_string_setf(result,
                                            LAGOPUS_RESULT_INVALID_ARGS,
                                            "Bad opt value = %s",
                                            *argv);
  }
  return ret;
}
Пример #2
0
static inline lagopus_result_t
s_opt_parse_tls(datastore_interp_state_t state,
                const char *const argv[], lagopus_dstring_t *result) {
  lagopus_result_t ret = LAGOPUS_RESULT_ANY_FAILURES;
  bool tls = false;

  if (IS_VALID_STRING(*argv) == true) {
    if (state == DATASTORE_INTERP_STATE_DRYRUN) {
      ret = LAGOPUS_RESULT_OK;
    } else {
      ret = lagopus_str_parse_bool(*argv, &tls);
      if (ret == LAGOPUS_RESULT_OK) {
        s_set_tls(tls);
      } else {
        ret = datastore_json_result_string_setf(result,
                                                LAGOPUS_RESULT_INVALID_ARGS,
                                                "Bad opt value = %s",
                                                *argv);
      }
    }
  } else {
    ret = datastore_json_result_string_setf(result,
                                            LAGOPUS_RESULT_INVALID_ARGS,
                                            "Bad opt value = %s",
                                            *argv);
  }
  return ret;
}
Пример #3
0
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;
}
Пример #4
0
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;
}
Пример #5
0
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;
}
Пример #6
0
static inline lagopus_result_t
s_opt_parse_protocol(const char *const argv[], lagopus_dstring_t *result) {
  lagopus_result_t ret = LAGOPUS_RESULT_ANY_FAILURES;

  if (IS_VALID_STRING(*argv) == true) {
    ret = s_set_protocol(*argv);
    if (ret != LAGOPUS_RESULT_OK) {
      ret = datastore_json_result_string_setf(result,
                                              LAGOPUS_RESULT_INVALID_ARGS,
                                              "Bad opt value = %s",
                                              *argv);
    }
  } else {
    ret = datastore_json_result_string_setf(result,
                                            LAGOPUS_RESULT_INVALID_ARGS,
                                            "Bad opt value = %s",
                                            *argv);
  }
  return ret;
}
Пример #7
0
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;
}
Пример #8
0
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);
  }
}
Пример #9
0
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;
    }
}
Пример #10
0
static inline lagopus_result_t
s_parse_snmp_show(lagopus_dstring_t *result) {
  lagopus_result_t ret = LAGOPUS_RESULT_ANY_FAILURES;
  bool enable = false;
  uint16_t ping_interval;
  char *agentx_sock = NULL;
  char *esc_sock = NULL;

  if ((ret = lagopus_snmp_get_agentx_sock(&agentx_sock))
      == LAGOPUS_RESULT_OK) {
    ret = datastore_json_string_escape(agentx_sock,
                                       (char **)&esc_sock);
    if (ret != LAGOPUS_RESULT_OK) {
      ret = datastore_json_result_string_setf(result, ret,
                                              "Can't convert "
                                              "to an unescaped strings.");
      goto done;
    }
  } else {
    ret = datastore_json_result_string_setf(result, ret,
                                            "Can't get "
                                            "master-agentx-socket.");
    goto done;
  }

  if ((ret = lagopus_snmp_get_ping_interval(&ping_interval))
      == LAGOPUS_RESULT_OK) {
    if (ping_interval > MAXIMUM_PING_SEC) {
      ret = datastore_json_result_string_setf(result,
                                              LAGOPUS_RESULT_TOO_LONG,
                                              "ping-interval-second "
                                              "must be smaller than 256.");
      goto done;
    } else if (ping_interval < MINIMUM_PING_SEC) {
      ret = datastore_json_result_string_setf(result,
                                              LAGOPUS_RESULT_TOO_SHORT,
                                              "ping-interval-second "
                                              "must be greater than zero.");
      goto done;
    } else {
      if ((ret = lagopus_snmp_get_enable(&enable))
          == LAGOPUS_RESULT_OK) {
        ret = datastore_json_result_setf(result, ret, "[{"
                                         "\"master-agentx-socket\":\"%s\",\n"
                                         "\"ping-interval-second\":%d,\n"
                                         "\"is-enabled\":%s"
                                         "}]",
                                         esc_sock,
                                         ping_interval,
                                         IS_ENABLED(enable));
      } else {
        ret = datastore_json_result_string_setf(result, ret,
                                                "Can't get enable.");
      }
    }
  } else {
    ret = datastore_json_result_string_setf(result, ret,
                                            "Can't get "
                                            "ping-interval-second.");
  }

done:
  free((void *)agentx_sock);
  free((void *)esc_sock);

  return ret;
}
Пример #11
0
static inline lagopus_result_t
s_parse_snmp_internal(const char *const argv[],
                      lagopus_dstring_t *result) {
  lagopus_result_t ret = LAGOPUS_RESULT_ANY_FAILURES;
  char *agentx_sock = NULL;
  char *esc_agentx = NULL;
  char *ping = NULL;

  while (IS_VALID_STRING(*argv) == true) {
    if (strcmp(*argv, "-master-agentx-socket") == 0) {
      if (IS_VALID_STRING(*(argv + 1)) == true) {
        argv++;
        if ((ret = lagopus_str_unescape(*argv, "\"'", &agentx_sock))
            > 0) {

          if ((ret = lagopus_snmp_set_agentx_sock(agentx_sock))
              != LAGOPUS_RESULT_OK) {
            ret = datastore_json_result_string_setf(result, ret,
                                                    "Can't set %s.",
                                                    agentx_sock);
            goto done;
          }

        } else if (ret == 0) {
          ret = datastore_json_result_string_setf(result,
                                                  LAGOPUS_RESULT_INVALID_ARGS,
                                                  "Bad opt val = %s ",
                                                  *argv);
          goto done;
        } else {
          ret = datastore_json_result_string_setf(result, ret,
                                                  "Can't convert to an "
                                                  "unescaped strings.");
          goto done;
        }
      } else {

        if ((ret = lagopus_snmp_get_agentx_sock(&agentx_sock))
            == LAGOPUS_RESULT_OK) {
          ret = datastore_json_string_escape(agentx_sock,
                                             (char **)&esc_agentx);
          if (ret == LAGOPUS_RESULT_OK) {
            ret = datastore_json_result_setf(result, ret, "[{"
                                             "\"master-agentx-socket\":\"%s\""
                                             "}]", esc_agentx);
            goto done;
          } else {
            ret = datastore_json_result_string_setf(result, ret,
                                                    "Can't convert to "
                                                    "an escaped strings.");
            goto done;
          }
        } else {
          ret = datastore_json_result_string_setf(result, ret,
                                                  "Can't get "
                                                  "master-agentx-socket.");
          goto done;
        }
      }

    } else if (strcmp(*argv, "-ping-interval-second") == 0) {

      if (IS_VALID_STRING(*(argv + 1)) == true) {
        argv++;
        ret = lagopus_str_unescape(*argv, "\"'", &ping);
        if (ret > 0) {
          uint16_t new_ping;
          ret = lagopus_str_parse_uint16(ping, &new_ping);
          if (ret == LAGOPUS_RESULT_OK) {
            if ((ret = lagopus_snmp_set_ping_interval(new_ping))
                != LAGOPUS_RESULT_OK) {
              ret = datastore_json_result_string_setf(result, ret,
                                                      "Can't set "
                                                      "ping-interval.");

              goto done;
            }
          } else {
            ret = datastore_json_result_string_setf(result, ret,
                                                    "Can't parse string "
                                                    "to uint16_t.");
            goto done;
          }
        } else if (ret == 0) {
          ret = datastore_json_result_string_setf(result,
                                                  LAGOPUS_RESULT_INVALID_ARGS,
                                                  "Bad opt val = %s ",
                                                  *argv);
          goto done;
        } else {
          ret = datastore_json_result_string_setf(result, ret,
                                                  "Can't convert to an "
                                                  "unescaped strings.");
          goto done;
        }
      } else {
        uint16_t ping_interval;
        ret = lagopus_snmp_get_ping_interval(&ping_interval);
        if (ret == LAGOPUS_RESULT_OK) {
          ret = datastore_json_result_setf(result, ret, "[{"
                                           "\"ping-interval-second\":%d"
                                           "}]", ping_interval);
          goto done;
        } else {
          ret = datastore_json_result_string_setf(result, ret,
                                                  "Can't get "
                                                  "ping-interval-second.");
          goto done;
        }
      }

    } else if (strcmp(*argv, "enable") == 0) {
      if ((ret = lagopus_snmp_set_enable(true))
          != LAGOPUS_RESULT_OK) {
        ret = datastore_json_result_string_setf(result, ret,
                                                "Can't set enable.");
        goto done;
      }
    } else {
      char *esc_str = NULL;
      ret = datastore_json_string_escape(*argv, (char **)&esc_str);
      if (ret == LAGOPUS_RESULT_OK) {
        ret = datastore_json_result_string_setf(result, LAGOPUS_RESULT_NOT_FOUND,
                                                "option = %s",
                                                esc_str);
      }
      free((void *)esc_str);
    }

 done:
    free((void *)agentx_sock);
    free((void *)esc_agentx);
    free((void *)ping);
    agentx_sock = NULL;
    esc_agentx = NULL;
    ping = NULL;

    if (ret != LAGOPUS_RESULT_OK) {
      break;
    }
    argv++;
  }

  if (ret == LAGOPUS_RESULT_OK &&
      lagopus_dstring_empty(result)) {
    ret = lagopus_dstring_appendf(result, "{\"ret\":\"OK\"}");
    if (ret != LAGOPUS_RESULT_OK) {
      ret = datastore_json_result_string_setf(result, ret,
                                              "Can't add strings "
                                              "to dstring.");
    }
  }

  return ret;
}
Пример #12
0
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;
}
Пример #13
0
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;
}
Пример #14
0
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;
}
Пример #15
0
static inline lagopus_result_t
s_parse_begin(datastore_interp_t *iptr,
              datastore_interp_state_t state,
              size_t argc, const char *const argv[],
              bool *is_show,
              lagopus_dstring_t *result) {
    lagopus_result_t ret = LAGOPUS_RESULT_ANY_FAILURES;
    (void) argc;

    if (*argv != NULL) {
        argv++;
        if (*argv != NULL) {
            if (IS_VALID_STRING(*argv) == true) {
                if (strcmp(*argv, opt_strs[OPT_TMP_DIR]) == 0) {
                    argv++;
                    if (*argv != NULL) {
                        if (IS_VALID_STRING(*argv) == true) {
                            if (strlen(*argv) < PATH_MAX) {
                                if (state == DATASTORE_INTERP_STATE_DRYRUN) {
                                    ret = LAGOPUS_RESULT_OK;
                                } else {
                                    lagopus_mutex_lock(&lock);
                                    strncpy(save_tmp_dir, *argv, PATH_MAX - 1);
                                    lagopus_mutex_unlock(&lock);

                                    /* call begin func.*/
                                    ret = s_parse_begin_call(iptr, result);
                                }
                            } else {
                                ret = datastore_json_result_string_setf(
                                          result,
                                          LAGOPUS_RESULT_OUT_OF_RANGE,
                                          CMD_ERR_MSG_INVALID_OPT_VALUE,
                                          *argv);
                            }
                        } else {
                            ret = datastore_json_result_string_setf(
                                      result,
                                      LAGOPUS_RESULT_INVALID_ARGS,
                                      CMD_ERR_MSG_INVALID_OPT_VALUE,
                                      *argv);
                        }
                    } else {
                        /* show */
                        *is_show = true;
                        ret = s_parse_begin_show(result);
                    }
                } else {
                    ret = datastore_json_result_string_setf(
                              result,
                              LAGOPUS_RESULT_INVALID_ARGS,
                              CMD_ERR_MSG_INVALID_OPT,
                              *argv);
                }
            } else {
                ret = datastore_json_result_string_setf(
                          result,
                          LAGOPUS_RESULT_INVALID_ARGS,
                          CMD_ERR_MSG_INVALID_OPT,
                          *argv);
            }
        }  else {
            if (state == DATASTORE_INTERP_STATE_DRYRUN) {
                ret = LAGOPUS_RESULT_OK;
            } else {
                /* call begin func.*/
                ret = s_parse_begin_call(iptr, result);
            }
        }
    } else {
        ret = datastore_json_result_string_setf(
                  result,
                  LAGOPUS_RESULT_INVALID_ARGS,
                  "Bad opt value.");
    }

    return ret;
}
Пример #16
0
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;
}
Пример #17
0
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;
}