blob: df85c8e88e92ed3844272c24e1038014b5c43fea [file] [log] [blame]
Holger Hans Peter Freyther9dbc3f82014-03-23 12:06:36 +01001/*
2 * (C) 2014 by Holger Hans Peter Freyther
3 * (C) 2014 by sysmocom s.f.m.c. GmbH
4 *
5 * All Rights Reserved
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU Affero General Public License as published by
9 * the Free Software Foundation; either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU Affero General Public License for more details.
16 *
17 * You should have received a copy of the GNU Affero General Public License
18 * along with this program. If not, see <http://www.gnu.org/licenses/>.
19 *
20 */
Harald Welteba874b82014-08-20 23:47:15 +020021#include <osmocom/ctrl/control_cmd.h>
Holger Hans Peter Freyther9dbc3f82014-03-23 12:06:36 +010022#include <openbsc/gsm_data.h>
23#include <openbsc/gsm_subscriber.h>
24#include <openbsc/db.h>
Holger Hans Peter Freyther2d99eeb2014-03-23 14:01:08 +010025#include <openbsc/debug.h>
Holger Hans Peter Freyther9dbc3f82014-03-23 12:06:36 +010026
27static int verify_subscriber_modify(struct ctrl_cmd *cmd, const char *value, void *d)
28{
29 char *tmp, *imsi, *msisdn, *saveptr = NULL;
30
31 tmp = talloc_strdup(cmd, value);
32 if (!tmp)
33 return 1;
34
35 imsi = strtok_r(tmp, ",", &saveptr);
36 msisdn = strtok_r(NULL, ",", &saveptr);
37 talloc_free(tmp);
38
39 if (!imsi || !msisdn)
40 return 1;
41 if (strlen(imsi) >= GSM_IMSI_LENGTH)
42 return 1;
43 if (strlen(msisdn) >= GSM_EXTENSION_LENGTH)
44 return 1;
45 return 0;
46}
47
48static int get_subscriber_modify(struct ctrl_cmd *cmd, void *data)
49{
50 cmd->reply = "Set only attribute";
51 return CTRL_CMD_ERROR;
52}
53
54static int set_subscriber_modify(struct ctrl_cmd *cmd, void *data)
55{
56 struct gsm_network *net = cmd->node;
57 char *tmp, *imsi, *msisdn, *saveptr = NULL;
58 struct gsm_subscriber* subscr;
59 int rc;
60
61 tmp = talloc_strdup(cmd, cmd->value);
62 if (!tmp)
63 return 1;
64
65 imsi = strtok_r(tmp, ",", &saveptr);
66 msisdn = strtok_r(NULL, ",", &saveptr);
67
68 subscr = subscr_get_by_imsi(net, imsi);
69 if (!subscr)
70 subscr = subscr_create_subscriber(net, imsi);
71 if (!subscr)
72 goto fail;
73
74 subscr->authorized = 1;
75 strncpy(subscr->extension, msisdn, GSM_EXTENSION_LENGTH - 1);
76 subscr->extension[GSM_EXTENSION_LENGTH-1] = '\0';
77
78 /* put it back to the db */
79 rc = db_sync_subscriber(subscr);
80 db_subscriber_update(subscr);
81 subscr_put(subscr);
82
83 talloc_free(tmp);
84
85 if (rc != 0) {
86 cmd->reply = "Failed to store the record in the DB";
87 return CTRL_CMD_ERROR;
88 }
89
90 cmd->reply = "OK";
91 return CTRL_CMD_REPLY;
92
93fail:
94 talloc_free(tmp);
95 cmd->reply = "Failed to create subscriber";
96 return CTRL_CMD_ERROR;
97}
98
99CTRL_CMD_DEFINE(subscriber_modify, "subscriber-modify-v1");
100
Holger Hans Peter Freyther2d99eeb2014-03-23 14:01:08 +0100101static int verify_subscriber_delete(struct ctrl_cmd *cmd, const char *v, void *d)
102{
103 return 0;
104}
105
106static int get_subscriber_delete(struct ctrl_cmd *cmd, void *data)
107{
108 cmd->reply = "Set only attribute";
109 return CTRL_CMD_ERROR;
110}
111
112static int set_subscriber_delete(struct ctrl_cmd *cmd, void *data)
113{
114 int was_used = 0;
115 int rc;
116 struct gsm_subscriber *subscr;
117 struct gsm_network *net = cmd->node;
118
119 subscr = subscr_get_by_imsi(net, cmd->value);
120 if (!subscr) {
121 cmd->reply = "Failed to find subscriber";
122 return CTRL_CMD_ERROR;
123 }
124
125 if (subscr->use_count != 1) {
126 LOGP(DCTRL, LOGL_NOTICE, "Going to remove active subscriber.\n");
127 was_used = 1;
128 }
129
130 rc = db_subscriber_delete(subscr);
131 subscr_put(subscr);
132
133 if (rc != 0) {
134 cmd->reply = "Failed to remove subscriber";
135 return CTRL_CMD_ERROR;
136 }
137
138 cmd->reply = was_used ? "Removed active subscriber" : "Removed";
139 return CTRL_CMD_REPLY;
140}
141CTRL_CMD_DEFINE(subscriber_delete, "subscriber-delete-v1");
142
Holger Hans Peter Freytherd883db02014-03-23 16:22:55 +0100143static int verify_subscriber_list(struct ctrl_cmd *cmd, const char *value, void *d)
144{
145 return 1;
146}
147
148static int set_subscriber_list(struct ctrl_cmd *cmd, void *d)
149{
150 cmd->reply = "Get only attribute";
151 return CTRL_CMD_ERROR;
152}
153
154static void list_cb(struct gsm_subscriber *subscr, void *d)
155{
156 char **data = (char **) d;
157 *data = talloc_asprintf_append(*data, "%s,%s\n",
158 subscr->imsi, subscr->extension);
159}
160
161static int get_subscriber_list(struct ctrl_cmd *cmd, void *d)
162{
163 cmd->reply = talloc_strdup(cmd, "");
164
165 db_subscriber_list_active(list_cb, &cmd->reply);
166 printf("%s\n", cmd->reply);
167 return CTRL_CMD_REPLY;
168}
169CTRL_CMD_DEFINE(subscriber_list, "subscriber-list-active-v1");
170
Holger Hans Peter Freyther9dbc3f82014-03-23 12:06:36 +0100171int msc_ctrl_cmds_install(void)
172{
173 int rc = 0;
174
175 rc |= ctrl_cmd_install(CTRL_NODE_ROOT, &cmd_subscriber_modify);
Holger Hans Peter Freyther2d99eeb2014-03-23 14:01:08 +0100176 rc |= ctrl_cmd_install(CTRL_NODE_ROOT, &cmd_subscriber_delete);
Holger Hans Peter Freytherd883db02014-03-23 16:22:55 +0100177 rc |= ctrl_cmd_install(CTRL_NODE_ROOT, &cmd_subscriber_list);
Holger Hans Peter Freyther9dbc3f82014-03-23 12:06:36 +0100178 return rc;
179}