<p>laforge <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-remsim/+/16629">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Jenkins Builder: Verified
  laforge: Looks good to me, approved

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">remsim-client: Call an external script in specific situations<br><br>There are some situations where remsim-client would want to make its<br>surrounding system aware of, e.g. to take specific action.<br><br>This is particularly important on platforms where the simtrace2 firmware<br>doesn't have direct control over modem reset/poweron or the like.<br><br>Change-Id: I61cf4d93c669db137de801f8b147dcffaa6f3abd<br>Depends: libosmocore.git Ib24ac8a083db32e55402ce496a5eabd8749cc888<br>Closes: OS#4332<br>---<br>M doc/manuals/chapters/remsim-client.adoc<br>M src/client/simtrace2-remsim_client.c<br>2 files changed, 141 insertions(+), 1 deletion(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/doc/manuals/chapters/remsim-client.adoc b/doc/manuals/chapters/remsim-client.adoc</span><br><span>index 8f90a1a..7416b05 100644</span><br><span>--- a/doc/manuals/chapters/remsim-client.adoc</span><br><span>+++ b/doc/manuals/chapters/remsim-client.adoc</span><br><span>@@ -82,6 +82,10 @@</span><br><span>   Specify the initial ATR to be communicated to the modem/phone.  Can</span><br><span>   and will later be overridden by the ATR as specified by</span><br><span>   `osmo-remsim-bankd` once a card has been mapped to this client.</span><br><span style="color: hsl(120, 100%, 40%);">+*-e, --event-script COMMAND*::</span><br><span style="color: hsl(120, 100%, 40%);">+  Specify the shell command to be execute when the client wants to call its</span><br><span style="color: hsl(120, 100%, 40%);">+  helper script</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> </span><br><span> ==== Examples</span><br><span> .remsim-server is on 10.2.3.4, sysmoQMOD on usb bus, all 4 modems:</span><br><span>@@ -97,3 +101,55 @@</span><br><span> `osmo-remsim-client` currently logs to stdout only, and the logging</span><br><span> verbosity is not yet configurable.  However, as the libosmocore logging</span><br><span> framework is used, extending this is an easy modification.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+=== Helper Script</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+`osmo-remsim-client` can call an external shell command / script / program at specific</span><br><span style="color: hsl(120, 100%, 40%);">+instances of time.  This serves two purposes:</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+* To keep external system integration posted about the overall status of remsim-client,</span><br><span style="color: hsl(120, 100%, 40%);">+  such as whether or not it is connected to a server and/or bankd.</span><br><span style="color: hsl(120, 100%, 40%);">+* To request the external system to perform specific actions, such as triggering the reset</span><br><span style="color: hsl(120, 100%, 40%);">+  of the modem - in case the hardware doesn't allow the simtrace2 firmware to do that itself.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+==== Script Environment Variables</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+The environment passed to the helper script contains a number of variables to provide inormation</span><br><span style="color: hsl(120, 100%, 40%);">+to the external script:</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+.Environment Variables</span><br><span style="color: hsl(120, 100%, 40%);">+[options="header",cols="27%,18%,55%"]</span><br><span style="color: hsl(120, 100%, 40%);">+|===</span><br><span style="color: hsl(120, 100%, 40%);">+| Name | Example Value | Description</span><br><span style="color: hsl(120, 100%, 40%);">+| REMSIM_CLIENT_VERSION | 0.2.2.37-5406a | Compile version of the software</span><br><span style="color: hsl(120, 100%, 40%);">+| REMSIM_SERVER_ADDR | 1.2.3.4:1234 | Address and port of the remsim-server</span><br><span style="color: hsl(120, 100%, 40%);">+| REMSIM_SERVER_STATE | CONNECTED | FSM state of the connection to remsim-server</span><br><span style="color: hsl(120, 100%, 40%);">+| REMSIM_BANKD_ADDR | 1.2.3.4:1234 | Address and port of the remsim-bankd</span><br><span style="color: hsl(120, 100%, 40%);">+| REMSIM_BANKD_STATE | CONNECTED | FSM state of the connection to remsim-bankd</span><br><span style="color: hsl(120, 100%, 40%);">+| REMSIM_CLIENT_SLOT | 23:42 | Client ID and Client Slot Number</span><br><span style="color: hsl(120, 100%, 40%);">+| REMSIM_BANKD_SLOT | 55:33 | Bank ID and Bank Slot Number</span><br><span style="color: hsl(120, 100%, 40%);">+| REMSIM_USB_PATH | 2-1.1 | USB path of the USB device with simtrace2 cardem firmware</span><br><span style="color: hsl(120, 100%, 40%);">+| REMSIM_USB_INTERFACE | 1 | Interface number of the USB device with simtrace2 cardem firmware</span><br><span style="color: hsl(120, 100%, 40%);">+| REMSIM_SIM_VCC | 1 | Whether or not the modem currently applies SIM VCC (0/1)</span><br><span style="color: hsl(120, 100%, 40%);">+| REMSIM_SIM_RST | 1 | Whether or not the modem currently asserts SIM RST (0=inactive, 1=active)</span><br><span style="color: hsl(120, 100%, 40%);">+| REMSIM_CAUSE | request-card-insert | The cause why this script has been called</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%);">+==== REMSIM_CAUSE values</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+The REMSIM_CAUSE environment variable (as well as the first argument) passed to the helper</span><br><span style="color: hsl(120, 100%, 40%);">+script indicated why the script has been called.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[options="header",cols="25%,75%"]</span><br><span style="color: hsl(120, 100%, 40%);">+|===</span><br><span style="color: hsl(120, 100%, 40%);">+| Name | Description</span><br><span style="color: hsl(120, 100%, 40%);">+| event-modem-status | The SIM card interface status has changed (e.g. VCC/RST change)</span><br><span style="color: hsl(120, 100%, 40%);">+| event-bankd-connect | A logical RSPRO connection to a bankd has been established</span><br><span style="color: hsl(120, 100%, 40%);">+| event-server-connect | A logical RSPRO connection to a server has been established</span><br><span style="color: hsl(120, 100%, 40%);">+| event-config-bankd | The server has instructed the client of the bankd address</span><br><span style="color: hsl(120, 100%, 40%);">+| request-card-insert | The client asks the system to simulate SIM card insertion to the modem</span><br><span style="color: hsl(120, 100%, 40%);">+| request-card-remove | The client asks the system to simulate SIM card removal from the modem</span><br><span style="color: hsl(120, 100%, 40%);">+| request-sim-remote | The client asks the system to switch to remote SIM</span><br><span style="color: hsl(120, 100%, 40%);">+| request-sim-local | The client asks the system to switch to local SIM</span><br><span style="color: hsl(120, 100%, 40%);">+| request-modem-reset | The client asks the system to perform a modem reset</span><br><span style="color: hsl(120, 100%, 40%);">+|===</span><br><span>diff --git a/src/client/simtrace2-remsim_client.c b/src/client/simtrace2-remsim_client.c</span><br><span>index 846ce85..ce8ea1d 100644</span><br><span>--- a/src/client/simtrace2-remsim_client.c</span><br><span>+++ b/src/client/simtrace2-remsim_client.c</span><br><span>@@ -32,6 +32,7 @@</span><br><span> #include <osmocom/core/utils.h></span><br><span> #include <osmocom/core/logging.h></span><br><span> #include <osmocom/core/application.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/exec.h></span><br><span> </span><br><span> #include <osmocom/abis/ipa.h></span><br><span> #include <osmocom/gsm/protocol/ipaccess.h></span><br><span>@@ -130,6 +131,77 @@</span><br><span>      return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* build the (additional) environment for executing a script */</span><br><span style="color: hsl(120, 100%, 40%);">+static char **build_script_env(struct bankd_client *clnt, const char *cause)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  struct cardem_inst *ci = clnt->cardem;</span><br><span style="color: hsl(120, 100%, 40%);">+     char **env = talloc_zero_size(clnt, 256*sizeof(char *));</span><br><span style="color: hsl(120, 100%, 40%);">+      int i = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  if (!env)</span><br><span style="color: hsl(120, 100%, 40%);">+             return NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        env[i++] = talloc_asprintf(env, "REMSIM_CLIENT_VERSION=%s", VERSION);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     env[i++] = talloc_asprintf(env, "REMSIM_SERVER_ADDR=%s:%u",</span><br><span style="color: hsl(120, 100%, 40%);">+                            clnt->srv_conn.server_host, clnt->srv_conn.server_port);</span><br><span style="color: hsl(120, 100%, 40%);">+     env[i++] = talloc_asprintf(env, "REMSIM_SERVER_STATE=%s",</span><br><span style="color: hsl(120, 100%, 40%);">+                              osmo_fsm_inst_state_name(clnt->srv_conn.fi));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ env[i++] = talloc_asprintf(env, "REMSIM_BANKD_ADDR=%s:%u",</span><br><span style="color: hsl(120, 100%, 40%);">+                             clnt->bankd_conn.server_host, clnt->bankd_conn.server_port);</span><br><span style="color: hsl(120, 100%, 40%);">+ env[i++] = talloc_asprintf(env, "REMSIM_BANKD_STATE=%s",</span><br><span style="color: hsl(120, 100%, 40%);">+                               osmo_fsm_inst_state_name(clnt->bankd_conn.fi));</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 (clnt->srv_conn.clslot) {</span><br><span style="color: hsl(120, 100%, 40%);">+               env[i++] = talloc_asprintf(env, "REMSIM_CLIENT_SLOT=%lu:%lu",</span><br><span style="color: hsl(120, 100%, 40%);">+                                          g_client->srv_conn.clslot->clientId,</span><br><span style="color: hsl(120, 100%, 40%);">+                                    g_client->srv_conn.clslot->slotNr);</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+     env[i++] = talloc_asprintf(env, "REMSIM_BANKD_SLOT=%u:%u",</span><br><span style="color: hsl(120, 100%, 40%);">+                             clnt->bankd_slot.bank_id, clnt->bankd_slot.slot_nr);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       env[i++] = talloc_asprintf(env, "REMSIM_USB_PATH=%s", ci->usb_path);</span><br><span style="color: hsl(120, 100%, 40%);">+     env[i++] = talloc_asprintf(env, "REMSIM_USB_INTERFACE=%u", clnt->cfg->usb.if_num);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* TODO: SIM card state VCC/CLK/RST */</span><br><span style="color: hsl(120, 100%, 40%);">+        env[i++] = talloc_asprintf(env, "REMSIM_SIM_VCC=%u",</span><br><span style="color: hsl(120, 100%, 40%);">+                                   !!(ci->last_status.flags & CEMU_STATUS_F_VCC_PRESENT));</span><br><span style="color: hsl(120, 100%, 40%);">+     env[i++] = talloc_asprintf(env, "REMSIM_SIM_RST=%u",</span><br><span style="color: hsl(120, 100%, 40%);">+                                   !!(ci->last_status.flags & CEMU_STATUS_F_RESET_ACTIVE));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  env[i++] = talloc_asprintf(env, "REMSIM_CAUSE=%s", cause);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* terminate last entry */</span><br><span style="color: hsl(120, 100%, 40%);">+    env[i++] = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+      return env;</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%);">+static int call_script(struct bankd_client *clnt, const char *cause)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     char **env, *cmd;</span><br><span style="color: hsl(120, 100%, 40%);">+     int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     if (!clnt->cfg->event_script)</span><br><span style="color: hsl(120, 100%, 40%);">+           return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   env = build_script_env(clnt, cause);</span><br><span style="color: hsl(120, 100%, 40%);">+  if (!env)</span><br><span style="color: hsl(120, 100%, 40%);">+             return -ENOMEM;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     cmd = talloc_asprintf(env, "%s %s", clnt->cfg->event_script, cause);</span><br><span style="color: hsl(120, 100%, 40%);">+  if (!cmd) {</span><br><span style="color: hsl(120, 100%, 40%);">+           talloc_free(env);</span><br><span style="color: hsl(120, 100%, 40%);">+             return -ENOMEM;</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%);">+   rc = osmo_system_nowait(cmd, osmo_environment_whitelist, env);</span><br><span style="color: hsl(120, 100%, 40%);">+        talloc_free(env);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   return rc;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /***********************************************************************</span><br><span>  * SIMTRACE core protocol</span><br><span>  ***********************************************************************/</span><br><span>@@ -548,6 +620,7 @@</span><br><span> </span><br><span>      if (ci->last_status.flags != status->flags) {</span><br><span>          ci->last_status = *status;</span><br><span style="color: hsl(120, 100%, 40%);">+         call_script(g_client, "event-modem-status");</span><br><span>       } else</span><br><span>               ci->last_status = *status;</span><br><span> </span><br><span>@@ -754,6 +827,7 @@</span><br><span>              /* Store 'identity' of bankd to in peer_comp_id */</span><br><span>           rspro_comp_id_retrieve(&bankdc->peer_comp_id, &pdu->msg.choice.connectClientRes.identity);</span><br><span>             osmo_fsm_inst_dispatch(bankdc->fi, SRVC_E_CLIENT_CONN_RES, (void *) pdu);</span><br><span style="color: hsl(120, 100%, 40%);">+          call_script(g_client, "event-bankd-connect");</span><br><span>              break;</span><br><span>       case RsproPDUchoice_PR_tpduCardToModem: // APDU response from card received</span><br><span>          bankd_handle_tpduCardToModem(g_client, pdu);</span><br><span>@@ -780,6 +854,7 @@</span><br><span>           /* Store 'identity' of server in srvc->peer_comp_id */</span><br><span>            rspro_comp_id_retrieve(&srvc->peer_comp_id, &pdu->msg.choice.connectClientRes.identity);</span><br><span>               osmo_fsm_inst_dispatch(srvc->fi, SRVC_E_CLIENT_CONN_RES, (void *) pdu);</span><br><span style="color: hsl(120, 100%, 40%);">+            call_script(g_client, "event-server-connect");</span><br><span>             break;</span><br><span>       case RsproPDUchoice_PR_configClientIdReq:</span><br><span>            /* store/set the clientID as instructed by the server */</span><br><span>@@ -804,6 +879,7 @@</span><br><span>               /* send response to server */</span><br><span>                resp = rspro_gen_ConfigClientBankRes(ResultCode_ok);</span><br><span>                 server_conn_send_rspro(srvc, resp);</span><br><span style="color: hsl(120, 100%, 40%);">+           call_script(g_client, "event-config-bankd");</span><br><span>               break;</span><br><span>       default:</span><br><span>             LOGPFSML(srvc->fi, LOGL_ERROR, "Unknown/Unsupported RSPRO PDU type: %s\n",</span><br><span>@@ -847,6 +923,7 @@</span><br><span>                "\t-A\t--usb-address\tADDRESS\n"</span><br><span>           "\t-H\t--usb-path\tPATH\n"</span><br><span>                 "\t-a\t--atr\tATR\n"</span><br><span style="color: hsl(120, 100%, 40%);">+                "\t-e\t--event-script\tPATH\n"</span><br><span>             "\n"</span><br><span>               );</span><br><span> }</span><br><span>@@ -898,6 +975,7 @@</span><br><span>                { "usb-address", 1, 0, 'A' },</span><br><span>              { "usb-path", 1, 0, 'H' },</span><br><span>                 { "atr", 1, 0, 'a' },</span><br><span style="color: hsl(120, 100%, 40%);">+               { "event-script", 1, 0, 'e' },</span><br><span>             { NULL, 0, 0, 0 }</span><br><span>    };</span><br><span>   int c, rc;</span><br><span>@@ -905,7 +983,7 @@</span><br><span>     while (1) {</span><br><span>          int option_index = 0;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-               c = getopt_long(argc, argv, "s:p:c:n:hvi:kV:P:C:I:S:A:H:a:", opts, &option_index);</span><br><span style="color: hsl(120, 100%, 40%);">+              c = getopt_long(argc, argv, "s:p:c:n:hvi:kV:P:C:I:S:A:H:a:e:", opts, &option_index);</span><br><span>           if (c == -1)</span><br><span>                         break;</span><br><span>               switch (c) {</span><br><span>@@ -964,6 +1042,9 @@</span><br><span>                  }</span><br><span>                    cfg->atr.len = rc;</span><br><span>                        break;</span><br><span style="color: hsl(120, 100%, 40%);">+                case 'e':</span><br><span style="color: hsl(120, 100%, 40%);">+                     osmo_talloc_replace_string(cfg, &cfg->event_script, optarg);</span><br><span style="color: hsl(120, 100%, 40%);">+                   break;</span><br><span>               }</span><br><span>    }</span><br><span> </span><br><span>@@ -1062,9 +1143,11 @@</span><br><span> </span><br><span>   /* simulate card-insert to modem (owhw, not qmod) */</span><br><span>         cardem_request_card_insert(ci, true);</span><br><span style="color: hsl(120, 100%, 40%);">+ call_script(g_client, "request-card-insert");</span><br><span> </span><br><span>  /* select remote (forwarded) SIM */</span><br><span>  st_modem_sim_select_remote(ci->slot);</span><br><span style="color: hsl(120, 100%, 40%);">+      call_script(g_client, "request-sim-remote");</span><br><span> </span><br><span>   /* set the ATR */</span><br><span>    //atr_update_csum(real_atr, sizeof(real_atr));</span><br><span>@@ -1072,6 +1155,7 @@</span><br><span> </span><br><span>   /* select remote (forwarded) SIM */</span><br><span>  st_modem_reset_pulse(ci->slot, 300);</span><br><span style="color: hsl(120, 100%, 40%);">+       call_script(g_client, "request-modem-reset");</span><br><span> </span><br><span>  printf("Entering main loop\n");</span><br><span> </span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-remsim/+/16629">change 16629</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/c/osmo-remsim/+/16629"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-remsim </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I61cf4d93c669db137de801f8b147dcffaa6f3abd </div>
<div style="display:none"> Gerrit-Change-Number: 16629 </div>
<div style="display:none"> Gerrit-PatchSet: 8 </div>
<div style="display:none"> Gerrit-Owner: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>