mirror of
https://gitea.osmocom.org/cellular-infrastructure/osmo-hlr.git
synced 2025-11-08 16:11:59 +00:00
Compare commits
2 Commits
osmith/aut
...
neels/for_
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
472bb0733d | ||
|
|
d118efb789 |
@@ -25,6 +25,7 @@
|
|||||||
#include <getopt.h>
|
#include <getopt.h>
|
||||||
#include <inttypes.h>
|
#include <inttypes.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
#include <osmocom/core/logging.h>
|
#include <osmocom/core/logging.h>
|
||||||
#include <osmocom/core/application.h>
|
#include <osmocom/core/application.h>
|
||||||
@@ -70,8 +71,9 @@ static void print_help()
|
|||||||
printf(" (All commands imply this if none exists yet.)\n");
|
printf(" (All commands imply this if none exists yet.)\n");
|
||||||
printf("\n");
|
printf("\n");
|
||||||
printf(" import-nitb-db <nitb.db> Add OsmoNITB db's subscribers to OsmoHLR db.\n");
|
printf(" import-nitb-db <nitb.db> Add OsmoNITB db's subscribers to OsmoHLR db.\n");
|
||||||
printf(" Be aware that the import is lossy, only the\n");
|
printf(" Be aware that the import is somewhat lossy, only the IMSI,\n");
|
||||||
printf(" IMSI, MSISDN, nam_cs/ps and 2G auth data are set.\n");
|
printf(" MSISDN, IMEI, nam_cs/ps, 2G auth data and last seen LU are set.\n");
|
||||||
|
printf(" The most recently associated IMEI from the Equipment table is used.\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void print_version(int print_copyright)
|
static void print_version(int print_copyright)
|
||||||
@@ -212,9 +214,15 @@ enum nitb_stmt {
|
|||||||
|
|
||||||
static const char *nitb_stmt_sql[] = {
|
static const char *nitb_stmt_sql[] = {
|
||||||
[NITB_SELECT_SUBSCR] =
|
[NITB_SELECT_SUBSCR] =
|
||||||
"SELECT imsi, id, extension, authorized"
|
"SELECT s.imsi, s.id, s.extension, s.authorized,"
|
||||||
" FROM Subscriber"
|
" SUBSTR(e.imei,0,15), STRFTIME('%s', s.expire_lu)"
|
||||||
" ORDER BY id",
|
" FROM Subscriber s INNER JOIN"
|
||||||
|
" (SELECT imei, subscriber_id, MAX(Equipment.updated) AS updated"
|
||||||
|
" FROM Equipment,EquipmentWatch"
|
||||||
|
" WHERE Equipment.id = EquipmentWatch.equipment_id"
|
||||||
|
" GROUP BY EquipmentWatch.subscriber_id) e"
|
||||||
|
" ON e.subscriber_id = s.id"
|
||||||
|
" ORDER by s.id",
|
||||||
[NITB_SELECT_AUTH_KEYS] =
|
[NITB_SELECT_AUTH_KEYS] =
|
||||||
"SELECT algorithm_id, a3a8_ki from authkeys"
|
"SELECT algorithm_id, a3a8_ki from authkeys"
|
||||||
" WHERE subscriber_id = $subscr_id",
|
" WHERE subscriber_id = $subscr_id",
|
||||||
@@ -222,8 +230,65 @@ static const char *nitb_stmt_sql[] = {
|
|||||||
|
|
||||||
sqlite3_stmt *nitb_stmt[ARRAY_SIZE(nitb_stmt_sql)] = {};
|
sqlite3_stmt *nitb_stmt[ARRAY_SIZE(nitb_stmt_sql)] = {};
|
||||||
|
|
||||||
|
enum hlr_db_stmt {
|
||||||
|
HLR_DB_STMT_SET_IMPLICIT_LU_BY_IMSI,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const char *hlr_db_stmt_sql[] = {
|
||||||
|
[HLR_DB_STMT_SET_IMPLICIT_LU_BY_IMSI] =
|
||||||
|
"UPDATE subscriber SET last_lu_seen = datetime($last_lu, 'unixepoch') WHERE imsi = $imsi",
|
||||||
|
};
|
||||||
|
|
||||||
|
sqlite3_stmt *hlr_db_stmt[ARRAY_SIZE(hlr_db_stmt_sql)] = {};
|
||||||
|
|
||||||
size_t _dbd_decode_binary(const unsigned char *in, unsigned char *out);
|
size_t _dbd_decode_binary(const unsigned char *in, unsigned char *out);
|
||||||
|
|
||||||
|
/*! Set a subscriber's LU timestamp in the HLR database.
|
||||||
|
* In normal operations there is never any need to explicitly
|
||||||
|
* update the value of last_lu_seen, so this function can live here.
|
||||||
|
*
|
||||||
|
* \param[in,out] dbc database context.
|
||||||
|
* \param[in] imsi ASCII string of IMSI digits
|
||||||
|
* \param[in] imei ASCII string of identifier digits, or NULL to remove the IMEI.
|
||||||
|
* \returns 0 on success, -ENOENT when the given subscriber does not exist,
|
||||||
|
* -EIO on database errors.
|
||||||
|
*/
|
||||||
|
int db_subscr_update_lu_by_imsi(struct db_context *dbc, const char* imsi, const int last_lu)
|
||||||
|
{
|
||||||
|
int rc, ret = 0;
|
||||||
|
|
||||||
|
sqlite3_stmt *stmt = hlr_db_stmt[HLR_DB_STMT_SET_IMPLICIT_LU_BY_IMSI];
|
||||||
|
|
||||||
|
if (!db_bind_text(stmt, "$imsi", imsi))
|
||||||
|
return -EIO;
|
||||||
|
if (last_lu && !db_bind_int(stmt, "$last_lu", last_lu))
|
||||||
|
return -EIO;
|
||||||
|
|
||||||
|
/* execute the statement */
|
||||||
|
rc = sqlite3_step(stmt);
|
||||||
|
if (rc != SQLITE_DONE) {
|
||||||
|
LOGP(DAUC, LOGL_ERROR, "Update last_lu_seen for subscriber IMSI='%s': SQL Error: %s\n", imsi,
|
||||||
|
sqlite3_errmsg(dbc->db));
|
||||||
|
ret = -EIO;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* verify execution result */
|
||||||
|
rc = sqlite3_changes(dbc->db);
|
||||||
|
if (!rc) {
|
||||||
|
LOGP(DAUC, LOGL_ERROR, "Cannot update last_lu_seen for subscriber IMSI='%s': no such subscriber\n", imsi);
|
||||||
|
ret = -ENOENT;
|
||||||
|
} else if (rc != 1) {
|
||||||
|
LOGP(DAUC, LOGL_ERROR, "Update last_lu_seen for subscriber IMSI='%s': SQL modified %d rows (expected 1)\n",
|
||||||
|
imsi, rc);
|
||||||
|
ret = -EIO;
|
||||||
|
}
|
||||||
|
|
||||||
|
out:
|
||||||
|
db_remove_reset(stmt);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
void import_nitb_subscr_aud(sqlite3 *nitb_db, const char *imsi, int64_t nitb_id, int64_t hlr_id)
|
void import_nitb_subscr_aud(sqlite3 *nitb_db, const char *imsi, int64_t nitb_id, int64_t hlr_id)
|
||||||
{
|
{
|
||||||
int rc;
|
int rc;
|
||||||
@@ -297,6 +362,7 @@ void import_nitb_subscr(sqlite3 *nitb_db, sqlite3_stmt *stmt)
|
|||||||
int64_t imsi;
|
int64_t imsi;
|
||||||
char imsi_str[32];
|
char imsi_str[32];
|
||||||
bool authorized;
|
bool authorized;
|
||||||
|
int last_lu_int;
|
||||||
|
|
||||||
imsi = sqlite3_column_int64(stmt, 0);
|
imsi = sqlite3_column_int64(stmt, 0);
|
||||||
|
|
||||||
@@ -315,8 +381,16 @@ void import_nitb_subscr(sqlite3 *nitb_db, sqlite3_stmt *stmt)
|
|||||||
nitb_id = sqlite3_column_int64(stmt, 1);
|
nitb_id = sqlite3_column_int64(stmt, 1);
|
||||||
copy_sqlite3_text_to_buf(subscr.msisdn, stmt, 2);
|
copy_sqlite3_text_to_buf(subscr.msisdn, stmt, 2);
|
||||||
authorized = sqlite3_column_int(stmt, 3) ? true : false;
|
authorized = sqlite3_column_int(stmt, 3) ? true : false;
|
||||||
|
copy_sqlite3_text_to_buf(subscr.imei, stmt, 4);
|
||||||
|
/* Default periodic LU was 30 mins and the expire_lu
|
||||||
|
* was twice that + 1 min
|
||||||
|
*/
|
||||||
|
last_lu_int = sqlite3_column_int(stmt, 5) - 3660;
|
||||||
|
|
||||||
db_subscr_update_msisdn_by_imsi(dbc, imsi_str, subscr.msisdn);
|
db_subscr_update_msisdn_by_imsi(dbc, imsi_str, subscr.msisdn);
|
||||||
|
db_subscr_update_imei_by_imsi(dbc, imsi_str, subscr.imei);
|
||||||
|
db_subscr_update_lu_by_imsi(dbc, imsi_str, last_lu_int);
|
||||||
|
|
||||||
db_subscr_nam(dbc, imsi_str, authorized, true);
|
db_subscr_nam(dbc, imsi_str, authorized, true);
|
||||||
db_subscr_nam(dbc, imsi_str, authorized, false);
|
db_subscr_nam(dbc, imsi_str, authorized, false);
|
||||||
|
|
||||||
@@ -361,6 +435,17 @@ int import_nitb_db(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < ARRAY_SIZE(hlr_db_stmt_sql); i++) {
|
||||||
|
sql = hlr_db_stmt_sql[i];
|
||||||
|
rc = sqlite3_prepare_v2(g_hlr_db_tool_ctx->dbc->db, hlr_db_stmt_sql[i], -1,
|
||||||
|
&hlr_db_stmt[i], NULL);
|
||||||
|
if (rc != SQLITE_OK) {
|
||||||
|
LOGP(DDB, LOGL_ERROR, "OsmoHLR DB: Unable to prepare SQL statement '%s'\n", sql);
|
||||||
|
ret = -1;
|
||||||
|
goto out_free;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
stmt = nitb_stmt[NITB_SELECT_SUBSCR];
|
stmt = nitb_stmt[NITB_SELECT_SUBSCR];
|
||||||
|
|
||||||
while ((rc = sqlite3_step(stmt)) == SQLITE_ROW) {
|
while ((rc = sqlite3_step(stmt)) == SQLITE_ROW) {
|
||||||
|
|||||||
Reference in New Issue
Block a user