diff options
author | Holger Hans Peter Freyther <holger@moiji-mobile.com> | 2016-05-09 20:53:28 +0200 |
---|---|---|
committer | Holger Hans Peter Freyther <holger@moiji-mobile.com> | 2016-05-09 20:53:28 +0200 |
commit | 301126d5b5a9eff4de490d23c1af45dabe365aea (patch) | |
tree | 85e972e921b464d397d5198943d8a629c4c029c2 | |
parent | 9bcb1a56cbec710cbfa49ae6623c10595eab08ec (diff) |
ctrl: Add command to list subs, modify, set name, etc
-rw-r--r-- | openbsc/include/openbsc/db.h | 1 | ||||
-rw-r--r-- | openbsc/src/libmsc/ctrl_commands.c | 38 | ||||
-rw-r--r-- | openbsc/src/libmsc/db.c | 32 |
3 files changed, 58 insertions, 13 deletions
diff --git a/openbsc/include/openbsc/db.h b/openbsc/include/openbsc/db.h index 6699a8600..aee5e4670 100644 --- a/openbsc/include/openbsc/db.h +++ b/openbsc/include/openbsc/db.h @@ -48,6 +48,7 @@ int db_subscriber_delete(struct gsm_subscriber *subscriber); int db_sync_equipment(struct gsm_equipment *equip); int db_subscriber_update(struct gsm_subscriber *subscriber); int db_subscriber_list_active(void (*list_cb)(struct gsm_subscriber*,void*), void*); +int db_subscriber_list_all(void (*list_cb)(struct gsm_subscriber*,void*), void*); /* auth info */ int db_get_authinfo_for_subscr(struct gsm_auth_info *ainfo, diff --git a/openbsc/src/libmsc/ctrl_commands.c b/openbsc/src/libmsc/ctrl_commands.c index 9ac39de95..c81cd448e 100644 --- a/openbsc/src/libmsc/ctrl_commands.c +++ b/openbsc/src/libmsc/ctrl_commands.c @@ -80,7 +80,7 @@ static int get_subscriber_modify(struct ctrl_cmd *cmd, void *data) static int set_subscriber_modify(struct ctrl_cmd *cmd, void *data) { struct gsm_network *net = cmd->node; - char *tmp, *imsi, *msisdn, *alg, *ki, *saveptr = NULL; + char *tmp, *imsi, *msisdn, *alg, *ki, *name, *saveptr = NULL; struct gsm_subscriber* subscr; int rc; @@ -92,6 +92,7 @@ static int set_subscriber_modify(struct ctrl_cmd *cmd, void *data) msisdn = strtok_r(NULL, ",", &saveptr); alg = strtok_r(NULL, ",", &saveptr); ki = strtok_r(NULL, ",", &saveptr); + name = strtok_r(NULL, ",", &saveptr); subscr = subscr_get_by_imsi(net->subscr_group, imsi); if (!subscr) @@ -103,6 +104,11 @@ static int set_subscriber_modify(struct ctrl_cmd *cmd, void *data) strncpy(subscr->extension, msisdn, GSM_EXTENSION_LENGTH - 1); subscr->extension[GSM_EXTENSION_LENGTH-1] = '\0'; + if (name) { + osmo_hexparse(name, (uint8_t *) subscr->name, sizeof(subscr->name) - 1); + subscr->name[GSM_NAME_LENGTH - 1] = '\0'; + } + /* put it back to the db */ rc = db_sync_subscriber(subscr); db_subscriber_update(subscr); @@ -212,8 +218,11 @@ static int set_subscriber_list(struct ctrl_cmd *cmd, void *d) static void list_cb(struct gsm_subscriber *subscr, void *d) { char **data = (char **) d; - *data = talloc_asprintf_append(*data, "%s,%s\n", - subscr->imsi, subscr->extension); + *data = talloc_asprintf_append(*data, "%s,%s,%d,%s\n", + subscr->imsi, subscr->extension, + subscr->authorized, + osmo_hexdump_nospc((const uint8_t *) subscr->name, + strlen(subscr->name))); } static int get_subscriber_list(struct ctrl_cmd *cmd, void *d) @@ -221,11 +230,31 @@ static int get_subscriber_list(struct ctrl_cmd *cmd, void *d) cmd->reply = talloc_strdup(cmd, ""); db_subscriber_list_active(list_cb, &cmd->reply); - printf("%s\n", cmd->reply); return CTRL_CMD_REPLY; } CTRL_CMD_DEFINE(subscriber_list, "subscriber-list-active-v1"); + +static int verify_subscriber_list_all(struct ctrl_cmd *cmd, const char *value, void *d) +{ + return 1; +} + +static int set_subscriber_list_all(struct ctrl_cmd *cmd, void *d) +{ + cmd->reply = "Get only attribute"; + return CTRL_CMD_ERROR; +} + +static int get_subscriber_list_all(struct ctrl_cmd *cmd, void *d) +{ + cmd->reply = talloc_strdup(cmd, ""); + + db_subscriber_list_all(list_cb, &cmd->reply); + return CTRL_CMD_REPLY; +} +CTRL_CMD_DEFINE(subscriber_list_all, "subscriber-list-all-v1"); + int msc_ctrl_cmds_install(void) { int rc = 0; @@ -233,5 +262,6 @@ int msc_ctrl_cmds_install(void) rc |= ctrl_cmd_install(CTRL_NODE_ROOT, &cmd_subscriber_modify); rc |= ctrl_cmd_install(CTRL_NODE_ROOT, &cmd_subscriber_delete); rc |= ctrl_cmd_install(CTRL_NODE_ROOT, &cmd_subscriber_list); + rc |= ctrl_cmd_install(CTRL_NODE_ROOT, &cmd_subscriber_list_all); return rc; } diff --git a/openbsc/src/libmsc/db.c b/openbsc/src/libmsc/db.c index 267b5ef41..cbe0aa71e 100644 --- a/openbsc/src/libmsc/db.c +++ b/openbsc/src/libmsc/db.c @@ -1086,18 +1086,12 @@ int db_subscriber_delete(struct gsm_subscriber *subscr) return 0; } -/** - * List all the authorized and non-expired subscribers. The callback will - * be called one by one. The subscr argument is not fully initialize and - * subscr_get/subscr_put must not be called. The passed in pointer will be - * deleted after the callback by the database call. - */ -int db_subscriber_list_active(void (*cb)(struct gsm_subscriber*,void*), void *closure) +static int db_subscriber_do_list(const char *query, + void (*cb)(struct gsm_subscriber*,void*), void *closure) { dbi_result result; - result = dbi_conn_query(conn, - "SELECT * from Subscriber WHERE LAC != 0 AND authorized = 1"); + result = dbi_conn_query(conn, query); if (!result) { LOGP(DDB, LOGL_ERROR, "Failed to list active subscribers\n"); return -1; @@ -1119,6 +1113,26 @@ int db_subscriber_list_active(void (*cb)(struct gsm_subscriber*,void*), void *cl return 0; } +/** + * List all the authorized and non-expired subscribers. The callback will + * be called one by one. The subscr argument is not fully initialize and + * subscr_get/subscr_put must not be called. The passed in pointer will be + * deleted after the callback by the database call. + */ +int db_subscriber_list_active(void (*cb)(struct gsm_subscriber*,void*), void *closure) +{ + return db_subscriber_do_list( + "SELECT * from Subscriber WHERE LAC != 0 AND authorized = 1", + cb, closure); +} + +int db_subscriber_list_all(void (cb)(struct gsm_subscriber*,void*), void *closure) +{ + return db_subscriber_do_list( + "SELECT * from Subscriber", + cb, closure); +} + int db_sync_equipment(struct gsm_equipment *equip) { dbi_result result; |