Statistics
| Branch: | Tag: | Revision:

root / ncclient / manager.py @ b2d60e49

History | View | Annotate | Download (7 kB)

1 94803aaf Shikhar Bhushan
# Copyright 2009 Shikhar Bhushan
2 94803aaf Shikhar Bhushan
#
3 94803aaf Shikhar Bhushan
# Licensed under the Apache License, Version 2.0 (the "License");
4 94803aaf Shikhar Bhushan
# you may not use this file except in compliance with the License.
5 94803aaf Shikhar Bhushan
# You may obtain a copy of the License at
6 94803aaf Shikhar Bhushan
#
7 94803aaf Shikhar Bhushan
#    http://www.apache.org/licenses/LICENSE-2.0
8 94803aaf Shikhar Bhushan
#
9 94803aaf Shikhar Bhushan
# Unless required by applicable law or agreed to in writing, software
10 94803aaf Shikhar Bhushan
# distributed under the License is distributed on an "AS IS" BASIS,
11 94803aaf Shikhar Bhushan
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 94803aaf Shikhar Bhushan
# See the License for the specific language governing permissions and
13 94803aaf Shikhar Bhushan
# limitations under the License.
14 94803aaf Shikhar Bhushan
15 4bc8021f Shikhar Bhushan
"This module is a thin layer of abstraction around the library. It exposes all core functionality."
16 216bb34c Shikhar Bhushan
17 94803aaf Shikhar Bhushan
import capabilities
18 0b7d3b31 Shikhar Bhushan
import operations
19 94803aaf Shikhar Bhushan
import transport
20 94803aaf Shikhar Bhushan
21 454339d6 Shikhar Bhushan
import logging
22 b2d60e49 Shikhar Bhushan
23 454339d6 Shikhar Bhushan
logger = logging.getLogger('ncclient.manager')
24 454339d6 Shikhar Bhushan
25 e3b66e4b Shikhar Bhushan
CAPABILITIES = [
26 68ac4439 Shikhar Bhushan
    "urn:ietf:params:netconf:base:1.0",
27 68ac4439 Shikhar Bhushan
    "urn:ietf:params:netconf:capability:writable-running:1.0",
28 68ac4439 Shikhar Bhushan
    "urn:ietf:params:netconf:capability:candidate:1.0",
29 68ac4439 Shikhar Bhushan
    "urn:ietf:params:netconf:capability:confirmed-commit:1.0",
30 68ac4439 Shikhar Bhushan
    "urn:ietf:params:netconf:capability:rollback-on-error:1.0",
31 68ac4439 Shikhar Bhushan
    "urn:ietf:params:netconf:capability:startup:1.0",
32 68ac4439 Shikhar Bhushan
    "urn:ietf:params:netconf:capability:url:1.0?scheme=http,ftp,file,https,sftp",
33 68ac4439 Shikhar Bhushan
    "urn:ietf:params:netconf:capability:validate:1.0",
34 68ac4439 Shikhar Bhushan
    "urn:ietf:params:netconf:capability:xpath:1.0",
35 68ac4439 Shikhar Bhushan
    "urn:liberouter:params:netconf:capability:power-control:1.0"
36 68ac4439 Shikhar Bhushan
    "urn:ietf:params:netconf:capability:interleave:1.0"
37 e3b66e4b Shikhar Bhushan
]
38 b2d60e49 Shikhar Bhushan
"A list of URI's representing the client's capabilities. This is used during the initial capability exchange. Modify this if you need to announce some capability not already included."
39 2f8bc438 Shikhar Bhushan
40 b660fcda Shikhar Bhushan
OPERATIONS = {
41 b660fcda Shikhar Bhushan
    "get": operations.Get,
42 b660fcda Shikhar Bhushan
    "get_config": operations.GetConfig,
43 b660fcda Shikhar Bhushan
    "edit_config": operations.EditConfig,
44 b660fcda Shikhar Bhushan
    "copy_config": operations.CopyConfig,
45 b660fcda Shikhar Bhushan
    "validate": operations.Validate,
46 b660fcda Shikhar Bhushan
    "commit": operations.Commit,
47 b660fcda Shikhar Bhushan
    "discard_changes": operations.DiscardChanges,
48 b660fcda Shikhar Bhushan
    "delete_config": operations.DeleteConfig,
49 b660fcda Shikhar Bhushan
    "lock": operations.Lock,
50 b660fcda Shikhar Bhushan
    "unlock": operations.Unlock,
51 b660fcda Shikhar Bhushan
    "close_session": operations.CloseSession,
52 b660fcda Shikhar Bhushan
    "kill_session": operations.KillSession,
53 b660fcda Shikhar Bhushan
    "poweroff_machine": operations.PoweroffMachine,
54 b660fcda Shikhar Bhushan
    "reboot_machine": operations.RebootMachine
55 b660fcda Shikhar Bhushan
}
56 b2d60e49 Shikhar Bhushan
"""Dictionary of method names and corresponding `~ncclient.operations.RPC` subclasses. It is used to lookup operations, e.g. "get_config" is mapped to `~ncclient.operations.GetConfig`. It is thus possible to add additional operations to the `Manager` API."""
57 4f650d54 Shikhar Bhushan
58 68ac4439 Shikhar Bhushan
def connect_ssh(*args, **kwds):
59 b2d60e49 Shikhar Bhushan
    """Initializes a NETCONF session over SSH, and creates a connected `Manager` instance. *host* must be specified, all the other arguments are optional and depend on the kind of host key verification and user authentication you want to complete.
60 4bc8021f Shikhar Bhushan
        
61 b2d60e49 Shikhar Bhushan
    For the purpose of host key verification, on -NIX systems a user's :file:`~/.ssh/known_hosts` file is automatically considered. The *unknown_host_cb* argument specifies a callback that will be invoked when the server's host key cannot be verified. See :func:`~ncclient.transport.ssh.default_unknown_host_cb` for function signature.
62 4bc8021f Shikhar Bhushan
    
63 4bc8021f Shikhar Bhushan
    First, ``publickey`` authentication is attempted. If a specific *key_filename* is specified, it
64 4bc8021f Shikhar Bhushan
    will be loaded and authentication attempted using it. If *allow_agent* is :const:`True` and an
65 4bc8021f Shikhar Bhushan
    SSH agent is running, the keys provided by the agent will be tried. If *look_for_keys* is
66 4bc8021f Shikhar Bhushan
    :const:`True`, keys in the :file:`~/.ssh/id_rsa` and :file:`~.ssh/id_dsa` will be tried. In case
67 4bc8021f Shikhar Bhushan
    an encrypted key file is encountered, the *password* argument will be used as a decryption
68 4bc8021f Shikhar Bhushan
    passphrase.
69 4bc8021f Shikhar Bhushan
    
70 b2d60e49 Shikhar Bhushan
    If ``publickey`` authentication fails and the *password* argument has been supplied, ``password`` / ``keyboard-interactive`` SSH authentication will be attempted.
71 4bc8021f Shikhar Bhushan
    
72 4bc8021f Shikhar Bhushan
    :param host: hostname or address on which to connect
73 4bc8021f Shikhar Bhushan
    :type host: `string`
74 4bc8021f Shikhar Bhushan
    
75 4bc8021f Shikhar Bhushan
    :param port: port on which to connect
76 4bc8021f Shikhar Bhushan
    :type port: `int`
77 4bc8021f Shikhar Bhushan
    
78 4bc8021f Shikhar Bhushan
    :param timeout: timeout for socket connect
79 4bc8021f Shikhar Bhushan
    :type timeout: `int`
80 4bc8021f Shikhar Bhushan
    
81 4bc8021f Shikhar Bhushan
    :param unknown_host_cb: optional; callback that is invoked when host key verification fails
82 4bc8021f Shikhar Bhushan
    :type unknown_host_cb: `function`
83 4bc8021f Shikhar Bhushan
    
84 4bc8021f Shikhar Bhushan
    :param username: username to authenticate with, if not specified the username of the logged-in user is used
85 4bc8021f Shikhar Bhushan
    :type username: `string`
86 4bc8021f Shikhar Bhushan
    
87 4bc8021f Shikhar Bhushan
    :param password: password for ``password`` authentication or passphrase for decrypting private key files
88 4bc8021f Shikhar Bhushan
    :type password: `string`
89 4bc8021f Shikhar Bhushan
    
90 4bc8021f Shikhar Bhushan
    :param key_filename: location of a private key file on the file system
91 4bc8021f Shikhar Bhushan
    :type key_filename: `string`
92 4bc8021f Shikhar Bhushan
    
93 4bc8021f Shikhar Bhushan
    :param allow_agent: whether to try connecting to SSH agent for keys
94 4bc8021f Shikhar Bhushan
    :type allow_agent: `bool`
95 4bc8021f Shikhar Bhushan
    
96 4bc8021f Shikhar Bhushan
    :param look_for_keys: whether to look in usual locations for keys
97 4bc8021f Shikhar Bhushan
    :type look_for_keys: `bool`
98 4bc8021f Shikhar Bhushan
    
99 4bc8021f Shikhar Bhushan
    :raises: :exc:`~ncclient.transport.SSHUnknownHostError`
100 4bc8021f Shikhar Bhushan
    :raises: :exc:`~ncclient.transport.AuthenticationError`
101 4bc8021f Shikhar Bhushan
    
102 4bc8021f Shikhar Bhushan
    :rtype: `Manager`
103 b2d60e49 Shikhar Bhushan
    """
104 e3b66e4b Shikhar Bhushan
    session = transport.SSHSession(capabilities.Capabilities(CAPABILITIES))
105 68ac4439 Shikhar Bhushan
    session.load_known_hosts()
106 68ac4439 Shikhar Bhushan
    session.connect(*args, **kwds)
107 68ac4439 Shikhar Bhushan
    return Manager(session)
108 68ac4439 Shikhar Bhushan
109 68ac4439 Shikhar Bhushan
connect = connect_ssh
110 4bc8021f Shikhar Bhushan
"Same as :func:`connect_ssh`, since SSH is the default (and currently, the only) transport."
111 216bb34c Shikhar Bhushan
112 b2d60e49 Shikhar Bhushan
class OpExecutor(type):
113 b2d60e49 Shikhar Bhushan
    def __new__(cls, name, bases, attrs):
114 b2d60e49 Shikhar Bhushan
        def make_wrapper(op_cls):
115 b2d60e49 Shikhar Bhushan
            def wrapper(self, *args, **kwds):
116 b2d60e49 Shikhar Bhushan
                return self.execute(op_cls, *args, **kwds)
117 b2d60e49 Shikhar Bhushan
            wrapper.func_doc = op_cls.request.func_doc
118 b2d60e49 Shikhar Bhushan
            return wrapper
119 b2d60e49 Shikhar Bhushan
        for op_name, op_cls in OPERATIONS.iteritems():
120 b2d60e49 Shikhar Bhushan
            attrs[op_name] = make_wrapper(op_cls)
121 b2d60e49 Shikhar Bhushan
        return super(OpExecutor, cls).__new__(cls, name, bases, attrs)
122 b2d60e49 Shikhar Bhushan
123 68ac4439 Shikhar Bhushan
class Manager(object):
124 4f650d54 Shikhar Bhushan
125 b2d60e49 Shikhar Bhushan
    __metaclass__ = OpExecutor
126 b2d60e49 Shikhar Bhushan
127 b2d60e49 Shikhar Bhushan
    RAISE_NONE = 0
128 b2d60e49 Shikhar Bhushan
    RAISE_ERRORS = 1
129 b2d60e49 Shikhar Bhushan
    RAISE_ALL = 2
130 b2d60e49 Shikhar Bhushan
131 4f650d54 Shikhar Bhushan
    def __init__(self, session):
132 179b00d4 Shikhar Bhushan
        self._session = session
133 c8381a66 Shikhar Bhushan
        self._async_mode = False
134 c8381a66 Shikhar Bhushan
        self._timeout = None
135 b2d60e49 Shikhar Bhushan
        self._raise_mode = self.RAISE_ALL
136 216bb34c Shikhar Bhushan
137 454339d6 Shikhar Bhushan
    def __enter__(self):
138 454339d6 Shikhar Bhushan
        return self
139 454339d6 Shikhar Bhushan
140 b2d60e49 Shikhar Bhushan
    def __exit__(self, *args):
141 68ac4439 Shikhar Bhushan
        self.close_session()
142 454339d6 Shikhar Bhushan
        return False
143 d6688264 Shikhar Bhushan
144 b2d60e49 Shikhar Bhushan
    def execute(self, cls, *args, **kwds):
145 b2d60e49 Shikhar Bhushan
        return cls(self._session,
146 b2d60e49 Shikhar Bhushan
                   async=self._async_mode,
147 b2d60e49 Shikhar Bhushan
                   timeout=self._timeout,
148 b2d60e49 Shikhar Bhushan
                   raise_mode=self._raise_mode).request(*args, **kwds)
149 b2d60e49 Shikhar Bhushan
150 216bb34c Shikhar Bhushan
    def locked(self, target):
151 216bb34c Shikhar Bhushan
        return operations.LockContext(self._session, target)
152 b2d60e49 Shikhar Bhushan
153 cc9af1c3 Shikhar Bhushan
    @property
154 a7cb58ce Shikhar Bhushan
    def client_capabilities(self):
155 cc9af1c3 Shikhar Bhushan
        return self._session._client_capabilities
156 4f650d54 Shikhar Bhushan
157 4f650d54 Shikhar Bhushan
    @property
158 4f650d54 Shikhar Bhushan
    def server_capabilities(self):
159 4f650d54 Shikhar Bhushan
        return self._session._server_capabilities
160 a7cb58ce Shikhar Bhushan
161 a7cb58ce Shikhar Bhushan
    @property
162 a7cb58ce Shikhar Bhushan
    def session_id(self):
163 a7cb58ce Shikhar Bhushan
        return self._session.id
164 216bb34c Shikhar Bhushan
165 216bb34c Shikhar Bhushan
    @property
166 216bb34c Shikhar Bhushan
    def connected(self):
167 216bb34c Shikhar Bhushan
        return self._session.connected
168 c8381a66 Shikhar Bhushan
169 68ac4439 Shikhar Bhushan
    def set_async_mode(self, mode):
170 68ac4439 Shikhar Bhushan
        self._async_mode = mode
171 c8381a66 Shikhar Bhushan
172 6c70b245 Shikhar Bhushan
    def set_raise_mode(self, mode):
173 b2d60e49 Shikhar Bhushan
        assert(choice in (self.RAISE_NONE, self.RAISE_ERRORS, self.RAISE_ALL))
174 6c70b245 Shikhar Bhushan
        self._raise_mode = mode
175 c8381a66 Shikhar Bhushan
176 c8381a66 Shikhar Bhushan
    async_mode = property(fget=lambda self: self._async_mode, fset=set_async_mode)
177 c8381a66 Shikhar Bhushan
178 68ac4439 Shikhar Bhushan
    raise_mode = property(fget=lambda self: self._raise_mode, fset=set_raise_mode)