Statistics
| Branch: | Tag: | Revision:

root / ncclient / session.py @ ee4bb099

History | View | Annotate | Download (3.3 kB)

1 589b23e4 Shikhar Bhushan
# Copyright 2009 Shikhar Bhushan
2 589b23e4 Shikhar Bhushan
#
3 589b23e4 Shikhar Bhushan
# Licensed under the Apache License, Version 2.0 (the "License");
4 589b23e4 Shikhar Bhushan
# you may not use this file except in compliance with the License.
5 589b23e4 Shikhar Bhushan
# You may obtain a copy of the License at
6 589b23e4 Shikhar Bhushan
#
7 589b23e4 Shikhar Bhushan
#    http://www.apache.org/licenses/LICENSE-2.0
8 589b23e4 Shikhar Bhushan
#
9 589b23e4 Shikhar Bhushan
# Unless required by applicable law or agreed to in writing, software
10 589b23e4 Shikhar Bhushan
# distributed under the License is distributed on an "AS IS" BASIS,
11 589b23e4 Shikhar Bhushan
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 589b23e4 Shikhar Bhushan
# See the License for the specific language governing permissions and
13 589b23e4 Shikhar Bhushan
# limitations under the License.
14 589b23e4 Shikhar Bhushan
15 589b23e4 Shikhar Bhushan
import logging
16 589b23e4 Shikhar Bhushan
from threading import Thread, Event
17 589b23e4 Shikhar Bhushan
from Queue import Queue
18 589b23e4 Shikhar Bhushan
19 ee4bb099 Shikhar Bhushan
import content
20 ee4bb099 Shikhar Bhushan
from capabilities import CAPABILITIES
21 35ad9d81 Shikhar Bhushan
from error import ClientError
22 35ad9d81 Shikhar Bhushan
from subject import Subject
23 589b23e4 Shikhar Bhushan
24 589b23e4 Shikhar Bhushan
logger = logging.getLogger('ncclient.session')
25 589b23e4 Shikhar Bhushan
26 ee4bb099 Shikhar Bhushan
class SessionError(ClientError): pass
27 589b23e4 Shikhar Bhushan
28 589b23e4 Shikhar Bhushan
class Session(Thread, Subject):
29 589b23e4 Shikhar Bhushan
    
30 589b23e4 Shikhar Bhushan
    def __init__(self):
31 589b23e4 Shikhar Bhushan
        Thread.__init__(self, name='session')
32 589b23e4 Shikhar Bhushan
        Subject.__init__(self, listeners=[Session.HelloListener(self)])
33 589b23e4 Shikhar Bhushan
        self._client_capabilities = CAPABILITIES
34 589b23e4 Shikhar Bhushan
        self._server_capabilities = None # yet
35 589b23e4 Shikhar Bhushan
        self._id = None # session-id
36 589b23e4 Shikhar Bhushan
        self._error = None
37 589b23e4 Shikhar Bhushan
        self._init_event = Event()
38 589b23e4 Shikhar Bhushan
        self._q = Queue()
39 ee4bb099 Shikhar Bhushan
        self._connected = False # to be set/cleared by subclass
40 ee4bb099 Shikhar Bhushan
    
41 ee4bb099 Shikhar Bhushan
    def _post_connect(self):
42 ee4bb099 Shikhar Bhushan
        # start the subclass' main loop
43 ee4bb099 Shikhar Bhushan
        self.start()
44 ee4bb099 Shikhar Bhushan
        # queue client's hello message for sending
45 ee4bb099 Shikhar Bhushan
        self.send(content.make_hello(self._client_capabilities))
46 ee4bb099 Shikhar Bhushan
        # we expect server's hello message, wait for _init_event to be set by HelloListener
47 ee4bb099 Shikhar Bhushan
        self._init_event.wait()
48 ee4bb099 Shikhar Bhushan
        # there may have been an error
49 ee4bb099 Shikhar Bhushan
        if self._error:
50 ee4bb099 Shikhar Bhushan
            self._close()
51 ee4bb099 Shikhar Bhushan
            raise self._error
52 589b23e4 Shikhar Bhushan
    
53 589b23e4 Shikhar Bhushan
    def send(self, message):
54 ee4bb099 Shikhar Bhushan
        message = (u'<?xml version="1.0" encoding="UTF-8"?>%s' %
55 ee4bb099 Shikhar Bhushan
                   message).encode('utf-8')
56 589b23e4 Shikhar Bhushan
        logger.debug('queueing message: \n%s' % message)
57 589b23e4 Shikhar Bhushan
        self._q.put(message)
58 38a9b062 Shikhar Bhushan
    
59 38a9b062 Shikhar Bhushan
    def connect(self):
60 38a9b062 Shikhar Bhushan
        raise NotImplementedError
61 589b23e4 Shikhar Bhushan
62 589b23e4 Shikhar Bhushan
    def run(self):
63 589b23e4 Shikhar Bhushan
        raise NotImplementedError
64 589b23e4 Shikhar Bhushan
    
65 589b23e4 Shikhar Bhushan
    ### Properties
66 589b23e4 Shikhar Bhushan
67 589b23e4 Shikhar Bhushan
    @property
68 35ad9d81 Shikhar Bhushan
    def client_capabilities(self):
69 35ad9d81 Shikhar Bhushan
        return self._client_capabilities
70 589b23e4 Shikhar Bhushan
    
71 589b23e4 Shikhar Bhushan
    @property
72 ee4bb099 Shikhar Bhushan
    def server_capabilities(self):
73 35ad9d81 Shikhar Bhushan
        return self._server_capabilities
74 589b23e4 Shikhar Bhushan
    
75 589b23e4 Shikhar Bhushan
    @property
76 35ad9d81 Shikhar Bhushan
    def connected(self):
77 35ad9d81 Shikhar Bhushan
        return self._connected
78 589b23e4 Shikhar Bhushan
    
79 589b23e4 Shikhar Bhushan
    @property
80 35ad9d81 Shikhar Bhushan
    def id(self):
81 38a9b062 Shikhar Bhushan
        return self._id
82 38a9b062 Shikhar Bhushan
    
83 589b23e4 Shikhar Bhushan
    class HelloListener:
84 589b23e4 Shikhar Bhushan
        
85 38a9b062 Shikhar Bhushan
        def __str__(self):
86 38a9b062 Shikhar Bhushan
            return 'HelloListener'
87 38a9b062 Shikhar Bhushan
        
88 589b23e4 Shikhar Bhushan
        def __init__(self, session):
89 589b23e4 Shikhar Bhushan
            self._session = session
90 589b23e4 Shikhar Bhushan
        
91 589b23e4 Shikhar Bhushan
        def _done(self, err=None):
92 589b23e4 Shikhar Bhushan
            if err is not None:
93 589b23e4 Shikhar Bhushan
                self._session._error = err
94 589b23e4 Shikhar Bhushan
            self._session.remove_listener(self)
95 589b23e4 Shikhar Bhushan
            self._session._init_event.set()
96 589b23e4 Shikhar Bhushan
        
97 589b23e4 Shikhar Bhushan
        def reply(self, data):
98 589b23e4 Shikhar Bhushan
            err = None
99 589b23e4 Shikhar Bhushan
            try:
100 efc6b445 Shikhar Bhushan
                id, capabilities = content.parse_hello(data)
101 589b23e4 Shikhar Bhushan
                logger.debug('session_id: %s | capabilities: \n%s', id, capabilities)
102 589b23e4 Shikhar Bhushan
                self._session._id, self._session.capabilities = id, capabilities
103 589b23e4 Shikhar Bhushan
            except Exception as e:
104 589b23e4 Shikhar Bhushan
                err = e
105 589b23e4 Shikhar Bhushan
            finally:
106 589b23e4 Shikhar Bhushan
                self._done(err)
107 589b23e4 Shikhar Bhushan
        
108 38a9b062 Shikhar Bhushan
        def error(self, err):
109 589b23e4 Shikhar Bhushan
            self._done(err)