diff --git a/litenc/litenc.py b/litenc/litenc.py index 771a75a..4fd19bc 100644 --- a/litenc/litenc.py +++ b/litenc/litenc.py @@ -38,7 +38,17 @@ def connect(self, user=os.getenv('USER'), server="localhost", port=830, password key = self.t.get_remote_server_key() if(password==None): - self.t.auth_publickey(user, paramiko.RSAKey.from_private_key_file(private_key)) + _key = None + for key_class in (paramiko.RSAKey, paramiko.DSSKey, paramiko.ECDSAKey, paramiko.Ed25519Key): + try: + _key = key_class.from_private_key_file(private_key) + break + except Exception as e: + pass + if _key is not None: + self.t.auth_publickey(user, _key) + else: + raise Exception("Invalid private key: " + str(private_key)) else: self.t.auth_password(user, password) diff --git a/tntapi/tntapi/tntapi.py b/tntapi/tntapi/tntapi.py index ec7efee..5ca4644 100644 --- a/tntapi/tntapi/tntapi.py +++ b/tntapi/tntapi/tntapi.py @@ -57,8 +57,19 @@ def network_connect(network, skip_unreachable=False): password=None ncport = node.xpath('netconf-node:netconf-connect-params/netconf-node:ncport', namespaces=namespaces)[0].text + if(1==len(node.xpath('netconf-node:netconf-connect-params/netconf-node:public-key', namespaces=namespaces))): + publickey=node.xpath('netconf-node:netconf-connect-params/netconf-node:public-key', namespaces=namespaces)[0].text + else: + publickey=os.getenv('HOME')+"/.ssh/id_rsa.pub" + + if(1==len(node.xpath('netconf-node:netconf-connect-params/netconf-node:private-key', namespaces=namespaces))): + privatekey=node.xpath('netconf-node:netconf-connect-params/netconf-node:private-key', namespaces=namespaces)[0].text + else: + privatekey=os.getenv('HOME')+"/.ssh/id_rsa" + print("Connect to " + node_id +" (server=%(server)s user=%(user)s) password=%(password)s ncport=%(ncport)s:" % {'server':server, 'user':user, 'password':password, 'ncport':ncport}) - conns[node_id] = netconf_session_litenc(host=server,port=int(ncport),username=user,password=password,timeout=100) + conns[node_id] = netconf_session_litenc(host=server,port=int(ncport),username=user,password=password,timeout=100,publickey=publickey,privatekey=privatekey) + if conns[node_id] == None: print("FAILED connect") @@ -88,8 +99,18 @@ def network_connect_yangrpc(network): password=None ncport = node.xpath('netconf-node:netconf-connect-params/netconf-node:ncport', namespaces=namespaces)[0].text + if(1==len(node.xpath('netconf-node:netconf-connect-params/netconf-node:public-key', namespaces=namespaces))): + publickey=node.xpath('netconf-node:netconf-connect-params/netconf-node:public-key', namespaces=namespaces)[0].text + else: + publickey=os.getenv('HOME')+"/.ssh/id_rsa.pub" + + if(1==len(node.xpath('netconf-node:netconf-connect-params/netconf-node:private-key', namespaces=namespaces))): + privatekey=node.xpath('netconf-node:netconf-connect-params/netconf-node:private-key', namespaces=namespaces)[0].text + else: + privatekey=os.getenv('HOME')+"/.ssh/id_rsa" + print("Connect to YANG device " + node_id +" (server=%(server)s user=%(user)s) password=%(password)s ncport=%(ncport)s:" % {'server':server, 'user':user, 'password':password, 'ncport':ncport}) - yconns[node_id] = yangrpc.connect(server, int(ncport), user, password, os.getenv('HOME')+"/.ssh/id_rsa.pub", os.getenv('HOME')+"/.ssh/id_rsa", "--dump-session=nc-session-%s-" % (node_id)) + yconns[node_id] = yangrpc.connect(server, int(ncport), user, password, publickey, privatekey, "--dump-session=nc-session-%s-" % (node_id)) if yconns[node_id] == None: print("FAILED connect") diff --git a/tntapi/tntapi/tntapi_netconf_session_litenc.py b/tntapi/tntapi/tntapi_netconf_session_litenc.py index 4d373a3..5e279c7 100644 --- a/tntapi/tntapi/tntapi_netconf_session_litenc.py +++ b/tntapi/tntapi/tntapi_netconf_session_litenc.py @@ -11,13 +11,13 @@ class tntapi_netconf_session_litenc_class: def __init__(self): return - def connect(self, host="localhost",port=830,username="root",password=None,timeout=100): + def connect(self, host="localhost",port=830,username="root",password=None,timeout=100,private_key=None,public_key=None): conn = litenc() if(password==None): password_str="" else: password_str="password="+password - ret = conn.connect(server=host, port=port, user=username, password=password, timeout=timeout) + ret = conn.connect(server=host, port=port, user=username, password=password, timeout=timeout, private_key=private_key, public_key=public_key) if ret != 0: print("[FAILED] Connecting to server=%(server)s:" % {'server':host}) return None @@ -61,9 +61,9 @@ def rpc(self, rpc_xml_str): def close(self): self.litenc_session.close() -def netconf_session_litenc(host="localhost",port=830,username="root",password="blah",timeout=100): +def netconf_session_litenc(host="localhost",port=830,username="root",password="blah",timeout=100,publickey=None,privatekey=None): x=tntapi_netconf_session_litenc_class() - res=x.connect(host,port,username,password,timeout) + res=x.connect(host,port,username,password,timeout,privatekey,publickey) if(res==0): return x else: