laforge has submitted this change. ( 
https://gerrit.osmocom.org/c/pysim/+/34960?usp=email )

Change subject: transport/pcsc: Allow opening PC/SC readers by a regex of their 
name
......................................................................

transport/pcsc: Allow opening PC/SC readers by a regex of their name

Opening PC/SC readers by index/number is very error-prone as the order
is never deterministic in any system with multiple (hot-plugged, USB)
readers.  Instead, let's offer the alternative of specifying a regular
expression to match the reader name (similar to remsim-bankd).

Change-Id: I983f19c6741904c1adf27749c9801b44a03a5d78
---
M pySim/transport/__init__.py
M pySim/transport/pcsc.py
2 files changed, 45 insertions(+), 13 deletions(-)

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




diff --git a/pySim/transport/__init__.py b/pySim/transport/__init__.py
index e0e1e62..d075878 100644
--- a/pySim/transport/__init__.py
+++ b/pySim/transport/__init__.py
@@ -287,7 +287,7 @@
     """
     Init card reader driver
     """
-    if opts.pcsc_dev is not None:
+    if opts.pcsc_dev is not None or opts.pcsc_regex is not None:
         from pySim.transport.pcsc import PcscSimLink
         sl = PcscSimLink(opts, **kwargs)
     elif opts.osmocon_sock is not None:
diff --git a/pySim/transport/pcsc.py b/pySim/transport/pcsc.py
index 6afcdac..b1c424f 100644
--- a/pySim/transport/pcsc.py
+++ b/pySim/transport/pcsc.py
@@ -1,7 +1,7 @@
 # -*- coding: utf-8 -*-

 # Copyright (C) 2009-2010  Sylvain Munaut <[email protected]>
-# Copyright (C) 2010  Harald Welte <[email protected]>
+# Copyright (C) 2010-2023  Harald Welte <[email protected]>
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -19,7 +19,8 @@

 import argparse
 import os
-from typing import Optional
+import re
+from typing import Optional, Union

 from smartcard.CardConnection import CardConnection
 from smartcard.CardRequest import CardRequest
@@ -36,16 +37,30 @@

     def __init__(self, opts: argparse.Namespace = 
argparse.Namespace(pcsc_dev=0), **kwargs):
         super().__init__(**kwargs)
+        self._reader = None
+        r = readers()
+        if opts.pcsc_dev is not None:
+            # actual reader index number (integer)
+            reader_number = opts.pcsc_dev
+            if reader_number >= len(r):
+                raise ReaderError('No reader found for number %d' % 
reader_number)
+            self._reader = r[reader_number]
+        else:
+            # reader regex string
+            cre = re.compile(opts.pcsc_regex)
+            for reader in r:
+                if cre.search(reader.name):
+                    self._reader = reader
+                    break
+            if not self._reader:
+                raise ReaderError('No matching reader found for regex %s' % 
opts.pcsc_regex)
+
+        self._con = self._reader.createConnection()
+
         if os.environ.get('PYSIM_INTEGRATION_TEST') == "1":
             print("Using PC/SC reader interface")
         else:
-            print("Using PC/SC reader number %u" % opts.pcsc_dev)
-        r = readers()
-        if opts.pcsc_dev >= len(r):
-            raise ReaderError('No reader found for number %d' % opts.pcsc_dev)
-        self._reader = r[opts.pcsc_dev]
-        self._con = self._reader.createConnection()
-        self._reader_number = opts.pcsc_dev
+            print("Using PC/SC reader %s" % self)

     def __del__(self):
         try:
@@ -100,10 +115,13 @@
         return i2h(data), i2h(sw)

     def __str__(self) -> str:
-        return "PCSC:%u[%s]" % (self._reader_number,  self._reader)
+        return "PCSC[%s]" % (self._reader)

     @staticmethod
     def argparse_add_reader_args(arg_parser: argparse.ArgumentParser):
         pcsc_group = arg_parser.add_argument_group('PC/SC Reader')
-        pcsc_group.add_argument('-p', '--pcsc-device', type=int, 
dest='pcsc_dev', metavar='PCSC', default=None,
-                                help='PC/SC reader number to use for SIM 
access')
+        dev_group = pcsc_group.add_mutually_exclusive_group()
+        dev_group.add_argument('-p', '--pcsc-device', type=int, 
dest='pcsc_dev', metavar='PCSC', default=None,
+                               help='Number of PC/SC reader to use for SIM 
access')
+        dev_group.add_argument('--pcsc-regex', type=str, dest='pcsc_regex', 
metavar='REGEX', default=None,
+                               help='Regex matching PC/SC reader to use for 
SIM access')

--
To view, visit https://gerrit.osmocom.org/c/pysim/+/34960?usp=email
To unsubscribe, or for help writing mail filters, visit 
https://gerrit.osmocom.org/settings

Gerrit-Project: pysim
Gerrit-Branch: master
Gerrit-Change-Id: I983f19c6741904c1adf27749c9801b44a03a5d78
Gerrit-Change-Number: 34960
Gerrit-PatchSet: 5
Gerrit-Owner: laforge <[email protected]>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: dexter <[email protected]>
Gerrit-Reviewer: fixeria <[email protected]>
Gerrit-Reviewer: laforge <[email protected]>
Gerrit-Reviewer: osmith <[email protected]>
Gerrit-MessageType: merged

Reply via email to