From 974e7cea5587767022b8f92ceaccebf100652163 Mon Sep 17 00:00:00 2001 From: abhishek9686 Date: Fri, 17 Jan 2025 12:00:39 +0530 Subject: [PATCH 01/11] set default metrics port 8889 --- scripts/netmaker.default.env | 2 ++ 1 file changed, 2 insertions(+) diff --git a/scripts/netmaker.default.env b/scripts/netmaker.default.env index 806c3765d..ac267e84b 100644 --- a/scripts/netmaker.default.env +++ b/scripts/netmaker.default.env @@ -96,3 +96,5 @@ MANAGE_DNS=false OLD_ACL_SUPPORT=true # if STUN is set to true, hole punch is called STUN=true +# Metrics Port +METRICS_PORT=8009 \ No newline at end of file From 35ba72d1674ac4c575d493acca0a737b32d1c1fa Mon Sep 17 00:00:00 2001 From: abhishek9686 Date: Fri, 17 Jan 2025 12:03:06 +0530 Subject: [PATCH 02/11] set default metrics port 51821 --- scripts/netmaker.default.env | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/netmaker.default.env b/scripts/netmaker.default.env index ac267e84b..df0c41f52 100644 --- a/scripts/netmaker.default.env +++ b/scripts/netmaker.default.env @@ -97,4 +97,4 @@ OLD_ACL_SUPPORT=true # if STUN is set to true, hole punch is called STUN=true # Metrics Port -METRICS_PORT=8009 \ No newline at end of file +METRICS_PORT=51821 \ No newline at end of file From 0e1e1f3d98f4530320d1408995827384ee41e8e2 Mon Sep 17 00:00:00 2001 From: abhishek9686 Date: Fri, 17 Jan 2025 12:28:57 +0530 Subject: [PATCH 03/11] add metrics port to server config --- config/config.go | 13 +++++++------ models/structs.go | 1 + scripts/netmaker.default.env | 6 ++++-- servercfg/serverconf.go | 14 ++++++++++++++ 4 files changed, 26 insertions(+), 8 deletions(-) diff --git a/config/config.go b/config/config.go index 36ce1cbf1..f1e7a6b15 100644 --- a/config/config.go +++ b/config/config.go @@ -92,14 +92,15 @@ type ServerConfig struct { JwtValidityDuration time.Duration `yaml:"jwt_validity_duration" swaggertype:"primitive,integer" format:"int64"` RacAutoDisable bool `yaml:"rac_auto_disable"` CacheEnabled string `yaml:"caching_enabled"` - EndpointDetection bool `json:"endpoint_detection"` + EndpointDetection bool `yaml:"endpoint_detection"` AllowedEmailDomains string `yaml:"allowed_email_domains"` - EmailSenderAddr string `json:"email_sender_addr"` - EmailSenderUser string `json:"email_sender_user"` - EmailSenderPassword string `json:"email_sender_password"` - SmtpHost string `json:"smtp_host"` - SmtpPort int `json:"smtp_port"` + EmailSenderAddr string `yaml:"email_sender_addr"` + EmailSenderUser string `yaml:"email_sender_user"` + EmailSenderPassword string `yaml:"email_sender_password"` + SmtpHost string `yaml:"smtp_host"` + SmtpPort int `yaml:"smtp_port"` MetricInterval string `yaml:"metric_interval"` + MetricsPort int `yaml:"metrics_port"` ManageDNS bool `yaml:"manage_dns"` Stun bool `yaml:"stun"` StunServers string `yaml:"stun_servers"` diff --git a/models/structs.go b/models/structs.go index e929e7fc7..f140bf377 100644 --- a/models/structs.go +++ b/models/structs.go @@ -266,6 +266,7 @@ type ServerConfig struct { IsPro bool `yaml:"isee" json:"Is_EE"` TrafficKey []byte `yaml:"traffickey"` MetricInterval string `yaml:"metric_interval"` + MetricsPort int `yaml:"metrics_port"` ManageDNS bool `yaml:"manage_dns"` Stun bool `yaml:"stun"` StunServers string `yaml:"stun_servers"` diff --git a/scripts/netmaker.default.env b/scripts/netmaker.default.env index df0c41f52..29bdb6e93 100644 --- a/scripts/netmaker.default.env +++ b/scripts/netmaker.default.env @@ -96,5 +96,7 @@ MANAGE_DNS=false OLD_ACL_SUPPORT=true # if STUN is set to true, hole punch is called STUN=true -# Metrics Port -METRICS_PORT=51821 \ No newline at end of file +# Metrics Collection Port +METRICS_PORT=51821 +# Metrics Collection interval in minutes +PUBLISH_METRIC_INTERVAL=15 \ No newline at end of file diff --git a/servercfg/serverconf.go b/servercfg/serverconf.go index 267a08bf6..eace17ef9 100644 --- a/servercfg/serverconf.go +++ b/servercfg/serverconf.go @@ -141,6 +141,7 @@ func GetServerInfo() models.ServerConfig { cfg.Version = GetVersion() cfg.IsPro = IsPro cfg.MetricInterval = GetMetricInterval() + cfg.MetricsPort = GetMetricsPort() cfg.ManageDNS = GetManageDNS() cfg.Stun = IsStunEnabled() cfg.StunServers = GetStunServers() @@ -654,6 +655,19 @@ func GetMqUserName() string { return password } +// GetMetricsPort - get metrics port +func GetMetricsPort() int { + p := 51821 + if os.Getenv("METRICS_PORT") != "" { + pStr := os.Getenv("METRICS_PORT") + pInt, err := strconv.Atoi(pStr) + if err == nil { + p = pInt + } + } + return p +} + // GetMetricInterval - get the publish metric interval func GetMetricIntervalInMinutes() time.Duration { //default 15 minutes From 231846ba2bbab4ccf1207eb1f20e04ebd16a0c2d Mon Sep 17 00:00:00 2001 From: abhishek9686 Date: Fri, 17 Jan 2025 12:39:55 +0530 Subject: [PATCH 04/11] bind caddy only on tcp --- compose/docker-compose.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/compose/docker-compose.yml b/compose/docker-compose.yml index 5e6b1cc73..054936afc 100644 --- a/compose/docker-compose.yml +++ b/compose/docker-compose.yml @@ -52,8 +52,8 @@ services: - caddy_data:/data - caddy_conf:/config ports: - - "80:80" - - "443:443" + - "80:80/tcp" + - "443:443/tcp" coredns: #network_mode: host From 806399e85557ce8c33df029bf77fd3c916b07b4d Mon Sep 17 00:00:00 2001 From: abhishek9686 Date: Fri, 17 Jan 2025 13:06:53 +0530 Subject: [PATCH 05/11] add var for pulling files --- scripts/nm-quick.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/nm-quick.sh b/scripts/nm-quick.sh index 86a083c5e..3c79dff8e 100755 --- a/scripts/nm-quick.sh +++ b/scripts/nm-quick.sh @@ -6,7 +6,7 @@ SCRIPT_DIR=$(dirname "$(realpath "$0")") CONFIG_PATH="$SCRIPT_DIR/$CONFIG_FILE" NM_QUICK_VERSION="0.1.1" LATEST=$(curl -s https://api.github.com/repos/gravitl/netmaker/releases/latest | grep "tag_name" | cut -d : -f 2,3 | tr -d [:space:],\") - +BRANCH=master if [ $(id -u) -ne 0 ]; then echo "This script must be run as root" exit 1 @@ -617,7 +617,7 @@ install_netmaker() { echo "Pulling config files..." - local BASE_URL="https://raw.githubusercontent.com/gravitl/netmaker/master" + local BASE_URL="https://raw.githubusercontent.com/gravitl/netmaker/$BRANCH" local COMPOSE_URL="$BASE_URL/compose/docker-compose.yml" local CADDY_URL="$BASE_URL/docker/Caddyfile" if [ "$INSTALL_TYPE" = "pro" ]; then From 470f9eed5984bbe3694b01ffd0f0364476198a4b Mon Sep 17 00:00:00 2001 From: abhishek9686 Date: Fri, 17 Jan 2025 13:16:07 +0530 Subject: [PATCH 06/11] add new line --- scripts/netmaker.default.env | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/netmaker.default.env b/scripts/netmaker.default.env index 29bdb6e93..e5de8d35c 100644 --- a/scripts/netmaker.default.env +++ b/scripts/netmaker.default.env @@ -99,4 +99,4 @@ STUN=true # Metrics Collection Port METRICS_PORT=51821 # Metrics Collection interval in minutes -PUBLISH_METRIC_INTERVAL=15 \ No newline at end of file +PUBLISH_METRIC_INTERVAL=15 From 30aa18e3e62ad98777ed1c882e53c270961ac4f8 Mon Sep 17 00:00:00 2001 From: abhishek9686 Date: Wed, 22 Jan 2025 23:16:06 +0530 Subject: [PATCH 07/11] update peer update model --- logic/peers.go | 14 +++++--------- models/mqtt.go | 35 ++++++++++++++++------------------- models/structs.go | 39 ++++++++++++++++++++------------------- servercfg/serverconf.go | 3 +++ 4 files changed, 44 insertions(+), 47 deletions(-) diff --git a/logic/peers.go b/logic/peers.go index b665e51ff..d090a4580 100644 --- a/logic/peers.go +++ b/logic/peers.go @@ -79,11 +79,11 @@ func GetPeerUpdateForHost(network string, host *models.Host, allNodes []models.N IngressInfo: make(map[string]models.IngressInfo), AclRules: make(map[string]models.AclRule), }, - PeerIDs: make(models.PeerMap, 0), - Peers: []wgtypes.PeerConfig{}, - NodePeers: []wgtypes.PeerConfig{}, - HostNetworkInfo: models.HostInfoMap{}, - EndpointDetection: servercfg.IsEndpointDetectionEnabled(), + PeerIDs: make(models.PeerMap, 0), + Peers: []wgtypes.PeerConfig{}, + NodePeers: []wgtypes.PeerConfig{}, + HostNetworkInfo: models.HostInfoMap{}, + ServerConfig: servercfg.ServerInfo, } defer func() { if !hostPeerUpdate.FwUpdate.AllowAll { @@ -459,10 +459,6 @@ func GetPeerUpdateForHost(network string, host *models.Host, allNodes []models.N } } } - - hostPeerUpdate.ManageDNS = servercfg.GetManageDNS() - hostPeerUpdate.Stun = servercfg.IsStunEnabled() - hostPeerUpdate.StunServers = servercfg.GetStunServers() return hostPeerUpdate, nil } diff --git a/models/mqtt.go b/models/mqtt.go index c5921f381..97d0c51f3 100644 --- a/models/mqtt.go +++ b/models/mqtt.go @@ -8,25 +8,22 @@ import ( // HostPeerUpdate - struct for host peer updates type HostPeerUpdate struct { - Host Host `json:"host" bson:"host" yaml:"host"` - ChangeDefaultGw bool `json:"change_default_gw"` - DefaultGwIp net.IP `json:"default_gw_ip"` - IsInternetGw bool `json:"is_inet_gw"` - NodeAddrs []net.IPNet `json:"nodes_addrs" yaml:"nodes_addrs"` - Server string `json:"server" bson:"server" yaml:"server"` - ServerVersion string `json:"serverversion" bson:"serverversion" yaml:"serverversion"` - ServerAddrs []ServerAddr `json:"serveraddrs" bson:"serveraddrs" yaml:"serveraddrs"` - NodePeers []wgtypes.PeerConfig `json:"peers" bson:"peers" yaml:"peers"` - Peers []wgtypes.PeerConfig - PeerIDs PeerMap `json:"peerids" bson:"peerids" yaml:"peerids"` - HostNetworkInfo HostInfoMap `json:"host_network_info,omitempty" bson:"host_network_info,omitempty" yaml:"host_network_info,omitempty"` - EgressRoutes []EgressNetworkRoutes `json:"egress_network_routes"` - FwUpdate FwUpdate `json:"fw_update"` - ReplacePeers bool `json:"replace_peers"` - EndpointDetection bool `json:"endpoint_detection"` - ManageDNS bool `yaml:"manage_dns"` - Stun bool `yaml:"stun"` - StunServers string `yaml:"stun_servers"` + Host Host `json:"host"` + ChangeDefaultGw bool `json:"change_default_gw"` + DefaultGwIp net.IP `json:"default_gw_ip"` + IsInternetGw bool `json:"is_inet_gw"` + NodeAddrs []net.IPNet `json:"nodes_addrs"` + Server string `json:"server"` + ServerVersion string `json:"serverversion"` + ServerAddrs []ServerAddr `json:"serveraddrs"` + NodePeers []wgtypes.PeerConfig `json:"node_peers"` + Peers []wgtypes.PeerConfig `json:"peers"` + PeerIDs PeerMap `json:"peerids"` + HostNetworkInfo HostInfoMap `json:"host_network_info,omitempty"` + EgressRoutes []EgressNetworkRoutes `json:"egress_network_routes"` + FwUpdate FwUpdate `json:"fw_update"` + ReplacePeers bool `json:"replace_peers"` + ServerConfig } type FwRule struct { diff --git a/models/structs.go b/models/structs.go index f140bf377..49655a6e6 100644 --- a/models/structs.go +++ b/models/structs.go @@ -252,25 +252,26 @@ type NodeJoinResponse struct { // ServerConfig - struct for dealing with the server information for a netclient type ServerConfig struct { - CoreDNSAddr string `yaml:"corednsaddr"` - API string `yaml:"api"` - APIPort string `yaml:"apiport"` - DNSMode string `yaml:"dnsmode"` - Version string `yaml:"version"` - 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"` - TrafficKey []byte `yaml:"traffickey"` - MetricInterval string `yaml:"metric_interval"` - MetricsPort int `yaml:"metrics_port"` - ManageDNS bool `yaml:"manage_dns"` - Stun bool `yaml:"stun"` - StunServers string `yaml:"stun_servers"` - DefaultDomain string `yaml:"default_domain"` + CoreDNSAddr string `yaml:"corednsaddr"` + API string `yaml:"api"` + APIPort string `yaml:"apiport"` + DNSMode string `yaml:"dnsmode"` + Version string `yaml:"version"` + 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"` + TrafficKey []byte `yaml:"traffickey"` + MetricInterval string `yaml:"metric_interval"` + MetricsPort int `yaml:"metrics_port"` + ManageDNS bool `yaml:"manage_dns"` + Stun bool `yaml:"stun"` + StunServers string `yaml:"stun_servers"` + EndpointDetection bool `yaml:"endpoint_detection"` + DefaultDomain string `yaml:"default_domain"` } // User.NameInCharset - returns if name is in charset below or not diff --git a/servercfg/serverconf.go b/servercfg/serverconf.go index eace17ef9..456d36ed1 100644 --- a/servercfg/serverconf.go +++ b/servercfg/serverconf.go @@ -14,6 +14,8 @@ import ( "github.com/gravitl/netmaker/models" ) +var ServerInfo = GetServerInfo() + // EmqxBrokerType denotes the broker type for EMQX MQTT const EmqxBrokerType = "emqx" @@ -146,6 +148,7 @@ func GetServerInfo() models.ServerConfig { cfg.Stun = IsStunEnabled() cfg.StunServers = GetStunServers() cfg.DefaultDomain = GetDefaultDomain() + cfg.EndpointDetection = IsEndpointDetectionEnabled() return cfg } From efb41f14faa17a3d3e8481c8614148c576bbe1fd Mon Sep 17 00:00:00 2001 From: abhishek9686 Date: Wed, 22 Jan 2025 23:22:02 +0530 Subject: [PATCH 08/11] check if port is not zero --- servercfg/serverconf.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/servercfg/serverconf.go b/servercfg/serverconf.go index 456d36ed1..f00723af2 100644 --- a/servercfg/serverconf.go +++ b/servercfg/serverconf.go @@ -664,7 +664,7 @@ func GetMetricsPort() int { if os.Getenv("METRICS_PORT") != "" { pStr := os.Getenv("METRICS_PORT") pInt, err := strconv.Atoi(pStr) - if err == nil { + if err == nil && pInt != 0 { p = pInt } } From 63b558afb1b2b45a13b7692d6786d9e0f5f8dd08 Mon Sep 17 00:00:00 2001 From: abhishek9686 Date: Fri, 24 Jan 2025 10:17:47 +0530 Subject: [PATCH 09/11] set replace peer to false on pull --- controllers/hosts.go | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/controllers/hosts.go b/controllers/hosts.go index 1346b6543..b824e1925 100644 --- a/controllers/hosts.go +++ b/controllers/hosts.go @@ -5,7 +5,6 @@ import ( "errors" "fmt" "net/http" - "os" "github.com/google/uuid" "github.com/gorilla/mux" @@ -182,11 +181,7 @@ func pull(w http.ResponseWriter, r *http.Request) { } } if sendPeerUpdate { - reset := true - if os.Getenv("RESET_PEER_UPDATE") != "" { - reset = os.Getenv("RESET_PEER_UPDATE") == "true" - } - if err := mq.PublishPeerUpdate(reset); err != nil { + if err := mq.PublishPeerUpdate(false); err != nil { logger.Log(0, "fail to publish peer update: ", err.Error()) } } From 58381a5ea25f14db8b3e8d8c3897d136736d7016 Mon Sep 17 00:00:00 2001 From: abhishek9686 Date: Sun, 26 Jan 2025 19:58:48 +0530 Subject: [PATCH 10/11] do not replace peers on failover sync --- controllers/hosts.go | 4 ++-- logic/util.go | 25 +++++++++++++++++++++++++ mq/handlers.go | 6 ++++++ mq/publishers.go | 1 - utils/utils.go | 22 +++++++++++++++++++++- 5 files changed, 54 insertions(+), 4 deletions(-) diff --git a/controllers/hosts.go b/controllers/hosts.go index b824e1925..aa2dbbbd8 100644 --- a/controllers/hosts.go +++ b/controllers/hosts.go @@ -311,11 +311,11 @@ func hostUpdateFallback(w http.ResponseWriter, r *http.Request) { 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()) + slog.Error("failed to update a host:", "user", r.Header.Get("user"), "error", err.Error()) logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal")) return } - slog.Info("recieved host update", "name", hostUpdate.Host.Name, "id", hostUpdate.Host.ID) + slog.Info("recieved host update", "name", hostUpdate.Host.Name, "id", hostUpdate.Host.ID, "action", hostUpdate.Action) switch hostUpdate.Action { case models.CheckIn: sendPeerUpdate = mq.HandleHostCheckin(&hostUpdate.Host, currentHost) diff --git a/logic/util.go b/logic/util.go index bff2ced67..22ee3f097 100644 --- a/logic/util.go +++ b/logic/util.go @@ -7,6 +7,7 @@ import ( "encoding/base64" "encoding/json" "fmt" + "log/slog" "net" "os" "strings" @@ -91,6 +92,30 @@ func StringSliceContains(slice []string, item string) bool { } return false } +func SetVerbosity(logLevel int) { + var level slog.Level + switch logLevel { + + case 0: + level = slog.LevelInfo + case 1: + level = slog.LevelError + case 2: + level = slog.LevelWarn + case 3: + level = slog.LevelDebug + + default: + level = slog.LevelInfo + } + // Create the logger with the chosen level + handler := slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{ + Level: level, + }) + logger := slog.New(handler) + slog.SetDefault(logger) + +} // NormalizeCIDR - returns the first address of CIDR func NormalizeCIDR(address string) (string, error) { diff --git a/mq/handlers.go b/mq/handlers.go index 129133268..efbe19e08 100644 --- a/mq/handlers.go +++ b/mq/handlers.go @@ -2,6 +2,7 @@ package mq import ( "encoding/json" + "fmt" mqtt "github.com/eclipse/paho.mqtt.golang" "github.com/google/uuid" @@ -280,6 +281,11 @@ func HandleHostCheckin(h, currentHost *models.Host) bool { (h.ListenPort != 0 && h.ListenPort != currentHost.ListenPort) || (h.WgPublicListenPort != 0 && h.WgPublicListenPort != currentHost.WgPublicListenPort) || (!h.EndpointIPv6.Equal(currentHost.EndpointIPv6)) if ifaceDelta { // only save if something changes + fmt.Println("\n=========> IFACE DELTA =============>\n") + fmt.Printf("===>Curr: %+v\n", currentHost) + fmt.Printf("===>NEW: %+v\n", h) + fmt.Println("\n=========>===========================>\n") + currentHost.EndpointIP = h.EndpointIP currentHost.EndpointIPv6 = h.EndpointIPv6 currentHost.Interfaces = h.Interfaces diff --git a/mq/publishers.go b/mq/publishers.go index 28ef1935d..bb6010f8f 100644 --- a/mq/publishers.go +++ b/mq/publishers.go @@ -17,7 +17,6 @@ import ( // PublishPeerUpdate --- determines and publishes a peer update to all the hosts func PublishPeerUpdate(replacePeers bool) error { - if !servercfg.IsMessageQueueBackend() { return nil } diff --git a/utils/utils.go b/utils/utils.go index cb8c41d89..9138f3437 100644 --- a/utils/utils.go +++ b/utils/utils.go @@ -1,6 +1,10 @@ package utils -import "time" +import ( + "fmt" + "runtime" + "time" +) // RetryStrategy specifies a strategy to retry an operation after waiting a while, // with hooks for successful and unsuccessful (>=max) tries. @@ -39,3 +43,19 @@ func (rs RetryStrategy) DoStrategy() { return } } + +func TraceCaller() { + // Skip 1 frame to get the caller of this function + pc, file, line, ok := runtime.Caller(2) + if !ok { + fmt.Println("Unable to get caller information") + return + } + + // Get function name from the program counter (pc) + funcName := runtime.FuncForPC(pc).Name() + + // Print trace details + fmt.Printf("Called from function: %s\n", funcName) + fmt.Printf("File: %s, Line: %d\n", file, line) +} From 637f4565c56529befc1104f4286c3b22b4fe3679 Mon Sep 17 00:00:00 2001 From: abhishek9686 Date: Sun, 26 Jan 2025 20:04:23 +0530 Subject: [PATCH 11/11] remove debug log --- mq/handlers.go | 5 ----- 1 file changed, 5 deletions(-) diff --git a/mq/handlers.go b/mq/handlers.go index efbe19e08..3b33bb69d 100644 --- a/mq/handlers.go +++ b/mq/handlers.go @@ -2,7 +2,6 @@ package mq import ( "encoding/json" - "fmt" mqtt "github.com/eclipse/paho.mqtt.golang" "github.com/google/uuid" @@ -281,10 +280,6 @@ func HandleHostCheckin(h, currentHost *models.Host) bool { (h.ListenPort != 0 && h.ListenPort != currentHost.ListenPort) || (h.WgPublicListenPort != 0 && h.WgPublicListenPort != currentHost.WgPublicListenPort) || (!h.EndpointIPv6.Equal(currentHost.EndpointIPv6)) if ifaceDelta { // only save if something changes - fmt.Println("\n=========> IFACE DELTA =============>\n") - fmt.Printf("===>Curr: %+v\n", currentHost) - fmt.Printf("===>NEW: %+v\n", h) - fmt.Println("\n=========>===========================>\n") currentHost.EndpointIP = h.EndpointIP currentHost.EndpointIPv6 = h.EndpointIPv6