<p>laforge has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-remsim/+/16629">View Change</a></p><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 src/client/simtrace2-remsim_client.c<br>1 file changed, 85 insertions(+), 1 deletion(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-remsim refs/changes/29/16629/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/client/simtrace2-remsim_client.c b/src/client/simtrace2-remsim_client.c</span><br><span>index 846ce85..90e2371 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 *event)</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_EVENT=%s", event);</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 *event)</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, event);</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, event);</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, 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: 1 </div>
<div style="display:none"> Gerrit-Owner: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>