blob: e48c6a3e1e02a7a4d6f28d115b598b26600c6e77 [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;
Jacob Erlbeck76606d32014-10-28 14:57:53 +010030 int rc = 0;
Holger Hans Peter Freyther9dbc3f82014-03-23 12:06:36 +010031
32 tmp = talloc_strdup(cmd, value);
33 if (!tmp)
34 return 1;
35
36 imsi = strtok_r(tmp, ",", &saveptr);
37 msisdn = strtok_r(NULL, ",", &saveptr);
Holger Hans Peter Freyther9dbc3f82014-03-23 12:06:36 +010038
39 if (!imsi || !msisdn)
Jacob Erlbeck76606d32014-10-28 14:57:53 +010040 rc = 1;
41 else if (strlen(imsi) >= GSM_IMSI_LENGTH)
42 rc = 1;
43 else if (strlen(msisdn) >= GSM_EXTENSION_LENGTH)
44 rc = 1;
45
46 talloc_free(tmp);
47 return rc;
Holger Hans Peter Freyther9dbc3f82014-03-23 12:06:36 +010048}
49
50static int get_subscriber_modify(struct ctrl_cmd *cmd, void *data)
51{
52 cmd->reply = "Set only attribute";
53 return CTRL_CMD_ERROR;
54}
55
56static int set_subscriber_modify(struct ctrl_cmd *cmd, void *data)
57{
58 struct gsm_network *net = cmd->node;
59 char *tmp, *imsi, *msisdn, *saveptr = NULL;
60 struct gsm_subscriber* subscr;
61 int rc;
62
63 tmp = talloc_strdup(cmd, cmd->value);
64 if (!tmp)
65 return 1;
66
67 imsi = strtok_r(tmp, ",", &saveptr);
68 msisdn = strtok_r(NULL, ",", &saveptr);
69
Jacob Erlbeck1e30a282014-12-03 09:28:24 +010070 subscr = subscr_get_by_imsi(net->subscr_group, imsi);
Holger Hans Peter Freyther9dbc3f82014-03-23 12:06:36 +010071 if (!subscr)
Jacob Erlbeck1e30a282014-12-03 09:28:24 +010072 subscr = subscr_create_subscriber(net->subscr_group, imsi);
Holger Hans Peter Freyther9dbc3f82014-03-23 12:06:36 +010073 if (!subscr)
74 goto fail;
75
76 subscr->authorized = 1;
77 strncpy(subscr->extension, msisdn, GSM_EXTENSION_LENGTH - 1);
78 subscr->extension[GSM_EXTENSION_LENGTH-1] = '\0';
79
80 /* put it back to the db */
81 rc = db_sync_subscriber(subscr);
82 db_subscriber_update(subscr);
83 subscr_put(subscr);
84
85 talloc_free(tmp);
86
87 if (rc != 0) {
88 cmd->reply = "Failed to store the record in the DB";
89 return CTRL_CMD_ERROR;
90 }
91
92 cmd->reply = "OK";
93 return CTRL_CMD_REPLY;
94
95fail:
96 talloc_free(tmp);
97 cmd->reply = "Failed to create subscriber";
98 return CTRL_CMD_ERROR;
99}
100
101CTRL_CMD_DEFINE(subscriber_modify, "subscriber-modify-v1");
102
Holger Hans Peter Freyther2d99eeb2014-03-23 14:01:08 +0100103static int verify_subscriber_delete(struct ctrl_cmd *cmd, const char *v, void *d)
104{
105 return 0;
106}
107
108static int get_subscriber_delete(struct ctrl_cmd *cmd, void *data)
109{
110 cmd->reply = "Set only attribute";
111 return CTRL_CMD_ERROR;
112}
113
114static int set_subscriber_delete(struct ctrl_cmd *cmd, void *data)
115{
116 int was_used = 0;
117 int rc;
118 struct gsm_subscriber *subscr;
119 struct gsm_network *net = cmd->node;
120
Jacob Erlbeck1e30a282014-12-03 09:28:24 +0100121 subscr = subscr_get_by_imsi(net->subscr_group, cmd->value);
Holger Hans Peter Freyther2d99eeb2014-03-23 14:01:08 +0100122 if (!subscr) {
123 cmd->reply = "Failed to find subscriber";
124 return CTRL_CMD_ERROR;
125 }
126
127 if (subscr->use_count != 1) {
128 LOGP(DCTRL, LOGL_NOTICE, "Going to remove active subscriber.\n");
129 was_used = 1;
130 }
131
132 rc = db_subscriber_delete(subscr);
133 subscr_put(subscr);
134
135 if (rc != 0) {
136 cmd->reply = "Failed to remove subscriber";
137 return CTRL_CMD_ERROR;
138 }
139
140 cmd->reply = was_used ? "Removed active subscriber" : "Removed";
141 return CTRL_CMD_REPLY;
142}
143CTRL_CMD_DEFINE(subscriber_delete, "subscriber-delete-v1");
144
Holger Hans Peter Freytherd883db02014-03-23 16:22:55 +0100145static int verify_subscriber_list(struct ctrl_cmd *cmd, const char *value, void *d)
146{
147 return 1;
148}
149
150static int set_subscriber_list(struct ctrl_cmd *cmd, void *d)
151{
152 cmd->reply = "Get only attribute";
153 return CTRL_CMD_ERROR;
154}
155
156static void list_cb(struct gsm_subscriber *subscr, void *d)
157{
158 char **data = (char **) d;
159 *data = talloc_asprintf_append(*data, "%s,%s\n",
160 subscr->imsi, subscr->extension);
161}
162
163static int get_subscriber_list(struct ctrl_cmd *cmd, void *d)
164{
165 cmd->reply = talloc_strdup(cmd, "");
166
167 db_subscriber_list_active(list_cb, &cmd->reply);
168 printf("%s\n", cmd->reply);
169 return CTRL_CMD_REPLY;
170}
171CTRL_CMD_DEFINE(subscriber_list, "subscriber-list-active-v1");
172
Holger Hans Peter Freyther9dbc3f82014-03-23 12:06:36 +0100173int msc_ctrl_cmds_install(void)
174{
175 int rc = 0;
176
177 rc |= ctrl_cmd_install(CTRL_NODE_ROOT, &cmd_subscriber_modify);
Holger Hans Peter Freyther2d99eeb2014-03-23 14:01:08 +0100178 rc |= ctrl_cmd_install(CTRL_NODE_ROOT, &cmd_subscriber_delete);
Holger Hans Peter Freytherd883db02014-03-23 16:22:55 +0100179 rc |= ctrl_cmd_install(CTRL_NODE_ROOT, &cmd_subscriber_list);
Holger Hans Peter Freyther9dbc3f82014-03-23 12:06:36 +0100180 return rc;
181}