Statistics
| Branch: | Tag: | Revision:

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)