Revision 634a0ea7
b/src/session.py | ||
---|---|---|
21 | 21 |
|
22 | 22 |
class Session(Thread, Subject, Listener): |
23 | 23 |
|
24 |
def __init__(self, capabilities=None): |
|
24 |
CLIENT, SERVER = range(2) |
|
25 |
|
|
26 |
def __init__(self, capabilities=None, listeners=[]): |
|
25 | 27 |
Thread.__init__(self, name='session') |
26 |
Subject.__init__(self, listeners=[self]) |
|
28 |
listeners.append(self) |
|
29 |
Subject.__init__(self, listeners=listeners) |
|
27 | 30 |
Thread.setDaemon(True) |
28 |
self.client_capabilities = capabilities |
|
29 |
self.server_capabilities = None # yet |
|
30 |
self.id = None # session-id |
|
31 |
self.connected = False |
|
32 |
self.initialised = False |
|
31 |
self._capabilities = { |
|
32 |
CLIENT: capabilities, |
|
33 |
SERVER: None # yet |
|
34 |
} |
|
35 |
self._id = None # session-id |
|
36 |
self._connected = False |
|
37 |
self._initialised = False |
|
33 | 38 |
self._q = Queue.Queue() |
34 | 39 |
|
35 | 40 |
def _init(self, id, capabilities): |
36 |
self.id = id |
|
37 |
self.capabilities[SERVER] = capabilities |
|
38 |
self.initialised = True |
|
41 |
if isinstance(id, int) and isinstance(capabilities, Capabilities): |
|
42 |
self.id = id |
|
43 |
self.capabilities[SERVER] = capabilities |
|
44 |
self.initialised = True |
|
45 |
else: |
|
46 |
raise ValueError |
|
39 | 47 |
|
40 | 48 |
def _greet(self): |
41 |
self._q.add(make_hello()) |
|
49 |
hello = Creator() |
|
50 |
# ... |
|
51 |
self._q.add(hello) |
|
42 | 52 |
|
43 | 53 |
@override |
44 | 54 |
def _close(self): |
... | ... | |
46 | 56 |
|
47 | 57 |
@override |
48 | 58 |
def connect(self): |
49 |
'call Session.connect() at the end' |
|
50 |
self._greet() |
|
51 |
Thread.start() |
|
59 |
raise NotImplementedError |
|
52 | 60 |
|
53 |
def send(self, msg): |
|
54 |
if self.connected and self.initialised: |
|
55 |
self._q.add(msg) |
|
61 |
|
|
62 |
def send(self, message): |
|
63 |
if self.ready: |
|
64 |
self._q.add(message) |
|
56 | 65 |
else: |
57 |
raise SessionError('Attempted to send message while not connected')
|
|
58 |
|
|
66 |
raise SessionError('Session not ready')
|
|
67 |
|
|
59 | 68 |
### Thread methods |
60 | 69 |
|
61 | 70 |
@override |
62 | 71 |
def run(self): |
63 | 72 |
raise NotImplementedError |
64 | 73 |
|
65 |
### Subject methods |
|
66 |
|
|
67 |
def add_listener(self, listener): |
|
68 |
if not self.initialised: |
|
69 |
raise SessionError('Listeners may only be added after session initialisation') |
|
70 |
else: |
|
71 |
Subject.add_listner(self, listener) |
|
72 |
|
|
73 |
### Listener methods |
|
74 |
# these are relevant for the initial greeting only |
|
74 |
### Listener methods - these are relevant for the initial greeting only |
|
75 | 75 |
|
76 | 76 |
def reply(self, data): |
77 |
p = Parser(data) |
|
78 |
s = p['session'] |
|
79 |
id = s['@id'] |
|
80 |
capabilities = Capabilities() |
|
81 |
capabilities.fromXML(p['capabilities']) |
|
82 |
self._init(id, capabilities) |
|
83 |
self.remove_listener(self) |
|
77 |
id, capabilities = None, None |
|
78 |
try: |
|
79 |
p = Parser() |
|
80 |
# ... |
|
81 |
self._init(id, capabilities) |
|
82 |
except: # ... |
|
83 |
pass |
|
84 |
finally: |
|
85 |
self.remove_listener(self) |
|
84 | 86 |
|
85 | 87 |
def error(self, data): |
86 | 88 |
self._close() |
87 | 89 |
raise SSHError('Session initialization failed') |
88 |
|
|
90 |
|
|
91 |
### Getter methods and properties |
|
92 |
|
|
93 |
def get_capabilities(self, whose): |
|
94 |
return self._capabilities[whose] |
|
95 |
|
|
96 |
@property |
|
97 |
def ready(self): self._connected and self._initialised |
|
98 |
|
|
99 |
@property |
|
100 |
def id(self): self._id |
|
101 |
|
|
102 |
@property |
|
103 |
def client_capabilities(self): |
|
104 |
return self._capabilities[CLIENT] |
|
105 |
|
|
106 |
@property |
|
107 |
def server_capabilities(self): |
|
108 |
return self._capabilities[SERVER] |
Also available in: Unified diff