Statistics
| Branch: | Tag: | Revision:

root / ncclient / listeners.py @ ee4bb099

History | View | Annotate | Download (2.3 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 ee4bb099 Shikhar Bhushan
        self._subscription = None
36 7101ce49 Shikhar Bhushan
    
37 38a9b062 Shikhar Bhushan
    def __str__(self):
38 38a9b062 Shikhar Bhushan
        return 'SessionListener'
39 38a9b062 Shikhar Bhushan
    
40 ee4bb099 Shikhar Bhushan
    def set_subscription(self, id):   
41 35ad9d81 Shikhar Bhushan
        self._subscription = id
42 7101ce49 Shikhar Bhushan
    
43 ee4bb099 Shikhar Bhushan
    def expect_close(self):
44 ee4bb099 Shikhar Bhushan
        self._expecting_close = True
45 ee4bb099 Shikhar Bhushan
    
46 efc6b445 Shikhar Bhushan
    def register(self, id, op):
47 efc6b445 Shikhar Bhushan
        self._id2rpc[id] = op
48 efc6b445 Shikhar Bhushan
    
49 efc6b445 Shikhar Bhushan
    ### Events
50 efc6b445 Shikhar Bhushan
    
51 35ad9d81 Shikhar Bhushan
    def reply(self, raw):
52 ee4bb099 Shikhar Bhushan
        try:
53 ee4bb099 Shikhar Bhushan
            id = content.parse_message_root(raw)
54 ee4bb099 Shikhar Bhushan
            if id is None:
55 ee4bb099 Shikhar Bhushan
                pass
56 ee4bb099 Shikhar Bhushan
            elif id == 'notification':
57 ee4bb099 Shikhar Bhushan
                self._id2rpc[self._sub_id]._notify(raw)
58 ee4bb099 Shikhar Bhushan
            else:
59 ee4bb099 Shikhar Bhushan
                self._id2rpc[id]._response_cb(raw)
60 ee4bb099 Shikhar Bhushan
        except Exception as e:
61 ee4bb099 Shikhar Bhushan
            logger.warning(e)
62 7101ce49 Shikhar Bhushan
    
63 ee4bb099 Shikhar Bhushan
    def error(self, err):
64 ee4bb099 Shikhar Bhushan
        from ssh import SessionCloseError
65 ee4bb099 Shikhar Bhushan
        if err is SessionCloseError:
66 ee4bb099 Shikhar Bhushan
            logger.debug('received session close, expecting_close=%s' %
67 ee4bb099 Shikhar Bhushan
                         self._expecting_close)
68 ee4bb099 Shikhar Bhushan
            if not self._expecting_close:
69 ee4bb099 Shikhar Bhushan
                raise err
70 38a9b062 Shikhar Bhushan
71 38a9b062 Shikhar Bhushan
class DebugListener:
72 38a9b062 Shikhar Bhushan
    
73 38a9b062 Shikhar Bhushan
    def __str__(self):
74 38a9b062 Shikhar Bhushan
        return 'DebugListener'
75 38a9b062 Shikhar Bhushan
    
76 38a9b062 Shikhar Bhushan
    def reply(self, raw):
77 ee4bb099 Shikhar Bhushan
        logger.debug('DebugListener:reply:\n%s' % raw)
78 38a9b062 Shikhar Bhushan
    
79 38a9b062 Shikhar Bhushan
    def error(self, err):
80 ee4bb099 Shikhar Bhushan
        logger.debug('DebugListener:error:\n%s' % err)