diff options
-rw-r--r-- | vyroute/DataIO.py | 81 | ||||
-rw-r--r-- | vyroute/Router.py | 503 | ||||
-rw-r--r-- | vyroute/Routing.py | 29 | ||||
-rw-r--r-- | vyroute/basic_function/Modifylo.py | 43 | ||||
-rw-r--r-- | vyroute/basic_function/OSPFRoute.py | 126 | ||||
-rw-r--r-- | vyroute/basic_function/RIPRoute.py | 44 | ||||
-rw-r--r-- | vyroute/basic_function/StaticRoute.py | 47 |
7 files changed, 649 insertions, 224 deletions
diff --git a/vyroute/DataIO.py b/vyroute/DataIO.py deleted file mode 100644 index 979820e..0000000 --- a/vyroute/DataIO.py +++ /dev/null @@ -1,81 +0,0 @@ -# author=hochikong -import shelve - - -class IO(object): - - def post(self): - pass - - def put(self): - pass - - -class RawIO(IO): - # The router node record is in a python shelve object (.dat file). - def __init__(self, datafile): - """Initial member self.file. - - :param datafile: a string - """ - self.file = datafile - - def post(self, key, data): - """Create a new record in the shelve object. - - :param key: a string - :param data: a python dictionary - :return : a python dictionary - """ - temp = shelve.open(self.file) - temp[key] = data - temp.close() - return {"Result": "Create successfully."} - - def put(self, key, data): - """Update a record or delete a existing record. - - :param key: a string - :param data: a python dictionary - :return: different python dictionaries - """ - if data == {"content": "delete"}: - temp = shelve.open(self.file) - try: - del temp[key] - return {"Result": "Delete successfully."} - except KeyError: - return {"Result": "There is no key '%s'." % key} - finally: - temp.close() - else: - self.post(key, data) - return {"Result": "Update successfully."} - - def get(self, key="all"): - """Query a specific record or all records. - - :param key: 'none' or a vaild key - :param args: 'all' or 'none' - :return: different python dictionaries - """ - temp = shelve.open(self.file) - if key == "all": - print temp - temp.close() - else: - try: - print temp[key] - except KeyError: - return {"Result": "'There is no key '%s'." % key} - finally: - temp.close() - - - - - - - - - diff --git a/vyroute/Router.py b/vyroute/Router.py new file mode 100644 index 0000000..b8c6aca --- /dev/null +++ b/vyroute/Router.py @@ -0,0 +1,503 @@ +# author=hochikong +from Exscript.protocols import SSH2 +from Exscript import Account +from vyroute.basic_function import Modifylo +from vyroute.basic_function import StaticRoute +from vyroute.basic_function import RIPRoute +from vyroute.basic_function import OSPFRoute + + +class Router(object): + # Static router configuration func + def static_route(self, data): + pass + + # RIP router configuration func + def rip_route(self, data): + pass + + # OSPF router configuration func + def ospf_area(self, data): + pass + + def router_id(self, data): + pass + + def ospf_redistribute(self, data): + pass + + def ospf_adjacency(self): + pass + + def ospf_default_route(self, data): + pass + + def ospf_route_map(self, data): + pass + + # Interfaces configuration func + def lo(self, data): + pass + + # Basic VyOS configuration func + def configure(self): + pass + + def commit_config(self): + pass + + def save_config(self): + pass + + def exit_config(self): + pass + + # Login and logout a router + def login(self): + pass + + def logout(self): + pass + + +class BasicRouter(Router): + def __init__(self, address, cred): + """Initial a router object + + :param address: Router address,example:'192.168.10.10' + :param cred: Router user and password,example:'vyos:vyos' + """ + self.address = address + self.cred = list(cred) + self.divi = self.cred.index(":") + self.username = ''.join(self.cred[:self.divi]) + self.passwd = ''.join(self.cred[self.divi+1:]) + self.account = Account(self.username, self.passwd) + self.conn = SSH2() + self.status = {"object": None, "commit": None, "save": None, "configure": None} + + def login(self): + """Login the router + + :return: a python dictionary + """ + try: + if self.conn.connect(self.address) == "True": + self.conn.login(self.account) + self.status["object"] = "login" + return {"Result": "Login successfully."} + else: + return {"Error": "Connect Failed."} + except Exception, e: + return {"Error": e} + + def logout(self): + """Logout the router + + :return: a python dictionary + """ + try: + self.conn.close(force=True) + self.status["object"] = "logout" + return {"Result": "Logout successfully."} + except Exception, e: + return {"Error": e} + + def configure(self): + """Enter the VyOS configure mode + + :return: a python dictionary + """ + try: + if self.status["object"] == "login": + if self.status["configure"] is None: + self.conn.execute("configure") + self.status["configure"] = "Yes" + return {"Result": "Active configure mode successfully."} + else: + return {"Error": "In configure mode now!"} + else: + return {"Error": "Router object not connect to a router."} + except Exception, e: + return {"Error": e} + + def commit_config(self): + """Commit the configuration changes + + :return: a python dictionary + """ + try: + if self.status["object"] == "login": + if self.status["configure"] == "Yes": + if self.status["commit"] is None: + return {"Error": "You don't need to commit."} + if self.status["commit"] == "No": + self.conn.execute("commit") + self.status["commit"] = "Yes" + return {"Result": "Commit successfully."} + else: + return {"Error": "You have committed!"} + else: + return {"Error": "Router not in configure mode!"} + else: + return {"Error": "Router object not connect to a router."} + except Exception, e: + return {"Error": e} + + def save_config(self): + """Save the configuration after commit + + :return: a python dictionary + """ + try: + if self.status["object"] == "login": + if self.status["configure"] == "Yes": + if self.status["commit"] == "Yes": + if self.status["save"] is None: + return {"Error": "You don't need to save."} + if self.status["save"] == "No": + self.conn.execute("save") + self.status["save"] = "Yes" + else: + return {"Error": "You have saved!"} + else: + return {"Error": "You need to commit first!"} + else: + return {"Error": "Router not in configure mode!"} + else: + return {"Error": "Router object not connect to a router."} + except Exception, e: + return {"Error": e} + + def exit_config(self, force=False): + """Exit VyOS configure mode + + :param force: True or False + :return: a python dictionary + """ + try: + if self.status["object"] == "login": + if self.status["configure"] == "Yes": + if force is True: + self.conn.execute("exit") + self.status["configure"] = None + self.status["save"] = None + self.status["commit"] = None + return {"Result": "Exit configure mode successfully."} + if force is False: + if self.status["commit"] == "Yes": + if self.status["save"] == "Yes": + self.conn.execute("exit") + self.status["configure"] = None + self.status["save"] = None + self.status["commit"] = None + return {"Result": "Exit configure mode successfully."} + else: + return {"Error": "You should save first."} + else: + return {"Error": "You should commit first."} + else: + return {"Error": "You are not in configure mode,need not exit."} + else: + return {"Error": "Router object not connect to a router."} + except Exception, e: + return {"Error": e} + + def lo(self, data): + """Modify a router loopback address + + :param data: a python dictionary + :return: a python dictionary + """ + try: + if self.status["object"] == "login": + if self.status["configure"] == "Yes": + res = Modifylo.modifylo(self.conn, data) + if "Result" in res: + if self.status["commit"] == "No": + pass + else: + self.status["commit"] = "No" + if self.status["save"] == "No": + pass + else: + self.status["save"] = "No" + return res + else: + return res + else: + return {"Error": "You are not in configure mode."} + else: + return {"Error": "Router object not connect to a router."} + except Exception, e: + return {"Error": e} + + def static_route(self, data): + """Static router setting + + Parameter data example: + {'config':[{'target':'10.20.10.0/24','next-hop':'10.20.10.1','distance':'1'}, + {'target':"192.168.20.0/24','next-hop':'192.168.20.1','distance':'1'}, + ], + } + + :param data: a python dictionary + :return: a python dictionary + """ + try: + if self.status["object"] == "login": + if self.status["configure"] == "Yes": + res = StaticRoute.staticroute(self.conn, data) + if "Result" in res: + if self.status["commit"] == "No": + pass + else: + self.status["commit"] = "No" + if self.status["save"] == "No": + pass + else: + self.status["save"] = "No" + return res + else: + return res + else: + return {"Error": "You are not in configure mode."} + else: + return {"Error": "Router object not connect to a router."} + except Exception, e: + return {"Error": e} + + def rip_route(self, data): + """RIP protocols router setting + + Parameter data example: + {'config':['192.168.10.0/24','10.20.10.0/24'], + } + + :param data: a python dictionary + :return: a python dictionary + """ + try: + if self.status["object"] == "login": + if self.status["configure"] == "Yes": + res = RIPRoute.riproute(self.conn, data) + if "Result" in res: + if self.status["commit"] == "No": + pass + else: + self.status["commit"] = "No" + if self.status["save"] == "No": + pass + else: + self.status["save"] = "No" + return res + else: + return res + else: + return {"Error": "You are not in configure mode."} + else: + return {"Error": "Router object not connect to a router."} + except Exception, e: + return {"Error": e} + + def ospf_area(self, data): + """OSPF area setting + + Parameter data example: + {'config':[{'area':'0','network':'192.168.10.0/24'}, + {'area':'0','network':'10.20.10.0/24'}, + ], + } + + :param data: a python dictionary + :return: a python dictionary + """ + try: + if self.status["object"] == "login": + if self.status["configure"] == "Yes": + res = OSPFRoute.ospfarea(self.conn, data) + if "Result" in res: + if self.status["commit"] == "No": + pass + else: + self.status["commit"] = "No" + if self.status["save"] == "No": + pass + else: + self.status["save"] = "No" + return res + else: + return res + else: + return {"Error": "You are not in configure mode."} + else: + return {"Error": "Router object not connect to a router."} + except Exception, e: + return {"Error": e} + + def router_id(self, data): + """OSPF router id setting + + Parameter data example: + {'config':{'id':'1.1.1.1'}, + } + + :param data: a python dictionary + :return: a python dictionary + """ + try: + if self.status["object"] == "login": + if self.status["configure"] == "Yes": + res = OSPFRoute.router_id(self.conn, data) + if "Result" in res: + if self.status["commit"] == "No": + pass + else: + self.status["commit"] = "No" + if self.status["save"] == "No": + pass + else: + self.status["save"] = "No" + return res + else: + return res + else: + return {"Error": "You are not in configure mode."} + else: + return {"Error": "Router object not connect to a router."} + except Exception, e: + return {"Error": e} + + def ospf_redistribute(self, data): + """OSPF redistribute setting + + Parameter data example: + {'config':{'type':'2'}, + } + + :param data: a python dictionary + :return: a python dictionary + """ + try: + if self.status["object"] == "login": + if self.status["configure"] == "Yes": + res = OSPFRoute.ospf_redistribute(self.conn, data) + if "Result" in res: + if self.status["commit"] == "No": + pass + else: + self.status["commit"] = "No" + if self.status["save"] == "No": + pass + else: + self.status["save"] = "No" + return res + else: + return res + else: + return {"Error": "You are not in configure mode."} + else: + return {"Error": "Router object not connect to a router."} + except Exception, e: + return {"Error": e} + + def ospf_adjacency(self): + """set protocols ospf log-adjacency-changes + + :return: a python dictionary + """ + try: + if self.status["object"] == "login": + if self.status["configure"] == "Yes": + res = OSPFRoute.ospf_adjacency(self.conn) + if "Result" in res: + if self.status["commit"] == "No": + pass + else: + self.status["commit"] = "No" + if self.status["save"] == "No": + pass + else: + self.status["save"] = "No" + return res + else: + return res + else: + return {"Error": "You are not in configure mode."} + else: + return {"Error": "Router object not connect to a router."} + except Exception, e: + return {"Error": e} + + def ospf_default_route(self, data): + """set protocols ospf default-information originate always (and other 2 commands) + + Parameter data example: + {'config':{'metric':'10','metric-type':'2'}, + } + + :param data: a python dictionary + :return: a python dictionary + """ + try: + if self.status["object"] == "login": + if self.status["configure"] == "Yes": + res = OSPFRoute.ospf_default_route(self.conn, data) + if "Result" in res: + if self.status["commit"] == "No": + pass + else: + self.status["commit"] = "No" + if self.status["save"] == "No": + pass + else: + self.status["save"] = "No" + return res + else: + return res + else: + return {"Error": "You are not in configure mode."} + else: + return {"Error": "Router object not connect to a router."} + except Exception, e: + return {"Error": e} + + def ospf_route_map(self, data): + """VyOS route-map setting when you configure a OSPF router + + Parameter data example: + {'config':{'rule':'10','interface':'lo'}, + } + + :param data: a python dictionary + :return: a python dictionary + """ + try: + if self.status["object"] == "login": + if self.status["configure"] == "Yes": + res = OSPFRoute.ospf_route_map(self.conn, data) + if "Result" in res: + if self.status["commit"] == "No": + pass + else: + self.status["commit"] = "No" + if self.status["save"] == "No": + pass + else: + self.status["save"] = "No" + return res + else: + return res + else: + return {"Error": "You are not in configure mode."} + else: + return {"Error": "Router object not connect to a router."} + except Exception, e: + return {"Error": e} + + + + + + + diff --git a/vyroute/Routing.py b/vyroute/Routing.py deleted file mode 100644 index 8c1ec11..0000000 --- a/vyroute/Routing.py +++ /dev/null @@ -1,29 +0,0 @@ -# author=hochikong -from vyroute.basic_function import RIPRoute -from vyroute.basic_function import StaticRoute - - -class BasicRouting(object): - def static_routing(self,data): - pass - - def rip_routing(self,data): - pass - - def ospf_routing(self,data): - pass - - -class Routing(BasicRouting): - def static_routing(self, data): - return StaticRoute.staticroute(data) - - def rip_routing(self,data): - return RIPRoute.riproute(data) - - - - - - - diff --git a/vyroute/basic_function/Modifylo.py b/vyroute/basic_function/Modifylo.py index 6808c0d..9d88427 100644 --- a/vyroute/basic_function/Modifylo.py +++ b/vyroute/basic_function/Modifylo.py @@ -1,50 +1,21 @@ # author=hochikong -from Exscript.protocols import SSH2 -from Exscript import Account - - -def modifylo(data): +def modifylo(obj, data): """This method provide a loopback address configuration function Parameter data example: - {'router':'vyos@172.16.77.188','passwd':'vyos','config':'1.1.1.1/32' + {'config':'1.1.1.1/32' } + :param obj: a connection object :param data: a python dictionary :return: a python dictionary """ + lo_basic_configuration = "set interfaces loopback lo address %s" try: - stringlist = list(data['router']) - divi = stringlist.index('@') - user = ''.join(stringlist[:divi]) - passwd = data['passwd'] - address = ''.join(stringlist[divi+1:]) - account = Account(user, passwd) - conn = SSH2() - conn.connect(address) - conn.login(account) - -# configure mode - conn.execute("configure") - -# configure loopback interface lo address - conn.execute(lo_basic_configuration % data['config']) - - # commit configuration - conn.execute("commit") - - # save configuration - conn.execute("save") - - # exit configure mode - conn.execute("exit") - - # close connection - conn.close(force=True) - - return {"Result": "Configured successfully"} - + # Configure loopback interface lo address + obj.execute(lo_basic_configuration % data['config']) + return {"Result": "Modify successfully."} except Exception, e: return {'Error': e} diff --git a/vyroute/basic_function/OSPFRoute.py b/vyroute/basic_function/OSPFRoute.py new file mode 100644 index 0000000..b89edd6 --- /dev/null +++ b/vyroute/basic_function/OSPFRoute.py @@ -0,0 +1,126 @@ +# author=hochikong +def ospfarea(obj, data): + """This method provide a OSPF area configuration function + + Parameter data example: + {'config':[{'area':'0','network':'192.168.10.0/24'}, + {'area':'0','network':'10.20.10.0/24'}, + ], + } + + :param obj: a connection object + :param data: a python dictionary + :return: a python dictionary + """ + ospf_basic_configuration = "set protocols ospf area %s network %s" + + try: + # Configure ospf area + for i in data["config"]: + obj.execute(ospf_basic_configuration % (i['area'], i['network'])) + return {"Result": "Configured successfully"} + except Exception, e: + return {"Error": e} + + +def router_id(obj, data): + """This method provide a router id configuration function + + Parameter data example: + {'config':{'id':'1.1.1.1'}, + } + + :param obj: a connection object + :param data: a python dictionary + :return: a python dictionary + """ + router_id_configuration = "set protocols ospf parameters router-id %s" + try: + # Configure router id + obj.execute(router_id_configuration % data['config']['id']) + return {"Result": "Configured successfully"} + except Exception, e: + return {"Error": e} + + +def ospf_redistribute(obj, data): + """This method provide a router redistribute function + + Parameter data example: + {'config':{'type':'2'}, + } + + :param obj: a connection object + :param data: a python dictionary + :return: a python dictionary + """ + redistribute_configuration = {"0": "set protocols ospf redistribute connected metric-type %s", + "1": "set protocols ospf redistribute connected route-map CONNECT", + } + try: + obj.execute(redistribute_configuration['0'] % data['config']['type']) + obj.execute(redistribute_configuration['1']) + return {"Result": "Configured successfully"} + except Exception, e: + return {"Error": e} + + +def ospf_adjacency(obj): + """This method execute : set protocols ospf log-adjacency-changes + + :param obj: a connection object + :return: a python dictionary + """ + log_adjacency_changes_configuration = "set protocols ospf log-adjacency-changes" + try: + obj.execute(log_adjacency_changes_configuration) + return {"Result": "Configured successfully"} + except Exception, e: + return {"Error": e} + + +def ospf_default_route(obj, data): + """This method execute : set protocols ospf default-information originate always + and other commands + + Parameter data example: + {'config':{'metric':'10','metric-type':'2'}, + } + + :param obj: a connection object + :param data: a python dictionary + :return: a python dictionary + """ + default_route_configuration = {"0": "set protocols ospf default-information originate always", + "1": "set protocols ospf default-information originate metric %s", + "2": "set protocols ospf default-information originate metric-type %", + } + try: + obj.execute(default_route_configuration['0']) + obj.execute(default_route_configuration['1'] % data['config']['metric']) + obj.execute(default_route_configuration['2'] % data['config']['metric-type']) + return {"Result": "Configured successfully"} + except Exception, e: + return {"Error": e} + + +def ospf_route_map(obj, data): + """This method used for VyOS route-map setting when you configure a OSPF router + + Parameter data example: + {'config':{'rule':'10','interface':'lo'}, + } + + :param obj: a connection object + :param data: a python dictionary + :return: a python dictionary + """ + route_map_configuration = {"0": "set policy route-map CONNECT rule %s action permit", + "1": "set policy route-map CONNECT rule %s match interface %s", + } + try: + obj.execute(route_map_configuration['0'] % data['config']['rule']) + obj.execute(route_map_configuration['1'] % (data['config']['rule'], data['config']['interface'])) + return {"Result": "Configured successfully"} + except Exception, e: + return {"Error": e} diff --git a/vyroute/basic_function/RIPRoute.py b/vyroute/basic_function/RIPRoute.py index f559a17..085299e 100644 --- a/vyroute/basic_function/RIPRoute.py +++ b/vyroute/basic_function/RIPRoute.py @@ -1,55 +1,23 @@ # author=hochikong -from Exscript.protocols import SSH2 -from Exscript import Account - - -def riproute(data): +def riproute(obj, data): """This method provide a RIP protocols router configuration function Parameter data example: - {'router':'vyos@172.16.77.188','passwd':'vyos', - 'config':['192.168.10.0/24','10.20.10.0/24'], + {'config':['192.168.10.0/24','10.20.10.0/24'], } + :param obj: a connection object :param data: a python dictionary :return: a python dictionary """ rip_basic_configuration = "set protocols rip network %s" redistribute_configuration = "set protocols rip redistribute connected" try: - stringlist = list(data['router']) - divi = stringlist.index('@') - user = ''.join(stringlist[:divi]) - passwd = data['passwd'] - address = ''.join(stringlist[divi + 1:]) - account = Account(user, passwd) - conn = SSH2() - conn.connect(address) - conn.login(account) - - # configure mode - conn.execute("configure") - - # configure RIP router + # Configure RIP router for i in data['config']: - conn.execute(rip_basic_configuration % i) - - conn.execute(redistribute_configuration) - - # commit configuration - conn.execute("commit") - - # save configuration - conn.execute("save") - - # exit configure mode - conn.execute("exit") - - # close connection - conn.close(force=True) - + obj.execute(rip_basic_configuration % i) + obj.execute(redistribute_configuration) return {"Result": "Configured successfully"} - except Exception, e: return {"Error": e} diff --git a/vyroute/basic_function/StaticRoute.py b/vyroute/basic_function/StaticRoute.py index f9fa233..f0d6afc 100644 --- a/vyroute/basic_function/StaticRoute.py +++ b/vyroute/basic_function/StaticRoute.py @@ -1,57 +1,24 @@ # author=hochikong -from Exscript.protocols import SSH2 -from Exscript import Account - - -def staticroute(data): +def staticroute(obj, data): """This method provide a basic static router configuration function Parameter data example: - {'router':'vyos@172.16.77.188','passwd':'vyos', - 'config':[{'target':'10.20.10.0/24','next-hop':'10.20.10.1','distance':'1'}, - {'target':"192.168.20.0/24','next-hop':'192.168.20.1','distance':'1'} - ] + {'config':[{'target':'10.20.10.0/24','next-hop':'10.20.10.1','distance':'1'}, + {'target':"192.168.20.0/24','next-hop':'192.168.20.1','distance':'1'}, + ], } + :param obj: a connection object :param data: a python dictionary :return:a python dictionary """ static_basic_configuration = "set protocols static route %s next-hop %s distance %s" try: - stringlist = list(data['router']) - divi = stringlist.index('@') - user = ''.join(stringlist[:divi]) - passwd = data['passwd'] - address = ''.join(stringlist[divi+1:]) - account = Account(user, passwd) - conn = SSH2() - conn.connect(address) - conn.login(account) - - # configure mode - conn.execute("configure") - - # configure static router + # Configure static router for i in data['config']: - conn.execute(static_basic_configuration % (i['target'], - i['next-hop'], - i['distance'])) - - # commit configuration - conn.execute("commit") - - # save configuration - conn.execute("save") - - # exit configure mode - conn.execute("exit") - - # close connection - conn.close(force=True) - + obj.execute(static_basic_configuration % (i['target'], i['next-hop'], i['distance'])) return {"Result": "Configured successfully"} - except Exception, e: return {'Error': e} |