From ed958a61b5c98189870effe3ddec335fd020b333 Mon Sep 17 00:00:00 2001
From: Yang Yuechun <younggy1997@outlook.com>
Date: Wed, 19 Dec 2018 14:10:40 -0600
Subject: [PATCH] server finish

---
 server/__pycache__/gns3.cpython-36.pyc        | Bin 7687 -> 8240 bytes
 server/__pycache__/gns3_helper.cpython-36.pyc | Bin 1436 -> 2065 bytes
 server/client.py                              |   4 +-
 server/gns3.py                                |  31 +++---
 server/gns3_helper.py                         |  42 ++++++--
 server/index_instruction.txt                  |   4 +-
 server/server.py                              |  93 ++++++++++++++++--
 7 files changed, 146 insertions(+), 28 deletions(-)

diff --git a/server/__pycache__/gns3.cpython-36.pyc b/server/__pycache__/gns3.cpython-36.pyc
index 53742264b3cf9ba6d500f54ddb1cc925e0791cdd..60c294e139eb5b633cdd194379ed1346e10c692a 100644
GIT binary patch
literal 8240
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
EKZ<tc<p2Nx

delta 2608
zcmcIl%Wo4$7~k2oy=yy894GNB!46Jhx&><TfDlRvQVvBzBnSj*-G^&=EtJ%Ctl5n~
ziLE`PQcnnpxm1-(FGZXxQT0%%mt2q#RaL}w@B9Ira^?GG*ALd41{JZ^{AOl%{QG|2
zV`d&-{Na3PJ`xE%yqWs)LGJgErH~?fsoVhkI9N*-L%LC>MybB3Rf|F0*lgItKlXyM
zNRsSnc$cKvy>yB#j-FvZ4P@4a1VK<`Itm?)Aw&^|5k?Tk5aIx;M8}~k4rsJ|d%b>3
zFKy8pP2lHb2U1Lq<jDm4DDs(!tF4f;y0ors%R8r9g`L@!O6c2L^>M582$F@{WL}o}
zf?HLi<Sb(T!6?b1l5bE6XE;<sQEF@%ZpV8h&<s-bIsNb86q#h1i7RY*NdEd@a{*VJ
zt$<doRgG%bqI$ToUx%hhjvXDov>XO8?O+CY;w)cdQ#b5H^7Qe%Vh&+lpX{}0j!Xkn
ziY<rdR|b06<eoC%Rq-a7T@W6OWH?J^P}_w_51XycE-DW;FKLg4b0pu9HrPY<f2DmM
z%aCL2PVCxA&L;92v>kCMr@%^I=-7TN8|{l+eq@@c?S1r>Y|F#EA6jAmv9&D8tFGDp
zNS+*bY<+U`U5(HW(aS!E{vOSf6YSOK&!(p{cC;*?RyNA2LO(zb*O9@a=Q=X{eDhkq
zdilF5lxCThz0Cui6~;5GRAG^LB6bR1R73!Le9-)?FcFVy;$6}b4RJ%#qzz*Dnqrge
zN^CYYW)f~`JM0`Wg`K(1G2`BJ^e7Pa?Kn&3_Sdz;6xuuXH{j3%00N1UBr)k63@aEr
ze1g#Y&{m-7R{=EAloEm_CWIz|9>z^S^gigJX)tcWH~u~VJ+zi=2pdF`H$+1+e7mCI
zZ_1i-S86Fu<+`8-SGO}eIh3sD&P{&79whE9b!*Ql?vr3ybvB=?xOo-ub0J8_+3jQ@
zUko%h;pUii`Z-#FfA<&4i{x0v_Im;Rrt`3<0<H597;(2TZJGd5$!gC9(Q{S6cPm_5
zuYX&zL;5GY(0S4cU4VMOY%1^u4hPSY@5?H8uv34|ZFO)m2YI^f+p=7%{e{Nc`HT~K
z8s_YN`jUyMd|w(Ojt01;LBgI(!Wo!X7)yU@hTfxwsI6g3Z&d3V%6Q_Eu_&1Dl;Th~
z(9e+C$?#e94qE3qxNyvF(eP0U{$m9@vHJ(6ZPq0iza^^|=|FEVp0|0U0-@(%qUQK@
zL8I))OwsHff1RSEX;?)k5V8o92swmlgc*c9!Z8FD;W)wx1U&QjDZ=*@UBD?;A;mhN
eiwGDqiY|g2FzVh`DfWH#mxy1H6hHq-iu4+Usjm3|

diff --git a/server/__pycache__/gns3_helper.cpython-36.pyc b/server/__pycache__/gns3_helper.cpython-36.pyc
index 4ba445dd2ed5e0127f25d4d097bb8ce90b2a157c..6ef50ba8fbf95320a75d28f08d5124ac9b89bef4 100644
GIT binary patch
literal 2065
zcmZuyOK%)S5bmDW&aQX;k^#ekR|05-?2R7*M_4E*IUo*BM2r%RK%?2|wlkaEnMwDo
zv8~+;%YnbZl^cJlubgt>2js+8J)5;-F|Drds(#k@RrTz3I<0^I{NU$jA!GlrYoCMu
zeN-(V1QUG7qPpb~x4IKKwsj-dwqE23C-Q|G1;P{l?<{JFKs3;XA{0%uP0<odXj`H!
zI%t=~vRFae7W@h8uD-%a?CA3L!Crs=&b_+_TT;lcw)TZgx9+7UCtGr7r!P+S4*LBx
zy=?C6e!YDMWhdpd4xfkWqdq{@KR{$`%Fpjl*Z|j`@rUe}-KhhcJ8@ufW_;ob=a5;=
zwVDgfop5XMX8e%7Tz$$WbUFXX_+_Cg9W5s!DJ!Ysd_3w)6)lnZjndN3t(J^rmmBv~
zR$b3{c_E}}+2wJTpA^QUe$=!p$?!K*4czy2zxR`tO7})d+IuMVi>fGl<2<V_;!+g@
znN~fS%Kg2&ahjC6Dsma0saPaclFFQ}be8FHGR!WMDl76HwmOrlcbe<H__-XGQf-$P
ziV$iMLdy`0dwdmj8D-tEV=0;GqlpBmh4U|TPT7=IY``l(H|2s)o%7!&1ncG01+3o0
z9RN@Oi8vr2p%JW}u&_b{q|m(i*kWddm3G9Rj|4N0*^L=jf7o3XI#xF@hYkD*_Tud2
z=2KP$BBcI=fu`n>VZa;kn+BmCXTmhnBG<)GDhlbS1tft)l}T;Fa+p*ng&JLUXtMrz
zTmnofx((wIYG%!vEoW+EK?RL96WCd~*wA8Tf}|{EE)XLs%d4($T30KLS94B0DFQTV
z)>i}ZmiAg80hw8=ZxCOt-hf$u2tib}=9TE8(sow)2HKFTcQIo@9i6hEu7dJ5b?474
zZI2h(;8K1d8xZk`eM_Qn-)D2mTtURVu?N@eH5ryZkg)+W{I|%68pAAqK_vLrBSopI
zmLSX=0}=1MBIA|5d)cN%3oZghfoj&ssIOC@R%tWK!5a0}A&_mYYZD1P<B=h1lB}0g
zs{Ie<SL;5<1Wjve%n9{nzKLRyCNffrCHm-ist-{0Aw-=Z6E<_E4q-N92u)|;5yH0T
zPq=X2V}oGE$Wk>ZNoWM&>m6y@xYK&gZ<!|IHb>4Q9z)Zt<S>`jFzZLbvF#e~`$tcX
zqZK6+5hKqpVws#uW&B@NR^hp^_HkZiLlek6MSRx?xsmty(T~T9-T>oN`OOeqnI9X^
z(`J`EYeO)ETZj-`r*QiMdP<JdN1?U=;Q$Ifxo{e9#LPNd=jXtI>n>d9<T`>2qf@ue
zegNQF0F0mLG|T2VsE@E)*H^dDsLx2;hA;vC2@8ijMSRu%xaml!cSyZKGI>Rh0K6KF
zl3aX)Ihs<AA%Ql@qc724{7NV!i3v+9MFM$5R94m}jz1x8>l~RN9Tpl4ImWlW8e?8x
z>Bb#8cE%fAzr(JYkYjZEHrj5d4)q3p8)c%karK2(pJ2o|r)eGTpF*=wj!k$)v1qxl
q*SEV|^W2_q-<9xiREY6VeoKz&O^6Vu+TwWJbHY}*9=5|~82kqbT-qQ2

delta 853
zcmY*XPiqrF6raDFP12@`ZB3*iNLwKwYE=-llt86;vSN$EqJ+3JhFv$ib#_y&Y>2R4
z6fa@HlYRjGD4sme#e-kKvlo4{Te0rr{pS6fd9%Mav*yS8>b3d#+Urke9=+uV{Xi!^
z0(K8H?#))$&J%|TD%cz3aKVKIt0gMJhP5K_9_m(S?=N0=|89q~5Ch#d`#%5-(F7&P
z#|g>s1PeSNFAr0E8$Ay59kSI+sZRyZFrbxTmHzLiOjw&JMLtVehB12Hd597&D#lI`
zG`I6_WF`MeE?_Hf({--tP$u~f?JjE;MnXDOgMBZ28hu8pmA}Koo4PeV5Q9YaO)4&O
zwz=(D0E8K?9cu%Z(!@((*;p;+U+EXj@-e%7s{*yU6?oyZ@&q*+BwiG%D#TUIK;6I`
zK$q#-iNZ$yoh{c}CR@O%{5Ly2?SLOI0hBi|cWB@aNYQx(;x08=_$*Lk7Zg7L14yNY
z;*_Q+BNO1tCm8}pfpXx90ejfz#uK!Sj$>9z1ZyLoXAtqHMe&3~aV0~ri37R(?yKs?
z)f<<tfNW?!h+WT%&EuG_{lcqVTUQeqgfa=dCyupWn9hQd1JOT}>ZmUVL#ebSqzgQ2
z{z7?))Rqj5>(q+6ahQ04=58>JV%fDEc5nCozNYR-DD#I7yR*BuuSpWB1#nBgO47j9
zjk0~;jlwtz<Ql}{27sY(jx=Cw9W%Cdh;(gLOsoRW<6scSn#M=5ItQ6@V%v+xG&C3G
dCp!IWXK#)oF%IMwhO(lO4ab8JM(n0N_XiI(x3T~L

diff --git a/server/client.py b/server/client.py
index 57259ad..a6dde56 100644
--- a/server/client.py
+++ b/server/client.py
@@ -4,8 +4,8 @@ import socket
 
 # TCP_IP = '127.0.0.1'
 # TCP_PORT = 5006
-BUFFER_SIZE = 1024
-UDP_IP = "10.193.163.46"
+BUFFER_SIZE = 2048
+UDP_IP = "127.0.0.1"
 UDP_PORT = 5005
 # MESSAGE = "Hello, World!"
 
diff --git a/server/gns3.py b/server/gns3.py
index a23a96f..8b8c111 100644
--- a/server/gns3.py
+++ b/server/gns3.py
@@ -171,17 +171,20 @@ def node_create(project_id, name):
     return r.json()
 
 def node_delete(project_id, node_id):
-    url = GNS3_URLS['nodes'].format(project_id=project_id)
-    r = requests.delete('{0}/{1}/{2}'.format(GNS3_ADDR, url, node_id), auth=GNS3_AUTH)
+    url = GNS3_URLS['node_instance'].format(project_id=project_id, node_id=node_id)
+    r = requests.delete('{0}/{1}'.format(GNS3_ADDR, url), auth=GNS3_AUTH)
     return r
 
 def link_create(project_id, node_id_1, node_id_2, adapter_1, adapter_2, port_1, port_2):
-    para = '{"nodes": [{"adapter_number": '+adapter_1+', "label": {"text": "Text", "x": 0, "y": 0}, "node_id": "'+node_id_1+'", "port_number": '+port_1+'}, {"adapter_number": '+adapter_2+', "node_id": "'+node_id_2+'", "port_number": '+port_2+'}]}'
+    para = '{"nodes": [{"adapter_number": '+str(adapter_1)+', "label": {"text": "Text", "x": 0, "y": 0}, "node_id": "'+str(node_id_1)+'", "port_number": '+str(port_1)+'}, {"adapter_number": '+str(adapter_2)+', "node_id": "'+str(node_id_2)+'", "port_number": '+str(port_2)+'}]}'
+    url = GNS3_URLS['links'].format(project_id=project_id)
     r = requests.post('{0}/{1}'.format(GNS3_ADDR, url), auth=GNS3_AUTH, data=para)
     return r
 
-def link_delete():
-    return
+def link_delete(project_id, link_id):
+    url = GNS3_URLS['link_instance'].format(project_id=project_id, link_id=link_id)
+    r = requests.delete('{0}/{1}'.format(GNS3_ADDR, url), auth=GNS3_AUTH)
+    return r
 
 def node_start_all(project_id):
     url = GNS3_URLS['start_all_nodes'].format(project_id=project_id)
@@ -198,14 +201,20 @@ def node_suspend_all(project_id):
     r = requests.post('{0}/{1}'.format(GNS3_ADDR, url), auth=GNS3_AUTH)
     return r
 
-def node_start():
-    return 
+def node_start(project_id, node_id):
+    url = GNS3_URLS['start_node'].format(project_id=project_id, node_id=node_id)
+    r = requests.post('{0}/{1}'.format(GNS3_ADDR, url), auth=GNS3_AUTH)
+    return r
 
-def node_stop():
-    return
+def node_stop(project_id, node_id):
+    url = GNS3_URLS['stop_node'].format(project_id=project_id, node_id=node_id)
+    r = requests.post('{0}/{1}'.format(GNS3_ADDR, url), auth=GNS3_AUTH)
+    return r
 
-def node_suspend():
-    return
+def node_suspend(project_id, node_id):
+    url = GNS3_URLS['suspend_node'].format(project_id=project_id, node_id=node_id)
+    r = requests.post('{0}/{1}'.format(GNS3_ADDR, url), auth=GNS3_AUTH)
+    return r
 
 
 
diff --git a/server/gns3_helper.py b/server/gns3_helper.py
index 950d34e..3f980d8 100644
--- a/server/gns3_helper.py
+++ b/server/gns3_helper.py
@@ -2,8 +2,20 @@ import gns3
 import getpass
 import sys
 import telnetlib
+import gc
 
 project_id ='83b40958-ede6-4dec-9cff-e11bdf38bbcc'
+HOST = "127.0.0.1"
+
+def ports_info(node):
+  ports_info = {}
+  for port in node.get('ports'):
+    port_info = {}
+    port_info['adapter_number'] = port.get('adapter_number')
+    port_info['port_number'] = port.get('port_number')
+    ports_info[port.get('short_name')] = port_info
+  # print(ports_info)
+  return ports_info
 
 def update_nodes_info():
   nodes_info = []
@@ -15,6 +27,8 @@ def update_nodes_info():
     node_info['node_id'] = node.get('node_id')
     node_info['console'] = node.get('console')
     node_info['name'] = node.get('name')
+    node_info['ports'] = ports_info(node)
+    # print(node_info['ports'])
     if node.get('properties').get('platform'):
       node_info['platform'] = node.get('properties').get('platform')
     nodes_info.append(node_info)
@@ -33,16 +47,30 @@ def update_links_info():
   print('link updated')
   return links_info
 
-def telnet_console(PORT, cmd, name):
-  HOST = "127.0.0.1"
+def connect_console(PORT, name):
   tn = telnetlib.Telnet(HOST, PORT)
 
-  tn.read_very_eager().decode('ascii')
+  tn.read_very_eager()
+  tn.write(b"\r\n")
+  tn.read_until((name+'#').encode())
+  print('connected')
+  return tn
+
+def console_command(tn, name, cmd):
   tn.write(cmd.encode('ascii') + b"\r\n")
   data = tn.read_until((name+'#').encode()).decode('ascii')
-  tn.close()
+  print(data)
   return data
 
-# print(telnet_console(5000, "show int sum", "R1"))
-# print(telnet_console(5000, "show int sum", "R1"))
-# print(telnet_console(5000, "show int sum", "R1"))
\ No newline at end of file
+def close_console(tn):
+  tn.close()
+  print('closed')
+
+# tn = connect_console(5000, "R1")
+# console_command(tn, "R1", "show int sum")
+# console_command(tn, "R1", "show ip int bri")
+# console_command(tn, "R1", "show int sum")
+# console_command(tn, "R1", "show ip int bri")
+# console_command(tn, "R1", "show int sum")
+# console_command(tn, "R1", "show ip int bri")
+# close_console(tn)
\ No newline at end of file
diff --git a/server/index_instruction.txt b/server/index_instruction.txt
index 2616d20..fdea293 100644
--- a/server/index_instruction.txt
+++ b/server/index_instruction.txt
@@ -13,7 +13,9 @@ Provided functionality in GNS3:
 10: start one node
 11: stop one node
 12: suspend one node
-13: console command
+13: connect console
+14: console command
+15: close console
 -1: close connection
 
 Enter index:
\ No newline at end of file
diff --git a/server/server.py b/server/server.py
index 97b3d20..d0a4506 100644
--- a/server/server.py
+++ b/server/server.py
@@ -8,9 +8,9 @@ import time
 
 # TCP_IP = '127.0.0.1'
 # TCP_PORT = 5006
-BUFFER_SIZE = 1024  # Normally 1024, but we want fast response
+BUFFER_SIZE = 2048  # Normally 1024, but we want fast response
 project_id ='83b40958-ede6-4dec-9cff-e11bdf38bbcc'
-UDP_IP = "10.193.163.46"
+UDP_IP = "127.0.0.1"
 UDP_PORT = 5005
 
 sock = socket.socket(socket.AF_INET, # Internet
@@ -27,6 +27,7 @@ sock.bind((UDP_IP, UDP_PORT))
 ############update information#########
 nodes_info = gn.update_nodes_info()
 links_info = gn.update_links_info()
+tn = None
 
 while 1:
 
@@ -38,7 +39,14 @@ while 1:
 
   elif index == '01':
     nodes_info = gn.update_nodes_info()
-    data = str(nodes_info)+str('END')
+    data = []
+    for node in nodes_info:
+      temp = []
+      temp.append(node.get('name'))
+      temp.append(node.get('console'))
+      temp.append(list(node['ports'].keys()))
+      data.append(temp)
+    data = str(data)+str('END')
 
   elif index == '02':
     links_info = gn.update_links_info()
@@ -48,13 +56,39 @@ while 1:
     nodes_info = gn.update_nodes_info()
     name = len(nodes_info)+1
     gns3.node_create(project_id, name)
-    data = str('okEND')
+    data = str('ok')+str('END')
 
   elif index == '04':
     nodes_info = gn.update_nodes_info()
     node_id = nodes_info[-1].get('node_id')
     data = str(gns3.node_delete(project_id, node_id))+str('END')
 
+  elif index[:2] == '05':
+    node_idx_1 = int(index[2:4])
+    node_idx_2 = int(index[4:6])
+    port_name_1 = index[6:10]
+    port_name_2 = index[10:14]
+    if node_idx_1>=0 and node_idx_1<len(nodes_info) and node_idx_2>=0 and node_idx_2<len(nodes_info) and node_idx_1!=node_idx_2:
+      node_1 = nodes_info[node_idx_1]
+      node_2 = nodes_info[node_idx_2]
+      if port_name_1 in list(node_1.get('ports').keys()) and port_name_2 in list(node_2.get('ports').keys()):
+        port_1 = node_1.get('ports').get(port_name_1)
+        port_2 = node_2.get('ports').get(port_name_2)
+        data = gns3.link_create(project_id, node_1.get('node_id'), node_2.get('node_id'), port_1.get('adapter_number'), port_2.get('adapter_number'), port_1.get('port_number'), port_2.get('port_number'))
+        data = str(data)+str('END')
+      else:
+        data = str('incorrect port')+str('END')
+    else:
+      data = str('incorrect index')+str('END')
+
+  elif index[:2] == '06':
+    links_info = gn.update_links_info()
+    link_idx = int(index[2:4])
+    if link_idx>=0 and link_idx<len(links_info):
+      data = str(gns3.link_delete(project_id, links_info[link_idx].get('link_id')))+str('END')
+    else:
+      data = str('incorrect index')+str('END')
+
   elif index == '07':
     data = str(gns3.node_start_all(project_id))+str('END')
 
@@ -64,9 +98,55 @@ while 1:
   elif index == '09':
     data = str(gns3.node_suspend_all(project_id))+str('END')
 
+  elif index[:2] == '10':
+    node_idx = int(index[2:4])
+    if node_idx>=0 and node_idx<len(nodes_info):
+      node_id = nodes_info[node_idx].get('node_id')
+      data = str(gns3.node_start(project_id, node_id))+str('END')
+    else:
+      data = str('incorrect index')+str('END')
+
+  elif index[:2] == '11':
+    node_idx = int(index[2:4])
+    if node_idx>=0 and node_idx<len(nodes_info):
+      node_id = nodes_info[node_idx].get('node_id')
+      data = str(gns3.node_stop(project_id, node_id))+str('END')
+    else:
+      data = str('incorrect index')+str('END')
+
+  elif index[:2] == '12':
+    node_idx = int(index[2:4])
+    if node_idx>=0 and node_idx<len(nodes_info):
+      node_id = nodes_info[node_idx].get('node_id')
+      data = str(gns3.node_suspend(project_id, node_id))+str('END')
+    else:
+      data = str('incorrect index')+str('END')
+
   elif index[0:2] == '13':
-    node = nodes_info[0]
-    data = gn.telnet_console(node.get('console'), index[2:], node.get('name')) + str('END')
+    node_idx = int(index[2:4])
+    if node_idx >= 0 and node_idx < len(nodes_info):
+      node = nodes_info[node_idx]
+      tn = gn.connect_console(node.get('console'), node.get('name'))
+      data = str('connected')+str('END')
+    else:
+      data = str('incorrect index')+str('END')
+
+  elif index[0:2] == '14':
+    if tn:
+      node_idx = int(index[2:4])
+      cmd = index[4:]
+      node = nodes_info[node_idx]
+      data = str(gn.console_command(tn, node.get('name'), cmd))+str('END')
+    else: 
+      data = str('no connection')+str('END')
+
+  elif index[0:2] == '15':
+    if tn:
+      gn.close_console(tn)
+      tn = None
+      data = str('closed')+str('END')
+    else:
+      data = str('no connection')+str('END')
 
   elif index == '-1':
     data = str('close')+str('END')
@@ -75,4 +155,3 @@ while 1:
     data = str('incorrect msg')+str('END')
   sock.sendto(data.encode('utf-8'), addr)  # echo
 
-# conn.close()
-- 
GitLab