From 4cd838454e5db705c6044e38b5851db0ff84bdf8 Mon Sep 17 00:00:00 2001 From: Anton Hvornum Date: Mon, 20 Jan 2020 15:55:00 +0100 Subject: [PATCH] Added sliders for switching NIC state. Also added post-restart sync with interface listing in vmanager, so interfaces now correctly show which type they are. Also added special case columns on table() so that custom elements can be injected into particular columns. --- api_modules/interface.py | 55 +++++++++++++++ api_modules/router.py | 27 ++++++- api_modules/switch.py | 27 ++++++- api_modules/virtualnic.py | 27 ++++++- web_root/index.html | 1 + web_root/slider.css | 45 ++++++++++++ web_root/vmanager-gui.css | 6 +- web_root/vmanager-gui.js | 143 +++++++++++++++++++++++++++++++++++--- web_root/vmanager.js | 8 +++ 9 files changed, 324 insertions(+), 15 deletions(-) create mode 100644 api_modules/interface.py create mode 100644 web_root/slider.css diff --git a/api_modules/interface.py b/api_modules/interface.py new file mode 100644 index 0000000..12867f5 --- /dev/null +++ b/api_modules/interface.py @@ -0,0 +1,55 @@ +import json +from os.path import isdir, isfile + +def get_overview(): + response = {'vnics' : {}, 'interfaces' : {}, 'routers' : {}, 'switches' : {}} + for nic_name in vmanager.nics: + response['vnics'][nic_name] = { + 'ip' : vmanager.nics[nic_name].ip, + 'MAC' : vmanager.nics[nic_name].mac, + 'state' : vmanager.nics[nic_name].state, + 'gateway' : vmanager.nics[nic_name].ports['sink_name'], + 'routes' : None, + 'connected_to' : None + } + + for nic_name in vmanager.interfaces: + response['interfaces'][nic_name] = vmanager.interfaces[nic_name] + + for nic_name in vmanager.routers: + response['routers'][nic_name] = vmanager.routers[nic_name] + + for nic_name in vmanager.switches: + response['switches'][nic_name] = vmanager.switches[nic_name] + + return response + +class parser(): + def process(self, path, client, data, headers, fileno, addr, *args, **kwargs): + print('### nic ###\n', data, client) + + if 'state' in data and 'target' in data: + if data['target'] in vmanager.nics: + if data['state']: + vmanager.nics[data['target']].up() + else: + vmanager.nics[data['target']].down() + elif data['target'] in vmanager.interfaces: + if data['state']: + vmanager.interfaces[data['target']].up() + else: + vmanager.interfaces[data['target']].down() + elif data['target'] in vmanager.routers: + if data['state']: + vmanager.routers[data['target']].up() + else: + vmanager.routers[data['target']].down() + elif data['target'] in vmanager.switches: + if data['state']: + vmanager.switches[data['target']].up() + else: + vmanager.switches[data['target']].down() + else: + print(f'[N] Could not locate {data["target"]}') + + return get_overview() \ No newline at end of file diff --git a/api_modules/router.py b/api_modules/router.py index 24d47bc..96de866 100644 --- a/api_modules/router.py +++ b/api_modules/router.py @@ -1,9 +1,34 @@ import json from os.path import isdir, isfile +def get_overview(): + response = {'vnics' : {}, 'interfaces' : {}, 'routers' : {}, 'switches' : {}} + for nic_name in vmanager.nics: + response['vnics'][nic_name] = { + 'ip' : vmanager.nics[nic_name].ip, + 'MAC' : vmanager.nics[nic_name].mac, + 'state' : vmanager.nics[nic_name].state, + 'gateway' : vmanager.nics[nic_name].ports['sink_name'], + 'routes' : None, + 'connected_to' : None + } + + for nic_name in vmanager.interfaces: + response['interfaces'][nic_name] = vmanager.interfaces[nic_name] + + for nic_name in vmanager.routers: + response['routers'][nic_name] = vmanager.routers[nic_name] + + for nic_name in vmanager.switches: + response['switches'][nic_name] = vmanager.switches[nic_name] + + return response + class parser(): def process(self, path, client, data, headers, fileno, addr, *args, **kwargs): print('### router ###\n', data, client) if 'new' in data: - vmanager.Router(trunk=data['new']['trunk'], ifname=data['new']['name']) \ No newline at end of file + vmanager.Router(trunk=data['new']['trunk'], ifname=data['new']['name']) + + return get_overview() \ No newline at end of file diff --git a/api_modules/switch.py b/api_modules/switch.py index 47397b1..5fdeace 100644 --- a/api_modules/switch.py +++ b/api_modules/switch.py @@ -1,9 +1,34 @@ import json from os.path import isdir, isfile +def get_overview(): + response = {'vnics' : {}, 'interfaces' : {}, 'routers' : {}, 'switches' : {}} + for nic_name in vmanager.nics: + response['vnics'][nic_name] = { + 'ip' : vmanager.nics[nic_name].ip, + 'MAC' : vmanager.nics[nic_name].mac, + 'state' : vmanager.nics[nic_name].state, + 'gateway' : vmanager.nics[nic_name].ports['sink_name'], + 'routes' : None, + 'connected_to' : None + } + + for nic_name in vmanager.interfaces: + response['interfaces'][nic_name] = vmanager.interfaces[nic_name] + + for nic_name in vmanager.routers: + response['routers'][nic_name] = vmanager.routers[nic_name] + + for nic_name in vmanager.switches: + response['switches'][nic_name] = vmanager.switches[nic_name] + + return response + class parser(): def process(self, path, client, data, headers, fileno, addr, *args, **kwargs): print('### switch ###\n', data, client) if 'new' in data: - vmanager.Switch(data['new']['name']) \ No newline at end of file + vmanager.Switch(data['new']['name']) + + return get_overview() \ No newline at end of file diff --git a/api_modules/virtualnic.py b/api_modules/virtualnic.py index ee90a04..247da83 100644 --- a/api_modules/virtualnic.py +++ b/api_modules/virtualnic.py @@ -1,9 +1,34 @@ import json from os.path import isdir, isfile +def get_overview(): + response = {'vnics' : {}, 'interfaces' : {}, 'routers' : {}, 'switches' : {}} + for nic_name in vmanager.nics: + response['vnics'][nic_name] = { + 'ip' : vmanager.nics[nic_name].ip, + 'MAC' : vmanager.nics[nic_name].mac, + 'state' : vmanager.nics[nic_name].state, + 'gateway' : vmanager.nics[nic_name].ports['sink_name'], + 'routes' : None, + 'connected_to' : None + } + + for nic_name in vmanager.interfaces: + response['interfaces'][nic_name] = vmanager.interfaces[nic_name] + + for nic_name in vmanager.routers: + response['routers'][nic_name] = vmanager.routers[nic_name] + + for nic_name in vmanager.switches: + response['switches'][nic_name] = vmanager.switches[nic_name] + + return response + class parser(): def process(self, path, client, data, headers, fileno, addr, *args, **kwargs): print('### nic ###\n', data, client) if 'new' in data: - vmanager.VirtualNic(data['new']['name']) \ No newline at end of file + vmanager.VirtualNic(data['new']['name']) + + return get_overview() \ No newline at end of file diff --git a/web_root/index.html b/web_root/index.html index a33e3b3..9be4892 100644 --- a/web_root/index.html +++ b/web_root/index.html @@ -4,6 +4,7 @@ Vmanager GUI +