Revision 583c11f6 ncclient/transport/ssh.py

b/ncclient/transport/ssh.py
32 32

  
33 33
class SSHSession(Session):
34 34
    
35
    def __init__(self, *args, **kwds):
36
        Session.__init__(self, *args, **kwds)
35
    "A NETCONF SSH session, per :rfc: 4742"
36
    
37
    def __init__(self, capabilities):
38
        Session.__init__(self, capabilities)
37 39
        self._host_keys = paramiko.HostKeys()
38 40
        self._system_host_keys = paramiko.HostKeys()
39 41
        self._transport = None
......
89 91
        self._parsing_state = expect
90 92
        self._parsing_pos = self._buffer.tell()
91 93
    
92
    def expect_close(self):
93
        self._expecting_close = True
94
    
95 94
    def load_system_host_keys(self, filename=None):
96 95
        if filename is None:
97 96
            filename = os.path.expanduser('~/.ssh/known_hosts')
......
115 114
    
116 115
    def save_host_keys(self, filename):
117 116
        f = open(filename, 'w')
118
        for hostname, keys in self._host_keys.iteritems():
117
        for host, keys in self._host_keys.iteritems():
119 118
            for keytype, key in keys.iteritems():
120
                f.write('%s %s %s\n' % (hostname, keytype, key.get_base64()))
119
                f.write('%s %s %s\n' % (host, keytype, key.get_base64()))
121 120
        f.close()    
122 121
    
123 122
    def close(self):
124
        self.expect_close()
123
        self._expecting_close = True
125 124
        if self._transport.is_active():
126 125
            self._transport.close()
127 126
        self._connected = False
128 127
    
129
    def connect(self, hostname, port=830, timeout=None,
128
    def connect(self, host, port=830, timeout=None,
130 129
                unknown_host_cb=None, username=None, password=None,
131 130
                key_filename=None, allow_agent=True, look_for_keys=True):
132
        
133 131
        assert(username is not None)
134 132
        
135 133
        for (family, socktype, proto, canonname, sockaddr) in \
136
        socket.getaddrinfo(hostname, port):
137
            if socktype==socket.SOCK_STREAM:
134
        socket.getaddrinfo(host, port):
135
            if socktype == socket.SOCK_STREAM:
138 136
                af = family
139 137
                addr = sockaddr
140 138
                break
141 139
        else:
142
            raise SSHError('No suitable address family for %s' % hostname)
140
            raise SSHError('No suitable address family for %s' % host)
143 141
        sock = socket.socket(af, socket.SOCK_STREAM)
144 142
        sock.settimeout(timeout)
145 143
        sock.connect(addr)
......
153 151
        
154 152
        # host key verification
155 153
        server_key = t.get_remote_server_key()
156
        known_host = self._host_keys.check(hostname, server_key) or \
157
                        self._system_host_keys.check(hostname, server_key)
154
        known_host = self._host_keys.check(host, server_key) or \
155
                        self._system_host_keys.check(host, server_key)
158 156
        
159 157
        if unknown_host_cb is None:
160 158
            unknown_host_cb = lambda *args: False
161
        if not known_host and not unknown_host_cb(hostname, server_key):
162
                raise SSHUnknownHostError(hostname, server_key)
159
        if not known_host and not unknown_host_cb(host, server_key):
160
                raise SSHUnknownHostError(host, server_key)
163 161
        
164 162
        if key_filename is None:
165 163
            key_filenames = []
......
283 281
    
284 282
    @property
285 283
    def transport(self):
286
        '''Get underlying paramiko transport object; this is provided so methods
287
        like set_keepalive can be called on it. See paramiko.Transport
288
        documentation for details.
289
        '''
290 284
        return self._transport
291 285
    
292 286
    @property

Also available in: Unified diff