Skip to content

Commit

Permalink
NET-655 (#2670)
Browse files Browse the repository at this point in the history
* NET-655

* Updated HostPull structure to include EgressRoutes and FirewallUpdate models.

* added ServerVersion structure to hostpull model

* added ServerVersion structure to hostpull model

* removed ServerVersion structure

* removed ServerVersion structure

* added egressroute and fwupdate to hostpull handler

* add host update fallback handler

* set broker type on server cfg

* use actual host password to create emqx user

---------

Co-authored-by: Christopher Blaha <[email protected]>
Co-authored-by: Abhishek Kondur <[email protected]>
  • Loading branch information
3 people authored Dec 21, 2023
1 parent 61d6b2f commit 1f9ef50
Show file tree
Hide file tree
Showing 5 changed files with 62 additions and 10 deletions.
50 changes: 49 additions & 1 deletion controllers/hosts.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ func hostHandlers(r *mux.Router) {
r.HandleFunc("/api/hosts/adm/authenticate", authenticateHost).Methods(http.MethodPost)
r.HandleFunc("/api/v1/host", Authorize(true, false, "host", http.HandlerFunc(pull))).Methods(http.MethodGet)
r.HandleFunc("/api/v1/host/{hostid}/signalpeer", Authorize(true, false, "host", http.HandlerFunc(signalPeer))).Methods(http.MethodPost)
r.HandleFunc("/api/v1/fallback/host/{hostid}", Authorize(true, false, "host", http.HandlerFunc(hostUpdateFallback))).Methods(http.MethodPut)
r.HandleFunc("/api/v1/auth-register/host", socketHandler)
}

Expand Down Expand Up @@ -141,6 +142,8 @@ func pull(w http.ResponseWriter, r *http.Request) {
Peers: hPU.Peers,
PeerIDs: hPU.PeerIDs,
HostNetworkInfo: hPU.HostNetworkInfo,
EgressRoutes: hPU.EgressRoutes,
FwUpdate: hPU.FwUpdate,
}

logger.Log(1, hostID, "completed a pull")
Expand Down Expand Up @@ -208,6 +211,51 @@ func updateHost(w http.ResponseWriter, r *http.Request) {
json.NewEncoder(w).Encode(apiHostData)
}

// swagger:route PUT /api/v1/fallback/host/{hostid} hosts hostUpdateFallback
//
// Updates a Netclient host on Netmaker server.
//
// Schemes: https
//
// Security:
// oauth
//
// Responses:
// 200: apiHostResponse
func hostUpdateFallback(w http.ResponseWriter, r *http.Request) {
var params = mux.Vars(r)
hostid := params["hostid"]
currentHost, err := logic.GetHost(hostid)
if err != nil {
slog.Error("error getting host", "id", hostid, "error", err)
return
}

var hostUpdate models.HostUpdate
err = json.NewDecoder(r.Body).Decode(&hostUpdate)
if err != nil {
logger.Log(0, r.Header.Get("user"), "failed to update a host:", err.Error())
logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
return
}
slog.Info("recieved host update", "name", hostUpdate.Host.Name, "id", hostUpdate.Host.ID)
switch hostUpdate.Action {
case models.CheckIn:
_ = mq.HandleHostCheckin(&hostUpdate.Host, currentHost)

case models.UpdateHost:

_ = logic.UpdateHostFromClient(&hostUpdate.Host, currentHost)
err := logic.UpsertHost(currentHost)
if err != nil {
slog.Error("failed to update host", "id", currentHost.ID, "error", err)
return
}

}

}

// swagger:route DELETE /api/hosts/{hostid} hosts deleteHost
//
// Deletes a Netclient host from Netmaker server.
Expand Down Expand Up @@ -497,7 +545,7 @@ func authenticateHost(response http.ResponseWriter, request *http.Request) {

// Create EMQX creds and ACLs if not found
if servercfg.GetBrokerType() == servercfg.EmqxBrokerType {
if err := mq.CreateEmqxUser(host.ID.String(), host.HostPass, false); err != nil {
if err := mq.CreateEmqxUser(host.ID.String(), authRequest.Password, false); err != nil {
slog.Error("failed to create host credentials for EMQX: ", err.Error())
} else {
if err := mq.CreateHostACL(host.ID.String(), servercfg.GetServerInfo().Server); err != nil {
Expand Down
15 changes: 9 additions & 6 deletions models/structs.go
Original file line number Diff line number Diff line change
Expand Up @@ -225,12 +225,14 @@ type TrafficKeys struct {

// HostPull - response of a host's pull
type HostPull struct {
Host Host `json:"host" yaml:"host"`
Nodes []Node `json:"nodes" yaml:"nodes"`
Peers []wgtypes.PeerConfig `json:"peers" yaml:"peers"`
ServerConfig ServerConfig `json:"server_config" yaml:"server_config"`
PeerIDs PeerMap `json:"peer_ids,omitempty" yaml:"peer_ids,omitempty"`
HostNetworkInfo HostInfoMap `json:"host_network_info,omitempty" yaml:"host_network_info,omitempty"`
Host Host `json:"host" yaml:"host"`
Nodes []Node `json:"nodes" yaml:"nodes"`
Peers []wgtypes.PeerConfig `json:"peers" yaml:"peers"`
ServerConfig ServerConfig `json:"server_config" yaml:"server_config"`
PeerIDs PeerMap `json:"peer_ids,omitempty" yaml:"peer_ids,omitempty"`
HostNetworkInfo HostInfoMap `json:"host_network_info,omitempty" yaml:"host_network_info,omitempty"`
EgressRoutes []EgressNetworkRoutes `json:"egress_network_routes"`
FwUpdate FwUpdate `json:"fw_update"`
}

// NodeGet - struct for a single node get response
Expand Down Expand Up @@ -261,6 +263,7 @@ type ServerConfig struct {
MQPort string `yaml:"mqport"`
MQUserName string `yaml:"mq_username"`
MQPassword string `yaml:"mq_password"`
BrokerType string `yaml:"broker_type"`
Server string `yaml:"server"`
Broker string `yaml:"broker"`
IsPro bool `yaml:"isee" json:"Is_EE"`
Expand Down
4 changes: 2 additions & 2 deletions mq/handlers.go
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ func UpdateHost(client mqtt.Client, msg mqtt.Message) {
var sendPeerUpdate bool
switch hostUpdate.Action {
case models.CheckIn:
sendPeerUpdate = handleHostCheckin(&hostUpdate.Host, currentHost)
sendPeerUpdate = HandleHostCheckin(&hostUpdate.Host, currentHost)
case models.Acknowledgement:
hu := hostactions.GetAction(currentHost.ID.String())
if hu != nil {
Expand Down Expand Up @@ -258,7 +258,7 @@ func ClientPeerUpdate(client mqtt.Client, msg mqtt.Message) {
slog.Info("sent peer updates after signal received from", "id", id)
}

func handleHostCheckin(h, currentHost *models.Host) bool {
func HandleHostCheckin(h, currentHost *models.Host) bool {
if h == nil {
return false
}
Expand Down
2 changes: 1 addition & 1 deletion mq/util.go
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ func publish(host *models.Host, dest string, msg []byte) error {
if encryptErr != nil {
return encryptErr
}
if mqclient == nil {
if mqclient == nil || !mqclient.IsConnectionOpen() {
return errors.New("cannot publish ... mqclient not connected")
}

Expand Down
1 change: 1 addition & 0 deletions servercfg/serverconf.go
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,7 @@ func GetServerInfo() models.ServerConfig {
cfg.APIPort = GetAPIPort()
cfg.DNSMode = "off"
cfg.Broker = GetPublicBrokerEndpoint()
cfg.BrokerType = GetBrokerType()
if IsDNSMode() {
cfg.DNSMode = "on"
}
Expand Down

0 comments on commit 1f9ef50

Please sign in to comment.