Source code for jnpr.junos.cfg.user_ssh_key
# 3rd-party modules
from lxml.builder import E
# local module
from jnpr.junos.cfg import Resource
from jnpr.junos import jxml as JXML
[docs]class UserSSHKey(Resource):
"""
[edit system login user <name> authentication <key-type> <key-value> ]
Resource name: tuple(<key-type>, <key-value>)
<key-type> : ['ssh-dsa', 'ssh-rsa']
<key-value> : SSH public key string (usually something very long)
Resource manager utilities:
load_key - allows you to load an ssh-key from a file or str
"""
# there are no properties, since the name <key-value> constitutes the
# actual ssk key data, yo!
PROPERTIES = []
# -----------------------------------------------------------------------
# XML readers
# -----------------------------------------------------------------------
def _xml_at_top(self):
key_t, key_v = self._name
return E.system(E.login(E.user(
E.name(self.P.name),
E.authentication(
E(key_t, E.name(key_v)
)
))))
def _xml_at_res(self, xml):
return xml.find('.//authentication/%s' % self._name[0])
def _xml_to_py(self, has_xml, has_py):
Resource._r_has_xml_status(has_xml, has_py)
# -----------------------------------------------------------------------
# UTILITY FUNCTIONS
# -----------------------------------------------------------------------
[docs] def load_key(self, path=None, key_value=None):
"""
Adds a new ssh-key to the user authentication. You can
provide either the path to the ssh-key file, or the contents
of they key (useful for loading the same key on many devices)
:path: (optional)
path to public ssh-key file on the local server,
:key_value: (optional)
the contents of the ssh public key
"""
if not self.is_mgr:
raise RuntimeError("must be a resource-manager!")
if path is None and key_value is None:
raise RuntimeError("You must provide either path or key_value")
if path is not None:
# snarf the file into key_value, yo!
with open(path, 'r') as f:
key_value = f.read().strip()
# extract some data from the key value, this will either
# be 'ssh-rsa' or 'ssh-dss'. we need to decode this to set
# the type correctly in the RPC.
vt = key_value[0:7]
key_map = {'ssh-rsa': 'ssh-rsa', 'ssh-dss': 'ssh-dsa'}
key_type = key_map.get(vt)
if key_type is None:
raise RuntimeError("Unknown ssh public key file type: %s" % vt)
# at this point we are going to add a new key, so really what we are
# doing is accessing a new instance of this class and
# doing a write, but just a touch since there are no properties, yo!
new_key = self[(key_type, key_value)]
return new_key.write(touch=True)
# -----------------------------------------------------------------------
# Manager List, Catalog
# -----------------------------------------------------------------------
def _r_list(self):
# the key list comes from the parent object.
self._rlist = self.P['$sshkeys']
def _r_catalog(self):
# no catalog but the keys
self._rcatalog = dict((k, None) for k in self.list)