#!/usr/bin/python3 # This script checks your libccid configuration file if it contains a matching entry # for the sysmoOCTSIM reader. If not, it will generate a modified config file import plistlib, sys INFILE="/etc/libccid_Info.plist" OUTFILE="/tmp/libccid_Info.plist" VENDOR_ID=0x1d50 PRODUCT_ID=0x6141 NAME='sysmocom sysmoOCTSIM' def gen_reader_dictlist(prod_id, vend_id, names): readers = [] for i in range(0,len(prod_id)): reader = {'vendor_id': vend_id[i], 'product_id': prod_id[i], 'name': names[i]} readers.append(reader) return readers def find_reader(readers, vend_id, prod_id): for r in readers: if int(r['vendor_id'], 16) == vend_id and int(r['product_id'], 16) == prod_id: return r return None def plist_add_reader(pl, vend_id, prod_id, name): pl['ifdVendorID'].append(hex(vend_id)) pl['ifdProductID'].append(hex(prod_id)) pl['ifdFriendlyName'].append(name) if len(sys.argv) > 1: INFILE = sys.argv[1] if len(sys.argv) > 2: OUTFILE = sys.argv[2] # read the property list print("Reading libccid config file at '%s'" % (INFILE)) with open(INFILE, 'rb') as fp: pl = plistlib.load(fp) # consistency check if len(pl['ifdProductID']) != len(pl['ifdVendorID']) or len(pl['ifdProductID']) != len(pl['ifdFriendlyName']): print("input file is corrupt", file=sys.stderr) sys.exit(2) # convert into a better sorted form (one list of dicts; each dict one reader) readers = gen_reader_dictlist(pl['ifdProductID'], pl['ifdVendorID'], pl['ifdFriendlyName']) if find_reader(readers, VENDOR_ID, PRODUCT_ID): print("Matching reader already in libccid_Info.plist; no action required", file=sys.stderr) else: print("Reader not found in config file, it needs to be updated...") plist_add_reader(pl, VENDOR_ID, PRODUCT_ID, NAME) with open(OUTFILE, 'wb') as fp: plistlib.dump(pl, fp) print("Generated new config file stored as '%s'" % (OUTFILE)) print("\tWARNING: The generated file doesn't preserve comments!")