aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHolger Hans Peter Freyther <holger@moiji-mobile.com>2016-05-09 20:53:28 +0200
committerHolger Hans Peter Freyther <holger@moiji-mobile.com>2016-05-09 20:53:28 +0200
commit301126d5b5a9eff4de490d23c1af45dabe365aea (patch)
tree85e972e921b464d397d5198943d8a629c4c029c2
parent9bcb1a56cbec710cbfa49ae6623c10595eab08ec (diff)
ctrl: Add command to list subs, modify, set name, etc
-rw-r--r--openbsc/include/openbsc/db.h1
-rw-r--r--openbsc/src/libmsc/ctrl_commands.c38
-rw-r--r--openbsc/src/libmsc/db.c32
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;