123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504 |
- package ganserv
- import (
- "encoding/json"
- "net"
- "net/http"
- "regexp"
- "strings"
- "imuslab.com/zoraxy/mod/utils"
- )
- func (m *NetworkManager) HandleGetNodeID(w http.ResponseWriter, r *http.Request) {
- if m.ControllerID == "" {
- //Node id not exists. Check again
- instanceInfo, err := getControllerInfo(m.option.AuthToken, m.option.ApiPort)
- if err != nil {
- utils.SendErrorResponse(w, "unable to access node id information")
- return
- }
- m.ControllerID = instanceInfo.Address
- }
- js, _ := json.Marshal(m.ControllerID)
- utils.SendJSONResponse(w, string(js))
- }
- func (m *NetworkManager) HandleAddNetwork(w http.ResponseWriter, r *http.Request) {
- networkInfo, err := m.createNetwork()
- if err != nil {
- utils.SendErrorResponse(w, err.Error())
- return
- }
- //Network created. Assign it the standard network settings
- err = m.configureNetwork(networkInfo.Nwid, "192.168.192.1", "192.168.192.254", "192.168.192.0/24")
- if err != nil {
- utils.SendErrorResponse(w, err.Error())
- return
- }
- // Return the new network ID
- js, _ := json.Marshal(networkInfo.Nwid)
- utils.SendJSONResponse(w, string(js))
- }
- func (m *NetworkManager) HandleRemoveNetwork(w http.ResponseWriter, r *http.Request) {
- networkID, err := utils.PostPara(r, "id")
- if err != nil {
- utils.SendErrorResponse(w, "invalid or empty network id given")
- return
- }
- if !m.networkExists(networkID) {
- utils.SendErrorResponse(w, "network id not exists")
- return
- }
- err = m.deleteNetwork(networkID)
- if err != nil {
- utils.SendErrorResponse(w, err.Error())
- }
- utils.SendOK(w)
- }
- func (m *NetworkManager) HandleListNetwork(w http.ResponseWriter, r *http.Request) {
- netid, _ := utils.GetPara(r, "netid")
- if netid != "" {
- targetNetInfo, err := m.getNetworkInfoById(netid)
- if err != nil {
- utils.SendErrorResponse(w, err.Error())
- return
- }
- js, _ := json.Marshal(targetNetInfo)
- utils.SendJSONResponse(w, string(js))
- } else {
- // Return the list of networks as JSON
- networkIds, err := m.listNetworkIds()
- if err != nil {
- utils.SendErrorResponse(w, err.Error())
- return
- }
- networkInfos := []*NetworkInfo{}
- for _, id := range networkIds {
- thisNetInfo, err := m.getNetworkInfoById(id)
- if err == nil {
- networkInfos = append(networkInfos, thisNetInfo)
- }
- }
- js, _ := json.Marshal(networkInfos)
- utils.SendJSONResponse(w, string(js))
- }
- }
- func (m *NetworkManager) HandleNetworkNaming(w http.ResponseWriter, r *http.Request) {
- netid, err := utils.PostPara(r, "netid")
- if err != nil {
- utils.SendErrorResponse(w, "network id not given")
- return
- }
- if !m.networkExists(netid) {
- utils.SendErrorResponse(w, "network not eixsts")
- }
- newName, _ := utils.PostPara(r, "name")
- newDesc, _ := utils.PostPara(r, "desc")
- if newName != "" && newDesc != "" {
- //Strip away html from name and desc
- re := regexp.MustCompile("<[^>]*>")
- newName := re.ReplaceAllString(newName, "")
- newDesc := re.ReplaceAllString(newDesc, "")
- //Set the new network name and desc
- err = m.setNetworkNameAndDescription(netid, newName, newDesc)
- if err != nil {
- utils.SendErrorResponse(w, err.Error())
- return
- }
- utils.SendOK(w)
- } else {
- //Get current name and description
- name, desc, err := m.getNetworkNameAndDescription(netid)
- if err != nil {
- utils.SendErrorResponse(w, err.Error())
- return
- }
- js, _ := json.Marshal([]string{name, desc})
- utils.SendJSONResponse(w, string(js))
- }
- }
- func (m *NetworkManager) HandleNetworkDetails(w http.ResponseWriter, r *http.Request) {
- netid, err := utils.PostPara(r, "netid")
- if err != nil {
- utils.SendErrorResponse(w, "netid not given")
- return
- }
- targetNetwork, err := m.getNetworkInfoById(netid)
- if err != nil {
- utils.SendErrorResponse(w, err.Error())
- return
- }
- js, _ := json.Marshal(targetNetwork)
- utils.SendJSONResponse(w, string(js))
- }
- func (m *NetworkManager) HandleSetRanges(w http.ResponseWriter, r *http.Request) {
- netid, err := utils.PostPara(r, "netid")
- if err != nil {
- utils.SendErrorResponse(w, "netid not given")
- return
- }
- cidr, err := utils.PostPara(r, "cidr")
- if err != nil {
- utils.SendErrorResponse(w, "cidr not given")
- return
- }
- ipstart, err := utils.PostPara(r, "ipstart")
- if err != nil {
- utils.SendErrorResponse(w, "ipstart not given")
- return
- }
- ipend, err := utils.PostPara(r, "ipend")
- if err != nil {
- utils.SendErrorResponse(w, "ipend not given")
- return
- }
- //Validate the CIDR is real, the ip range is within the CIDR range
- _, ipnet, err := net.ParseCIDR(cidr)
- if err != nil {
- utils.SendErrorResponse(w, "invalid cidr string given")
- return
- }
- startIP := net.ParseIP(ipstart)
- endIP := net.ParseIP(ipend)
- if startIP == nil || endIP == nil {
- utils.SendErrorResponse(w, "invalid start or end ip given")
- return
- }
- withinRange := ipnet.Contains(startIP) && ipnet.Contains(endIP)
- if !withinRange {
- utils.SendErrorResponse(w, "given CIDR did not cover all of the start to end ip range")
- return
- }
- err = m.configureNetwork(netid, startIP.String(), endIP.String(), strings.TrimSpace(cidr))
- if err != nil {
- utils.SendErrorResponse(w, err.Error())
- return
- }
- utils.SendOK(w)
- }
- // Handle listing of network members. Set details=true for listing all details
- func (m *NetworkManager) HandleMemberList(w http.ResponseWriter, r *http.Request) {
- netid, err := utils.GetPara(r, "netid")
- if err != nil {
- utils.SendErrorResponse(w, "netid is empty")
- return
- }
- details, _ := utils.GetPara(r, "detail")
- memberIds, err := m.getNetworkMembers(netid)
- if err != nil {
- utils.SendErrorResponse(w, err.Error())
- return
- }
- if details == "" {
- //Only show client ids
- js, _ := json.Marshal(memberIds)
- utils.SendJSONResponse(w, string(js))
- } else {
- //Show detail members info
- detailMemberInfo := []*MemberInfo{}
- for _, thisMemberId := range memberIds {
- memInfo, err := m.getNetworkMemberInfo(netid, thisMemberId)
- if err == nil {
- detailMemberInfo = append(detailMemberInfo, memInfo)
- }
- }
- js, _ := json.Marshal(detailMemberInfo)
- utils.SendJSONResponse(w, string(js))
- }
- }
- // Handle Authorization of members
- func (m *NetworkManager) HandleMemberAuthorization(w http.ResponseWriter, r *http.Request) {
- netid, err := utils.PostPara(r, "netid")
- if err != nil {
- utils.SendErrorResponse(w, "net id not set")
- return
- }
- memberid, err := utils.PostPara(r, "memid")
- if err != nil {
- utils.SendErrorResponse(w, "memid not set")
- return
- }
- //Check if the target memeber exists
- if !m.memberExistsInNetwork(netid, memberid) {
- utils.SendErrorResponse(w, "member not exists in given network")
- return
- }
- setAuthorized, err := utils.PostPara(r, "auth")
- if err != nil || setAuthorized == "" {
- //Get the member authorization state
- memberInfo, err := m.getNetworkMemberInfo(netid, memberid)
- if err != nil {
- utils.SendErrorResponse(w, err.Error())
- return
- }
- js, _ := json.Marshal(memberInfo.Authorized)
- utils.SendJSONResponse(w, string(js))
- } else if setAuthorized == "true" {
- m.AuthorizeMember(netid, memberid, true)
- } else if setAuthorized == "false" {
- m.AuthorizeMember(netid, memberid, false)
- } else {
- utils.SendErrorResponse(w, "unknown operation state: "+setAuthorized)
- }
- }
- // Handle Delete or Add IP for a member in a network
- func (m *NetworkManager) HandleMemberIP(w http.ResponseWriter, r *http.Request) {
- netid, err := utils.PostPara(r, "netid")
- if err != nil {
- utils.SendErrorResponse(w, "net id not set")
- return
- }
- memberid, err := utils.PostPara(r, "memid")
- if err != nil {
- utils.SendErrorResponse(w, "memid not set")
- return
- }
- opr, err := utils.PostPara(r, "opr")
- if err != nil {
- utils.SendErrorResponse(w, "opr not defined")
- return
- }
- targetip, _ := utils.PostPara(r, "ip")
- memberInfo, err := m.getNetworkMemberInfo(netid, memberid)
- if err != nil {
- utils.SendErrorResponse(w, err.Error())
- return
- }
- if opr == "add" {
- if targetip == "" {
- utils.SendErrorResponse(w, "ip not set")
- return
- }
- if !isValidIPAddr(targetip) {
- utils.SendErrorResponse(w, "ip address not valid")
- return
- }
- newIpList := append(memberInfo.IPAssignments, targetip)
- err = m.setAssignedIps(netid, memberid, newIpList)
- if err != nil {
- utils.SendErrorResponse(w, err.Error())
- return
- }
- utils.SendOK(w)
- } else if opr == "del" {
- if targetip == "" {
- utils.SendErrorResponse(w, "ip not set")
- return
- }
- //Delete user ip from the list
- newIpList := []string{}
- for _, thisIp := range memberInfo.IPAssignments {
- if thisIp != targetip {
- newIpList = append(newIpList, thisIp)
- }
- }
- err = m.setAssignedIps(netid, memberid, newIpList)
- if err != nil {
- utils.SendErrorResponse(w, err.Error())
- return
- }
- utils.SendOK(w)
- } else if opr == "get" {
- js, _ := json.Marshal(memberInfo.IPAssignments)
- utils.SendJSONResponse(w, string(js))
- } else {
- utils.SendErrorResponse(w, "unsupported opr type: "+opr)
- }
- }
- // Handle naming for members
- func (m *NetworkManager) HandleMemberNaming(w http.ResponseWriter, r *http.Request) {
- netid, err := utils.PostPara(r, "netid")
- if err != nil {
- utils.SendErrorResponse(w, "net id not set")
- return
- }
- memberid, err := utils.PostPara(r, "memid")
- if err != nil {
- utils.SendErrorResponse(w, "memid not set")
- return
- }
- if !m.memberExistsInNetwork(netid, memberid) {
- utils.SendErrorResponse(w, "target member not exists in given network")
- return
- }
- //Read memeber data
- targetMemberData := m.GetMemberMetaData(netid, memberid)
- newname, err := utils.PostPara(r, "name")
- if err != nil {
- //Send over the member data
- js, _ := json.Marshal(targetMemberData)
- utils.SendJSONResponse(w, string(js))
- } else {
- //Write member data
- targetMemberData.Name = newname
- m.WriteMemeberMetaData(netid, memberid, targetMemberData)
- utils.SendOK(w)
- }
- }
- // Handle delete of a given memver
- func (m *NetworkManager) HandleMemberDelete(w http.ResponseWriter, r *http.Request) {
- netid, err := utils.PostPara(r, "netid")
- if err != nil {
- utils.SendErrorResponse(w, "net id not set")
- return
- }
- memberid, err := utils.PostPara(r, "memid")
- if err != nil {
- utils.SendErrorResponse(w, "memid not set")
- return
- }
- //Check if that member is authorized.
- memberInfo, err := m.getNetworkMemberInfo(netid, memberid)
- if err != nil {
- utils.SendErrorResponse(w, "member not exists in given GANet")
- return
- }
- if memberInfo.Authorized {
- //Deauthorized this member before deleting
- m.AuthorizeMember(netid, memberid, false)
- }
- //Remove the memeber
- err = m.deleteMember(netid, memberid)
- if err != nil {
- utils.SendErrorResponse(w, err.Error())
- return
- }
- utils.SendOK(w)
- }
- // Check if a given network id is a network hosted on this zoraxy node
- func (m *NetworkManager) IsLocalGAN(networkId string) bool {
- networks, err := m.listNetworkIds()
- if err != nil {
- return false
- }
- for _, network := range networks {
- if network == networkId {
- return true
- }
- }
- return false
- }
- // Handle server instant joining a given network
- func (m *NetworkManager) HandleServerJoinNetwork(w http.ResponseWriter, r *http.Request) {
- netid, err := utils.PostPara(r, "netid")
- if err != nil {
- utils.SendErrorResponse(w, "net id not set")
- return
- }
- //Check if the target network is a network hosted on this server
- if !m.IsLocalGAN(netid) {
- utils.SendErrorResponse(w, "given network is not a GAN hosted on this node")
- return
- }
- if m.memberExistsInNetwork(netid, m.ControllerID) {
- utils.SendErrorResponse(w, "controller already inside network")
- return
- }
- //Join the network
- err = m.joinNetwork(netid)
- if err != nil {
- utils.SendErrorResponse(w, err.Error())
- return
- }
- utils.SendOK(w)
- }
- // Handle server instant leaving a given network
- func (m *NetworkManager) HandleServerLeaveNetwork(w http.ResponseWriter, r *http.Request) {
- netid, err := utils.PostPara(r, "netid")
- if err != nil {
- utils.SendErrorResponse(w, "net id not set")
- return
- }
- //Check if the target network is a network hosted on this server
- if !m.IsLocalGAN(netid) {
- utils.SendErrorResponse(w, "given network is not a GAN hosted on this node")
- return
- }
- //Leave the network
- err = m.leaveNetwork(netid)
- if err != nil {
- utils.SendErrorResponse(w, err.Error())
- return
- }
- //Remove it from target network if it is authorized
- err = m.deleteMember(netid, m.ControllerID)
- if err != nil {
- utils.SendErrorResponse(w, err.Error())
- return
- }
- utils.SendOK(w)
- }
|