handlers.go 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504
  1. package ganserv
  2. import (
  3. "encoding/json"
  4. "net"
  5. "net/http"
  6. "regexp"
  7. "strings"
  8. "imuslab.com/zoraxy/mod/utils"
  9. )
  10. func (m *NetworkManager) HandleGetNodeID(w http.ResponseWriter, r *http.Request) {
  11. if m.ControllerID == "" {
  12. //Node id not exists. Check again
  13. instanceInfo, err := getControllerInfo(m.option.AuthToken, m.option.ApiPort)
  14. if err != nil {
  15. utils.SendErrorResponse(w, "unable to access node id information")
  16. return
  17. }
  18. m.ControllerID = instanceInfo.Address
  19. }
  20. js, _ := json.Marshal(m.ControllerID)
  21. utils.SendJSONResponse(w, string(js))
  22. }
  23. func (m *NetworkManager) HandleAddNetwork(w http.ResponseWriter, r *http.Request) {
  24. networkInfo, err := m.createNetwork()
  25. if err != nil {
  26. utils.SendErrorResponse(w, err.Error())
  27. return
  28. }
  29. //Network created. Assign it the standard network settings
  30. err = m.configureNetwork(networkInfo.Nwid, "192.168.192.1", "192.168.192.254", "192.168.192.0/24")
  31. if err != nil {
  32. utils.SendErrorResponse(w, err.Error())
  33. return
  34. }
  35. // Return the new network ID
  36. js, _ := json.Marshal(networkInfo.Nwid)
  37. utils.SendJSONResponse(w, string(js))
  38. }
  39. func (m *NetworkManager) HandleRemoveNetwork(w http.ResponseWriter, r *http.Request) {
  40. networkID, err := utils.PostPara(r, "id")
  41. if err != nil {
  42. utils.SendErrorResponse(w, "invalid or empty network id given")
  43. return
  44. }
  45. if !m.networkExists(networkID) {
  46. utils.SendErrorResponse(w, "network id not exists")
  47. return
  48. }
  49. err = m.deleteNetwork(networkID)
  50. if err != nil {
  51. utils.SendErrorResponse(w, err.Error())
  52. }
  53. utils.SendOK(w)
  54. }
  55. func (m *NetworkManager) HandleListNetwork(w http.ResponseWriter, r *http.Request) {
  56. netid, _ := utils.GetPara(r, "netid")
  57. if netid != "" {
  58. targetNetInfo, err := m.getNetworkInfoById(netid)
  59. if err != nil {
  60. utils.SendErrorResponse(w, err.Error())
  61. return
  62. }
  63. js, _ := json.Marshal(targetNetInfo)
  64. utils.SendJSONResponse(w, string(js))
  65. } else {
  66. // Return the list of networks as JSON
  67. networkIds, err := m.listNetworkIds()
  68. if err != nil {
  69. utils.SendErrorResponse(w, err.Error())
  70. return
  71. }
  72. networkInfos := []*NetworkInfo{}
  73. for _, id := range networkIds {
  74. thisNetInfo, err := m.getNetworkInfoById(id)
  75. if err == nil {
  76. networkInfos = append(networkInfos, thisNetInfo)
  77. }
  78. }
  79. js, _ := json.Marshal(networkInfos)
  80. utils.SendJSONResponse(w, string(js))
  81. }
  82. }
  83. func (m *NetworkManager) HandleNetworkNaming(w http.ResponseWriter, r *http.Request) {
  84. netid, err := utils.PostPara(r, "netid")
  85. if err != nil {
  86. utils.SendErrorResponse(w, "network id not given")
  87. return
  88. }
  89. if !m.networkExists(netid) {
  90. utils.SendErrorResponse(w, "network not eixsts")
  91. }
  92. newName, _ := utils.PostPara(r, "name")
  93. newDesc, _ := utils.PostPara(r, "desc")
  94. if newName != "" && newDesc != "" {
  95. //Strip away html from name and desc
  96. re := regexp.MustCompile("<[^>]*>")
  97. newName := re.ReplaceAllString(newName, "")
  98. newDesc := re.ReplaceAllString(newDesc, "")
  99. //Set the new network name and desc
  100. err = m.setNetworkNameAndDescription(netid, newName, newDesc)
  101. if err != nil {
  102. utils.SendErrorResponse(w, err.Error())
  103. return
  104. }
  105. utils.SendOK(w)
  106. } else {
  107. //Get current name and description
  108. name, desc, err := m.getNetworkNameAndDescription(netid)
  109. if err != nil {
  110. utils.SendErrorResponse(w, err.Error())
  111. return
  112. }
  113. js, _ := json.Marshal([]string{name, desc})
  114. utils.SendJSONResponse(w, string(js))
  115. }
  116. }
  117. func (m *NetworkManager) HandleNetworkDetails(w http.ResponseWriter, r *http.Request) {
  118. netid, err := utils.PostPara(r, "netid")
  119. if err != nil {
  120. utils.SendErrorResponse(w, "netid not given")
  121. return
  122. }
  123. targetNetwork, err := m.getNetworkInfoById(netid)
  124. if err != nil {
  125. utils.SendErrorResponse(w, err.Error())
  126. return
  127. }
  128. js, _ := json.Marshal(targetNetwork)
  129. utils.SendJSONResponse(w, string(js))
  130. }
  131. func (m *NetworkManager) HandleSetRanges(w http.ResponseWriter, r *http.Request) {
  132. netid, err := utils.PostPara(r, "netid")
  133. if err != nil {
  134. utils.SendErrorResponse(w, "netid not given")
  135. return
  136. }
  137. cidr, err := utils.PostPara(r, "cidr")
  138. if err != nil {
  139. utils.SendErrorResponse(w, "cidr not given")
  140. return
  141. }
  142. ipstart, err := utils.PostPara(r, "ipstart")
  143. if err != nil {
  144. utils.SendErrorResponse(w, "ipstart not given")
  145. return
  146. }
  147. ipend, err := utils.PostPara(r, "ipend")
  148. if err != nil {
  149. utils.SendErrorResponse(w, "ipend not given")
  150. return
  151. }
  152. //Validate the CIDR is real, the ip range is within the CIDR range
  153. _, ipnet, err := net.ParseCIDR(cidr)
  154. if err != nil {
  155. utils.SendErrorResponse(w, "invalid cidr string given")
  156. return
  157. }
  158. startIP := net.ParseIP(ipstart)
  159. endIP := net.ParseIP(ipend)
  160. if startIP == nil || endIP == nil {
  161. utils.SendErrorResponse(w, "invalid start or end ip given")
  162. return
  163. }
  164. withinRange := ipnet.Contains(startIP) && ipnet.Contains(endIP)
  165. if !withinRange {
  166. utils.SendErrorResponse(w, "given CIDR did not cover all of the start to end ip range")
  167. return
  168. }
  169. err = m.configureNetwork(netid, startIP.String(), endIP.String(), strings.TrimSpace(cidr))
  170. if err != nil {
  171. utils.SendErrorResponse(w, err.Error())
  172. return
  173. }
  174. utils.SendOK(w)
  175. }
  176. // Handle listing of network members. Set details=true for listing all details
  177. func (m *NetworkManager) HandleMemberList(w http.ResponseWriter, r *http.Request) {
  178. netid, err := utils.GetPara(r, "netid")
  179. if err != nil {
  180. utils.SendErrorResponse(w, "netid is empty")
  181. return
  182. }
  183. details, _ := utils.GetPara(r, "detail")
  184. memberIds, err := m.getNetworkMembers(netid)
  185. if err != nil {
  186. utils.SendErrorResponse(w, err.Error())
  187. return
  188. }
  189. if details == "" {
  190. //Only show client ids
  191. js, _ := json.Marshal(memberIds)
  192. utils.SendJSONResponse(w, string(js))
  193. } else {
  194. //Show detail members info
  195. detailMemberInfo := []*MemberInfo{}
  196. for _, thisMemberId := range memberIds {
  197. memInfo, err := m.getNetworkMemberInfo(netid, thisMemberId)
  198. if err == nil {
  199. detailMemberInfo = append(detailMemberInfo, memInfo)
  200. }
  201. }
  202. js, _ := json.Marshal(detailMemberInfo)
  203. utils.SendJSONResponse(w, string(js))
  204. }
  205. }
  206. // Handle Authorization of members
  207. func (m *NetworkManager) HandleMemberAuthorization(w http.ResponseWriter, r *http.Request) {
  208. netid, err := utils.PostPara(r, "netid")
  209. if err != nil {
  210. utils.SendErrorResponse(w, "net id not set")
  211. return
  212. }
  213. memberid, err := utils.PostPara(r, "memid")
  214. if err != nil {
  215. utils.SendErrorResponse(w, "memid not set")
  216. return
  217. }
  218. //Check if the target memeber exists
  219. if !m.memberExistsInNetwork(netid, memberid) {
  220. utils.SendErrorResponse(w, "member not exists in given network")
  221. return
  222. }
  223. setAuthorized, err := utils.PostPara(r, "auth")
  224. if err != nil || setAuthorized == "" {
  225. //Get the member authorization state
  226. memberInfo, err := m.getNetworkMemberInfo(netid, memberid)
  227. if err != nil {
  228. utils.SendErrorResponse(w, err.Error())
  229. return
  230. }
  231. js, _ := json.Marshal(memberInfo.Authorized)
  232. utils.SendJSONResponse(w, string(js))
  233. } else if setAuthorized == "true" {
  234. m.AuthorizeMember(netid, memberid, true)
  235. } else if setAuthorized == "false" {
  236. m.AuthorizeMember(netid, memberid, false)
  237. } else {
  238. utils.SendErrorResponse(w, "unknown operation state: "+setAuthorized)
  239. }
  240. }
  241. // Handle Delete or Add IP for a member in a network
  242. func (m *NetworkManager) HandleMemberIP(w http.ResponseWriter, r *http.Request) {
  243. netid, err := utils.PostPara(r, "netid")
  244. if err != nil {
  245. utils.SendErrorResponse(w, "net id not set")
  246. return
  247. }
  248. memberid, err := utils.PostPara(r, "memid")
  249. if err != nil {
  250. utils.SendErrorResponse(w, "memid not set")
  251. return
  252. }
  253. opr, err := utils.PostPara(r, "opr")
  254. if err != nil {
  255. utils.SendErrorResponse(w, "opr not defined")
  256. return
  257. }
  258. targetip, _ := utils.PostPara(r, "ip")
  259. memberInfo, err := m.getNetworkMemberInfo(netid, memberid)
  260. if err != nil {
  261. utils.SendErrorResponse(w, err.Error())
  262. return
  263. }
  264. if opr == "add" {
  265. if targetip == "" {
  266. utils.SendErrorResponse(w, "ip not set")
  267. return
  268. }
  269. if !isValidIPAddr(targetip) {
  270. utils.SendErrorResponse(w, "ip address not valid")
  271. return
  272. }
  273. newIpList := append(memberInfo.IPAssignments, targetip)
  274. err = m.setAssignedIps(netid, memberid, newIpList)
  275. if err != nil {
  276. utils.SendErrorResponse(w, err.Error())
  277. return
  278. }
  279. utils.SendOK(w)
  280. } else if opr == "del" {
  281. if targetip == "" {
  282. utils.SendErrorResponse(w, "ip not set")
  283. return
  284. }
  285. //Delete user ip from the list
  286. newIpList := []string{}
  287. for _, thisIp := range memberInfo.IPAssignments {
  288. if thisIp != targetip {
  289. newIpList = append(newIpList, thisIp)
  290. }
  291. }
  292. err = m.setAssignedIps(netid, memberid, newIpList)
  293. if err != nil {
  294. utils.SendErrorResponse(w, err.Error())
  295. return
  296. }
  297. utils.SendOK(w)
  298. } else if opr == "get" {
  299. js, _ := json.Marshal(memberInfo.IPAssignments)
  300. utils.SendJSONResponse(w, string(js))
  301. } else {
  302. utils.SendErrorResponse(w, "unsupported opr type: "+opr)
  303. }
  304. }
  305. // Handle naming for members
  306. func (m *NetworkManager) HandleMemberNaming(w http.ResponseWriter, r *http.Request) {
  307. netid, err := utils.PostPara(r, "netid")
  308. if err != nil {
  309. utils.SendErrorResponse(w, "net id not set")
  310. return
  311. }
  312. memberid, err := utils.PostPara(r, "memid")
  313. if err != nil {
  314. utils.SendErrorResponse(w, "memid not set")
  315. return
  316. }
  317. if !m.memberExistsInNetwork(netid, memberid) {
  318. utils.SendErrorResponse(w, "target member not exists in given network")
  319. return
  320. }
  321. //Read memeber data
  322. targetMemberData := m.GetMemberMetaData(netid, memberid)
  323. newname, err := utils.PostPara(r, "name")
  324. if err != nil {
  325. //Send over the member data
  326. js, _ := json.Marshal(targetMemberData)
  327. utils.SendJSONResponse(w, string(js))
  328. } else {
  329. //Write member data
  330. targetMemberData.Name = newname
  331. m.WriteMemeberMetaData(netid, memberid, targetMemberData)
  332. utils.SendOK(w)
  333. }
  334. }
  335. // Handle delete of a given memver
  336. func (m *NetworkManager) HandleMemberDelete(w http.ResponseWriter, r *http.Request) {
  337. netid, err := utils.PostPara(r, "netid")
  338. if err != nil {
  339. utils.SendErrorResponse(w, "net id not set")
  340. return
  341. }
  342. memberid, err := utils.PostPara(r, "memid")
  343. if err != nil {
  344. utils.SendErrorResponse(w, "memid not set")
  345. return
  346. }
  347. //Check if that member is authorized.
  348. memberInfo, err := m.getNetworkMemberInfo(netid, memberid)
  349. if err != nil {
  350. utils.SendErrorResponse(w, "member not exists in given GANet")
  351. return
  352. }
  353. if memberInfo.Authorized {
  354. //Deauthorized this member before deleting
  355. m.AuthorizeMember(netid, memberid, false)
  356. }
  357. //Remove the memeber
  358. err = m.deleteMember(netid, memberid)
  359. if err != nil {
  360. utils.SendErrorResponse(w, err.Error())
  361. return
  362. }
  363. utils.SendOK(w)
  364. }
  365. // Check if a given network id is a network hosted on this zoraxy node
  366. func (m *NetworkManager) IsLocalGAN(networkId string) bool {
  367. networks, err := m.listNetworkIds()
  368. if err != nil {
  369. return false
  370. }
  371. for _, network := range networks {
  372. if network == networkId {
  373. return true
  374. }
  375. }
  376. return false
  377. }
  378. // Handle server instant joining a given network
  379. func (m *NetworkManager) HandleServerJoinNetwork(w http.ResponseWriter, r *http.Request) {
  380. netid, err := utils.PostPara(r, "netid")
  381. if err != nil {
  382. utils.SendErrorResponse(w, "net id not set")
  383. return
  384. }
  385. //Check if the target network is a network hosted on this server
  386. if !m.IsLocalGAN(netid) {
  387. utils.SendErrorResponse(w, "given network is not a GAN hosted on this node")
  388. return
  389. }
  390. if m.memberExistsInNetwork(netid, m.ControllerID) {
  391. utils.SendErrorResponse(w, "controller already inside network")
  392. return
  393. }
  394. //Join the network
  395. err = m.joinNetwork(netid)
  396. if err != nil {
  397. utils.SendErrorResponse(w, err.Error())
  398. return
  399. }
  400. utils.SendOK(w)
  401. }
  402. // Handle server instant leaving a given network
  403. func (m *NetworkManager) HandleServerLeaveNetwork(w http.ResponseWriter, r *http.Request) {
  404. netid, err := utils.PostPara(r, "netid")
  405. if err != nil {
  406. utils.SendErrorResponse(w, "net id not set")
  407. return
  408. }
  409. //Check if the target network is a network hosted on this server
  410. if !m.IsLocalGAN(netid) {
  411. utils.SendErrorResponse(w, "given network is not a GAN hosted on this node")
  412. return
  413. }
  414. //Leave the network
  415. err = m.leaveNetwork(netid)
  416. if err != nil {
  417. utils.SendErrorResponse(w, err.Error())
  418. return
  419. }
  420. //Remove it from target network if it is authorized
  421. err = m.deleteMember(netid, m.ControllerID)
  422. if err != nil {
  423. utils.SendErrorResponse(w, err.Error())
  424. return
  425. }
  426. utils.SendOK(w)
  427. }