diff --git a/server/__pycache__/gns3.cpython-36.pyc b/server/__pycache__/gns3.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0d46a1e4e32c07ca592b45698856de2191a0415a Binary files /dev/null and b/server/__pycache__/gns3.cpython-36.pyc differ diff --git a/server/__pycache__/gns3_function.cpython-36.pyc b/server/__pycache__/gns3_function.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..46863f16f95745806f9b081614b86756fe2f65da Binary files /dev/null and b/server/__pycache__/gns3_function.cpython-36.pyc differ diff --git a/server/client.py b/server/client.py new file mode 100644 index 0000000000000000000000000000000000000000..54a68463db8d52894c068a45c12cd7606d42aba3 --- /dev/null +++ b/server/client.py @@ -0,0 +1,36 @@ +#!/usr/bin/env python + +import socket + +TCP_IP = '127.0.0.1' +TCP_PORT = 5005 +BUFFER_SIZE = 1024 + +s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +s.connect((TCP_IP, TCP_PORT)) + +#print index instruction +f = open('index_instruction.txt', 'r') +file_contents = '' +file_contents += f.read() +print(file_contents) +f.close() + +while 1: + # print('Enter index:') + text = '' + index = input() + while not index: + index = input(file_contents) + s.send(index.encode('utf-8')) + data = s.recv(BUFFER_SIZE).decode('utf-8') + text += data + + while text.find('END') == -1: + data = s.recv(BUFFER_SIZE).decode('utf-8') + text += data + print(text[:-3]) + if text[:-3] == 'close': break +s.close() + +# print("received text:", text) \ No newline at end of file diff --git a/server/gns3.py b/server/gns3.py new file mode 100644 index 0000000000000000000000000000000000000000..5b4142df46a6ad8d3c1904109c6f0265c528d10a --- /dev/null +++ b/server/gns3.py @@ -0,0 +1,173 @@ +import json +import requests +from requests.auth import HTTPBasicAuth + +#GNS3 Information + +GNS3_SERVER_ADDR = '127.0.0.1' +GNS3_SERVER_PORT = '3080' +GNS3_USERNAME = 'admin' +GNS3_PASSWORD = 'cs436' + + +#URL mappings +#Copied and modified from https://gns3-server.readthedocs.io/en/latest/endpoints.html on December 17, 2018 +GNS3_URLS = { + #Appliance + 'appliances': 'v2/appliances', + 'appliance_templates': 'v2/appliances/templates', + 'initialize_node_from_template': 'v2/projects/{project_id}/appliances/{appliance_id}', + #TODO 'implement' later + #Compute + # /v2/computes + # /v2/computes/endpoint/{compute_id}/{emulator}/{action:.+} + # /v2/computes/{compute_id} + # /v2/computes/{compute_id}/auto_idlepc + # /v2/computes/{compute_id}/{emulator}/{action:.+} + # /v2/computes/{compute_id}/{emulator}/images + #Drawing + 'drawings': 'v2/projects/{project_id}/drawings', + 'drawing_instance': 'v2/projects/{project_id}/drawings/{drawing_id}', + #Gns3 vm + 'vm_settings': 'v2/gns3vm', + 'vm_engines_supported': 'v2/gns3vm/engines', + 'engine_vms_supported': '/v2/gns3vm/engines/{engine}/vms', + #Link + 'links': 'v2/projects/{project_id}/links', + 'link_instance': 'v2/projects/{project_id}/links/{link_id}', + 'link_filters': 'v2/projects/{project_id}/links/{link_id}/available_filters', + 'link_pcap': 'v2/projects/{project_id}/links/{link_id}/pcap', + 'link_start_capture': 'v2/projects/{project_id}/links/{link_id}/start_capture', + 'link_stop_capture': 'v2/projects/{project_id}/links/{link_id}/stop_capture', + #Node + 'nodes': 'v2/projects/{project_id}/nodes', + 'node_instance': 'v2/projects/{project_id}/nodes/{node_id}', + 'duplicate_node': 'v2/projects/{project_id}/nodes/{node_id}/duplicate', + 'compute_node_idlepc': 'v2/projects/{project_id}/nodes/{node_id}/dynamips/auto_idlepc', + 'compute_node_potential_idlepcs': 'v2/projects/{project_id}/nodes/{node_id}/dynamips/idlepc_proposals', + #'node_files': 'v2/projects/{project_id}/nodes/{node_id}/files/{path:.+}', + 'node_links': 'v2/projects/{project_id}/nodes/{node_id}/links', + 'reload_node': 'v2/projects/{project_id}/nodes/{node_id}/reload', + 'start_node': 'v2/projects/{project_id}/nodes/{node_id}/start', + 'stop_node': 'v2/projects/{project_id}/nodes/{node_id}/stop', + 'suspend_node': 'v2/projects/{project_id}/nodes/{node_id}/suspend', + 'reload_all_nodes': 'v2/projects/{project_id}/nodes/reload', + 'start_all_nodes': 'v2/projects/{project_id}/nodes/start', + 'stop_all_nodes': 'v2/projects/{project_id}/nodes/stop', + 'suspend__all_nodes': 'v2/projects/{project_id}/nodes/suspend', + #Project + 'projects': 'v2/projects', + 'load_project': 'v2/projects/load', + 'project_instance': 'v2/projects/{project_id}', + 'close_project': 'v2/projects/{project_id}/close', + 'duplicate_project': '/v2/projects/{project_id}/duplicate', + 'export_project': 'v2/projects/{project_id}/export', + #'access_project_file': 'v2/projects/{project_id}/files/{path:.+}', + 'import_project': 'v2/projects/{project_id}/import', + 'project_notifications': 'v2/projects/{project_id}/notifications', + 'project_notifications_websocket': 'v2/projects/{project_id}/notifications/ws', + 'open_project': 'v2/projects/{project_id}/open', + #Server + 'debug': 'v2/debug', + 'settings' : 'v2/settings', + 'shutdown': 'v2/shutdown', + 'version': 'v2/version', + #Snapshot + 'all_snapshots': 'v2/projects/{project_id}/snapshots', + 'snapshot_info': 'v2/projects/{project_id}/snapshots/{snapshot_id}', + 'restore_snapshot': '/v2/projects/{project_id}/snapshots/{snapshot_id}/restore' +} +#TODO implement later? +#Symbol +#/v2/symbols +#/v2/symbols/{symbol_id:.+}/raw + +#Generate GNS3 address for requests +GNS3_ADDR = 'http://{0}:{1}'.format(GNS3_SERVER_ADDR, GNS3_SERVER_PORT) +GNS3_AUTH = HTTPBasicAuth(GNS3_USERNAME, GNS3_PASSWORD) + +################################################################################ +##########Appliance +################################################################################ + +def gns3_get_appliances_list(): + r = requests.get('{0}/{1}'.format(GNS3_ADDR, GNS3_URLS['appliances']), auth=GNS3_AUTH) + return r.json() + +#TODO finish the rest + +################################################################################ +##########Drawing +################################################################################ + +def gns3_get_drawings_list(project_id): + drawings_url = GNS3_URLS['drawings'].format(project_id=project_id) + r = requests.get('{0}/{1}'.format(GNS3_ADDR, drawings_url), auth=GNS3_AUTH) + return r.json() + +def gns3_get_drawing(project_id, drawing_id): + drawing_url = GNS3_URLS['drawing_instance'].format(project_id=project_id, drawing_id=drawing_id) + r = requests.get('{0}/{1}'.format(GNS3_ADDR, drawing_url), auth=GNS3_AUTH) + return r.json() + +def gns3_update_drawing(project_id, drawing_id): + drawing_url = GNS3_URLS['drawing_instance'].format(project_id=project_id, drawing_id=drawing_id) + r = requests.put('{0}/{1}'.format(GNS3_ADDR, drawing_url), auth=GNS3_AUTH) + return r.json() + +def gns3_delete_drawing(project_id, drawing_id): + drawing_url = GNS3_URLS['drawing_instance'].format(project_id=project_id, drawing_id=drawing_id) + r = requests.delete('{0}/{1}'.format(GNS3_ADDR, drawing_url), auth=GNS3_AUTH) + #TODO what do we return? + return r + +#TODO next categories + +################################################################################ +#########Server +################################################################################ + +def gns3_dump_debug_info(): + r = requests.post('{0}/{1}'.format(GNS3_ADDR, GNS3_URLS['debug']), auth=GNS3_AUTH) + #TODO what do we return? + return r + +def gns3_get_settings(): + r = requests.get('{0}/{1}'.format(GNS3_ADDR, GNS3_URLS['settings']), auth=GNS3_AUTH) + return r.json() + +def gns3_shutdown_server(): + r = requests.get('{0}/{1}'.format(GNS3_ADDR, GNS3_URLS['shutdown']), auth=GNS3_AUTH) + #TODO what do we return? + return r + +def gns3_get_version(): + r = requests.get('{0}/{1}'.format(GNS3_ADDR, GNS3_URLS['version']), auth=GNS3_AUTH) + return r.json() + +def gns3_compare_version(version_to_compare): + r = requests.post('{0}/{1}'.format(GNS3_ADDR, GNS3_URLS['version']), auth=GNS3_AUTH, + json={'version': str(version_to_compare)}) + return r + + +################################################################################ +##########Implementation +################################################################################ +def gns3_nodes_information(project_id): + url = GNS3_URLS['nodes'].format(project_id=project_id) + r = requests.get('{0}/{1}'.format(GNS3_ADDR, url), auth=GNS3_AUTH) + return r.json() + +def gns3_links_information(project_id): + url = GNS3_URLS['links'].format(project_id=project_id) + r = requests.get('{0}/{1}'.format(GNS3_ADDR, url), auth=GNS3_AUTH) + return r.json() + + +#Testing +# print(gns3_get_version()) +# gns3_get_settings() +# print(gns3_shutdown_server()) +# print(gns3_compare_version('2.1.12dev1')) +# print(gns3_get_drawings_list('a')) \ No newline at end of file diff --git a/server/index_instruction.txt b/server/index_instruction.txt new file mode 100644 index 0000000000000000000000000000000000000000..8f2fc130f5d6c50a147059642e736fcb07836f69 --- /dev/null +++ b/server/index_instruction.txt @@ -0,0 +1,10 @@ +Provided functionality in GNS3: + +0: version information +1: drawing list +2: setting information +3: nodes information +4: links information +-1: close connection + +Enter index: \ No newline at end of file diff --git a/server/server.py b/server/server.py new file mode 100644 index 0000000000000000000000000000000000000000..ea4d0b1851d9c230e37c6ac67bd8c40f5afcff74 --- /dev/null +++ b/server/server.py @@ -0,0 +1,62 @@ +#!/usr/bin/env python + +import socket +import gns3 + + +TCP_IP = '127.0.0.1' +TCP_PORT = 5005 +BUFFER_SIZE = 1024 # Normally 1024, but we want fast response +project_id ='83b40958-ede6-4dec-9cff-e11bdf38bbcc' + +s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +s.bind((TCP_IP, TCP_PORT)) +s.listen(1) + +conn, addr = s.accept() +print('Connection address:', addr) +while 1: + + index = conn.recv(BUFFER_SIZE).decode('utf-8') + + if index == '0': + data = str(gns3.gns3_get_version())+str('END') + + elif index == '1': + data = str(gns3.gns3_get_drawings_list(project_id))+str('END') + + elif index == '2': + data = str(gns3.gns3_get_settings())+str('END') + + elif index == '3': + info = gns3.gns3_nodes_information(project_id) + data = '' + for nodes in info: + data += str('name: ') + str(nodes.get('name')) + '\n' + data += str('node_id: ') + str(nodes.get('node_id')) + '\n' + if nodes.get('properties').get('platform'): + data += str('platform: ') + str(nodes.get('properties').get('platform')) + '\n' + data += '\n' + data += str('END') + + elif index == '4': + info = gns3.gns3_links_information(project_id) + data = '' + for links in info: + data += str('link_id: ') + str(links.get('link_id')) + '\n' + nodes = links.get('nodes') + for node in nodes: + data += str('node_id: ') + str(node.get('node_id')) + '\n' + data += '\n' + data += str('END') + + elif index == '-1': + data = str('close')+str('END') + conn.send(data.encode('utf-8')) # echo + break + else: + data = str('incorrect msg')+str('END') + conn.send(data.encode('utf-8')) # echo + +conn.close() +