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
46 """Remote reader class that embeds a local reader."""
47
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
60
64
71
72
74 """Monitor local readers, and publish them as remote pyro readers.
75 """
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
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