handlers.go 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376
  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) HandleSetRanges(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. cidr, err := utils.PostPara(r, "cidr")
  124. if err != nil {
  125. utils.SendErrorResponse(w, "cidr not given")
  126. return
  127. }
  128. ipstart, err := utils.PostPara(r, "ipstart")
  129. if err != nil {
  130. utils.SendErrorResponse(w, "ipstart not given")
  131. return
  132. }
  133. ipend, err := utils.PostPara(r, "ipend")
  134. if err != nil {
  135. utils.SendErrorResponse(w, "ipend not given")
  136. return
  137. }
  138. //Validate the CIDR is real, the ip range is within the CIDR range
  139. _, ipnet, err := net.ParseCIDR(cidr)
  140. if err != nil {
  141. utils.SendErrorResponse(w, "invalid cidr string given")
  142. return
  143. }
  144. startIP := net.ParseIP(ipstart)
  145. endIP := net.ParseIP(ipend)
  146. if startIP == nil || endIP == nil {
  147. utils.SendErrorResponse(w, "invalid start or end ip given")
  148. return
  149. }
  150. withinRange := ipnet.Contains(startIP) && ipnet.Contains(endIP)
  151. if !withinRange {
  152. utils.SendErrorResponse(w, "given CIDR did not cover all of the start to end ip range")
  153. return
  154. }
  155. err = m.configureNetwork(netid, startIP.String(), endIP.String(), strings.TrimSpace(cidr))
  156. if err != nil {
  157. utils.SendErrorResponse(w, err.Error())
  158. return
  159. }
  160. utils.SendOK(w)
  161. }
  162. //Handle listing of network members. Set details=true for listing all details
  163. func (m *NetworkManager) HandleMemberList(w http.ResponseWriter, r *http.Request) {
  164. netid, err := utils.GetPara(r, "netid")
  165. if err != nil {
  166. utils.SendErrorResponse(w, "netid is empty")
  167. return
  168. }
  169. details, _ := utils.GetPara(r, "detail")
  170. memberIds, err := m.getNetworkMembers(netid)
  171. if err != nil {
  172. utils.SendErrorResponse(w, err.Error())
  173. return
  174. }
  175. if details == "" {
  176. //Only show client ids
  177. js, _ := json.Marshal(memberIds)
  178. utils.SendJSONResponse(w, string(js))
  179. } else {
  180. //Show detail members info
  181. detailMemberInfo := []*MemberInfo{}
  182. for _, thisMemberId := range memberIds {
  183. memInfo, err := m.getNetworkMemberInfo(netid, thisMemberId)
  184. if err == nil {
  185. detailMemberInfo = append(detailMemberInfo, memInfo)
  186. }
  187. }
  188. js, _ := json.Marshal(detailMemberInfo)
  189. utils.SendJSONResponse(w, string(js))
  190. }
  191. }
  192. //Handle Authorization of members
  193. func (m *NetworkManager) HandleMemberAuthorization(w http.ResponseWriter, r *http.Request) {
  194. netid, err := utils.PostPara(r, "netid")
  195. if err != nil {
  196. utils.SendErrorResponse(w, "net id not set")
  197. return
  198. }
  199. memberid, err := utils.PostPara(r, "memid")
  200. if err != nil {
  201. utils.SendErrorResponse(w, "memid not set")
  202. return
  203. }
  204. //Check if the target memeber exists
  205. if !m.memberExistsInNetwork(netid, memberid) {
  206. utils.SendErrorResponse(w, "member not exists in given network")
  207. return
  208. }
  209. setAuthorized, err := utils.PostPara(r, "auth")
  210. if err != nil || setAuthorized == "" {
  211. //Get the member authorization state
  212. memberInfo, err := m.getNetworkMemberInfo(netid, memberid)
  213. if err != nil {
  214. utils.SendErrorResponse(w, err.Error())
  215. return
  216. }
  217. js, _ := json.Marshal(memberInfo.Authorized)
  218. utils.SendJSONResponse(w, string(js))
  219. } else if setAuthorized == "true" {
  220. m.AuthorizeMember(netid, memberid, true)
  221. } else if setAuthorized == "false" {
  222. m.AuthorizeMember(netid, memberid, false)
  223. } else {
  224. utils.SendErrorResponse(w, "unknown operation state: "+setAuthorized)
  225. }
  226. }
  227. //Handle Delete or Add IP for a member in a network
  228. func (m *NetworkManager) HandleMemberIP(w http.ResponseWriter, r *http.Request) {
  229. netid, err := utils.PostPara(r, "netid")
  230. if err != nil {
  231. utils.SendErrorResponse(w, "net id not set")
  232. return
  233. }
  234. memberid, err := utils.PostPara(r, "memid")
  235. if err != nil {
  236. utils.SendErrorResponse(w, "memid not set")
  237. return
  238. }
  239. opr, err := utils.PostPara(r, "opr")
  240. if err != nil {
  241. utils.SendErrorResponse(w, "opr not defined")
  242. return
  243. }
  244. targetip, _ := utils.PostPara(r, "ip")
  245. memberInfo, err := m.getNetworkMemberInfo(netid, memberid)
  246. if err != nil {
  247. utils.SendErrorResponse(w, err.Error())
  248. return
  249. }
  250. if opr == "add" {
  251. if targetip == "" {
  252. utils.SendErrorResponse(w, "ip not set")
  253. return
  254. }
  255. if !isValidIPAddr(targetip) {
  256. utils.SendErrorResponse(w, "ip address not valid")
  257. return
  258. }
  259. newIpList := append(memberInfo.IPAssignments, targetip)
  260. err = m.setAssignedIps(netid, memberid, newIpList)
  261. if err != nil {
  262. utils.SendErrorResponse(w, err.Error())
  263. return
  264. }
  265. utils.SendOK(w)
  266. } else if opr == "del" {
  267. if targetip == "" {
  268. utils.SendErrorResponse(w, "ip not set")
  269. return
  270. }
  271. //Delete user ip from the list
  272. newIpList := []string{}
  273. for _, thisIp := range memberInfo.IPAssignments {
  274. if thisIp != targetip {
  275. newIpList = append(newIpList, thisIp)
  276. }
  277. }
  278. err = m.setAssignedIps(netid, memberid, newIpList)
  279. if err != nil {
  280. utils.SendErrorResponse(w, err.Error())
  281. return
  282. }
  283. utils.SendOK(w)
  284. } else if opr == "get" {
  285. js, _ := json.Marshal(memberInfo.IPAssignments)
  286. utils.SendJSONResponse(w, string(js))
  287. } else {
  288. utils.SendErrorResponse(w, "unsupported opr type: "+opr)
  289. }
  290. }
  291. //Handle delete of a given memver
  292. func (m *NetworkManager) HandleMemberDelete(w http.ResponseWriter, r *http.Request) {
  293. netid, err := utils.PostPara(r, "netid")
  294. if err != nil {
  295. utils.SendErrorResponse(w, "net id not set")
  296. return
  297. }
  298. memberid, err := utils.PostPara(r, "memid")
  299. if err != nil {
  300. utils.SendErrorResponse(w, "memid not set")
  301. return
  302. }
  303. //Check if that member is authorized.
  304. memberInfo, err := m.getNetworkMemberInfo(netid, memberid)
  305. if err != nil {
  306. utils.SendErrorResponse(w, "member not exists in given GANet")
  307. return
  308. }
  309. if memberInfo.Authorized {
  310. //Deauthorized this member before deleting
  311. m.AuthorizeMember(netid, memberid, false)
  312. }
  313. //Remove the memeber
  314. err = m.deleteMember(netid, memberid)
  315. if err != nil {
  316. utils.SendErrorResponse(w, err.Error())
  317. return
  318. }
  319. utils.SendOK(w)
  320. }