<matrixBuild _class='hudson.matrix.MatrixBuild'><action _class='hudson.model.ParametersAction'><parameter _class='hudson.model.StringParameterValue'><name>BRANCH</name><value>pmaier/rcp</value></parameter><parameter _class='hudson.model.StringParameterValue'><name>EMAIL_NOTIFICATIONS</name><value></value></parameter></action><action _class='hudson.model.CauseAction'><cause _class='hudson.model.Cause$UserIdCause'><shortDescription>Started by user pmaier@sysmocom.de</shortDescription><userId>pmaier</userId><userName>pmaier@sysmocom.de</userName></cause></action><action _class='jenkins.metrics.impl.TimeInQueueAction'><blockedDurationMillis>0</blockedDurationMillis><blockedTimeMillis>0</blockedTimeMillis><buildableDurationMillis>0</buildableDurationMillis><buildableTimeMillis>0</buildableTimeMillis><buildingDurationMillis>963479</buildingDurationMillis><executingTimeMillis>963479</executingTimeMillis><executorUtilization>1.0</executorUtilization><subTaskCount>0</subTaskCount><waitingDurationMillis>0</waitingDurationMillis><waitingTimeMillis>0</waitingTimeMillis></action><action></action><action _class='hudson.plugins.git.util.BuildData'><buildsByBranchName><refsremotesoriginpmaierfixgr _class='hudson.plugins.git.util.Build'><buildNumber>2045</buildNumber><marked><SHA1>e5f56dd35f1b2347a59f88b401b59997798fff67</SHA1><branch><SHA1>e5f56dd35f1b2347a59f88b401b59997798fff67</SHA1><name>refs/remotes/origin/pmaier/fixgr</name></branch></marked><revision><SHA1>e5f56dd35f1b2347a59f88b401b59997798fff67</SHA1><branch><SHA1>e5f56dd35f1b2347a59f88b401b59997798fff67</SHA1><name>refs/remotes/origin/pmaier/fixgr</name></branch></revision></refsremotesoriginpmaierfixgr><refsremotesoriginpmaierrcp _class='hudson.plugins.git.util.Build'><buildNumber>2134</buildNumber><marked><SHA1>a3653acf804d4ff17e4536c7d7721b6d54e29a3b</SHA1><branch><SHA1>a3653acf804d4ff17e4536c7d7721b6d54e29a3b</SHA1><name>refs/remotes/origin/pmaier/rcp</name></branch></marked><revision><SHA1>a3653acf804d4ff17e4536c7d7721b6d54e29a3b</SHA1><branch><SHA1>a3653acf804d4ff17e4536c7d7721b6d54e29a3b</SHA1><name>refs/remotes/origin/pmaier/rcp</name></branch></revision></refsremotesoriginpmaierrcp><originmaster _class='hudson.plugins.git.util.Build'><buildNumber>2132</buildNumber><marked><SHA1>593bfa09119383d23b9e3385fc2d35a036a796c5</SHA1><branch><SHA1>593bfa09119383d23b9e3385fc2d35a036a796c5</SHA1><name>origin/master</name></branch></marked><revision><SHA1>593bfa09119383d23b9e3385fc2d35a036a796c5</SHA1><branch><SHA1>593bfa09119383d23b9e3385fc2d35a036a796c5</SHA1><name>origin/master</name></branch></revision></originmaster><refsremotesoriginpmaierara-m _class='hudson.plugins.git.util.Build'><buildNumber>1320</buildNumber><marked><SHA1>8f289234f74045496c3752bf1bb9397302f3e912</SHA1><branch><SHA1>8f289234f74045496c3752bf1bb9397302f3e912</SHA1><name>refs/remotes/origin/pmaier/ara-m</name></branch></marked><revision><SHA1>8f289234f74045496c3752bf1bb9397302f3e912</SHA1><branch><SHA1>8f289234f74045496c3752bf1bb9397302f3e912</SHA1><name>refs/remotes/origin/pmaier/ara-m</name></branch></revision></refsremotesoriginpmaierara-m><refsremotesoriginpmaierkeepfiles _class='hudson.plugins.git.util.Build'><buildNumber>1353</buildNumber><marked><SHA1>3d815859830197b9c55e0a49a1bd2532f71285e1</SHA1><branch><SHA1>3d815859830197b9c55e0a49a1bd2532f71285e1</SHA1><name>refs/remotes/origin/pmaier/keepfiles</name></branch></marked><revision><SHA1>3d815859830197b9c55e0a49a1bd2532f71285e1</SHA1><branch><SHA1>3d815859830197b9c55e0a49a1bd2532f71285e1</SHA1><name>refs/remotes/origin/pmaier/keepfiles</name></branch></revision></refsremotesoriginpmaierkeepfiles><refsremotesoriginpmaierfixapdu _class='hudson.plugins.git.util.Build'><buildNumber>1421</buildNumber><marked><SHA1>568e8ae9b817ec2473907bfdd30870410890ffb0</SHA1><branch><SHA1>568e8ae9b817ec2473907bfdd30870410890ffb0</SHA1><name>refs/remotes/origin/pmaier/fixapdu</name></branch></marked><revision><SHA1>568e8ae9b817ec2473907bfdd30870410890ffb0</SHA1><branch><SHA1>568e8ae9b817ec2473907bfdd30870410890ffb0</SHA1><name>refs/remotes/origin/pmaier/fixapdu</name></branch></revision></refsremotesoriginpmaierfixapdu><refsremotesoriginpmaieraramtest _class='hudson.plugins.git.util.Build'><buildNumber>1467</buildNumber><marked><SHA1>6a555ac5ccad9ee2cae5e0ba247990f824f8e9b6</SHA1><branch><SHA1>6a555ac5ccad9ee2cae5e0ba247990f824f8e9b6</SHA1><name>refs/remotes/origin/pmaier/aramtest</name></branch></marked><revision><SHA1>6a555ac5ccad9ee2cae5e0ba247990f824f8e9b6</SHA1><branch><SHA1>6a555ac5ccad9ee2cae5e0ba247990f824f8e9b6</SHA1><name>refs/remotes/origin/pmaier/aramtest</name></branch></revision></refsremotesoriginpmaieraramtest><refsremotesoriginosmithwip _class='hudson.plugins.git.util.Build'><buildNumber>1816</buildNumber><marked><SHA1>e4ea1c997348370ba1d7415bfd926ac873b58c87</SHA1><branch><SHA1>e4ea1c997348370ba1d7415bfd926ac873b58c87</SHA1><name>refs/remotes/origin/osmith/wip</name></branch></marked><revision><SHA1>e4ea1c997348370ba1d7415bfd926ac873b58c87</SHA1><branch><SHA1>e4ea1c997348370ba1d7415bfd926ac873b58c87</SHA1><name>refs/remotes/origin/osmith/wip</name></branch></revision></refsremotesoriginosmithwip><refsremotesoriginpmaierotatest _class='hudson.plugins.git.util.Build'><buildNumber>2022</buildNumber><marked><SHA1>f57f047c627392c40fbe349b1a73ccebe05dc005</SHA1><branch><SHA1>f57f047c627392c40fbe349b1a73ccebe05dc005</SHA1><name>refs/remotes/origin/pmaier/otatest</name></branch></marked><revision><SHA1>f57f047c627392c40fbe349b1a73ccebe05dc005</SHA1><branch><SHA1>f57f047c627392c40fbe349b1a73ccebe05dc005</SHA1><name>refs/remotes/origin/pmaier/otatest</name></branch></revision></refsremotesoriginpmaierotatest><refsremotesoriginmaster _class='hudson.plugins.git.util.Build'><buildNumber>402</buildNumber><marked><SHA1>4f888a0414101dee4f20aa12579491fcc71707b3</SHA1><branch><SHA1>4f888a0414101dee4f20aa12579491fcc71707b3</SHA1><name>refs/remotes/origin/master</name></branch></marked><revision><SHA1>4f888a0414101dee4f20aa12579491fcc71707b3</SHA1><branch><SHA1>4f888a0414101dee4f20aa12579491fcc71707b3</SHA1><name>refs/remotes/origin/master</name></branch></revision></refsremotesoriginmaster></buildsByBranchName><lastBuiltRevision><SHA1>a3653acf804d4ff17e4536c7d7721b6d54e29a3b</SHA1><branch><SHA1>a3653acf804d4ff17e4536c7d7721b6d54e29a3b</SHA1><name>refs/remotes/origin/pmaier/rcp</name></branch></lastBuiltRevision><remoteUrl>https://gerrit.osmocom.org/pysim</remoteUrl><scmName></scmName></action><action></action><action></action><action></action><action _class='org.jenkinsci.plugins.displayurlapi.actions.RunDisplayAction'></action><building>false</building><displayName>#2134</displayName><duration>963479</duration><estimatedDuration>954229</estimatedDuration><fullDisplayName>master-pysim #2134</fullDisplayName><id>2134</id><inProgress>false</inProgress><keepLog>false</keepLog><number>2134</number><queueId>111865</queueId><result>SUCCESS</result><timestamp>1778161872352</timestamp><url>https://jenkins.osmocom.org/jenkins/view/gerrit/job/master-pysim/2134/</url><builtOn></builtOn><changeSet _class='hudson.plugins.git.GitChangeSetList'><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>tests/unittests/test_card_key_provider.py</affectedPath><affectedPath>pySim/card_key_provider.py</affectedPath><commitId>3a713ca2a6352d84b7ac7744456b2f2b61cc0682</commitId><timestamp>1778161412000</timestamp><author><absoluteUrl>https://jenkins.osmocom.org/jenkins/user/pmaier</absoluteUrl><fullName>pmaier@sysmocom.de</fullName></author><authorEmail>pmaier@sysmocom.de</authorEmail><comment>card_key_provider: pass CardKeyFieldCryptor to constructor

We currently create the CardKeyFieldCryptor object inside the constructor
of the concrete CardKeyProvider classes. There is currently no problem
with that, but when we create the CardKeyFieldCryptor object first and
then pass it as parameter to the constructor, we gain more flexibility
in case we want to support other CardKeyFieldCryptor variants in the
future.

Related: SYS#6959
</comment><date>2026-05-07 15:43:32 +0200</date><id>3a713ca2a6352d84b7ac7744456b2f2b61cc0682</id><msg>card_key_provider: pass CardKeyFieldCryptor to constructor</msg><path><editType>edit</editType><file>tests/unittests/test_card_key_provider.py</file></path><path><editType>edit</editType><file>pySim/card_key_provider.py</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>pySim/card_key_provider.py</affectedPath><commitId>191113baee3431e905194485e74d44f8b99a7f17</commitId><timestamp>1778161412000</timestamp><author><absoluteUrl>https://jenkins.osmocom.org/jenkins/user/pmaier</absoluteUrl><fullName>pmaier@sysmocom.de</fullName></author><authorEmail>pmaier@sysmocom.de</authorEmail><comment>card_key_provider: add a static method to parse --column-keys args

The contents of the --column-keys arguments are currently parsed
in init_card_key_provider. Let's add a static method in
CardKeyFieldCryptor to simplify re-usage of the CardKeyFieldCryptor

Related: SYS#6959
</comment><date>2026-05-07 15:43:32 +0200</date><id>191113baee3431e905194485e74d44f8b99a7f17</id><msg>card_key_provider: add a static method to parse --column-keys args</msg><path><editType>edit</editType><file>pySim/card_key_provider.py</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>pySim/log.py</affectedPath><commitId>1b43839da36200065d3ae03cb9a316900c5a39c4</commitId><timestamp>1778161412000</timestamp><author><absoluteUrl>https://jenkins.osmocom.org/jenkins/user/pmaier</absoluteUrl><fullName>pmaier@sysmocom.de</fullName></author><authorEmail>pmaier@sysmocom.de</authorEmail><comment>pySimLogger: fix default log format string

In format string we prepend when we log in verbose mode. We use %(module)s
as format string quaifier. This qualifier is replaced with the name of the
module from where the logger was called. This is mostly equal to the logger
name (__name__) we pass when we create the logger.

However, this is not the behavior we actually want. We want to log the
logger name that we passed when the logger was created. For this, we must
use %(name)s as qualifier.

Related: SYS#6959
</comment><date>2026-05-07 15:43:32 +0200</date><id>1b43839da36200065d3ae03cb9a316900c5a39c4</id><msg>pySimLogger: fix default log format string</msg><path><editType>edit</editType><file>pySim/log.py</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>pySim/app.py</affectedPath><commitId>9e43ada58f52a51ee7c9157c49ae3d05c1c1b746</commitId><timestamp>1778161412000</timestamp><author><absoluteUrl>https://jenkins.osmocom.org/jenkins/user/pmaier</absoluteUrl><fullName>pmaier@sysmocom.de</fullName></author><authorEmail>pmaier@sysmocom.de</authorEmail><comment>pySim/app: use pySimLogger instead of print

let's replace the stray print statements with proper logger calls.

Related: SYS#6959
</comment><date>2026-05-07 15:43:32 +0200</date><id>9e43ada58f52a51ee7c9157c49ae3d05c1c1b746</id><msg>pySim/app: use pySimLogger instead of print</msg><path><editType>edit</editType><file>pySim/app.py</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>pySim/filesystem.py</affectedPath><commitId>7596045245a5becc7bb528d0f8515cfb7eb6e33c</commitId><timestamp>1778161412000</timestamp><author><absoluteUrl>https://jenkins.osmocom.org/jenkins/user/pmaier</absoluteUrl><fullName>pmaier@sysmocom.de</fullName></author><authorEmail>pmaier@sysmocom.de</authorEmail><comment>pySim/filesystem: use pySimLogger instead of print

let's replace the stray print statements with proper logger calls.

Related: SYS#6959
</comment><date>2026-05-07 15:43:32 +0200</date><id>7596045245a5becc7bb528d0f8515cfb7eb6e33c</id><msg>pySim/filesystem: use pySimLogger instead of print</msg><path><editType>edit</editType><file>pySim/filesystem.py</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>pySim/global_platform/scp.py</affectedPath><commitId>2184168c544d5433c9787595d83b718736a753db</commitId><timestamp>1778161412000</timestamp><author><absoluteUrl>https://jenkins.osmocom.org/jenkins/user/pmaier</absoluteUrl><fullName>pmaier@sysmocom.de</fullName></author><authorEmail>pmaier@sysmocom.de</authorEmail><comment>pySim/scp: migrate to pySimLogger

The module scp.py predates the existence of the pySimLogger and still
uses an individually created logger. Let's migrate to pySimLogger to
avoid unexpected effects and to be uniform with the other modules.

Related: SYS#6959
</comment><date>2026-05-07 15:43:32 +0200</date><id>2184168c544d5433c9787595d83b718736a753db</id><msg>pySim/scp: migrate to pySimLogger</msg><path><editType>edit</editType><file>pySim/global_platform/scp.py</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>pySim/global_platform/__init__.py</affectedPath><commitId>35ca46d8fe121046e210a5a7ec9f04f60562686c</commitId><timestamp>1778161412000</timestamp><author><absoluteUrl>https://jenkins.osmocom.org/jenkins/user/pmaier</absoluteUrl><fullName>pmaier@sysmocom.de</fullName></author><authorEmail>pmaier@sysmocom.de</authorEmail><comment>pySim/global_platform: make functionality available outside of cmd2

The nested class AddlShellCommands holds methods that encapsulate
the actual functionality from the related do_ method (e.g.
do_store_data calls self.store_data). This is already a good level
of separation but it does not allow us to call those methods from
programs that are not based on cmd2. Let's turn those methods into
functions so that non cmd2 applications have easy access to the
functionality of pySim.global_platform.

Let's also add a pySimLogger, so that we do not have to call
self._cmd.poutput

Related: SYS#6959
</comment><date>2026-05-07 15:43:32 +0200</date><id>35ca46d8fe121046e210a5a7ec9f04f60562686c</id><msg>pySim/global_platform: make functionality available outside of cmd2</msg><path><editType>edit</editType><file>pySim/global_platform/__init__.py</file></path></item><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>contrib/rcp/usage_example/start_rcp_module.sh</affectedPath><affectedPath>contrib/rcp/rcp_utils.py</affectedPath><affectedPath>contrib/rcp/usage_example/start_rcp_server.sh</affectedPath><affectedPath>contrib/rcp/usage_example/card_data.csv.encr</affectedPath><affectedPath>contrib/rcp/rcps_to_rcpc_schema.json</affectedPath><affectedPath>contrib/rcp/rcpm_to_rcps_schema.json</affectedPath><affectedPath>contrib/rcp/usage_example/run_rcp_client_help_cmd.sh</affectedPath><affectedPath>contrib/rcp/usage_example/certs/example_ssl_rcps_rcpm_cert.pem</affectedPath><affectedPath>contrib/rcp/usage_example/certs/example_ssl_rcpm_rcps_cert.pem</affectedPath><affectedPath>contrib/rcp/rcps_to_rcpm_schema.json</affectedPath><affectedPath>contrib/rcp/rcp_server.py</affectedPath><affectedPath>contrib/rcp/usage_example/run_rcp_client_help_cmd_specific.sh</affectedPath><affectedPath>contrib/rcp/usage_example/run_rcp_client_help.sh</affectedPath><affectedPath>contrib/rcp/rcps_to_rcpmcs_schema.json</affectedPath><affectedPath>contrib/rcp/usage_example/rcp_module.py</affectedPath><affectedPath>contrib/rcp/usage_example/run_rcp_client_cmd.sh</affectedPath><affectedPath>contrib/rcp/usage_example/run_rcp_client.sh</affectedPath><affectedPath>contrib/rcp/rcp_client.py</affectedPath><affectedPath>contrib/rcp/usage_example/certs/make_certs.sh</affectedPath><affectedPath>contrib/rcp/usage_example/card_data.csv</affectedPath><affectedPath>contrib/rcp/rcpmcs_to_rcps_schema.json</affectedPath><affectedPath>contrib/rcp/rcpc_to_rcps_schema.json</affectedPath><affectedPath>contrib/rcp/rcp_module_utils.py</affectedPath><affectedPath>contrib/rcp/usage_example/readme.txt</affectedPath><affectedPath>contrib/rcp/usage_example/certs/example_ssl_rcp_ca_cert.crt</affectedPath><affectedPath>contrib/rcp/usage_example/encrypt_card_data.sh</affectedPath><affectedPath>contrib/rcp/usage_example/certs/example_ssl_rcpc_rcps_cert.pem</affectedPath><affectedPath>contrib/rcp/usage_example/params.cfg</affectedPath><commitId>a3653acf804d4ff17e4536c7d7721b6d54e29a3b</commitId><timestamp>1778161412000</timestamp><author><absoluteUrl>https://jenkins.osmocom.org/jenkins/user/pmaier</absoluteUrl><fullName>pmaier@sysmocom.de</fullName></author><authorEmail>pmaier@sysmocom.de</authorEmail><comment>WIP: Remote Card Procedure

Related: SYS#6959
</comment><date>2026-05-07 15:43:32 +0200</date><id>a3653acf804d4ff17e4536c7d7721b6d54e29a3b</id><msg>WIP: Remote Card Procedure</msg><path><editType>add</editType><file>contrib/rcp/rcp_module_utils.py</file></path><path><editType>add</editType><file>contrib/rcp/usage_example/run_rcp_client_cmd.sh</file></path><path><editType>add</editType><file>contrib/rcp/usage_example/params.cfg</file></path><path><editType>add</editType><file>contrib/rcp/rcp_client.py</file></path><path><editType>add</editType><file>contrib/rcp/rcp_utils.py</file></path><path><editType>add</editType><file>contrib/rcp/usage_example/rcp_module.py</file></path><path><editType>add</editType><file>contrib/rcp/rcps_to_rcpmcs_schema.json</file></path><path><editType>add</editType><file>contrib/rcp/usage_example/certs/example_ssl_rcps_rcpm_cert.pem</file></path><path><editType>add</editType><file>contrib/rcp/rcps_to_rcpc_schema.json</file></path><path><editType>add</editType><file>contrib/rcp/usage_example/readme.txt</file></path><path><editType>add</editType><file>contrib/rcp/rcp_server.py</file></path><path><editType>add</editType><file>contrib/rcp/usage_example/certs/make_certs.sh</file></path><path><editType>add</editType><file>contrib/rcp/rcpmcs_to_rcps_schema.json</file></path><path><editType>add</editType><file>contrib/rcp/usage_example/card_data.csv</file></path><path><editType>add</editType><file>contrib/rcp/rcpm_to_rcps_schema.json</file></path><path><editType>add</editType><file>contrib/rcp/usage_example/certs/example_ssl_rcp_ca_cert.crt</file></path><path><editType>add</editType><file>contrib/rcp/usage_example/certs/example_ssl_rcpm_rcps_cert.pem</file></path><path><editType>add</editType><file>contrib/rcp/usage_example/start_rcp_server.sh</file></path><path><editType>add</editType><file>contrib/rcp/usage_example/run_rcp_client.sh</file></path><path><editType>add</editType><file>contrib/rcp/usage_example/start_rcp_module.sh</file></path><path><editType>add</editType><file>contrib/rcp/usage_example/run_rcp_client_help_cmd.sh</file></path><path><editType>add</editType><file>contrib/rcp/usage_example/card_data.csv.encr</file></path><path><editType>add</editType><file>contrib/rcp/usage_example/encrypt_card_data.sh</file></path><path><editType>add</editType><file>contrib/rcp/rcps_to_rcpm_schema.json</file></path><path><editType>add</editType><file>contrib/rcp/rcpc_to_rcps_schema.json</file></path><path><editType>add</editType><file>contrib/rcp/usage_example/run_rcp_client_help.sh</file></path><path><editType>add</editType><file>contrib/rcp/usage_example/certs/example_ssl_rcpc_rcps_cert.pem</file></path><path><editType>add</editType><file>contrib/rcp/usage_example/run_rcp_client_help_cmd_specific.sh</file></path></item><kind>git</kind></changeSet><culprit><absoluteUrl>https://jenkins.osmocom.org/jenkins/user/pmaier</absoluteUrl><fullName>pmaier@sysmocom.de</fullName></culprit><run><number>2134</number><url>https://jenkins.osmocom.org/jenkins/view/gerrit/job/master-pysim/JOB_TYPE=card-test,a1=default,a3=default,a4=default,label=simtester/2134/</url></run><run><number>2134</number><url>https://jenkins.osmocom.org/jenkins/view/gerrit/job/master-pysim/JOB_TYPE=distcheck,a1=default,a3=default,a4=default,label=osmocom-master/2134/</url></run><run><number>2134</number><url>https://jenkins.osmocom.org/jenkins/view/gerrit/job/master-pysim/JOB_TYPE=docs,a1=default,a3=default,a4=default,label=osmocom-master/2134/</url></run><run><number>2134</number><url>https://jenkins.osmocom.org/jenkins/view/gerrit/job/master-pysim/JOB_TYPE=pylint,a1=default,a3=default,a4=default,label=osmocom-master/2134/</url></run><run><number>2134</number><url>https://jenkins.osmocom.org/jenkins/view/gerrit/job/master-pysim/JOB_TYPE=test,a1=default,a3=default,a4=default,label=osmocom-master/2134/</url></run><run><number>2112</number><url>https://jenkins.osmocom.org/jenkins/view/gerrit/job/master-pysim/JOB_TYPE=test,a1=default,a3=default,a4=default,label=simtester/2112/</url></run></matrixBuild>