root / ncclient / listeners.py @ 2acc860a
History | View | Annotate | Download (2.8 kB)
1 | ee4bb099 | Shikhar Bhushan | # Copyright 2009 Shikhar Bhushan
|
---|---|---|---|
2 | 7101ce49 | Shikhar Bhushan | #
|
3 | 7101ce49 | Shikhar Bhushan | # Licensed under the Apache License, Version 2.0 (the "License");
|
4 | 7101ce49 | Shikhar Bhushan | # you may not use this file except in compliance with the License.
|
5 | 7101ce49 | Shikhar Bhushan | # You may obtain a copy of the License at
|
6 | 7101ce49 | Shikhar Bhushan | #
|
7 | 7101ce49 | Shikhar Bhushan | # http://www.apache.org/licenses/LICENSE-2.0
|
8 | 7101ce49 | Shikhar Bhushan | #
|
9 | 7101ce49 | Shikhar Bhushan | # Unless required by applicable law or agreed to in writing, software
|
10 | 7101ce49 | Shikhar Bhushan | # distributed under the License is distributed on an "AS IS" BASIS,
|
11 | 7101ce49 | Shikhar Bhushan | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12 | 7101ce49 | Shikhar Bhushan | # See the License for the specific language governing permissions and
|
13 | 7101ce49 | Shikhar Bhushan | # limitations under the License.
|
14 | 7101ce49 | Shikhar Bhushan | |
15 | 38a9b062 | Shikhar Bhushan | import logging |
16 | ee4bb099 | Shikhar Bhushan | from weakref import WeakValueDictionary |
17 | ee4bb099 | Shikhar Bhushan | |
18 | ee4bb099 | Shikhar Bhushan | import content |
19 | 38a9b062 | Shikhar Bhushan | |
20 | 38a9b062 | Shikhar Bhushan | logger = logging.getLogger('ncclient.listeners')
|
21 | 7101ce49 | Shikhar Bhushan | |
22 | ee4bb099 | Shikhar Bhushan | session_listeners = {} |
23 | ee4bb099 | Shikhar Bhushan | def session_listener_factory(session): |
24 | ee4bb099 | Shikhar Bhushan | try:
|
25 | ee4bb099 | Shikhar Bhushan | return session_listeners[session]
|
26 | ee4bb099 | Shikhar Bhushan | except KeyError: |
27 | ee4bb099 | Shikhar Bhushan | session_listeners[session] = SessionListener() |
28 | ee4bb099 | Shikhar Bhushan | return session_listeners[session]
|
29 | 7101ce49 | Shikhar Bhushan | |
30 | 38a9b062 | Shikhar Bhushan | class SessionListener(object): |
31 | 38a9b062 | Shikhar Bhushan | |
32 | ee4bb099 | Shikhar Bhushan | def __init__(self): |
33 | ee4bb099 | Shikhar Bhushan | self._id2rpc = WeakValueDictionary()
|
34 | ee4bb099 | Shikhar Bhushan | self._expecting_close = False |
35 | 2acc860a | Shikhar Bhushan | sself._notification_rpc_id = None
|
36 | 7101ce49 | Shikhar Bhushan | |
37 | 38a9b062 | Shikhar Bhushan | def __str__(self): |
38 | 38a9b062 | Shikhar Bhushan | return 'SessionListener' |
39 | 38a9b062 | Shikhar Bhushan | |
40 | 2acc860a | Shikhar Bhushan | |
41 | 7101ce49 | Shikhar Bhushan | |
42 | ee4bb099 | Shikhar Bhushan | def expect_close(self): |
43 | ee4bb099 | Shikhar Bhushan | self._expecting_close = True |
44 | ee4bb099 | Shikhar Bhushan | |
45 | efc6b445 | Shikhar Bhushan | def register(self, id, op): |
46 | efc6b445 | Shikhar Bhushan | self._id2rpc[id] = op |
47 | efc6b445 | Shikhar Bhushan | |
48 | efc6b445 | Shikhar Bhushan | ### Events
|
49 | efc6b445 | Shikhar Bhushan | |
50 | 35ad9d81 | Shikhar Bhushan | def reply(self, raw): |
51 | ee4bb099 | Shikhar Bhushan | try:
|
52 | ee4bb099 | Shikhar Bhushan | id = content.parse_message_root(raw) |
53 | ee4bb099 | Shikhar Bhushan | if id is None: |
54 | ee4bb099 | Shikhar Bhushan | pass
|
55 | ee4bb099 | Shikhar Bhushan | elif id == 'notification': |
56 | ee4bb099 | Shikhar Bhushan | self._id2rpc[self._sub_id]._notify(raw) |
57 | ee4bb099 | Shikhar Bhushan | else:
|
58 | ee4bb099 | Shikhar Bhushan | self._id2rpc[id]._response_cb(raw) |
59 | ee4bb099 | Shikhar Bhushan | except Exception as e: |
60 | ee4bb099 | Shikhar Bhushan | logger.warning(e) |
61 | 7101ce49 | Shikhar Bhushan | |
62 | ee4bb099 | Shikhar Bhushan | def error(self, err): |
63 | ee4bb099 | Shikhar Bhushan | from ssh import SessionCloseError |
64 | ee4bb099 | Shikhar Bhushan | if err is SessionCloseError: |
65 | ee4bb099 | Shikhar Bhushan | logger.debug('received session close, expecting_close=%s' %
|
66 | ee4bb099 | Shikhar Bhushan | self._expecting_close)
|
67 | ee4bb099 | Shikhar Bhushan | if not self._expecting_close: |
68 | ee4bb099 | Shikhar Bhushan | raise err
|
69 | 38a9b062 | Shikhar Bhushan | |
70 | 2acc860a | Shikhar Bhushan | |
71 | 2acc860a | Shikhar Bhushan | class HelloListener: |
72 | 2acc860a | Shikhar Bhushan | |
73 | 2acc860a | Shikhar Bhushan | def __str__(self): |
74 | 2acc860a | Shikhar Bhushan | return 'HelloListener' |
75 | 2acc860a | Shikhar Bhushan | |
76 | 2acc860a | Shikhar Bhushan | def __init__(self, session): |
77 | 2acc860a | Shikhar Bhushan | self._session = session
|
78 | 2acc860a | Shikhar Bhushan | |
79 | 2acc860a | Shikhar Bhushan | def reply(self, data): |
80 | 2acc860a | Shikhar Bhushan | try:
|
81 | 2acc860a | Shikhar Bhushan | id, capabilities = content.Hello.parse(data)
|
82 | 2acc860a | Shikhar Bhushan | logger.debug('HelloListener: session_id: %s; capabilities: %s', id, capabilities) |
83 | 2acc860a | Shikhar Bhushan | self._session.initialize(id, capabilities) |
84 | 2acc860a | Shikhar Bhushan | except Exception as e: |
85 | 2acc860a | Shikhar Bhushan | self._session.initialize_error(e)
|
86 | 2acc860a | Shikhar Bhushan | |
87 | 2acc860a | Shikhar Bhushan | def error(self, err): |
88 | 2acc860a | Shikhar Bhushan | self._session.initialize_error(err)
|
89 | 2acc860a | Shikhar Bhushan | |
90 | 2acc860a | Shikhar Bhushan | |
91 | 38a9b062 | Shikhar Bhushan | class DebugListener: |
92 | 38a9b062 | Shikhar Bhushan | |
93 | 38a9b062 | Shikhar Bhushan | def __str__(self): |
94 | 38a9b062 | Shikhar Bhushan | return 'DebugListener' |
95 | 38a9b062 | Shikhar Bhushan | |
96 | 38a9b062 | Shikhar Bhushan | def reply(self, raw): |
97 | ee4bb099 | Shikhar Bhushan | logger.debug('DebugListener:reply:\n%s' % raw)
|
98 | 38a9b062 | Shikhar Bhushan | |
99 | 38a9b062 | Shikhar Bhushan | def error(self, err): |
100 | 2acc860a | Shikhar Bhushan | logger.debug('DebugListener:error:\n%s' % err) |