Package smartcard :: Package pyro :: Package server :: Module RemoteReaderServer
[hide private]
[frames] | no frames]

Source Code for Module smartcard.pyro.server.RemoteReaderServer

  1  """RemoteReaderServer: monitor local readers and publish them as pyro 
  2  Remote Readers. 
  3   
  4  __author__ = "gemalto http://www.gemalto.com" 
  5   
  6  Copyright 2001-2011 gemalto 
  7  Author: Jean-Daniel Aussel, mailto:jean-daniel.aussel@gemalto.com 
  8   
  9  This file is part of pyscard. 
 10   
 11  pyscard is free software; you can redistribute it and/or modify 
 12  it under the terms of the GNU Lesser General Public License as published by 
 13  the Free Software Foundation; either version 2.1 of the License, or 
 14  (at your option) any later version. 
 15   
 16  pyscard is distributed in the hope that it will be useful, 
 17  but WITHOUT ANY WARRANTY; without even the implied warranty of 
 18  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
 19  GNU Lesser General Public License for more details. 
 20   
 21  You should have received a copy of the GNU Lesser General Public License 
 22  along with pyscard; if not, write to the Free Software 
 23  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA 
 24  """ 
 25   
 26  try: 
 27      import Pyro.core 
 28      import Pyro.naming 
 29  except: 
 30      print 'You need pyro (python remote objects) at http://www.xs4all.nl/~irmen/pyro3/' 
 31      import sys 
 32      sys.exit() 
 33   
 34  import signal 
 35  import time 
 36   
 37  import smartcard.System 
 38  from smartcard.reader.Reader import Reader 
 39  from smartcard.ReaderMonitoring import ReaderMonitor, ReaderObserver 
 40  from smartcard.pyro.server.RemoteCardConnection import RemoteCardConnection 
 41  from smartcard.pyro.server import PyroDaemon 
 42  from smartcard.pyro.server import PyroNameServer 
 43   
 44   
45 -class RemoteReader(Reader, Pyro.core.ObjBase):
46 """Remote reader class that embeds a local reader.""" 47
48 - def __init__(self, reader):
49 """Encapsulate a local reader and publish as a pyro remote reader. 50 51 reader: the local reader to publish remotely 52 """ 53 Pyro.core.ObjBase.__init__(self) 54 self.readerobj = reader 55 self.name = reader.name
56
57 - def addtoreadergroup(self, groupname):
58 """Add reader to a reader group.""" 59 self.readerobj.reader.addtoreadergroup(groupname)
60
61 - def removefromreadergroup(self, groupname):
62 """Remove a reader from a reader group""" 63 self.readerobj.reader.removefromreadergroup(groupname)
64
65 - def createConnection(self):
66 """Return a card connection thru the reader.""" 67 connection = RemoteCardConnection(self.readerobj.createConnection()) 68 daemon = PyroDaemon.PyroDaemon() 69 uri = daemon.connect(connection) 70 return uri
71 72
73 -class RemoteReaderServer(ReaderObserver):
74 """Monitor local readers, and publish them as remote pyro readers. 75 """
76 - def __init__(self):
77 """Starts pyro name server and constructs reader name space.""" 78 self.pn = PyroNameServer.PyroNameServer() 79 self.pn.start() 80 self.pn.waitStarted() 81 82 Pyro.core.initServer() 83 self.ns = Pyro.naming.NameServerLocator().getNS() 84 try: 85 self.ns.createGroup(':pyscard') 86 self.ns.createGroup(':pyscard.smartcard') 87 self.ns.createGroup(':pyscard.smartcard.readers') 88 except Pyro.errors.NamingError as error: 89 print error 90 self.daemon = PyroDaemon.PyroDaemon() 91 self.remotereaders = {}
92
93 - def start(self):
94 """Start pyro daemon and accept incoming requests.""" 95 self.daemon.start()
96
97 - def update(self, observable, (addedreaders, removedreaders)):
98 """Called when a local reader is added or removed. 99 Create remote pyro reader objects for added readers. 100 Delete remote pyro reader objects for removed readers.""" 101 for reader in addedreaders: 102 remotereader = RemoteReader(reader) 103 self.remotereaders[reader.name] = remotereader 104 name = "".join(reader.name.split(' ')) 105 name = ":pyscard.smartcard.readers." + "".join(name.split('.')) 106 uri = self.daemon.connect(remotereader, name) 107 for reader in removedreaders: 108 remotereader = self.remotereaders[reader.name] 109 self.daemon.disconnect(remotereader) 110 del self.remotereaders[reader.name] 111 self.pn.listall()
112 113 114 if __name__ == '__main__': 115 readerserver = RemoteReaderServer() 116 readermonitor = ReaderMonitor() 117 readermonitor.addObserver(readerserver) 118 print 'Reader remote server up and running', 119 print 'Please enter Ctrl+C to stop and exit...' 120 readerserver.start() 121