Change in osmo-remsim[master]: remsim-client: Call an external script in specific situations

This is merely a historical archive of years 2008-2021, before the migration to mailman3.

A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.

laforge gerrit-no-reply at lists.osmocom.org
Sun Feb 16 14:46:49 UTC 2020


laforge has submitted this change. ( https://gerrit.osmocom.org/c/osmo-remsim/+/16629 )

Change subject: remsim-client: Call an external script in specific situations
......................................................................

remsim-client: Call an external script in specific situations

There are some situations where remsim-client would want to make its
surrounding system aware of, e.g. to take specific action.

This is particularly important on platforms where the simtrace2 firmware
doesn't have direct control over modem reset/poweron or the like.

Change-Id: I61cf4d93c669db137de801f8b147dcffaa6f3abd
Depends: libosmocore.git Ib24ac8a083db32e55402ce496a5eabd8749cc888
Closes: OS#4332
---
M doc/manuals/chapters/remsim-client.adoc
M src/client/simtrace2-remsim_client.c
2 files changed, 141 insertions(+), 1 deletion(-)

Approvals:
  Jenkins Builder: Verified
  laforge: Looks good to me, approved



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

-- 
To view, visit https://gerrit.osmocom.org/c/osmo-remsim/+/16629
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings

Gerrit-Project: osmo-remsim
Gerrit-Branch: master
Gerrit-Change-Id: I61cf4d93c669db137de801f8b147dcffaa6f3abd
Gerrit-Change-Number: 16629
Gerrit-PatchSet: 8
Gerrit-Owner: laforge <laforge at osmocom.org>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: laforge <laforge at osmocom.org>
Gerrit-MessageType: merged
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20200216/c9c9d1be/attachment.htm>


More information about the gerrit-log mailing list