Browse Source

remade server logs

afeiszli 3 years ago
parent
commit
932712619a

+ 10 - 9
auth/auth.go

@@ -7,6 +7,7 @@ import (
 	"net/http"
 	"strings"
 
+	"github.com/gravitl/netmaker/logger"
 	"github.com/gravitl/netmaker/logic"
 	"github.com/gravitl/netmaker/models"
 	"github.com/gravitl/netmaker/servercfg"
@@ -53,7 +54,7 @@ func InitializeAuthProvider() string {
 	}
 	var _, err = fetchPassValue(logic.RandomString(64))
 	if err != nil {
-		logic.Log(err.Error(), 0)
+		logger.Log(0, err.Error())
 		return ""
 	}
 	var currentFrontendURL = servercfg.GetFrontendURL()
@@ -64,10 +65,10 @@ func InitializeAuthProvider() string {
 	var serverConn = servercfg.GetAPIHost()
 	if strings.Contains(serverConn, "localhost") || strings.Contains(serverConn, "127.0.0.1") {
 		serverConn = "http://" + serverConn
-		logic.Log("localhost OAuth detected, proceeding with insecure http redirect: "+serverConn+")", 1)
+		logger.Log(1, "localhost OAuth detected, proceeding with insecure http redirect: (", serverConn, ")")
 	} else {
 		serverConn = "https://" + serverConn
-		logic.Log("external OAuth detected, proceeding with https redirect: ("+serverConn+")", 1)
+		logger.Log(1, "external OAuth detected, proceeding with https redirect: ("+serverConn+")")
 	}
 
 	functions[init_provider].(func(string, string, string))(serverConn+"/api/oauth/callback", authInfo[1], authInfo[2])
@@ -122,7 +123,7 @@ func IsOauthUser(user *models.User) error {
 func addUser(email string) error {
 	var hasAdmin, err = logic.HasAdmin()
 	if err != nil {
-		logic.Log("error checking for existence of admin user during OAuth login for "+email+", user not added", 1)
+		logger.Log(1, "error checking for existence of admin user during OAuth login for", email, "; user not added")
 		return err
 	} // generate random password to adapt to current model
 	var newPass, fetchErr = fetchPassValue("")
@@ -135,17 +136,17 @@ func addUser(email string) error {
 	}
 	if !hasAdmin { // must be first attempt, create an admin
 		if newUser, err = logic.CreateAdmin(newUser); err != nil {
-			logic.Log("error creating admin from user, "+email+", user not added", 1)
+			logger.Log(1, "error creating admin from user,", email, "; user not added")
 		} else {
-			logic.Log("admin created from user, "+email+", was first user added", 0)
+			logger.Log(1, "admin created from user,", email, "; was first user added")
 		}
 	} else { // otherwise add to db as admin..?
 		// TODO: add ability to add users with preemptive permissions
 		newUser.IsAdmin = false
 		if newUser, err = logic.CreateUser(newUser); err != nil {
-			logic.Log("error creating user, "+email+", user not added", 1)
+			logger.Log(1, "error creating user,", email, "; user not added")
 		} else {
-			logic.Log("user created from, "+email+"", 0)
+			logger.Log(0, "user created from ", email)
 		}
 	}
 	return nil
@@ -176,7 +177,7 @@ func fetchPassValue(newValue string) (string, error) {
 
 	var b64CurrentValue, b64Err = base64.StdEncoding.DecodeString(newValueHolder.Value)
 	if b64Err != nil {
-		logic.Log("could not decode pass", 0)
+		logger.Log(0, "could not decode pass")
 		return "", nil
 	}
 	return string(b64CurrentValue), nil

+ 4 - 3
auth/azure-ad.go

@@ -7,6 +7,7 @@ import (
 	"net/http"
 	"os"
 
+	"github.com/gravitl/netmaker/logger"
 	"github.com/gravitl/netmaker/logic"
 	"github.com/gravitl/netmaker/models"
 	"github.com/gravitl/netmaker/servercfg"
@@ -56,7 +57,7 @@ func handleAzureCallback(w http.ResponseWriter, r *http.Request) {
 
 	var content, err = getAzureUserInfo(r.FormValue("state"), r.FormValue("code"))
 	if err != nil {
-		logic.Log("error when getting user info from azure: "+err.Error(), 1)
+		logger.Log(1, "error when getting user info from azure:", err.Error())
 		http.Redirect(w, r, servercfg.GetFrontendURL()+"/login?oauth=callback-error", http.StatusTemporaryRedirect)
 		return
 	}
@@ -78,11 +79,11 @@ func handleAzureCallback(w http.ResponseWriter, r *http.Request) {
 
 	var jwt, jwtErr = logic.VerifyAuthRequest(authRequest)
 	if jwtErr != nil {
-		logic.Log("could not parse jwt for user "+authRequest.UserName, 1)
+		logger.Log(1, "could not parse jwt for user", authRequest.UserName)
 		return
 	}
 
-	logic.Log("completed azure OAuth sigin in for "+content.UserPrincipalName, 1)
+	logger.Log(1, "completed azure OAuth sigin in for", content.UserPrincipalName)
 	http.Redirect(w, r, servercfg.GetFrontendURL()+"/login?login="+jwt+"&user="+content.UserPrincipalName, http.StatusPermanentRedirect)
 }
 

+ 4 - 3
auth/github.go

@@ -6,6 +6,7 @@ import (
 	"io/ioutil"
 	"net/http"
 
+	"github.com/gravitl/netmaker/logger"
 	"github.com/gravitl/netmaker/logic"
 	"github.com/gravitl/netmaker/models"
 	"github.com/gravitl/netmaker/servercfg"
@@ -55,7 +56,7 @@ func handleGithubCallback(w http.ResponseWriter, r *http.Request) {
 
 	var content, err = getGithubUserInfo(r.URL.Query().Get("state"), r.URL.Query().Get("code"))
 	if err != nil {
-		logic.Log("error when getting user info from github: "+err.Error(), 1)
+		logger.Log(1, "error when getting user info from github:", err.Error())
 		http.Redirect(w, r, servercfg.GetFrontendURL()+"/login?oauth=callback-error", http.StatusTemporaryRedirect)
 		return
 	}
@@ -77,11 +78,11 @@ func handleGithubCallback(w http.ResponseWriter, r *http.Request) {
 
 	var jwt, jwtErr = logic.VerifyAuthRequest(authRequest)
 	if jwtErr != nil {
-		logic.Log("could not parse jwt for user "+authRequest.UserName, 1)
+		logger.Log(1, "could not parse jwt for user", authRequest.UserName)
 		return
 	}
 
-	logic.Log("completed github OAuth sigin in for "+content.Login, 1)
+	logger.Log(1, "completed github OAuth sigin in for", content.Login)
 	http.Redirect(w, r, servercfg.GetFrontendURL()+"/login?login="+jwt+"&user="+content.Login, http.StatusPermanentRedirect)
 }
 

+ 4 - 3
auth/google.go

@@ -6,6 +6,7 @@ import (
 	"io/ioutil"
 	"net/http"
 
+	"github.com/gravitl/netmaker/logger"
 	"github.com/gravitl/netmaker/logic"
 	"github.com/gravitl/netmaker/models"
 	"github.com/gravitl/netmaker/servercfg"
@@ -55,7 +56,7 @@ func handleGoogleCallback(w http.ResponseWriter, r *http.Request) {
 
 	var content, err = getGoogleUserInfo(r.FormValue("state"), r.FormValue("code"))
 	if err != nil {
-		logic.Log("error when getting user info from google: "+err.Error(), 1)
+		logger.Log(1, "error when getting user info from google:", err.Error())
 		http.Redirect(w, r, servercfg.GetFrontendURL()+"/login?oauth=callback-error", http.StatusTemporaryRedirect)
 		return
 	}
@@ -77,11 +78,11 @@ func handleGoogleCallback(w http.ResponseWriter, r *http.Request) {
 
 	var jwt, jwtErr = logic.VerifyAuthRequest(authRequest)
 	if jwtErr != nil {
-		logic.Log("could not parse jwt for user "+authRequest.UserName, 1)
+		logger.Log(1, "could not parse jwt for user", authRequest.UserName)
 		return
 	}
 
-	logic.Log("completed google OAuth sigin in for "+content.Email, 1)
+	logger.Log(1, "completed google OAuth sigin in for", content.Email)
 	http.Redirect(w, r, servercfg.GetFrontendURL()+"/login?login="+jwt+"&user="+content.Email, http.StatusPermanentRedirect)
 }
 

+ 2 - 2
controllers/common.go

@@ -5,7 +5,7 @@ import (
 	"strings"
 
 	"github.com/gravitl/netmaker/database"
-	"github.com/gravitl/netmaker/functions"
+	"github.com/gravitl/netmaker/logger"
 	"github.com/gravitl/netmaker/logic"
 	"github.com/gravitl/netmaker/models"
 	"github.com/gravitl/netmaker/servercfg"
@@ -34,7 +34,7 @@ func DeleteNode(key string, exterminate bool) error {
 		}
 	} else {
 		if err := database.DeleteRecord(database.DELETED_NODES_TABLE_NAME, key); err != nil {
-			functions.PrintUserLog("", err.Error(), 2)
+			logger.Log(2, err.Error())
 		}
 	}
 	if err := database.DeleteRecord(database.NODES_TABLE_NAME, key); err != nil {

+ 10 - 6
controllers/controller.go

@@ -2,15 +2,16 @@ package controller
 
 import (
 	"context"
-	"log"
+	"fmt"
 	"net/http"
 	"os"
 	"os/signal"
 	"sync"
+	"time"
 
 	"github.com/gorilla/handlers"
 	"github.com/gorilla/mux"
-	"github.com/gravitl/netmaker/logic"
+	"github.com/gravitl/netmaker/logger"
 	"github.com/gravitl/netmaker/servercfg"
 )
 
@@ -33,6 +34,7 @@ func HandleRESTRequests(wg *sync.WaitGroup) {
 	fileHandlers(r)
 	serverHandlers(r)
 	extClientHandlers(r)
+	loggerHandlers(r)
 
 	port := servercfg.GetAPIPort()
 
@@ -40,10 +42,10 @@ func HandleRESTRequests(wg *sync.WaitGroup) {
 	go func() {
 		err := srv.ListenAndServe()
 		if err != nil {
-			log.Println(err)
+			logger.Log(0, err.Error())
 		}
 	}()
-	logic.Log("REST Server successfully started on port "+port+" (REST)", 0)
+	logger.Log(0, "REST Server successfully started on port ", port, " (REST)")
 	c := make(chan os.Signal)
 
 	// Relay os.Interrupt to our channel (os.Interrupt = CTRL+C)
@@ -55,7 +57,9 @@ func HandleRESTRequests(wg *sync.WaitGroup) {
 	<-c
 
 	// After receiving CTRL+C Properly stop the server
-	logic.Log("Stopping the REST server...", 0)
+	logger.Log(0, "Stopping the REST server...")
 	srv.Shutdown(context.TODO())
-	logic.Log("REST Server closed.", 0)
+	logger.Log(0, "REST Server closed.")
+	logger.DumpFile(fmt.Sprintf("data/netmaker.log.%s", time.Now().Format(logger.TimeFormatDay)))
+
 }

+ 6 - 6
controllers/dnsHttpController.go

@@ -8,7 +8,7 @@ import (
 	"github.com/go-playground/validator/v10"
 	"github.com/gorilla/mux"
 	"github.com/gravitl/netmaker/database"
-	"github.com/gravitl/netmaker/functions"
+	"github.com/gravitl/netmaker/logger"
 	"github.com/gravitl/netmaker/logic"
 	"github.com/gravitl/netmaker/models"
 )
@@ -252,7 +252,7 @@ func deleteDNS(w http.ResponseWriter, r *http.Request) {
 		return
 	}
 	entrytext := params["domain"] + "." + params["network"]
-	functions.PrintUserLog(models.NODE_SERVER_NAME, "deleted dns entry: "+entrytext, 1)
+	logger.Log(1, "deleted dns entry: ", entrytext)
 	err = logic.SetDNS()
 	if err != nil {
 		returnErrorResponse(w, r, formatError(err, "internal"))
@@ -337,7 +337,7 @@ func pushDNS(w http.ResponseWriter, r *http.Request) {
 		returnErrorResponse(w, r, formatError(err, "internal"))
 		return
 	}
-	functions.PrintUserLog(r.Header.Get("user"), "pushed DNS updates to nameserver", 1)
+	logger.Log(1, r.Header.Get("user"), "pushed DNS updates to nameserver")
 	json.NewEncoder(w).Encode("DNS Pushed to CoreDNS")
 }
 
@@ -359,7 +359,7 @@ func ValidateDNSCreate(entry models.DNSEntry) error {
 	err := v.Struct(entry)
 	if err != nil {
 		for _, e := range err.(validator.ValidationErrors) {
-			functions.PrintUserLog("", e.Error(), 1)
+			logger.Log(1, e.Error())
 		}
 	}
 	return err
@@ -381,7 +381,7 @@ func ValidateDNSUpdate(change models.DNSEntry, entry models.DNSEntry) error {
 	_ = v.RegisterValidation("network_exists", func(fl validator.FieldLevel) bool {
 		_, err := logic.GetParentNetwork(change.Network)
 		if err != nil {
-			functions.PrintUserLog("", err.Error(), 0)
+			logger.Log(0, err.Error())
 		}
 		return err == nil
 	})
@@ -404,7 +404,7 @@ func ValidateDNSUpdate(change models.DNSEntry, entry models.DNSEntry) error {
 
 	if err != nil {
 		for _, e := range err.(validator.ValidationErrors) {
-			functions.PrintUserLog("", e.Error(), 1)
+			logger.Log(1, e.Error())
 		}
 	}
 	return err

+ 8 - 7
controllers/extClientHttpController.go

@@ -12,6 +12,7 @@ import (
 	"github.com/gorilla/mux"
 	"github.com/gravitl/netmaker/database"
 	"github.com/gravitl/netmaker/functions"
+	"github.com/gravitl/netmaker/logger"
 	"github.com/gravitl/netmaker/logic"
 	"github.com/gravitl/netmaker/models"
 	"github.com/skip2/go-qrcode"
@@ -162,14 +163,14 @@ func getExtClientConf(w http.ResponseWriter, r *http.Request) {
 
 	gwnode, err := logic.GetNodeByMacAddress(client.Network, client.IngressGatewayID)
 	if err != nil {
-		functions.PrintUserLog(r.Header.Get("user"), "Could not retrieve Ingress Gateway Node "+client.IngressGatewayID, 1)
+		logger.Log(1, fmt.Sprintf("%s %s %s", r.Header.Get("user"), "Could not retrieve Ingress Gateway Node", client.IngressGatewayID))
 		returnErrorResponse(w, r, formatError(err, "internal"))
 		return
 	}
 
 	network, err := logic.GetParentNetwork(client.Network)
 	if err != nil {
-		functions.PrintUserLog(r.Header.Get("user"), "Could not retrieve Ingress Gateway Network "+client.Network, 1)
+		logger.Log(1, r.Header.Get("user"), "Could not retrieve Ingress Gateway Network", client.Network)
 		returnErrorResponse(w, r, formatError(err, "internal"))
 		return
 	}
@@ -234,7 +235,7 @@ Endpoint = %s
 		}
 		return
 	}
-	functions.PrintUserLog(r.Header.Get("user"), "retrieved ext client config", 2)
+	logger.Log(2, r.Header.Get("user"), "retrieved ext client config")
 	w.WriteHeader(http.StatusOK)
 	json.NewEncoder(w).Encode(client)
 }
@@ -348,7 +349,7 @@ func updateExtClient(w http.ResponseWriter, r *http.Request) {
 		returnErrorResponse(w, r, formatError(err, "internal"))
 		return
 	}
-	functions.PrintUserLog(r.Header.Get("user"), "updated client "+newExtClient.ClientID, 1)
+	logger.Log(1, r.Header.Get("user"), "updated client", newExtClient.ClientID)
 	w.WriteHeader(http.StatusOK)
 	json.NewEncoder(w).Encode(newclient)
 }
@@ -384,7 +385,7 @@ func DeleteGatewayExtClients(gatewayID string, networkName string) error {
 	for _, extClient := range currentExtClients {
 		if extClient.IngressGatewayID == gatewayID {
 			if err = DeleteExtClient(networkName, extClient.ClientID); err != nil {
-				functions.PrintUserLog(models.NODE_SERVER_NAME, "failed to remove ext client "+extClient.ClientID, 2)
+				logger.Log(1, "failed to remove ext client", extClient.ClientID)
 				continue
 			}
 		}
@@ -408,7 +409,7 @@ func deleteExtClient(w http.ResponseWriter, r *http.Request) {
 		returnErrorResponse(w, r, formatError(err, "internal"))
 		return
 	}
-	functions.PrintUserLog(r.Header.Get("user"),
-		"Deleted extclient client "+params["clientid"]+" from network "+params["network"], 1)
+	logger.Log(1, r.Header.Get("user"),
+		"Deleted extclient client", params["clientid"], "from network", params["network"])
 	returnSuccessResponse(w, r, params["clientid"]+" deleted.")
 }

+ 23 - 0
controllers/loggerHttpController.go

@@ -0,0 +1,23 @@
+package controller
+
+import (
+	"fmt"
+	"net/http"
+	"time"
+
+	"github.com/gorilla/mux"
+	"github.com/gravitl/netmaker/logger"
+)
+
+func loggerHandlers(r *mux.Router) {
+	r.HandleFunc("/api/logs", securityCheckDNS(true, true, http.HandlerFunc(getLogs))).Methods("GET")
+}
+
+func getLogs(w http.ResponseWriter, r *http.Request) {
+	var currentTime = time.Now().Format(logger.TimeFormatDay)
+	var currentFilePath = fmt.Sprintf("data/netmaker.log.%s", currentTime)
+	logger.DumpFile(currentFilePath)
+	logger.ResetLogs()
+	w.WriteHeader(http.StatusOK)
+	w.Write([]byte(logger.Retrieve(currentFilePath)))
+}

+ 17 - 16
controllers/networkHttpController.go

@@ -12,6 +12,7 @@ import (
 	"github.com/gorilla/mux"
 	"github.com/gravitl/netmaker/database"
 	"github.com/gravitl/netmaker/functions"
+	"github.com/gravitl/netmaker/logger"
 	"github.com/gravitl/netmaker/logic"
 	"github.com/gravitl/netmaker/models"
 	"github.com/gravitl/netmaker/servercfg"
@@ -158,7 +159,7 @@ func getNetworks(w http.ResponseWriter, r *http.Request) {
 			allnetworks[i] = net
 		}
 	}
-	functions.PrintUserLog(r.Header.Get("user"), "fetched networks.", 2)
+	logger.Log(2, r.Header.Get("user"), "fetched networks.")
 	w.WriteHeader(http.StatusOK)
 	json.NewEncoder(w).Encode(allnetworks)
 }
@@ -178,7 +179,7 @@ func ValidateNetworkUpdate(network models.Network) error {
 
 	if err != nil {
 		for _, e := range err.(validator.ValidationErrors) {
-			functions.PrintUserLog("validator", e.Error(), 1)
+			logger.Log(1, "validator", e.Error())
 		}
 	}
 	return err
@@ -198,7 +199,7 @@ func getNetwork(w http.ResponseWriter, r *http.Request) {
 	if !servercfg.IsDisplayKeys() {
 		network.AccessKeys = logic.RemoveKeySensitiveInfo(network.AccessKeys)
 	}
-	functions.PrintUserLog(r.Header.Get("user"), "fetched network "+netname, 2)
+	logger.Log(2, r.Header.Get("user"), "fetched network", netname)
 	w.WriteHeader(http.StatusOK)
 	json.NewEncoder(w).Encode(network)
 }
@@ -226,7 +227,7 @@ func keyUpdate(w http.ResponseWriter, r *http.Request) {
 		returnErrorResponse(w, r, formatError(err, "internal"))
 		return
 	}
-	functions.PrintUserLog(r.Header.Get("user"), "updated key on network "+netname, 2)
+	logger.Log(2, r.Header.Get("user"), "updated key on network", netname)
 	w.WriteHeader(http.StatusOK)
 	json.NewEncoder(w).Encode(network)
 }
@@ -301,7 +302,7 @@ func updateNetwork(w http.ResponseWriter, r *http.Request) {
 			return
 		}
 	}
-	functions.PrintUserLog(r.Header.Get("user"), "updated network "+netname, 1)
+	logger.Log(1, r.Header.Get("user"), "updated network", netname)
 	w.WriteHeader(http.StatusOK)
 	json.NewEncoder(w).Encode(newNetwork)
 }
@@ -329,7 +330,7 @@ func updateNetworkNodeLimit(w http.ResponseWriter, r *http.Request) {
 			return
 		}
 		database.Insert(network.NetID, string(data), database.NETWORKS_TABLE_NAME)
-		functions.PrintUserLog(r.Header.Get("user"), "updated network node limit on, "+netname, 1)
+		logger.Log(1, r.Header.Get("user"), "updated network node limit on", netname)
 	}
 	w.WriteHeader(http.StatusOK)
 	json.NewEncoder(w).Encode(network)
@@ -353,7 +354,7 @@ func deleteNetwork(w http.ResponseWriter, r *http.Request) {
 		returnErrorResponse(w, r, formatError(err, errtype))
 		return
 	}
-	functions.PrintUserLog(r.Header.Get("user"), "deleted network "+network, 1)
+	logger.Log(1, r.Header.Get("user"), "deleted network", network)
 	w.WriteHeader(http.StatusOK)
 	json.NewEncoder(w).Encode("success")
 }
@@ -366,13 +367,13 @@ func DeleteNetwork(network string) error {
 		if err == nil {
 			for _, s := range servers {
 				if err = logic.DeleteNode(&s, true); err != nil {
-					functions.PrintUserLog("", "could not removed server "+s.Name+" before deleting network "+network, 2)
+					logger.Log(2, "could not removed server", s.Name, "before deleting network", network)
 				} else {
-					functions.PrintUserLog("", "removed server "+s.Name+" before deleting network "+network, 2)
+					logger.Log(2, "removed server", s.Name, "before deleting network", network)
 				}
 			}
 		} else {
-			functions.PrintUserLog("", "could not remove servers before deleting network "+network, 1)
+			logger.Log(1, "could not remove servers before deleting network", network)
 		}
 		return database.DeleteRecord(database.NETWORKS_TABLE_NAME, network)
 	}
@@ -399,7 +400,7 @@ func createNetwork(w http.ResponseWriter, r *http.Request) {
 		returnErrorResponse(w, r, formatError(err, "badrequest"))
 		return
 	}
-	functions.PrintUserLog(r.Header.Get("user"), "created network "+network.NetID, 1)
+	logger.Log(1, r.Header.Get("user"), "created network", network.NetID)
 	w.WriteHeader(http.StatusOK)
 	//json.NewEncoder(w).Encode(result)
 }
@@ -461,7 +462,7 @@ func createAccessKey(w http.ResponseWriter, r *http.Request) {
 		returnErrorResponse(w, r, formatError(err, "badrequest"))
 		return
 	}
-	functions.PrintUserLog(r.Header.Get("user"), "created access key "+accesskey.Name+" on "+netname, 1)
+	logger.Log(1, r.Header.Get("user"), "created access key", accesskey.Name, "on", netname)
 	w.WriteHeader(http.StatusOK)
 	json.NewEncoder(w).Encode(key)
 	//w.Write([]byte(accesskey.AccessString))
@@ -527,7 +528,7 @@ func CreateAccessKey(accesskey models.AccessKey, network models.Network) (models
 	err = v.Struct(accesskey)
 	if err != nil {
 		for _, e := range err.(validator.ValidationErrors) {
-			functions.PrintUserLog("validator", e.Error(), 1)
+			logger.Log(1, "validator", e.Error())
 		}
 		return models.AccessKey{}, err
 	}
@@ -578,7 +579,7 @@ func getSignupToken(w http.ResponseWriter, r *http.Request) {
 		returnErrorResponse(w, r, formatError(err, "internal"))
 		return
 	}
-	functions.PrintUserLog(r.Header.Get("user"), "got signup token "+netID, 2)
+	logger.Log(2, r.Header.Get("user"), "got signup token", netID)
 	w.WriteHeader(http.StatusOK)
 	json.NewEncoder(w).Encode(token)
 }
@@ -596,7 +597,7 @@ func getAccessKeys(w http.ResponseWriter, r *http.Request) {
 	if !servercfg.IsDisplayKeys() {
 		keys = logic.RemoveKeySensitiveInfo(keys)
 	}
-	functions.PrintUserLog(r.Header.Get("user"), "fetched access keys on network "+network, 2)
+	logger.Log(2, r.Header.Get("user"), "fetched access keys on network", network)
 	w.WriteHeader(http.StatusOK)
 	json.NewEncoder(w).Encode(keys)
 }
@@ -624,7 +625,7 @@ func deleteAccessKey(w http.ResponseWriter, r *http.Request) {
 		returnErrorResponse(w, r, formatError(err, "badrequest"))
 		return
 	}
-	functions.PrintUserLog(r.Header.Get("user"), "deleted access key "+keyname+" on network "+netname, 1)
+	logger.Log(1, r.Header.Get("user"), "deleted access key", keyname, "on network,", netname)
 	w.WriteHeader(http.StatusOK)
 }
 func DeleteKey(keyname, netname string) error {

+ 2 - 2
controllers/nodeGrpcController.go

@@ -6,8 +6,8 @@ import (
 	"errors"
 	"strings"
 
-	"github.com/gravitl/netmaker/functions"
 	nodepb "github.com/gravitl/netmaker/grpc"
+	"github.com/gravitl/netmaker/logger"
 	"github.com/gravitl/netmaker/logic"
 	"github.com/gravitl/netmaker/models"
 )
@@ -170,7 +170,7 @@ func (s *NodeServiceServer) GetPeers(ctx context.Context, req *nodepb.Object) (*
 		}
 
 		peersData, err := json.Marshal(&peers)
-		functions.PrintUserLog(node.Address, "checked in successfully", 3)
+		logger.Log(3, node.Address, "checked in successfully")
 		return &nodepb.Object{
 			Data: string(peersData),
 			Type: nodepb.NODE_TYPE,

+ 14 - 13
controllers/nodeHttpController.go

@@ -10,6 +10,7 @@ import (
 	"github.com/gorilla/mux"
 	"github.com/gravitl/netmaker/database"
 	"github.com/gravitl/netmaker/functions"
+	"github.com/gravitl/netmaker/logger"
 	"github.com/gravitl/netmaker/logic"
 	"github.com/gravitl/netmaker/models"
 	"github.com/gravitl/netmaker/servercfg"
@@ -275,7 +276,7 @@ func getNetworkNodes(w http.ResponseWriter, r *http.Request) {
 	}
 
 	//Returns all the nodes in JSON format
-	functions.PrintUserLog(r.Header.Get("user"), "fetched nodes on network"+networkName, 2)
+	logger.Log(2, r.Header.Get("user"), "fetched nodes on network", networkName)
 	w.WriteHeader(http.StatusOK)
 	json.NewEncoder(w).Encode(nodes)
 }
@@ -304,7 +305,7 @@ func getAllNodes(w http.ResponseWriter, r *http.Request) {
 		}
 	}
 	//Return all the nodes in JSON format
-	functions.PrintUserLog(r.Header.Get("user"), "fetched nodes", 2)
+	logger.Log(2, r.Header.Get("user"), "fetched nodes")
 	w.WriteHeader(http.StatusOK)
 	json.NewEncoder(w).Encode(nodes)
 }
@@ -334,7 +335,7 @@ func getNode(w http.ResponseWriter, r *http.Request) {
 		returnErrorResponse(w, r, formatError(err, "internal"))
 		return
 	}
-	functions.PrintUserLog(r.Header.Get("user"), "fetched node "+params["macaddress"], 2)
+	logger.Log(2, r.Header.Get("user"), "fetched node", params["macaddress"])
 	w.WriteHeader(http.StatusOK)
 	json.NewEncoder(w).Encode(node)
 }
@@ -353,7 +354,7 @@ func getLastModified(w http.ResponseWriter, r *http.Request) {
 		returnErrorResponse(w, r, formatError(err, "internal"))
 		return
 	}
-	functions.PrintUserLog(r.Header.Get("user"), "called last modified", 2)
+	logger.Log(2, r.Header.Get("user"), "called last modified")
 	w.WriteHeader(http.StatusOK)
 	json.NewEncoder(w).Encode(network.NodesLastModified)
 }
@@ -420,7 +421,7 @@ func createNode(w http.ResponseWriter, r *http.Request) {
 		returnErrorResponse(w, r, formatError(err, "internal"))
 		return
 	}
-	functions.PrintUserLog(r.Header.Get("user"), "created new node "+node.Name+" on network "+node.Network, 1)
+	logger.Log(1, r.Header.Get("user"), "created new node", node.Name, "on network", node.Network)
 	w.WriteHeader(http.StatusOK)
 	json.NewEncoder(w).Encode(node)
 }
@@ -435,7 +436,7 @@ func uncordonNode(w http.ResponseWriter, r *http.Request) {
 		returnErrorResponse(w, r, formatError(err, "internal"))
 		return
 	}
-	functions.PrintUserLog(r.Header.Get("user"), "uncordoned node "+node.Name, 1)
+	logger.Log(1, r.Header.Get("user"), "uncordoned node", node.Name)
 	w.WriteHeader(http.StatusOK)
 	json.NewEncoder(w).Encode("SUCCESS")
 }
@@ -478,7 +479,7 @@ func createEgressGateway(w http.ResponseWriter, r *http.Request) {
 		returnErrorResponse(w, r, formatError(err, "internal"))
 		return
 	}
-	functions.PrintUserLog(r.Header.Get("user"), "created egress gateway on node "+gateway.NodeID+" on network "+gateway.NetID, 1)
+	logger.Log(1, r.Header.Get("user"), "created egress gateway on node", gateway.NodeID, "on network", gateway.NetID)
 	w.WriteHeader(http.StatusOK)
 	json.NewEncoder(w).Encode(node)
 }
@@ -561,7 +562,7 @@ func deleteEgressGateway(w http.ResponseWriter, r *http.Request) {
 		returnErrorResponse(w, r, formatError(err, "internal"))
 		return
 	}
-	functions.PrintUserLog(r.Header.Get("user"), "deleted egress gateway "+nodeMac+" on network "+netid, 1)
+	logger.Log(1, r.Header.Get("user"), "deleted egress gateway", nodeMac, "on network", netid)
 	w.WriteHeader(http.StatusOK)
 	json.NewEncoder(w).Encode(node)
 }
@@ -612,7 +613,7 @@ func createIngressGateway(w http.ResponseWriter, r *http.Request) {
 		returnErrorResponse(w, r, formatError(err, "internal"))
 		return
 	}
-	functions.PrintUserLog(r.Header.Get("user"), "created ingress gateway on node "+nodeMac+" on network "+netid, 1)
+	logger.Log(1, r.Header.Get("user"), "created ingress gateway on node", nodeMac, "on network", netid)
 	w.WriteHeader(http.StatusOK)
 	json.NewEncoder(w).Encode(node)
 }
@@ -677,7 +678,7 @@ func deleteIngressGateway(w http.ResponseWriter, r *http.Request) {
 		returnErrorResponse(w, r, formatError(err, "internal"))
 		return
 	}
-	functions.PrintUserLog(r.Header.Get("user"), "deleted ingress gateway"+nodeMac, 1)
+	logger.Log(1, r.Header.Get("user"), "deleted ingress gateway", nodeMac)
 	w.WriteHeader(http.StatusOK)
 	json.NewEncoder(w).Encode(node)
 }
@@ -761,7 +762,7 @@ func updateNode(w http.ResponseWriter, r *http.Request) {
 	if relayupdate {
 		UpdateRelay(node.Network, node.RelayAddrs, newNode.RelayAddrs)
 		if err = functions.NetworkNodesUpdatePullChanges(node.Network); err != nil {
-			functions.PrintUserLog("netmaker", "error setting relay updates: "+err.Error(), 1)
+			logger.Log(1, "error setting relay updates:", err.Error())
 		}
 	}
 
@@ -772,7 +773,7 @@ func updateNode(w http.ResponseWriter, r *http.Request) {
 		returnErrorResponse(w, r, formatError(err, "internal"))
 		return
 	}
-	functions.PrintUserLog(r.Header.Get("user"), "updated node "+node.MacAddress+" on network "+node.Network, 1)
+	logger.Log(1, r.Header.Get("user"), "updated node", node.MacAddress, "on network", node.Network)
 	w.WriteHeader(http.StatusOK)
 	json.NewEncoder(w).Encode(newNode)
 }
@@ -792,6 +793,6 @@ func deleteNode(w http.ResponseWriter, r *http.Request) {
 		returnErrorResponse(w, r, formatError(err, "internal"))
 		return
 	}
-	functions.PrintUserLog(r.Header.Get("user"), "Deleted node "+params["macaddress"]+" from network "+params["network"], 1)
+	logger.Log(1, r.Header.Get("user"), "Deleted node", params["macaddress"], "from network", params["network"])
 	returnSuccessResponse(w, r, params["macaddress"]+" deleted.")
 }

+ 5 - 4
controllers/relay.go

@@ -9,6 +9,7 @@ import (
 	"github.com/gorilla/mux"
 	"github.com/gravitl/netmaker/database"
 	"github.com/gravitl/netmaker/functions"
+	"github.com/gravitl/netmaker/logger"
 	"github.com/gravitl/netmaker/logic"
 	"github.com/gravitl/netmaker/models"
 )
@@ -29,7 +30,7 @@ func createRelay(w http.ResponseWriter, r *http.Request) {
 		returnErrorResponse(w, r, formatError(err, "internal"))
 		return
 	}
-	functions.PrintUserLog(r.Header.Get("user"), "created relay on node "+relay.NodeID+" on network "+relay.NetID, 1)
+	logger.Log(1, r.Header.Get("user"), "created relay on node", relay.NodeID, "on network", relay.NetID)
 	w.WriteHeader(http.StatusOK)
 	json.NewEncoder(w).Encode(node)
 }
@@ -84,7 +85,7 @@ func deleteRelay(w http.ResponseWriter, r *http.Request) {
 		returnErrorResponse(w, r, formatError(err, "internal"))
 		return
 	}
-	functions.PrintUserLog(r.Header.Get("user"), "deleted egress gateway "+nodeMac+" on network "+netid, 1)
+	logger.Log(1, r.Header.Get("user"), "deleted egress gateway", nodeMac, "on network", netid)
 	w.WriteHeader(http.StatusOK)
 	json.NewEncoder(w).Encode(node)
 }
@@ -137,11 +138,11 @@ func UpdateRelay(network string, oldAddrs []string, newAddrs []string) {
 	time.Sleep(time.Second / 4)
 	err := SetRelayedNodes("no", network, oldAddrs)
 	if err != nil {
-		functions.PrintUserLog("netmaker", err.Error(), 1)
+		logger.Log(1, err.Error())
 	}
 	err = SetRelayedNodes("yes", network, newAddrs)
 	if err != nil {
-		functions.PrintUserLog("netmaker", err.Error(), 1)
+		logger.Log(1, err.Error())
 	}
 }
 

+ 2 - 2
controllers/responseHttp.go

@@ -4,7 +4,7 @@ import (
 	"encoding/json"
 	"net/http"
 
-	"github.com/gravitl/netmaker/logic"
+	"github.com/gravitl/netmaker/logger"
 	"github.com/gravitl/netmaker/models"
 )
 
@@ -48,7 +48,7 @@ func returnErrorResponse(response http.ResponseWriter, request *http.Request, er
 	if err != nil {
 		panic(err)
 	}
-	logic.Log("processed request error: "+errorMessage.Message, 1)
+	logger.Log(1, "processed request error:", errorMessage.Message)
 	response.Header().Set("Content-Type", "application/json")
 	response.WriteHeader(errorMessage.Code)
 	response.Write(jsonResponse)

+ 10 - 10
controllers/userHttpController.go

@@ -10,7 +10,7 @@ import (
 	"github.com/gorilla/mux"
 	"github.com/gravitl/netmaker/auth"
 	"github.com/gravitl/netmaker/database"
-	"github.com/gravitl/netmaker/functions"
+	"github.com/gravitl/netmaker/logger"
 	"github.com/gravitl/netmaker/logic"
 	"github.com/gravitl/netmaker/models"
 )
@@ -77,7 +77,7 @@ func authenticateUser(response http.ResponseWriter, request *http.Request) {
 		returnErrorResponse(response, request, errorResponse)
 		return
 	}
-	functions.PrintUserLog(username, "was authenticated", 2)
+	logger.Log(2, username, "was authenticated")
 	response.Header().Set("Content-Type", "application/json")
 	response.Write(successJSONResponse)
 }
@@ -196,7 +196,7 @@ func getUser(w http.ResponseWriter, r *http.Request) {
 		returnErrorResponse(w, r, formatError(err, "internal"))
 		return
 	}
-	functions.PrintUserLog(r.Header.Get("user"), "fetched user "+usernameFetched, 2)
+	logger.Log(2, r.Header.Get("user"), "fetched user", usernameFetched)
 	json.NewEncoder(w).Encode(user)
 }
 
@@ -212,7 +212,7 @@ func getUsers(w http.ResponseWriter, r *http.Request) {
 		return
 	}
 
-	functions.PrintUserLog(r.Header.Get("user"), "fetched users", 2)
+	logger.Log(2, r.Header.Get("user"), "fetched users")
 	json.NewEncoder(w).Encode(users)
 }
 
@@ -229,7 +229,7 @@ func createAdmin(w http.ResponseWriter, r *http.Request) {
 		returnErrorResponse(w, r, formatError(err, "badrequest"))
 		return
 	}
-	functions.PrintUserLog(admin.UserName, "was made a new admin", 1)
+	logger.Log(1, admin.UserName, "was made a new admin")
 	json.NewEncoder(w).Encode(admin)
 }
 
@@ -246,7 +246,7 @@ func createUser(w http.ResponseWriter, r *http.Request) {
 		returnErrorResponse(w, r, formatError(err, "badrequest"))
 		return
 	}
-	functions.PrintUserLog(user.UserName, "was created", 1)
+	logger.Log(1, user.UserName, "was created")
 	json.NewEncoder(w).Encode(user)
 }
 
@@ -274,7 +274,7 @@ func updateUserNetworks(w http.ResponseWriter, r *http.Request) {
 		returnErrorResponse(w, r, formatError(err, "badrequest"))
 		return
 	}
-	functions.PrintUserLog(username, "status was updated", 1)
+	logger.Log(1, username, "status was updated")
 	json.NewEncoder(w).Encode(user)
 }
 
@@ -306,7 +306,7 @@ func updateUser(w http.ResponseWriter, r *http.Request) {
 		returnErrorResponse(w, r, formatError(err, "badrequest"))
 		return
 	}
-	functions.PrintUserLog(username, "was updated", 1)
+	logger.Log(1, username, "was updated")
 	json.NewEncoder(w).Encode(user)
 }
 
@@ -337,7 +337,7 @@ func updateUserAdm(w http.ResponseWriter, r *http.Request) {
 		returnErrorResponse(w, r, formatError(err, "badrequest"))
 		return
 	}
-	functions.PrintUserLog(username, "was updated (admin)", 1)
+	logger.Log(1, username, "was updated (admin)")
 	json.NewEncoder(w).Encode(user)
 }
 
@@ -359,6 +359,6 @@ func deleteUser(w http.ResponseWriter, r *http.Request) {
 		return
 	}
 
-	functions.PrintUserLog(username, "was deleted", 1)
+	logger.Log(1, username, "was deleted")
 	json.NewEncoder(w).Encode(params["username"] + " deleted.")
 }

+ 3 - 3
database/database.go

@@ -3,9 +3,9 @@ package database
 import (
 	"encoding/json"
 	"errors"
-	"log"
 	"time"
 
+	"github.com/gravitl/netmaker/logger"
 	"github.com/gravitl/netmaker/servercfg"
 )
 
@@ -90,11 +90,11 @@ func getCurrentDB() map[string]interface{} {
 }
 
 func InitializeDatabase() error {
-	log.Println("[netmaker] connecting to", servercfg.GetDB())
+	logger.Log(0, "connecting to", servercfg.GetDB())
 	tperiod := time.Now().Add(10 * time.Second)
 	for {
 		if err := getCurrentDB()[INIT_DB].(func() error)(); err != nil {
-			log.Println("[netmaker] unable to connect to db, retrying . . .")
+			logger.Log(0, "unable to connect to db, retrying . . .")
 			if time.Now().After(tperiod) {
 				return err
 			}

+ 0 - 9
functions/helpers.go

@@ -11,17 +11,8 @@ import (
 	"github.com/gravitl/netmaker/database"
 	"github.com/gravitl/netmaker/logic"
 	"github.com/gravitl/netmaker/models"
-	"github.com/gravitl/netmaker/servercfg"
 )
 
-// PrintUserLog - prints a log with a given username
-func PrintUserLog(username string, message string, loglevel int) {
-	log.SetFlags(log.Flags() &^ (log.Llongfile | log.Lshortfile))
-	if int32(loglevel) <= servercfg.GetVerbose() && servercfg.GetVerbose() != 0 {
-		log.Println("[netmaker]", username, message)
-	}
-}
-
 // ParseNetwork - parses a network into a model
 func ParseNetwork(value string) (models.Network, error) {
 	var network models.Network

+ 4 - 3
functions/local.go

@@ -3,6 +3,7 @@ package functions
 import (
 	"os"
 
+	"github.com/gravitl/netmaker/logger"
 	"github.com/gravitl/netmaker/logic"
 )
 
@@ -25,21 +26,21 @@ func SetDNSDir() error {
 	if os.IsNotExist(err) {
 		os.Mkdir(dir+"/config/dnsconfig", 0744)
 	} else if err != nil {
-		PrintUserLog("", "couldnt find or create /config/dnsconfig", 0)
+		logger.Log(0, "couldnt find or create /config/dnsconfig")
 		return err
 	}
 	_, err = os.Stat(dir + "/config/dnsconfig/Corefile")
 	if os.IsNotExist(err) {
 		err = logic.SetCorefile(".")
 		if err != nil {
-			PrintUserLog("", err.Error(), 0)
+			logger.Log(0, err.Error())
 		}
 	}
 	_, err = os.Stat(dir + "/config/dnsconfig/netmaker.hosts")
 	if os.IsNotExist(err) {
 		_, err = os.Create(dir + "/config/dnsconfig/netmaker.hosts")
 		if err != nil {
-			PrintUserLog("", err.Error(), 0)
+			logger.Log(0, err.Error())
 		}
 	}
 	return nil

+ 105 - 0
logger/logger.go

@@ -0,0 +1,105 @@
+package logger
+
+import (
+	"fmt"
+	"io/ioutil"
+	"os"
+	"sort"
+	"strconv"
+	"strings"
+	"time"
+)
+
+const TimeFormatDay = "2006-01-02"
+const TimeFormat = "2006-01-02 15:04:05"
+
+var currentLogs = make(map[string]string)
+
+func makeString(message ...string) string {
+	return strings.Join(message, " ")
+}
+
+func getVerbose() int32 {
+	level, err := strconv.Atoi(os.Getenv("VERBOSITY"))
+	if err != nil || level < 0 {
+		level = 0
+	}
+	if level > 3 {
+		level = 3
+	}
+	return int32(level)
+}
+
+// ResetLogs - reallocates logs map
+func ResetLogs() {
+	currentLogs = make(map[string]string)
+}
+
+// Log - handles adding logs
+func Log(verbosity int, message ...string) {
+	var currentTime = time.Now()
+	var currentMessage = makeString(message...)
+	if int32(verbosity) <= getVerbose() && getVerbose() >= 0 {
+		fmt.Printf("[netmaker] %s %s \n", currentTime.Format(TimeFormat), currentMessage)
+	}
+	currentLogs[currentMessage] = currentTime.Format("2006-01-02 15:04:05.999999999")
+}
+
+// Dump - dumps all logs into a formatted string
+func Dump() string {
+	var dumpString = ""
+	type keyVal struct {
+		Key   string
+		Value time.Time
+	}
+	var dumpLogs = make([]keyVal, 0, len(currentLogs))
+	for key, value := range currentLogs {
+		parsedTime, err := time.Parse(TimeFormat, value)
+		if err == nil {
+			dumpLogs = append(dumpLogs, keyVal{
+				Key:   key,
+				Value: parsedTime,
+			})
+		}
+	}
+	sort.Slice(dumpLogs, func(i, j int) bool {
+		return dumpLogs[i].Value.Before(dumpLogs[j].Value)
+	})
+
+	for i := range dumpLogs {
+		var currLog = dumpLogs[i]
+		dumpString += fmt.Sprintf("[netmaker] %s %s \n", currLog.Value.Format(TimeFormat), currLog.Key)
+	}
+
+	return dumpString
+}
+
+// DumpFile - appends log dump log file
+func DumpFile(filePath string) {
+	f, err := os.OpenFile(filePath, os.O_APPEND|os.O_WRONLY|os.O_CREATE, 0600)
+	if err != nil {
+		panic(err)
+	}
+
+	defer f.Close()
+
+	if _, err = f.WriteString(Dump()); err != nil {
+		panic(err)
+	}
+}
+
+// Retrieve - retrieves logs from given file
+func Retrieve(filePath string) string {
+	contents, err := ioutil.ReadFile(filePath)
+	if err != nil {
+		panic(err)
+	}
+	fmt.Println(string(contents))
+	return string(contents)
+}
+
+// FatalLog - exits os after logging
+func FatalLog(message ...string) {
+	fmt.Printf("[netmaker] Fatal: %s \n", makeString(message...))
+	os.Exit(2)
+}

+ 2 - 1
logic/accesskeys.go

@@ -4,6 +4,7 @@ import (
 	"encoding/json"
 
 	"github.com/gravitl/netmaker/database"
+	"github.com/gravitl/netmaker/logger"
 	"github.com/gravitl/netmaker/models"
 )
 
@@ -31,7 +32,7 @@ func DecrimentKey(networkName string, keyvalue string) {
 	}
 
 	if newNetworkData, err := json.Marshal(&network); err != nil {
-		Log("failed to decrement key", 2)
+		logger.Log(2, "failed to decrement key")
 		return
 	} else {
 		database.Insert(network.NetID, string(newNetworkData), database.NETWORKS_TABLE_NAME)

+ 3 - 2
logic/auth.go

@@ -7,6 +7,7 @@ import (
 
 	"github.com/go-playground/validator/v10"
 	"github.com/gravitl/netmaker/database"
+	"github.com/gravitl/netmaker/logger"
 	"github.com/gravitl/netmaker/models"
 	"golang.org/x/crypto/bcrypt"
 )
@@ -220,7 +221,7 @@ func UpdateUser(userchange models.User, user models.User) (models.User, error) {
 	if err = database.Insert(user.UserName, string(data), database.USERS_TABLE_NAME); err != nil {
 		return models.User{}, err
 	}
-	Log("updated user "+queryUser, 1)
+	logger.Log(1, "updated user", queryUser)
 	return user, nil
 }
 
@@ -232,7 +233,7 @@ func ValidateUser(user models.User) error {
 
 	if err != nil {
 		for _, e := range err.(validator.ValidationErrors) {
-			Log(e.Error(), 2)
+			logger.Log(2, e.Error())
 		}
 	}
 

+ 2 - 1
logic/dns.go

@@ -6,6 +6,7 @@ import (
 	"os"
 
 	"github.com/gravitl/netmaker/database"
+	"github.com/gravitl/netmaker/logger"
 	"github.com/gravitl/netmaker/models"
 	"github.com/gravitl/netmaker/servercfg"
 	"github.com/txn2/txeh"
@@ -118,7 +119,7 @@ func SetCorefile(domains string) error {
 	if os.IsNotExist(err) {
 		os.Mkdir(dir+"/config/dnsconfig", 744)
 	} else if err != nil {
-		Log("couldnt find or create /config/dnsconfig", 0)
+		logger.Log(0, "couldnt find or create /config/dnsconfig")
 		return err
 	}
 

+ 3 - 2
logic/extpeers.go

@@ -4,6 +4,7 @@ import (
 	"encoding/json"
 
 	"github.com/gravitl/netmaker/database"
+	"github.com/gravitl/netmaker/logger"
 	"github.com/gravitl/netmaker/models"
 )
 
@@ -22,12 +23,12 @@ func GetExtPeersList(macaddress string, networkName string) ([]models.ExtPeersRe
 		var extClient models.ExtClient
 		err = json.Unmarshal([]byte(value), &peer)
 		if err != nil {
-			Log("failed to unmarshal peer when getting ext peer list", 2)
+			logger.Log(2, "failed to unmarshal peer when getting ext peer list")
 			continue
 		}
 		err = json.Unmarshal([]byte(value), &extClient)
 		if err != nil {
-			Log("failed to unmarshal ext client", 2)
+			logger.Log(2, "failed to unmarshal ext client")
 			continue
 		}
 		if extClient.Network == networkName && extClient.IngressGatewayID == macaddress {

+ 5 - 4
logic/networks.go

@@ -10,6 +10,7 @@ import (
 
 	"github.com/go-playground/validator/v10"
 	"github.com/gravitl/netmaker/database"
+	"github.com/gravitl/netmaker/logger"
 	"github.com/gravitl/netmaker/models"
 	"github.com/gravitl/netmaker/netclient/ncutils"
 	"github.com/gravitl/netmaker/validation"
@@ -471,7 +472,7 @@ func deleteInterface(ifacename string, postdown string) error {
 		ipExec, errN := exec.LookPath("ip")
 		err = errN
 		if err != nil {
-			Log(err.Error(), 1)
+			logger.Log(1, err.Error())
 		}
 		_, err = ncutils.RunCmd(ipExec+" link del "+ifacename, false)
 		if postdown != "" {
@@ -487,7 +488,7 @@ func isInterfacePresent(iface string, address string) (string, bool) {
 	var err error
 	interfaces, err = net.Interfaces()
 	if err != nil {
-		Log("ERROR: could not read interfaces", 0)
+		logger.Log(0, "ERROR: could not read interfaces")
 		return "", true
 	}
 	for _, currIface := range interfaces {
@@ -498,11 +499,11 @@ func isInterfacePresent(iface string, address string) (string, bool) {
 		}
 		for _, addr := range currAddrs {
 			if strings.Contains(addr.String(), address) && currIface.Name != iface {
-				Log("found iface "+addr.String()+" "+currIface.Name, 2)
+				logger.Log(2, "found iface", addr.String(), currIface.Name)
 				return currIface.Name, false
 			}
 		}
 	}
-	Log("failed to find iface "+iface, 2)
+	logger.Log(2, "failed to find iface", iface)
 	return "", true
 }

+ 4 - 3
logic/nodes.go

@@ -9,6 +9,7 @@ import (
 
 	"github.com/go-playground/validator/v10"
 	"github.com/gravitl/netmaker/database"
+	"github.com/gravitl/netmaker/logger"
 	"github.com/gravitl/netmaker/models"
 	"github.com/gravitl/netmaker/validation"
 )
@@ -83,7 +84,7 @@ func GetPeers(node models.Node) ([]models.Node, error) {
 func IsLeader(node *models.Node) bool {
 	nodes, err := GetSortedNetworkServerNodes(node.Network)
 	if err != nil {
-		Log("ERROR: COULD NOT RETRIEVE SERVER NODES. THIS WILL BREAK HOLE PUNCHING.", 0)
+		logger.Log(0, "ERROR: COULD NOT RETRIEVE SERVER NODES. THIS WILL BREAK HOLE PUNCHING.")
 		return false
 	}
 	for _, n := range nodes {
@@ -332,13 +333,13 @@ func GetNodeRelay(network string, relayedNodeAddr string) (models.Node, error) {
 		if database.IsEmptyRecord(err) {
 			return relay, nil
 		}
-		Log(err.Error(), 2)
+		logger.Log(2, err.Error())
 		return relay, err
 	}
 	for _, value := range collection {
 		err := json.Unmarshal([]byte(value), &relay)
 		if err != nil {
-			Log(err.Error(), 2)
+			logger.Log(2, err.Error())
 			continue
 		}
 		if relay.IsRelay == "yes" {

+ 19 - 18
logic/server.go

@@ -10,6 +10,7 @@ import (
 	"strings"
 	"time"
 
+	"github.com/gravitl/netmaker/logger"
 	"github.com/gravitl/netmaker/models"
 	"github.com/gravitl/netmaker/netclient/ncutils"
 	"github.com/gravitl/netmaker/servercfg"
@@ -47,7 +48,7 @@ func ServerJoin(network string, serverID string, privateKey string) error {
 	}
 
 	if node.LocalRange != "" && node.LocalAddress == "" {
-		Log("local vpn, getting local address from range: "+node.LocalRange, 1)
+		logger.Log(1, "local vpn, getting local address from range:", node.LocalRange)
 		node.LocalAddress = GetLocalIP(*node)
 	}
 
@@ -58,7 +59,7 @@ func ServerJoin(network string, serverID string, privateKey string) error {
 			node.Endpoint, err = ncutils.GetPublicIP()
 		}
 		if err != nil || node.Endpoint == "" {
-			Log("Error setting server node Endpoint.", 0)
+			logger.Log(0, "Error setting server node Endpoint.")
 			return err
 		}
 	}
@@ -67,7 +68,7 @@ func ServerJoin(network string, serverID string, privateKey string) error {
 	if privateKey == "" {
 		wgPrivatekey, err := wgtypes.GeneratePrivateKey()
 		if err != nil {
-			Log(err.Error(), 1)
+			logger.Log(1, err.Error())
 			return err
 		}
 		privateKey = wgPrivatekey.String()
@@ -95,7 +96,7 @@ func ServerJoin(network string, serverID string, privateKey string) error {
 		UDPHolePunch:        node.UDPHolePunch,
 	}
 
-	Log("adding a server instance on network "+postnode.Network, 2)
+	logger.Log(2, "adding a server instance on network", postnode.Network)
 	*node, err = CreateNode(*postnode, network)
 	if err != nil {
 		return err
@@ -108,9 +109,9 @@ func ServerJoin(network string, serverID string, privateKey string) error {
 	// get free port based on returned default listen port
 	node.ListenPort, err = ncutils.GetFreePort(node.ListenPort)
 	if err != nil {
-		Log("Error retrieving port: "+err.Error(), 2)
+		logger.Log(2, "Error retrieving port:", err.Error())
 	} else {
-		Log("Set client port to "+fmt.Sprintf("%d", node.ListenPort)+" for network "+node.Network, 1)
+		logger.Log(1, "Set client port to", fmt.Sprintf("%d", node.ListenPort), "for network", node.Network)
 	}
 
 	// safety check. If returned node from server is local, but not currently configured as local, set to local addr
@@ -132,7 +133,7 @@ func ServerJoin(network string, serverID string, privateKey string) error {
 
 	peers, hasGateway, gateways, err := GetServerPeers(node.MacAddress, network, node.IsDualStack == "yes", node.IsIngressGateway == "yes")
 	if err != nil && !ncutils.IsEmptyRecord(err) {
-		Log("failed to retrieve peers", 1)
+		logger.Log(1, "failed to retrieve peers")
 		return err
 	}
 
@@ -188,9 +189,9 @@ func ServerPull(serverNode *models.Node, onErr bool) (*models.Node, error) {
 		oldIfaceName, isIfacePresent = isInterfacePresent(serverNode.Interface, serverNode.Address)
 		if !isIfacePresent {
 			if err = deleteInterface(oldIfaceName, serverNode.PostDown); err != nil {
-				Log("could not delete old interface "+oldIfaceName, 1)
+				logger.Log(1, "could not delete old interface", oldIfaceName)
 			}
-			Log("removed old interface "+oldIfaceName, 1)
+			logger.Log(1, "removed old interface", oldIfaceName)
 		}
 		serverNode.PullChanges = "no"
 		if err = setWGConfig(*serverNode, serverNode.Network, false); err != nil {
@@ -255,14 +256,14 @@ func GetServerPeers(macaddress string, network string, dualstack bool, isIngress
 	keepalivedur, err := time.ParseDuration(strconv.FormatInt(int64(keepalive), 10) + "s")
 	keepaliveserver, err := time.ParseDuration(strconv.FormatInt(int64(5), 10) + "s")
 	if err != nil {
-		Log("Issue with format of keepalive value. Please view server config. "+err.Error(), 1)
+		logger.Log(1, "Issue with format of keepalive value, Please view server config:", err.Error())
 		return nil, hasGateway, gateways, err
 	}
 
 	for _, node := range nodes {
 		pubkey, err := wgtypes.ParseKey(node.PublicKey)
 		if err != nil {
-			Log("error parsing key "+pubkey.String(), 1)
+			logger.Log(1, "error parsing key", pubkey.String())
 			return peers, hasGateway, gateways, err
 		}
 
@@ -306,21 +307,21 @@ func GetServerPeers(macaddress string, network string, dualstack bool, isIngress
 			for _, iprange := range ranges { // go through each cidr for egress gateway
 				_, ipnet, err := net.ParseCIDR(iprange) // confirming it's valid cidr
 				if err != nil {
-					Log("could not parse gateway IP range. Not adding "+iprange, 1)
+					logger.Log(1, "could not parse gateway IP range. Not adding", iprange)
 					continue // if can't parse CIDR
 				}
 				nodeEndpointArr := strings.Split(node.Endpoint, ":") // getting the public ip of node
 				if ipnet.Contains(net.ParseIP(nodeEndpointArr[0])) { // ensuring egress gateway range does not contain public ip of node
-					Log("egress IP range of "+iprange+" overlaps with "+node.Endpoint+", omitting", 2)
+					logger.Log(2, "egress IP range of", iprange, "overlaps with", node.Endpoint, ", omitting")
 					continue // skip adding egress range if overlaps with node's ip
 				}
 				if ipnet.Contains(net.ParseIP(nodecfg.LocalAddress)) { // ensuring egress gateway range does not contain public ip of node
-					Log("egress IP range of "+iprange+" overlaps with "+nodecfg.LocalAddress+", omitting", 2)
+					logger.Log(2, "egress IP range of", iprange, "overlaps with", nodecfg.LocalAddress, ", omitting")
 					continue // skip adding egress range if overlaps with node's local ip
 				}
 				gateways = append(gateways, iprange)
 				if err != nil {
-					Log("ERROR ENCOUNTERED SETTING GATEWAY", 1)
+					logger.Log(1, "ERROR ENCOUNTERED SETTING GATEWAY:", err.Error())
 				} else {
 					allowedips = append(allowedips, *ipnet)
 				}
@@ -369,7 +370,7 @@ func GetServerPeers(macaddress string, network string, dualstack bool, isIngress
 		if err == nil {
 			peers = append(peers, extPeers...)
 		} else {
-			Log("ERROR RETRIEVING EXTERNAL PEERS ON SERVER", 1)
+			logger.Log(1, "ERROR RETRIEVING EXTERNAL PEERS ON SERVER:", err.Error())
 		}
 	}
 	return peers, hasGateway, gateways, err
@@ -449,14 +450,14 @@ func checkNodeActions(node *models.Node, networkName string, localNode *models.N
 		node.IsStatic != "yes" {
 		err := setWGKeyConfig(*node)
 		if err != nil {
-			Log("unable to process reset keys request: "+err.Error(), 1)
+			logger.Log(1, "unable to process reset keys request:", err.Error())
 			return ""
 		}
 	}
 	if node.Action == models.NODE_DELETE || localNode.Action == models.NODE_DELETE {
 		err := ServerLeave(node.MacAddress, networkName)
 		if err != nil {
-			Log("error deleting locally: "+err.Error(), 1)
+			logger.Log(1, "error deleting locally:", err.Error())
 		}
 		return models.NODE_DELETE
 	}

+ 11 - 18
logic/util.go

@@ -4,13 +4,13 @@ package logic
 import (
 	"encoding/base64"
 	"encoding/json"
-	"log"
 	"math/rand"
 	"strconv"
 	"strings"
 	"time"
 
 	"github.com/gravitl/netmaker/database"
+	"github.com/gravitl/netmaker/logger"
 	"github.com/gravitl/netmaker/models"
 	"github.com/gravitl/netmaker/netclient/ncutils"
 	"github.com/gravitl/netmaker/servercfg"
@@ -34,10 +34,10 @@ func CheckEndpoint(endpoint string) bool {
 func SetNetworkServerPeers(node *models.Node) {
 	if currentPeersList, err := GetSystemPeers(node); err == nil {
 		if database.SetPeers(currentPeersList, node.Network) {
-			Log("set new peers on network "+node.Network, 1)
+			logger.Log(1, "set new peers on network", node.Network)
 		}
 	} else {
-		Log("could not set peers on network "+node.Network+"\n"+err.Error(), 1)
+		logger.Log(1, "could not set peers on network", node.Network, ":", err.Error())
 	}
 }
 
@@ -63,7 +63,7 @@ func DeleteNode(node *models.Node, exterminate bool) error {
 		}
 	} else {
 		if err := database.DeleteRecord(database.DELETED_NODES_TABLE_NAME, key); err != nil {
-			Log(err.Error(), 2)
+			logger.Log(2, err.Error())
 		}
 	}
 	if err = database.DeleteRecord(database.NODES_TABLE_NAME, key); err != nil {
@@ -192,19 +192,19 @@ func GetNodePeers(networkName string, excludeRelayed bool) ([]models.Node, error
 		if database.IsEmptyRecord(err) {
 			return peers, nil
 		}
-		Log(err.Error(), 2)
+		logger.Log(2, err.Error())
 		return nil, err
 	}
 	udppeers, errN := database.GetPeers(networkName)
 	if errN != nil {
-		Log(errN.Error(), 2)
+		logger.Log(2, errN.Error())
 	}
 	for _, value := range collection {
 		var node models.Node
 		var peer models.Node
 		err := json.Unmarshal([]byte(value), &node)
 		if err != nil {
-			Log(err.Error(), 2)
+			logger.Log(2, err.Error())
 			continue
 		}
 		if node.IsEgressGateway == "yes" { // handle egress stuff
@@ -288,6 +288,8 @@ func RandomString(length int) string {
 	return string(b)
 }
 
+// == Private Methods ==
+
 func setPeerInfo(node models.Node) models.Node {
 	var peer models.Node
 	peer.RelayAddrs = node.RelayAddrs
@@ -311,26 +313,17 @@ func setPeerInfo(node models.Node) models.Node {
 	return peer
 }
 
-func Log(message string, loglevel int) {
-	log.SetFlags(log.Flags() &^ (log.Llongfile | log.Lshortfile))
-	if int32(loglevel) <= servercfg.GetVerbose() && servercfg.GetVerbose() >= 0 {
-		log.Println("[netmaker] " + message)
-	}
-}
-
-// == Private Methods ==
-
 func setIPForwardingLinux() error {
 	out, err := ncutils.RunCmd("sysctl net.ipv4.ip_forward", true)
 	if err != nil {
-		log.Println("WARNING: Error encountered setting ip forwarding. This can break functionality.")
+		logger.Log(0, "WARNING: Error encountered setting ip forwarding. This can break functionality.")
 		return err
 	} else {
 		s := strings.Fields(string(out))
 		if s[2] != "1" {
 			_, err = ncutils.RunCmd("sysctl -w net.ipv4.ip_forward=1", true)
 			if err != nil {
-				log.Println("WARNING: Error encountered setting ip forwarding. You may want to investigate this.")
+				logger.Log(0, "WARNING: Error encountered setting ip forwarding. You may want to investigate this.")
 				return err
 			}
 		}

+ 41 - 38
logic/wireguard.go

@@ -4,13 +4,13 @@ import (
 	"errors"
 	"fmt"
 	"io/ioutil"
-	"log"
 	"os"
 	"os/exec"
 	"strconv"
 	"strings"
 	"time"
 
+	"github.com/gravitl/netmaker/logger"
 	"github.com/gravitl/netmaker/models"
 	"github.com/gravitl/netmaker/netclient/ncutils"
 	"golang.zx2c4.com/wireguard/wgctrl"
@@ -64,14 +64,14 @@ func initWireguard(node *models.Node, privkey string, peers []wgtypes.PeerConfig
 	if node.Interface != "" {
 		ifacename = node.Interface
 	} else {
-		Log("no server interface provided to configure", 2)
+		logger.Log(2, "no server interface provided to configure")
 	}
 	if node.Address == "" {
-		Log("no server address to provided configure", 2)
+		logger.Log(2, "no server address to provided configure")
 	}
 
 	if ncutils.IsKernel() {
-		Log("setting kernel device "+ifacename, 2)
+		logger.Log(2, "setting kernel device", ifacename)
 		setKernelDevice(ifacename, node.Address)
 	}
 
@@ -87,18 +87,18 @@ func initWireguard(node *models.Node, privkey string, peers []wgtypes.PeerConfig
 		var newConf string
 		newConf, _ = ncutils.CreateUserSpaceConf(node.Address, key.String(), strconv.FormatInt(int64(node.ListenPort), 10), node.MTU, node.PersistentKeepalive, peers)
 		confPath := ncutils.GetNetclientPathSpecific() + ifacename + ".conf"
-		Log("writing wg conf file to: "+confPath, 1)
+		logger.Log(1, "writing wg conf file to:", confPath)
 		err = ioutil.WriteFile(confPath, []byte(newConf), 0644)
 		if err != nil {
-			Log("error writing wg conf file to "+confPath+": "+err.Error(), 1)
+			logger.Log(1, "error writing wg conf file to", confPath, ":", err.Error())
 			return err
 		}
 		if ncutils.IsWindows() {
 			wgConfPath := ncutils.GetWGPathSpecific() + ifacename + ".conf"
-			Log("writing wg conf file to: "+confPath, 1)
+			logger.Log(1, "writing wg conf file to:", confPath)
 			err = ioutil.WriteFile(wgConfPath, []byte(newConf), 0644)
 			if err != nil {
-				Log("error writing wg conf file to "+wgConfPath+": "+err.Error(), 1)
+				logger.Log(1, "error writing wg conf file to", wgConfPath, ":", err.Error())
 				return err
 			}
 			confPath = wgConfPath
@@ -114,7 +114,7 @@ func initWireguard(node *models.Node, privkey string, peers []wgtypes.PeerConfig
 		time.Sleep(time.Second >> 2)
 		err = applyWGQuickConf(confPath)
 		if err != nil {
-			Log("failed to create wireguard interface", 1)
+			logger.Log(1, "failed to create wireguard interface")
 			return err
 		}
 	} else {
@@ -144,7 +144,7 @@ func initWireguard(node *models.Node, privkey string, peers []wgtypes.PeerConfig
 		}
 
 		if _, err := ncutils.RunCmd(ipExec+" link set down dev "+ifacename, false); err != nil {
-			Log("attempted to remove interface before editing", 2)
+			logger.Log(2, "attempted to remove interface before editing")
 			return err
 		}
 
@@ -154,7 +154,7 @@ func initWireguard(node *models.Node, privkey string, peers []wgtypes.PeerConfig
 		}
 		// set MTU of node interface
 		if _, err := ncutils.RunCmd(ipExec+" link set mtu "+strconv.Itoa(int(node.MTU))+" up dev "+ifacename, true); err != nil {
-			Log("failed to create interface with mtu "+strconv.Itoa(int(node.MTU))+" - "+ifacename, 2)
+			logger.Log(2, "failed to create interface with mtu", strconv.Itoa(int(node.MTU)), "-", ifacename)
 			return err
 		}
 
@@ -168,7 +168,7 @@ func initWireguard(node *models.Node, privkey string, peers []wgtypes.PeerConfig
 			}
 		}
 		if node.Address6 != "" && node.IsDualStack == "yes" {
-			log.Println("[netclient] adding address: "+node.Address6, 1)
+			logger.Log(1, "adding address:", node.Address6)
 			_, _ = ncutils.RunCmd(ipExec+" address add dev "+ifacename+" "+node.Address6+"/64", true)
 		}
 	}
@@ -207,29 +207,30 @@ func setServerPeers(iface string, keepalive int32, peers []wgtypes.PeerConfig) e
 
 	client, err := wgctrl.New()
 	if err != nil {
-		Log("failed to start wgctrl", 0)
+		logger.Log(0, "failed to start wgctrl")
 		return err
 	}
 
 	device, err := client.Device(iface)
 	if err != nil {
-		Log("failed to parse interface", 0)
+		logger.Log(0, "failed to parse interface")
 		return err
 	}
 	devicePeers := device.Peers
 	if len(devicePeers) > 1 && len(peers) == 0 {
-		Log("no peers pulled", 1)
+		logger.Log(1, "no peers pulled")
 		return err
 	}
 
 	for _, peer := range peers {
-
-		for _, currentPeer := range devicePeers {
-			if currentPeer.AllowedIPs[0].String() == peer.AllowedIPs[0].String() &&
-				currentPeer.PublicKey.String() != peer.PublicKey.String() {
-				_, err := ncutils.RunCmd("wg set "+iface+" peer "+currentPeer.PublicKey.String()+" remove", true)
-				if err != nil {
-					log.Println("error removing peer", peer.Endpoint.String())
+		if len(peer.AllowedIPs) > 0 {
+			for _, currentPeer := range devicePeers {
+				if len(currentPeer.AllowedIPs) > 0 && currentPeer.AllowedIPs[0].String() == peer.AllowedIPs[0].String() &&
+					currentPeer.PublicKey.String() != peer.PublicKey.String() {
+					_, err := ncutils.RunCmd("wg set "+iface+" peer "+currentPeer.PublicKey.String()+" remove", true)
+					if err != nil {
+						logger.Log(0, "error removing peer", peer.Endpoint.String())
+					}
 				}
 			}
 		}
@@ -255,21 +256,23 @@ func setServerPeers(iface string, keepalive int32, peers []wgtypes.PeerConfig) e
 				" allowed-ips "+allowedips, true)
 		}
 		if err != nil {
-			Log("error setting peer "+peer.PublicKey.String(), 1)
+			logger.Log(2, "error setting peer", peer.PublicKey.String())
 		}
 	}
 
 	for _, currentPeer := range devicePeers {
-		shouldDelete := true
-		for _, peer := range peers {
-			if peer.AllowedIPs[0].String() == currentPeer.AllowedIPs[0].String() {
-				shouldDelete = false
+		if len(currentPeer.AllowedIPs) > 0 {
+			shouldDelete := true
+			for _, peer := range peers {
+				if len(peer.AllowedIPs) > 0 && peer.AllowedIPs[0].String() == currentPeer.AllowedIPs[0].String() {
+					shouldDelete = false
+				}
 			}
-		}
-		if shouldDelete {
-			output, err := ncutils.RunCmd("wg set "+iface+" peer "+currentPeer.PublicKey.String()+" remove", true)
-			if err != nil {
-				log.Println(output, "error removing peer", currentPeer.PublicKey.String())
+			if shouldDelete {
+				output, err := ncutils.RunCmd("wg set "+iface+" peer "+currentPeer.PublicKey.String()+" remove", true)
+				if err != nil {
+					logger.Log(0, output, "error removing peer", currentPeer.PublicKey.String())
+				}
 			}
 		}
 	}
@@ -291,10 +294,10 @@ func setWGConfig(node models.Node, network string, peerupdate bool) error {
 	if peerupdate {
 		var iface string = node.Interface
 		err = setServerPeers(iface, node.PersistentKeepalive, peers)
-		Log("updated peers on server "+node.Name, 2)
+		logger.Log(2, "updated peers on server", node.Name)
 	} else {
 		err = initWireguard(&node, privkey, peers, hasGateway, gateways)
-		Log("finished setting wg config on server "+node.Name, 3)
+		logger.Log(3, "finished setting wg config on server", node.Name)
 	}
 	return err
 }
@@ -326,12 +329,12 @@ func removeLocalServer(node *models.Node) error {
 	var ifacename = node.Interface
 	var err error
 	if err = RemovePrivKey(node.ID); err != nil {
-		Log("failed to remove server conf from db "+node.ID, 1)
+		logger.Log(1, "failed to remove server conf from db", node.ID)
 	}
 	if ifacename != "" {
 		if !ncutils.IsKernel() {
 			if err = RemoveConf(ifacename, true); err == nil {
-				Log("removed WireGuard interface: "+ifacename, 1)
+				logger.Log(1, "removed WireGuard interface:", ifacename)
 			}
 		} else {
 			ipExec, err := exec.LookPath("ip")
@@ -341,8 +344,8 @@ func removeLocalServer(node *models.Node) error {
 			out, err := ncutils.RunCmd(ipExec+" link del "+ifacename, false)
 			dontprint := strings.Contains(out, "does not exist") || strings.Contains(out, "Cannot find device")
 			if err != nil && !dontprint {
-				Log("error running command: "+ipExec+" link del "+ifacename, 1)
-				Log(out, 1)
+				logger.Log(1, "error running command:", ipExec, "link del", ifacename)
+				logger.Log(1, out)
 			}
 			if node.PostDown != "" {
 				runcmds := strings.Split(node.PostDown, "; ")

+ 19 - 22
main.go

@@ -19,6 +19,7 @@ import (
 	"github.com/gravitl/netmaker/database"
 	"github.com/gravitl/netmaker/functions"
 	nodepb "github.com/gravitl/netmaker/grpc"
+	"github.com/gravitl/netmaker/logger"
 	"github.com/gravitl/netmaker/logic"
 	"github.com/gravitl/netmaker/models"
 	"github.com/gravitl/netmaker/netclient/ncutils"
@@ -40,41 +41,39 @@ func initialize() { // Client Mode Prereq Check
 	var err error
 
 	if err = database.InitializeDatabase(); err != nil {
-		logic.Log("Error connecting to database", 0)
+		logger.Log(0, "Error connecting to database")
 		log.Fatal(err)
 	}
-	logic.Log("database successfully connected", 0)
+	logger.Log(0, "database successfully connected")
 
 	var authProvider = auth.InitializeAuthProvider()
 	if authProvider != "" {
-		logic.Log("OAuth provider, "+authProvider+", initialized", 0)
+		logger.Log(0, "OAuth provider, ", authProvider, ", initialized")
 	} else {
-		logic.Log("no OAuth provider found or not configured, continuing without OAuth", 0)
+		logger.Log(0, "no OAuth provider found or not configured, continuing without OAuth")
 	}
 
 	if servercfg.IsClientMode() != "off" {
 		output, err := ncutils.RunCmd("id -u", true)
 		if err != nil {
-			logic.Log("Error running 'id -u' for prereq check. Please investigate or disable client mode.", 0)
-			log.Fatal(output, err)
+			logger.FatalLog("Error running 'id -u' for prereq check. Please investigate or disable client mode.", output, err.Error())
 		}
 		uid, err := strconv.Atoi(string(output[:len(output)-1]))
 		if err != nil {
-			logic.Log("Error retrieving uid from 'id -u' for prereq check. Please investigate or disable client mode.", 0)
-			log.Fatal(err)
+			logger.FatalLog("Error retrieving uid from 'id -u' for prereq check. Please investigate or disable client mode.", err.Error())
 		}
 		if uid != 0 {
-			log.Fatal("To run in client mode requires root privileges. Either disable client mode or run with sudo.")
+			logger.FatalLog("To run in client mode requires root privileges. Either disable client mode or run with sudo.")
 		}
 		if err := serverctl.InitServerNetclient(); err != nil {
-			log.Fatal("Did not find netclient to use CLIENT_MODE")
+			logger.FatalLog("Did not find netclient to use CLIENT_MODE")
 		}
 	}
 
 	if servercfg.IsDNSMode() {
 		err := functions.SetDNSDir()
 		if err != nil {
-			log.Fatal(err)
+			logger.FatalLog(err.Error())
 		}
 	}
 }
@@ -86,8 +85,7 @@ func startControllers() {
 		if !(servercfg.DisableRemoteIPCheck()) && servercfg.GetGRPCHost() == "127.0.0.1" {
 			err := servercfg.SetHost()
 			if err != nil {
-				logic.Log("Unable to Set host. Exiting...", 0)
-				log.Fatal(err)
+				logger.FatalLog("Unable to Set host. Exiting...", err.Error())
 			}
 		}
 		waitnetwork.Add(1)
@@ -102,7 +100,7 @@ func startControllers() {
 	if servercfg.IsDNSMode() {
 		err := logic.SetDNS()
 		if err != nil {
-			logic.Log("error occurred initializing DNS: "+err.Error(), 0)
+			logger.Log(0, "error occurred initializing DNS: ", err.Error())
 		}
 	}
 	//Run Rest Server
@@ -110,19 +108,18 @@ func startControllers() {
 		if !servercfg.DisableRemoteIPCheck() && servercfg.GetAPIHost() == "127.0.0.1" {
 			err := servercfg.SetHost()
 			if err != nil {
-				logic.Log("Unable to Set host. Exiting...", 0)
-				log.Fatal(err)
+				logger.FatalLog("Unable to Set host. Exiting...", err.Error())
 			}
 		}
 		waitnetwork.Add(1)
 		controller.HandleRESTRequests(&waitnetwork)
 	}
 	if !servercfg.IsAgentBackend() && !servercfg.IsRestBackend() {
-		logic.Log("No Server Mode selected, so nothing is being served! Set either Agent mode (AGENT_BACKEND) or Rest mode (REST_BACKEND) to 'true'.", 0)
+		logger.Log(0, "No Server Mode selected, so nothing is being served! Set either Agent mode (AGENT_BACKEND) or Rest mode (REST_BACKEND) to 'true'.")
 	}
 
 	waitnetwork.Wait()
-	logic.Log("exiting", 0)
+	logger.Log(0, "exiting")
 }
 
 func runClient(wg *sync.WaitGroup) {
@@ -169,7 +166,7 @@ func runGRPC(wg *sync.WaitGroup) {
 			log.Fatalf("Failed to serve: %v", err)
 		}
 	}()
-	logic.Log("Agent Server successfully started on port "+grpcport+" (gRPC)", 0)
+	logger.Log(0, "Agent Server successfully started on port ", grpcport, "(gRPC)")
 
 	// Right way to stop the server using a SHUTDOWN HOOK
 	// Create a channel to receive OS signals
@@ -184,11 +181,11 @@ func runGRPC(wg *sync.WaitGroup) {
 	<-c
 
 	// After receiving CTRL+C Properly stop the server
-	logic.Log("Stopping the Agent server...", 0)
+	logger.Log(0, "Stopping the Agent server...")
 	s.Stop()
 	listener.Close()
-	logic.Log("Agent server closed..", 0)
-	logic.Log("Closed DB connection.", 0)
+	logger.Log(0, "Agent server closed..")
+	logger.Log(0, "Closed DB connection.")
 }
 
 func authServerUnaryInterceptor() grpc.ServerOption {

+ 1 - 14
servercfg/serverconf.go

@@ -36,7 +36,6 @@ func GetServerConfig() config.ServerConfig {
 	cfg.DNSKey = "(hidden)"
 	cfg.AllowedOrigin = GetAllowedOrigin()
 	cfg.RestBackend = "off"
-	cfg.Verbosity = GetVerbose()
 	cfg.NodeID = GetNodeID()
 	cfg.CheckinInterval = GetCheckinInterval()
 	cfg.ServerCheckinInterval = GetServerCheckinInterval()
@@ -422,23 +421,11 @@ func GetPublicIP() (string, error) {
 		}
 	}
 	if err == nil && endpoint == "" {
-		err = errors.New("Public Address Not Found.")
+		err = errors.New("public address not found")
 	}
 	return endpoint, err
 }
 
-// GetVerbose - get the verbosity of server
-func GetVerbose() int32 {
-	level, err := strconv.Atoi(os.Getenv("VERBOSITY"))
-	if err != nil || level < 0 {
-		level = 0
-	}
-	if level > 3 {
-		level = 3
-	}
-	return int32(level)
-}
-
 // GetPlatform - get the system type of server
 func GetPlatform() string {
 	platform := "linux"

+ 10 - 44
serverctl/serverctl.go

@@ -3,13 +3,12 @@ package serverctl
 import (
 	"encoding/json"
 	"errors"
-	"io"
-	"log"
 	"net"
 	"os"
 	"strings"
 
 	"github.com/gravitl/netmaker/database"
+	"github.com/gravitl/netmaker/logger"
 	"github.com/gravitl/netmaker/logic"
 	"github.com/gravitl/netmaker/models"
 	"github.com/gravitl/netmaker/netclient/ncutils"
@@ -41,35 +40,6 @@ func FileExists(f string) bool {
 	return !info.IsDir()
 }
 
-func copy(src, dst string) (int64, error) {
-	sourceFileStat, err := os.Stat(src)
-	if err != nil {
-		return 0, err
-	}
-
-	if !sourceFileStat.Mode().IsRegular() {
-		return 0, errors.New(src + " is not a regular file")
-	}
-
-	source, err := os.Open(src)
-	if err != nil {
-		return 0, err
-	}
-	defer source.Close()
-
-	destination, err := os.Create(dst)
-	if err != nil {
-		return 0, err
-	}
-	defer destination.Close()
-	nBytes, err := io.Copy(destination, source)
-	err = os.Chmod(dst, 0755)
-	if err != nil {
-		logic.Log(err.Error(), 1)
-	}
-	return nBytes, err
-}
-
 // RemoveNetwork - removes a network locally on server
 func RemoveNetwork(network string) (bool, error) {
 	err := logic.ServerLeave(servercfg.GetNodeID(), network)
@@ -81,9 +51,9 @@ func InitServerNetclient() error {
 	netclientDir := ncutils.GetNetclientPath()
 	_, err := os.Stat(netclientDir + "/config")
 	if os.IsNotExist(err) {
-		os.MkdirAll(netclientDir+"/config", 744)
+		os.MkdirAll(netclientDir+"/config", 0744)
 	} else if err != nil {
-		logic.Log("[netmaker] could not find or create "+netclientDir, 1)
+		logger.Log(1, "could not find or create", netclientDir)
 		return err
 	}
 	return nil
@@ -102,16 +72,16 @@ func HandleContainedClient() error {
 		for _, serverNet := range servernets {
 			err = logic.ServerCheckin(servercfg.GetNodeID(), serverNet.NetID)
 			if err != nil {
-				logic.Log("error occurred during server checkin: "+err.Error(), 1)
+				logger.Log(1, "error occurred during server checkin:", err.Error())
 			} else {
-				logic.Log("completed peers check of network "+serverNet.NetID, 3)
+				logger.Log(3, "completed peers check of network", serverNet.NetID)
 			}
 		}
 		err := SyncNetworks(servernets)
 		if err != nil {
-			logic.Log("error syncing networks: "+err.Error(), 1)
+			logger.Log(1, "error syncing networks:", err.Error())
 		}
-		// logic.Log("completed a checkin call", 3)
+		// logger.Log("completed a checkin call", 3)
 	}
 	return nil
 }
@@ -137,10 +107,8 @@ func SyncNetworks(servernets []models.Network) error {
 				if err == nil {
 					err = errors.New("network add failed for " + servernet.NetID)
 				}
-				if servercfg.GetVerbose() >= 1 {
-					if !strings.Contains(err.Error(), "macaddress_unique") { // ignore macaddress unique error throws
-						log.Printf("[netmaker] error adding network %s during sync %s \n", servernet.NetID, err)
-					}
+				if !strings.Contains(err.Error(), "macaddress_unique") { // ignore macaddress unique error throws
+					logger.Log(1, "error adding network", servernet.NetID, "during sync:", err.Error())
 				}
 			}
 		}
@@ -160,9 +128,7 @@ func SyncNetworks(servernets []models.Network) error {
 					if err == nil {
 						err = errors.New("network delete failed for " + exists)
 					}
-					if servercfg.GetVerbose() >= 1 {
-						log.Printf("[netmaker] error removing network %s during sync %s \n", exists, err)
-					}
+					logger.Log(1, "error removing network", exists, "during sync", err.Error())
 				}
 			}
 		}