diff options
-rw-r--r-- | openbsc/src/vty_interface_layer3.c | 217 |
1 files changed, 95 insertions, 122 deletions
diff --git a/openbsc/src/vty_interface_layer3.c b/openbsc/src/vty_interface_layer3.c index c23c1c2bf..ab157f01e 100644 --- a/openbsc/src/vty_interface_layer3.c +++ b/openbsc/src/vty_interface_layer3.c @@ -45,31 +45,6 @@ extern struct gsm_network *gsmnet_from_vty(struct vty *v); -struct cmd_node subscr_node = { - SUBSCR_NODE, - "%s(subscriber)#", - 1, -}; - -/* Down vty node level. */ -DEFUN(subscr_node_exit, - subscr_node_exit_cmd, "exit", "Exit current mode and down to previous mode\n") -{ - switch (vty->node) { - case SUBSCR_NODE: - vty->node = VIEW_NODE; - subscr_put(vty->index); - vty->index = NULL; - break; - } - return CMD_SUCCESS; -} - -static int dummy_config_write(struct vty *v) -{ - return CMD_SUCCESS; -} - static int hexparse(const char *str, u_int8_t *b, int max_len) { @@ -97,30 +72,6 @@ static int hexparse(const char *str, u_int8_t *b, int max_len) return i>>1; } -/* per-subscriber configuration */ -DEFUN(cfg_subscr, - cfg_subscr_cmd, - "subscriber IMSI", - "Select a Subscriber to configure\n") -{ - struct gsm_network *gsmnet = gsmnet_from_vty(vty); - const char *imsi = argv[0]; - struct gsm_subscriber *subscr; - - subscr = subscr_get_by_imsi(gsmnet, imsi); - if (!subscr) { - vty_out(vty, "%% No subscriber for IMSI %s%s", - imsi, VTY_NEWLINE); - return CMD_WARNING; - } - - /* vty_go_parent should put this subscriber */ - vty->index = subscr; - vty->node = SUBSCR_NODE; - - return CMD_SUCCESS; -} - static void subscr_dump_full_vty(struct vty *vty, struct gsm_subscriber *subscr) { int rc; @@ -171,35 +122,6 @@ static void subscr_dump_full_vty(struct vty *vty, struct gsm_subscriber *subscr) /* Subscriber */ -DEFUN(show_subscr, - show_subscr_cmd, - "show subscriber [IMSI]", - SHOW_STR "Display information about a subscriber\n") -{ - struct gsm_network *gsmnet = gsmnet_from_vty(vty); - const char *imsi; - struct gsm_subscriber *subscr; - - if (argc >= 1) { - imsi = argv[0]; - subscr = subscr_get_by_imsi(gsmnet, imsi); - if (!subscr) { - vty_out(vty, "%% unknown subscriber%s", - VTY_NEWLINE); - return CMD_WARNING; - } - subscr_dump_full_vty(vty, subscr); - subscr_put(subscr); - - return CMD_SUCCESS; - } - - /* FIXME: iterate over all subscribers ? */ - return CMD_WARNING; - - return CMD_SUCCESS; -} - DEFUN(show_subscr_cache, show_subscr_cache_cmd, "show subscriber cache", @@ -301,9 +223,31 @@ static struct gsm_subscriber *get_subscr_by_argv(struct gsm_network *gsmnet, "Identify subscriber by his database ID\n" \ "Identifier for the subscriber\n" +DEFUN(show_subscr, + show_subscr_cmd, + "show subscriber " SUBSCR_TYPES " ID", + SHOW_STR SUBSCR_HELP) +{ + struct gsm_network *gsmnet = gsmnet_from_vty(vty); + struct gsm_subscriber *subscr = + get_subscr_by_argv(gsmnet, argv[0], argv[1]); + + if (!subscr) { + vty_out(vty, "%% No subscriber found for %s %s%s", + argv[0], argv[1], VTY_NEWLINE); + return CMD_WARNING; + } + + subscr_dump_full_vty(vty, subscr); + + subscr_put(subscr); + + return CMD_SUCCESS; +} + DEFUN(subscriber_send_sms, subscriber_send_sms_cmd, - "subscriber " SUBSCR_TYPES " EXTEN sms send .LINE", + "subscriber " SUBSCR_TYPES " ID sms send .LINE", SUBSCR_HELP "SMS Operations\n" "Send SMS\n" "Actual SMS Text") { struct gsm_network *gsmnet = gsmnet_from_vty(vty); @@ -327,7 +271,7 @@ DEFUN(subscriber_send_sms, DEFUN(subscriber_silent_sms, subscriber_silent_sms_cmd, - "subscriber " SUBSCR_TYPES " EXTEN silent-sms send .LINE", + "subscriber " SUBSCR_TYPES " ID silent-sms send .LINE", SUBSCR_HELP "Silent SMS Operation\n" "Send Silent SMS\n" "Actual SMS text\n") { @@ -360,7 +304,7 @@ DEFUN(subscriber_silent_sms, DEFUN(subscriber_silent_call_start, subscriber_silent_call_start_cmd, - "subscriber " SUBSCR_TYPES " EXTEN silent-call start (any|tch/f|tch/any|sdcch)", + "subscriber " SUBSCR_TYPES " ID silent-call start (any|tch/f|tch/any|sdcch)", SUBSCR_HELP "Silent call operation\n" "Start silent call\n" CHAN_TYPE_HELP) { @@ -398,7 +342,7 @@ DEFUN(subscriber_silent_call_start, DEFUN(subscriber_silent_call_stop, subscriber_silent_call_stop_cmd, - "subscriber " SUBSCR_TYPES " EXTEN silent-call stop", + "subscriber " SUBSCR_TYPES " ID silent-call stop", SUBSCR_HELP "Silent call operation\n" "Stop silent call\n" CHAN_TYPE_HELP) { @@ -423,52 +367,78 @@ DEFUN(subscriber_silent_call_stop, return CMD_SUCCESS; } -DEFUN(cfg_subscr_name, - cfg_subscr_name_cmd, - "name NAME", - "Set the name of the subscriber") +DEFUN(ena_subscr_authorizde, + ena_subscr_authorized_cmd, + "subscriber " SUBSCR_TYPES " ID authorized (0|1)", + SUBSCR_HELP "(De-)Authorize subscriber in HLR\n" + "Subscriber should NOT be authorized\n" + "Subscriber should be authorized\n") { - const char *name = argv[0]; - struct gsm_subscriber *subscr = vty->index; + struct gsm_network *gsmnet = gsmnet_from_vty(vty); + struct gsm_subscriber *subscr = + get_subscr_by_argv(gsmnet, argv[0], argv[1]); - strncpy(subscr->name, name, sizeof(subscr->name)); + if (!subscr) { + vty_out(vty, "%% No subscriber found for %s %s%s", + argv[0], argv[1], VTY_NEWLINE); + return CMD_WARNING; + } + subscr->authorized = atoi(argv[2]); db_sync_subscriber(subscr); + subscr_put(subscr); + return CMD_SUCCESS; } -DEFUN(cfg_subscr_extension, - cfg_subscr_extension_cmd, - "extension EXTENSION", - "Set the extension of the subscriber") +DEFUN(ena_subscr_name, + ena_subscr_name_cmd, + "subscriber " SUBSCR_TYPES " ID name NAME", + SUBSCR_HELP "Set the name of the subscriber\n" + "Name of the Subscriber\n") { - const char *name = argv[0]; - struct gsm_subscriber *subscr = vty->index; + struct gsm_network *gsmnet = gsmnet_from_vty(vty); + struct gsm_subscriber *subscr = + get_subscr_by_argv(gsmnet, argv[0], argv[1]); + const char *name = argv[2]; - strncpy(subscr->extension, name, sizeof(subscr->extension)); + if (!subscr) { + vty_out(vty, "%% No subscriber found for %s %s%s", + argv[0], argv[1], VTY_NEWLINE); + return CMD_WARNING; + } + strncpy(subscr->name, name, sizeof(subscr->name)); db_sync_subscriber(subscr); + subscr_put(subscr); + return CMD_SUCCESS; } -DEFUN(cfg_subscr_authorized, - cfg_subscr_authorized_cmd, - "auth (0|1)", - "Set the authorization status of the subscriber\n" - "Not authorized\n" "Authorized\n") +DEFUN(ena_subscr_extension, + ena_subscr_extension_cmd, + "subscriber " SUBSCR_TYPES " ID extension EXTENSION", + SUBSCR_HELP "Set the extension (phone number) of the subscriber\n" + "Extension (phone number)\n") { - int auth = atoi(argv[0]); - struct gsm_subscriber *subscr = vty->index; + struct gsm_network *gsmnet = gsmnet_from_vty(vty); + struct gsm_subscriber *subscr = + get_subscr_by_argv(gsmnet, argv[0], argv[1]); + const char *name = argv[2]; - if (auth) - subscr->authorized = 1; - else - subscr->authorized = 0; + if (!subscr) { + vty_out(vty, "%% No subscriber found for %s %s%s", + argv[0], argv[1], VTY_NEWLINE); + return CMD_WARNING; + } + strncpy(subscr->extension, name, sizeof(subscr->name)); db_sync_subscriber(subscr); + subscr_put(subscr); + return CMD_SUCCESS; } @@ -477,18 +447,26 @@ DEFUN(cfg_subscr_authorized, "Use No A3A8 algorithm\n" \ "Use COMP128v1 algorithm\n" -DEFUN(cfg_subscr_a3a8, - cfg_subscr_a3a8_cmd, - "a3a8 " A3A8_ALG_TYPES " [KI]", +DEFUN(ena_subscr_a3a8, + ena_subscr_a3a8_cmd, + "subscriber " SUBSCR_TYPES " ID a3a8 " A3A8_ALG_TYPES " [KI]", "Set a3a8 parameters for the subscriber\n" A3A8_ALG_HELP "Encryption Key Ki\n") { - struct gsm_subscriber *subscr = vty->index; - const char *alg_str = argv[0]; - const char *ki_str = argv[1]; + struct gsm_network *gsmnet = gsmnet_from_vty(vty); + struct gsm_subscriber *subscr = + get_subscr_by_argv(gsmnet, argv[0], argv[1]); + const char *alg_str = argv[2]; + const char *ki_str = argv[3]; struct gsm_auth_info ainfo; int rc; + if (!subscr) { + vty_out(vty, "%% No subscriber found for %s %s%s", + argv[0], argv[1], VTY_NEWLINE); + return CMD_WARNING; + } + if (!strcasecmp(alg_str, "none")) { /* Just erase */ rc = set_authinfo_for_subscr(NULL, subscr); @@ -579,15 +557,10 @@ int bsc_vty_init_extra(void) install_element_ve(&subscriber_silent_call_stop_cmd); install_element_ve(&show_stats_cmd); - install_element(CONFIG_NODE, &cfg_subscr_cmd); - install_node(&subscr_node, dummy_config_write); - - install_default(SUBSCR_NODE); - install_element(SUBSCR_NODE, &subscr_node_exit_cmd); - install_element(SUBSCR_NODE, &cfg_subscr_name_cmd); - install_element(SUBSCR_NODE, &cfg_subscr_extension_cmd); - install_element(SUBSCR_NODE, &cfg_subscr_authorized_cmd); - install_element(SUBSCR_NODE, &cfg_subscr_a3a8_cmd); + install_element(ENABLE_NODE, &ena_subscr_name_cmd); + install_element(ENABLE_NODE, &ena_subscr_extension_cmd); + install_element(ENABLE_NODE, &ena_subscr_authorized_cmd); + install_element(ENABLE_NODE, &ena_subscr_a3a8_cmd); return 0; } |