<p>Harald Welte <strong>merged</strong> this change.</p><p><a href="https://gerrit.osmocom.org/12527">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Harald Welte: Looks good to me, approved
  Neels Hofmeyr: Looks good to me, but someone else must approve
  Jenkins Builder: Verified

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">VTY: integrate IMEI<br><br>Display the IMEI in "subscriber ... show", allow showing and modifying<br>subscribers by their IMEI with: "subscriber imei ...". For debug<br>purposes (and to have proper VTY tests), make it possible to change the<br>IMEI with "subscriber ... update imei".<br><br>IMEIs are saved in the database without the 15th checksum number. When<br>the checksum gets passed, verify it and cut it off.<br><br>Related: OS#2541<br>Depends: I02b54cf01a674a1911c5c897fbec02240f88b521 (libosmocore)<br>Change-Id: I1af7b573ca2a1cb22497052665012d9c1acf3b30<br>---<br>M src/hlr_vty_subscr.c<br>M tests/test_nodes.vty<br>M tests/test_subscriber.vty<br>M tests/test_subscriber.vty.sql<br>4 files changed, 152 insertions(+), 15 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/hlr_vty_subscr.c b/src/hlr_vty_subscr.c</span><br><span>index 92cfa2a..998d1be 100644</span><br><span>--- a/src/hlr_vty_subscr.c</span><br><span>+++ b/src/hlr_vty_subscr.c</span><br><span>@@ -58,6 +58,15 @@</span><br><span> </span><br><span>    vty_out(vty, "    IMSI: %s%s", *subscr->imsi ? subscr->imsi : "none", VTY_NEWLINE);</span><br><span>        vty_out(vty, "    MSISDN: %s%s", *subscr->msisdn ? subscr->msisdn : "none", VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (*subscr->imei) {</span><br><span style="color: hsl(120, 100%, 40%);">+               char checksum = osmo_luhn(subscr->imei, 14);</span><br><span style="color: hsl(120, 100%, 40%);">+               if (checksum == -EINVAL)</span><br><span style="color: hsl(120, 100%, 40%);">+                      vty_out(vty, "    IMEI: %s (INVALID LENGTH!)%s", subscr->imei, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+             else</span><br><span style="color: hsl(120, 100%, 40%);">+                  vty_out(vty, "    IMEI: %s%c%s", subscr->imei, checksum, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+   }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  if (*subscr->vlr_number)</span><br><span>          vty_out(vty, "    VLR number: %s%s", subscr->vlr_number, VTY_NEWLINE);</span><br><span>  if (*subscr->sgsn_number)</span><br><span>@@ -131,6 +140,7 @@</span><br><span> </span><br><span> static int get_subscr_by_argv(struct vty *vty, const char *type, const char *id, struct hlr_subscriber *subscr)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+        char imei_buf[GSM23003_IMEI_NUM_DIGITS_NO_CHK+1];</span><br><span>    int rc = -1;</span><br><span>         if (strcmp(type, "imsi") == 0)</span><br><span>             rc = db_subscr_get_by_imsi(g_hlr->dbc, id, subscr);</span><br><span>@@ -138,6 +148,17 @@</span><br><span>                rc = db_subscr_get_by_msisdn(g_hlr->dbc, id, subscr);</span><br><span>     else if (strcmp(type, "id") == 0)</span><br><span>          rc = db_subscr_get_by_id(g_hlr->dbc, atoll(id), subscr);</span><br><span style="color: hsl(120, 100%, 40%);">+   else if (strcmp(type, "imei") == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+               /* Verify IMEI with checksum digit */</span><br><span style="color: hsl(120, 100%, 40%);">+         if (osmo_imei_str_valid(id, true)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                  /* Cut the checksum off */</span><br><span style="color: hsl(120, 100%, 40%);">+                    osmo_strlcpy(imei_buf, id, sizeof(imei_buf));</span><br><span style="color: hsl(120, 100%, 40%);">+                 id = imei_buf;</span><br><span style="color: hsl(120, 100%, 40%);">+                        vty_out(vty, "%% Checksum validated and stripped for search: imei = '%s'%s", id,</span><br><span style="color: hsl(120, 100%, 40%);">+                            VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+         }</span><br><span style="color: hsl(120, 100%, 40%);">+             rc = db_subscr_get_by_imei(g_hlr->dbc, id, subscr);</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span>    if (rc)</span><br><span>              vty_out(vty, "%% No subscriber for %s = '%s'%s",</span><br><span>                   type, id, VTY_NEWLINE);</span><br><span>@@ -147,12 +168,13 @@</span><br><span> #define SUBSCR_CMD "subscriber "</span><br><span> #define SUBSCR_CMD_HELP "Subscriber management commands\n"</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-#define SUBSCR_ID "(imsi|msisdn|id) IDENT"</span><br><span style="color: hsl(120, 100%, 40%);">+#define SUBSCR_ID "(imsi|msisdn|id|imei) IDENT"</span><br><span> #define SUBSCR_ID_HELP \</span><br><span>         "Identify subscriber by IMSI\n" \</span><br><span>  "Identify subscriber by MSISDN (phone number)\n" \</span><br><span>         "Identify subscriber by database ID\n" \</span><br><span style="color: hsl(0, 100%, 40%);">-      "IMSI/MSISDN/ID of the subscriber\n"</span><br><span style="color: hsl(120, 100%, 40%);">+        "Identify subscriber by IMEI\n" \</span><br><span style="color: hsl(120, 100%, 40%);">+   "IMSI/MSISDN/ID/IMEI of the subscriber\n"</span><br><span> </span><br><span> #define SUBSCR               SUBSCR_CMD SUBSCR_ID " "</span><br><span> #define SUBSCR_HELP       SUBSCR_CMD_HELP SUBSCR_ID_HELP</span><br><span>@@ -508,6 +530,54 @@</span><br><span>        return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+DEFUN(subscriber_imei,</span><br><span style="color: hsl(120, 100%, 40%);">+      subscriber_imei_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+      SUBSCR_UPDATE "imei (none|IMEI)",</span><br><span style="color: hsl(120, 100%, 40%);">+      SUBSCR_UPDATE_HELP</span><br><span style="color: hsl(120, 100%, 40%);">+      "Set IMEI of the subscriber (normally populated from MSC, no need to set this manually)\n"</span><br><span style="color: hsl(120, 100%, 40%);">+      "Forget IMEI\n"</span><br><span style="color: hsl(120, 100%, 40%);">+      "Set IMEI (use for debug only!)\n")</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    struct hlr_subscriber subscr;</span><br><span style="color: hsl(120, 100%, 40%);">+ const char *id_type = argv[0];</span><br><span style="color: hsl(120, 100%, 40%);">+        const char *id = argv[1];</span><br><span style="color: hsl(120, 100%, 40%);">+     const char *imei = argv[2];</span><br><span style="color: hsl(120, 100%, 40%);">+   char imei_buf[GSM23003_IMEI_NUM_DIGITS_NO_CHK+1];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (strcmp(imei, "none") == 0)</span><br><span style="color: hsl(120, 100%, 40%);">+              imei = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+  else {</span><br><span style="color: hsl(120, 100%, 40%);">+                /* Verify IMEI with checksum digit */</span><br><span style="color: hsl(120, 100%, 40%);">+         if (osmo_imei_str_valid(imei, true)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                        /* Cut the checksum off */</span><br><span style="color: hsl(120, 100%, 40%);">+                    osmo_strlcpy(imei_buf, imei, sizeof(imei_buf));</span><br><span style="color: hsl(120, 100%, 40%);">+                       imei = imei_buf;</span><br><span style="color: hsl(120, 100%, 40%);">+              } else if (!osmo_imei_str_valid(imei, false)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                       vty_out(vty, "%% IMEI invalid: '%s'%s", imei, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+                 return CMD_WARNING;</span><br><span style="color: hsl(120, 100%, 40%);">+           }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (get_subscr_by_argv(vty, id_type, id, &subscr))</span><br><span style="color: hsl(120, 100%, 40%);">+                return CMD_WARNING;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (db_subscr_update_imei_by_imsi(g_hlr->dbc, subscr.imsi, imei)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                vty_out(vty, "%% Error: cannot update IMEI for subscriber IMSI='%s'%s",</span><br><span style="color: hsl(120, 100%, 40%);">+                     subscr.imsi, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+            return CMD_WARNING;</span><br><span style="color: hsl(120, 100%, 40%);">+   }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (imei)</span><br><span style="color: hsl(120, 100%, 40%);">+             vty_out(vty, "%% Updated subscriber IMSI='%s' to IMEI='%s'%s",</span><br><span style="color: hsl(120, 100%, 40%);">+                      subscr.imsi, imei, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+      else</span><br><span style="color: hsl(120, 100%, 40%);">+          vty_out(vty, "%% Updated subscriber IMSI='%s': removed IMEI%s",</span><br><span style="color: hsl(120, 100%, 40%);">+                     subscr.imsi, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  return CMD_SUCCESS;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> void hlr_vty_subscriber_init(void)</span><br><span> {</span><br><span>        install_element_ve(&subscriber_show_cmd);</span><br><span>@@ -519,4 +589,5 @@</span><br><span>  install_element(ENABLE_NODE, &subscriber_aud2g_cmd);</span><br><span>     install_element(ENABLE_NODE, &subscriber_no_aud3g_cmd);</span><br><span>  install_element(ENABLE_NODE, &subscriber_aud3g_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+      install_element(ENABLE_NODE, &subscriber_imei_cmd);</span><br><span> }</span><br><span>diff --git a/tests/test_nodes.vty b/tests/test_nodes.vty</span><br><span>index 6e72ed0..ee7885b 100644</span><br><span>--- a/tests/test_nodes.vty</span><br><span>+++ b/tests/test_nodes.vty</span><br><span>@@ -17,8 +17,8 @@</span><br><span>   show talloc-context (application|all) (full|brief|DEPTH) tree ADDRESS</span><br><span>   show talloc-context (application|all) (full|brief|DEPTH) filter REGEXP</span><br><span>   show gsup-connections</span><br><span style="color: hsl(0, 100%, 40%);">-  subscriber (imsi|msisdn|id) IDENT show</span><br><span style="color: hsl(0, 100%, 40%);">-  show subscriber (imsi|msisdn|id) IDENT</span><br><span style="color: hsl(120, 100%, 40%);">+  subscriber (imsi|msisdn|id|imei) IDENT show</span><br><span style="color: hsl(120, 100%, 40%);">+  show subscriber (imsi|msisdn|id|imei) IDENT</span><br><span> </span><br><span> OsmoHLR> enable</span><br><span> OsmoHLR# list</span><br><span>diff --git a/tests/test_subscriber.vty b/tests/test_subscriber.vty</span><br><span>index d310eb3..265f8fa 100644</span><br><span>--- a/tests/test_subscriber.vty</span><br><span>+++ b/tests/test_subscriber.vty</span><br><span>@@ -2,15 +2,16 @@</span><br><span> </span><br><span> OsmoHLR# list</span><br><span> ...</span><br><span style="color: hsl(0, 100%, 40%);">-  subscriber (imsi|msisdn|id) IDENT show</span><br><span style="color: hsl(0, 100%, 40%);">-  show subscriber (imsi|msisdn|id) IDENT</span><br><span style="color: hsl(120, 100%, 40%);">+  subscriber (imsi|msisdn|id|imei) IDENT show</span><br><span style="color: hsl(120, 100%, 40%);">+  show subscriber (imsi|msisdn|id|imei) IDENT</span><br><span>   subscriber imsi IDENT create</span><br><span style="color: hsl(0, 100%, 40%);">-  subscriber (imsi|msisdn|id) IDENT delete</span><br><span style="color: hsl(0, 100%, 40%);">-  subscriber (imsi|msisdn|id) IDENT update msisdn (none|MSISDN)</span><br><span style="color: hsl(0, 100%, 40%);">-  subscriber (imsi|msisdn|id) IDENT update aud2g none</span><br><span style="color: hsl(0, 100%, 40%);">-  subscriber (imsi|msisdn|id) IDENT update aud2g (comp128v1|comp128v2|comp128v3|xor) ki KI</span><br><span style="color: hsl(0, 100%, 40%);">-  subscriber (imsi|msisdn|id) IDENT update aud3g none</span><br><span style="color: hsl(0, 100%, 40%);">-  subscriber (imsi|msisdn|id) IDENT update aud3g milenage k K (op|opc) OP_C [ind-bitlen] [<0-28>]</span><br><span style="color: hsl(120, 100%, 40%);">+  subscriber (imsi|msisdn|id|imei) IDENT delete</span><br><span style="color: hsl(120, 100%, 40%);">+  subscriber (imsi|msisdn|id|imei) IDENT update msisdn (none|MSISDN)</span><br><span style="color: hsl(120, 100%, 40%);">+  subscriber (imsi|msisdn|id|imei) IDENT update aud2g none</span><br><span style="color: hsl(120, 100%, 40%);">+  subscriber (imsi|msisdn|id|imei) IDENT update aud2g (comp128v1|comp128v2|comp128v3|xor) ki KI</span><br><span style="color: hsl(120, 100%, 40%);">+  subscriber (imsi|msisdn|id|imei) IDENT update aud3g none</span><br><span style="color: hsl(120, 100%, 40%);">+  subscriber (imsi|msisdn|id|imei) IDENT update aud3g milenage k K (op|opc) OP_C [ind-bitlen] [<0-28>]</span><br><span style="color: hsl(120, 100%, 40%);">+  subscriber (imsi|msisdn|id|imei) IDENT update imei (none|IMEI)</span><br><span> </span><br><span> OsmoHLR# subscriber?</span><br><span>   subscriber  Subscriber management commands</span><br><span>@@ -19,13 +20,16 @@</span><br><span>   imsi    Identify subscriber by IMSI</span><br><span>   msisdn  Identify subscriber by MSISDN (phone number)</span><br><span>   id      Identify subscriber by database ID</span><br><span style="color: hsl(120, 100%, 40%);">+  imei    Identify subscriber by IMEI</span><br><span> </span><br><span> OsmoHLR# subscriber imsi ?</span><br><span style="color: hsl(0, 100%, 40%);">-  IDENT  IMSI/MSISDN/ID of the subscriber</span><br><span style="color: hsl(120, 100%, 40%);">+  IDENT  IMSI/MSISDN/ID/IMEI of the subscriber</span><br><span> OsmoHLR# subscriber msisdn ?</span><br><span style="color: hsl(0, 100%, 40%);">-  IDENT  IMSI/MSISDN/ID of the subscriber</span><br><span style="color: hsl(120, 100%, 40%);">+  IDENT  IMSI/MSISDN/ID/IMEI of the subscriber</span><br><span> OsmoHLR# subscriber id ?</span><br><span style="color: hsl(0, 100%, 40%);">-  IDENT  IMSI/MSISDN/ID of the subscriber</span><br><span style="color: hsl(120, 100%, 40%);">+  IDENT  IMSI/MSISDN/ID/IMEI of the subscriber</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoHLR# subscriber imei ?</span><br><span style="color: hsl(120, 100%, 40%);">+  IDENT  IMSI/MSISDN/ID/IMEI of the subscriber</span><br><span> </span><br><span> OsmoHLR# subscriber imsi 123456789023000 show</span><br><span> % No subscriber for imsi = '123456789023000'</span><br><span>@@ -33,6 +37,9 @@</span><br><span> % No subscriber for id = '101'</span><br><span> OsmoHLR# subscriber msisdn 12345 show</span><br><span> % No subscriber for msisdn = '12345'</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoHLR# subscriber imei 357613004448485 show</span><br><span style="color: hsl(120, 100%, 40%);">+% Checksum validated and stripped for search: imei = '35761300444848'</span><br><span style="color: hsl(120, 100%, 40%);">+% No subscriber for imei = '35761300444848'</span><br><span> </span><br><span> OsmoHLR# show subscriber imsi 123456789023000</span><br><span> % No subscriber for imsi = '123456789023000'</span><br><span>@@ -40,6 +47,9 @@</span><br><span> % No subscriber for id = '101'</span><br><span> OsmoHLR# show subscriber msisdn 12345</span><br><span> % No subscriber for msisdn = '12345'</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoHLR# show subscriber imei 357613004448485</span><br><span style="color: hsl(120, 100%, 40%);">+% Checksum validated and stripped for search: imei = '35761300444848'</span><br><span style="color: hsl(120, 100%, 40%);">+% No subscriber for imei = '35761300444848'</span><br><span> </span><br><span> OsmoHLR# subscriber imsi 1234567890230001 create</span><br><span> % Not a valid IMSI: 1234567890230001</span><br><span>@@ -118,6 +128,7 @@</span><br><span>   msisdn  Set MSISDN (phone number) of the subscriber</span><br><span>   aud2g   Set 2G authentication data</span><br><span>   aud3g   Set UMTS authentication data (3G, and 2G with UMTS AKA)</span><br><span style="color: hsl(120, 100%, 40%);">+  imei    Set IMEI of the subscriber (normally populated from MSC, no need to set this manually)</span><br><span> </span><br><span> OsmoHLR# subscriber imsi 123456789023000 update msisdn ?</span><br><span>   none    Remove MSISDN (phone number)</span><br><span>@@ -374,3 +385,55 @@</span><br><span> </span><br><span> OsmoHLR# subscriber imsi 123456789023000 delete</span><br><span> % Deleted subscriber for IMSI '123456789023000'</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoHLR# subscriber imsi 123456789023000 create</span><br><span style="color: hsl(120, 100%, 40%);">+% Created subscriber 123456789023000</span><br><span style="color: hsl(120, 100%, 40%);">+    ID: 101</span><br><span style="color: hsl(120, 100%, 40%);">+    IMSI: 123456789023000</span><br><span style="color: hsl(120, 100%, 40%);">+    MSISDN: none</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoHLR# subscriber imsi 123456789023000 update imei ?</span><br><span style="color: hsl(120, 100%, 40%);">+  none  Forget IMEI</span><br><span style="color: hsl(120, 100%, 40%);">+  IMEI  Set IMEI (use for debug only!)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoHLR# subscriber imsi 123456789023000 update imei 35761300444848</span><br><span style="color: hsl(120, 100%, 40%);">+% Updated subscriber IMSI='123456789023000' to IMEI='35761300444848'</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoHLR# subscriber imsi 123456789023000 update imei 357613004448484</span><br><span style="color: hsl(120, 100%, 40%);">+% IMEI invalid: '357613004448484'</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoHLR# subscriber imsi 123456789023000 update imei 357613004448485</span><br><span style="color: hsl(120, 100%, 40%);">+% Updated subscriber IMSI='123456789023000' to IMEI='35761300444848'</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoHLR# show subscriber imei 35761300444848</span><br><span style="color: hsl(120, 100%, 40%);">+    ID: 101</span><br><span style="color: hsl(120, 100%, 40%);">+    IMSI: 123456789023000</span><br><span style="color: hsl(120, 100%, 40%);">+    MSISDN: none</span><br><span style="color: hsl(120, 100%, 40%);">+    IMEI: 357613004448485</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoHLR# show subscriber imei 357613004448485</span><br><span style="color: hsl(120, 100%, 40%);">+% Checksum validated and stripped for search: imei = '35761300444848'</span><br><span style="color: hsl(120, 100%, 40%);">+    ID: 101</span><br><span style="color: hsl(120, 100%, 40%);">+    IMSI: 123456789023000</span><br><span style="color: hsl(120, 100%, 40%);">+    MSISDN: none</span><br><span style="color: hsl(120, 100%, 40%);">+    IMEI: 357613004448485</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoHLR# show subscriber imei 357613004448484</span><br><span style="color: hsl(120, 100%, 40%);">+% No subscriber for imei = '357613004448484'</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoHLR# subscriber imsi 123456789023000 update imei none</span><br><span style="color: hsl(120, 100%, 40%);">+% Updated subscriber IMSI='123456789023000': removed IMEI</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoHLR# subscriber imsi 123456789023000 show</span><br><span style="color: hsl(120, 100%, 40%);">+    ID: 101</span><br><span style="color: hsl(120, 100%, 40%);">+    IMSI: 123456789023000</span><br><span style="color: hsl(120, 100%, 40%);">+    MSISDN: none</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoHLR# subscriber imsi 123456789023000 delete</span><br><span style="color: hsl(120, 100%, 40%);">+% Deleted subscriber for IMSI '123456789023000'</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoHLR# show subscriber id 99</span><br><span style="color: hsl(120, 100%, 40%);">+    ID: 99</span><br><span style="color: hsl(120, 100%, 40%);">+    IMSI: 000000000000099</span><br><span style="color: hsl(120, 100%, 40%);">+    MSISDN: none</span><br><span style="color: hsl(120, 100%, 40%);">+    IMEI: 12345 (INVALID LENGTH!)</span><br><span>diff --git a/tests/test_subscriber.vty.sql b/tests/test_subscriber.vty.sql</span><br><span>index ff167aa..e2c1af2 100644</span><br><span>--- a/tests/test_subscriber.vty.sql</span><br><span>+++ b/tests/test_subscriber.vty.sql</span><br><span>@@ -1,3 +1,6 @@</span><br><span style="color: hsl(120, 100%, 40%);">+-- Subscriber with invalid IMEI length</span><br><span style="color: hsl(120, 100%, 40%);">+INSERT INTO subscriber (id, imsi, imei) VALUES(99, '000000000000099', '12345');</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> -- Dummy entry with ID=100 gives all subscribers created in the VTY test an</span><br><span> -- ID > 100, so we can pre-fill the database with IDs < 100.</span><br><span> INSERT INTO subscriber (id, imsi) VALUES(100, '000000000000100');</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/12527">change 12527</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/12527"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-hlr </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: merged </div>
<div style="display:none"> Gerrit-Change-Id: I1af7b573ca2a1cb22497052665012d9c1acf3b30 </div>
<div style="display:none"> Gerrit-Change-Number: 12527 </div>
<div style="display:none"> Gerrit-PatchSet: 13 </div>
<div style="display:none"> Gerrit-Owner: osmith <osmith@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Harald Welte <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder (1000002) </div>
<div style="display:none"> Gerrit-Reviewer: Neels Hofmeyr <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Vadim Yanitskiy <axilirator@gmail.com> </div>
<div style="display:none"> Gerrit-Reviewer: osmith <osmith@sysmocom.de> </div>
<div style="display:none"> Gerrit-CC: Max <msuraev@sysmocom.de> </div>