| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173 | package controllersimport (	"encoding/json"	"errors"	"net/http"	"github.com/gorilla/mux"	"github.com/gravitl/netmaker/logger"	"github.com/gravitl/netmaker/logic"	"github.com/gravitl/netmaker/models"	"github.com/gravitl/netmaker/mq"	proLogic "github.com/gravitl/netmaker/pro/logic"	"github.com/gravitl/netmaker/servercfg")// InetHandlers - handlers for internet gwfunc InetHandlers(r *mux.Router) {	r.HandleFunc("/api/nodes/{network}/{nodeid}/inet_gw", logic.SecurityCheck(true, http.HandlerFunc(createInternetGw))).Methods(http.MethodPost)	r.HandleFunc("/api/nodes/{network}/{nodeid}/inet_gw", logic.SecurityCheck(true, http.HandlerFunc(updateInternetGw))).Methods(http.MethodPut)	r.HandleFunc("/api/nodes/{network}/{nodeid}/inet_gw", logic.SecurityCheck(true, http.HandlerFunc(deleteInternetGw))).Methods(http.MethodDelete)}// swagger:route POST /api/nodes/{network}/{nodeid}/inet_gw nodes createInternetGw//// Create an inet node.////			Schemes: https////			Security://	  		oauth////			Responses://				200: nodeResponsefunc createInternetGw(w http.ResponseWriter, r *http.Request) {	var params = mux.Vars(r)	w.Header().Set("Content-Type", "application/json")	nodeid := params["nodeid"]	netid := params["network"]	node, err := logic.ValidateParams(nodeid, netid)	if err != nil {		logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))		return	}	if node.IsInternetGateway {		logic.ReturnSuccessResponse(w, r, "node is already acting as internet gateway")		return	}	var request models.InetNodeReq	err = json.NewDecoder(r.Body).Decode(&request)	if err != nil {		logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))		return	}	host, err := logic.GetHost(node.HostID.String())	if err != nil {		logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))		return	}	if host.OS != models.OS_Types.Linux {		logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("only linux nodes can be made internet gws"), "badrequest"))		return	}	err = proLogic.ValidateInetGwReq(node, request, false)	if err != nil {		logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))		return	}	proLogic.SetInternetGw(&node, request)	if servercfg.IsPro {		if _, exists := proLogic.FailOverExists(node.Network); exists {			go func() {				proLogic.ResetFailedOverPeer(&node)				mq.PublishPeerUpdate(false)			}()		}	}	err = logic.UpsertNode(&node)	if err != nil {		logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))		return	}	apiNode := node.ConvertToAPINode()	logger.Log(1, r.Header.Get("user"), "created ingress gateway on node", nodeid, "on network", netid)	w.WriteHeader(http.StatusOK)	json.NewEncoder(w).Encode(apiNode)	go mq.PublishPeerUpdate(false)}// swagger:route PUT /api/nodes/{network}/{nodeid}/inet_gw nodes updateInternetGw//// update an inet node.////			Schemes: https////			Security://	  		oauth////			Responses://				200: nodeResponsefunc updateInternetGw(w http.ResponseWriter, r *http.Request) {	var params = mux.Vars(r)	w.Header().Set("Content-Type", "application/json")	nodeid := params["nodeid"]	netid := params["network"]	node, err := logic.ValidateParams(nodeid, netid)	if err != nil {		logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))		return	}	var request models.InetNodeReq	err = json.NewDecoder(r.Body).Decode(&request)	if err != nil {		logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))		return	}	if !node.IsInternetGateway {		logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("node is not a internet gw"), "badrequest"))		return	}	err = proLogic.ValidateInetGwReq(node, request, true)	if err != nil {		logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))		return	}	proLogic.UnsetInternetGw(&node)	proLogic.SetInternetGw(&node, request)	err = logic.UpsertNode(&node)	if err != nil {		logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))		return	}	apiNode := node.ConvertToAPINode()	logger.Log(1, r.Header.Get("user"), "created ingress gateway on node", nodeid, "on network", netid)	w.WriteHeader(http.StatusOK)	json.NewEncoder(w).Encode(apiNode)	go mq.PublishPeerUpdate(false)}// swagger:route DELETE /api/nodes/{network}/{nodeid}/inet_gw nodes deleteInternetGw//// Delete an internet gw.////			Schemes: https////			Security://	  		oauth////			Responses://				200: nodeResponsefunc deleteInternetGw(w http.ResponseWriter, r *http.Request) {	var params = mux.Vars(r)	w.Header().Set("Content-Type", "application/json")	nodeid := params["nodeid"]	netid := params["network"]	node, err := logic.ValidateParams(nodeid, netid)	if err != nil {		logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))		return	}	proLogic.UnsetInternetGw(&node)	err = logic.UpsertNode(&node)	if err != nil {		logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))		return	}	apiNode := node.ConvertToAPINode()	logger.Log(1, r.Header.Get("user"), "created ingress gateway on node", nodeid, "on network", netid)	w.WriteHeader(http.StatusOK)	json.NewEncoder(w).Encode(apiNode)	go mq.PublishPeerUpdate(false)}
 |