Browse Source

configs mostly working. Need to add in public dns default check.

afeiszli 4 years ago
parent
commit
de3d81db3a

+ 16 - 11
config/config.go

@@ -15,7 +15,7 @@ import (
 //setting dev by default
 func getEnv() string {
 
-  env := os.Getenv("APP_ENV")
+  env := os.Getenv("NETMAKER_ENV")
 
   if len(env) == 0 {
     return "dev"
@@ -35,15 +35,17 @@ type EnvironmentConfig struct {
 
 // ServerConfig :
 type ServerConfig struct {
-  Host   string  `yaml:"host"`
-  ApiPort   string `yaml:"apiport"`
-  GrpcPort   string `yaml:"grpcport"`
+  APIHost   string  `yaml:"apihost"`
+  APIPort   string `yaml:"apiport"`
+  GRPCHost   string `yaml:"grpchost"`
+  GRPCPort   string `yaml:"grpcport"`
   MasterKey	string `yaml:"masterkey"`
   AllowedOrigin	string `yaml:"allowedorigin"`
-  RestBackend bool `yaml:"restbackend"`
-  AgentBackend bool `yaml:"agentbackend"`
-  DefaultNetName string `yaml:"defaultnetname"`
-  DefaultNetRange string `yaml:"defaultnetrange"`
+  RestBackend string `yaml:"restbackend"`
+  AgentBackend string `yaml:"agentbackend"`
+  ClientMode string `yaml:"clientmode"`
+  DNSMode string `yaml:"dnsmode"`
+  DisableRemoteIPCheck string `yaml:"disableremoteipcheck"`
 }
 
 type MongoConnConfig struct {
@@ -59,13 +61,16 @@ type MongoConnConfig struct {
 func readConfig() *EnvironmentConfig {
   file := fmt.Sprintf("config/environments/%s.yaml", getEnv())
   f, err := os.Open(file)
+  var cfg EnvironmentConfig
   if err != nil {
-    log.Fatal(err)
-    os.Exit(2)
+    //log.Fatal(err)
+    //os.Exit(2)
+    log.Println("Unable to open config file at config/environments/" + getEnv())
+    log.Println("Will proceed with defaults or enironment variables (no config file).")
+    return &cfg
   }
   defer f.Close()
 
-  var cfg EnvironmentConfig
   decoder := yaml.NewDecoder(f)
   err = decoder.Decode(&cfg)
   if err != nil {

+ 3 - 6
controllers/controller.go

@@ -2,6 +2,7 @@ package controller
 
 import (
     "github.com/gravitl/netmaker/mongoconn"
+    "github.com/gravitl/netmaker/servercfg"
     "os/signal"
     "os"
     "fmt"
@@ -10,7 +11,6 @@ import (
     "github.com/gorilla/mux"
     "github.com/gorilla/handlers"
     "sync"
-    "github.com/gravitl/netmaker/config"
 )
 
 
@@ -22,7 +22,7 @@ func HandleRESTRequests(wg *sync.WaitGroup) {
     // Currently allowed dev origin is all. Should change in prod
     // should consider analyzing the allowed methods further
     headersOk := handlers.AllowedHeaders([]string{"Access-Control-Allow-Origin", "X-Requested-With", "Content-Type", "authorization"})
-    originsOk := handlers.AllowedOrigins([]string{config.Config.Server.AllowedOrigin})
+    originsOk := handlers.AllowedOrigins([]string{servercfg.GetAllowedOrigin()})
     methodsOk := handlers.AllowedMethods([]string{"GET", "PUT", "POST", "DELETE"})
 
     nodeHandlers(r)
@@ -32,10 +32,7 @@ func HandleRESTRequests(wg *sync.WaitGroup) {
     fileHandlers(r)
     serverHandlers(r)
 
-		port := config.Config.Server.ApiPort
-	        if os.Getenv("API_PORT") != "" {
-			port = os.Getenv("API_PORT")
-		}
+		port := servercfg.GetAPIPort()
 
 		srv := &http.Server{Addr: ":" + port, Handler: handlers.CORS(originsOk, headersOk, methodsOk)(r)}
 		go func(){

+ 2 - 3
controllers/networkHttpController.go

@@ -9,9 +9,8 @@ import (
 	"net/http"
 	"strings"
 	"time"
-	"os"
 	"github.com/gorilla/mux"
-	"github.com/gravitl/netmaker/config"
+	"github.com/gravitl/netmaker/servercfg"
 	"github.com/gravitl/netmaker/functions"
 	"github.com/gravitl/netmaker/models"
 	"github.com/gravitl/netmaker/mongoconn"
@@ -83,7 +82,7 @@ func securityCheck(next http.Handler) http.HandlerFunc {
 
 //Consider a more secure way of setting master key
 func authenticateMaster(tokenString string) bool {
-	if tokenString == config.Config.Server.MasterKey  || (tokenString == os.Getenv("MASTER_KEY") && tokenString != "") {
+	if tokenString == servercfg.GetMasterKey() {
 		return true
 	}
 	return false

+ 15 - 2
controllers/serverHttpController.go

@@ -3,7 +3,7 @@ package controller
 import (
     "github.com/gravitl/netmaker/models"
     "github.com/gravitl/netmaker/serverctl"
-    "github.com/gravitl/netmaker/config"
+    "github.com/gravitl/netmaker/servercfg"
     "encoding/json"
     "strings"
     "net/http"
@@ -12,6 +12,7 @@ import (
 
 func serverHandlers(r *mux.Router) {
     r.HandleFunc("/api/server/addnetwork/{network}", securityCheckServer(http.HandlerFunc(addNetwork))).Methods("POST")
+    r.HandleFunc("/api/server/getconfig", securityCheckServer(http.HandlerFunc(getConfig))).Methods("GET")
     r.HandleFunc("/api/server/removenetwork/{network}", securityCheckServer(http.HandlerFunc(removeNetwork))).Methods("DELETE")
 }
 
@@ -49,7 +50,7 @@ func securityCheckServer(next http.Handler) http.HandlerFunc {
 }
 //Consider a more secure way of setting master key
 func authenticateMasterServer(tokenString string) bool {
-    if tokenString == config.Config.Server.MasterKey {
+    if tokenString == servercfg.GetMasterKey() {
         return true
     }
     return false
@@ -72,6 +73,18 @@ func removeNetwork(w http.ResponseWriter, r *http.Request) {
         json.NewEncoder(w).Encode("Server removed from network " + params["network"])
 }
 
+func getConfig(w http.ResponseWriter, r *http.Request) {
+        // Set header
+        w.Header().Set("Content-Type", "application/json")
+
+        // get params
+
+        scfg := servercfg.GetConfig()
+
+        w.WriteHeader(http.StatusOK)
+        json.NewEncoder(w).Encode(scfg)
+}
+
 func addNetwork(w http.ResponseWriter, r *http.Request) {
         // Set header
         w.Header().Set("Content-Type", "application/json")

+ 3 - 4
functions/jwt.go

@@ -2,9 +2,8 @@ package functions
 
 import (
     "time"
-    "os"
-    "github.com/gravitl/netmaker/config"
     "github.com/gravitl/netmaker/models"
+    "github.com/gravitl/netmaker/servercfg"
     "github.com/dgrijalva/jwt-go"
 )
 
@@ -51,7 +50,7 @@ func CreateUserJWT(username string, isadmin bool) (response string, err error) {
 func VerifyUserToken(tokenString string) (username string, isadmin bool, err error) {
     claims := &models.UserClaims{}
 
-    if tokenString == config.Config.Server.MasterKey || (tokenString == os.Getenv("MASTER_KEY") && tokenString != "") {
+    if tokenString == servercfg.GetMasterKey() {
         return "masteradministrator", true, nil
     }
 
@@ -71,7 +70,7 @@ func VerifyToken(tokenString string) (macaddress string, network string, err err
 
     //this may be a stupid way of serving up a master key
     //TODO: look into a different method. Encryption?
-    if tokenString == config.Config.Server.MasterKey || (tokenString == os.Getenv("MASTER_KEY") && tokenString != "") {
+    if tokenString == servercfg.GetMasterKey() {
         return "mastermac", "", nil
     }
 

+ 8 - 15
main.go

@@ -5,17 +5,11 @@ package main
 
 import (
     "log"
-    "flag"
-    "github.com/gravitl/netmaker/models"
     "github.com/gravitl/netmaker/controllers"
+    "github.com/gravitl/netmaker/servercfg"
     "github.com/gravitl/netmaker/serverctl"
-    "github.com/gravitl/netmaker/functions"
     "github.com/gravitl/netmaker/mongoconn"
-    "github.com/gravitl/netmaker/config"
-    "go.mongodb.org/mongo-driver/bson"
     "fmt"
-    "time"
-    "strings"
     "os"
     "os/exec"
     "net"
@@ -23,7 +17,6 @@ import (
     "strconv"
     "sync"
     "os/signal"
-    "go.mongodb.org/mongo-driver/mongo"
     service "github.com/gravitl/netmaker/controllers"
     nodepb "github.com/gravitl/netmaker/grpc"
     "google.golang.org/grpc"
@@ -33,7 +26,7 @@ import (
 func main() {
 
 	//Client Mode Prereq Check
-	if serverctl.IsClientMode() {
+	if servercfg.IsClientMode() {
 		cmd := exec.Command("id", "-u")
 		output, err := cmd.Output()
 
@@ -62,7 +55,7 @@ func main() {
 		fmt.Printf("Error creating default network: %v", err)
 	}
 
-	if created && serverctl.IsClientMode() {
+	if created && servercfg.IsClientMode() {
 		installserver = true
 	}
 
@@ -74,17 +67,17 @@ func main() {
 	var waitnetwork sync.WaitGroup
 
 	//Run Agent Server
-	if serverctl.IsAgentBackend() {
+	if servercfg.IsAgentBackend() {
 		waitnetwork.Add(1)
 		go runGRPC(&waitnetwork, installserver)
 	}
 
 	//Run Rest Server
-	if serverctl.IsRestBackend() {
+	if servercfg.IsRestBackend() {
 		waitnetwork.Add(1)
 		controller.HandleRESTRequests(&waitnetwork)
 	}
-	if !serverctl.IsAgentBackend() && !serverctl.IsRestBackend {
+	if !servercfg.IsAgentBackend() && !servercfg.IsRestBackend() {
 		fmt.Println("Oops! No Server Mode selected. Nothing is being served! Set either Agent mode (AGENT_BACKEND) or Rest mode (REST_BACKEND) to 'true'.")
 	}
 	waitnetwork.Wait()
@@ -101,9 +94,9 @@ func runGRPC(wg *sync.WaitGroup, installserver bool) {
         // Pipe flags to one another (log.LstdFLags = log.Ldate | log.Ltime)
         log.SetFlags(log.LstdFlags | log.Lshortfile)
 
-	grpcport := serverctl.GetGRPCPort()
+	grpcport := servercfg.GetGRPCPort()
 
-	listener, err := net.Listen("tcp", grpcport)
+	listener, err := net.Listen("tcp", ":"+grpcport)
         // Handle errors if any
         if err != nil {
                 log.Fatalf("Unable to listen on port" + grpcport + ": %v", err)

+ 6 - 45
mongoconn/mongoconn.go

@@ -3,10 +3,9 @@ package mongoconn
 import (
 	"context"
 	"log"
-	"os"
 	"go.mongodb.org/mongo-driver/mongo"
 	"go.mongodb.org/mongo-driver/mongo/options"
-        "github.com/gravitl/netmaker/config"
+        "github.com/gravitl/netmaker/servercfg"
 )
 
 var Client *mongo.Client
@@ -19,51 +18,13 @@ var port string
 var opts string
 
 func setVars() {
-
-	//defaults
-	user = "admin"
-	pass = "password"
-	host = "localhost"
-	port = "27017"
-	opts = "/?authSource=admin"
-
-	//override with settings from config file
-	if config.Config.MongoConn.User != "" {
-		user = config.Config.MongoConn.User
-	}
-        if config.Config.MongoConn.Pass != "" {
-                pass = config.Config.MongoConn.Pass
-        }
-        if config.Config.MongoConn.Host != "" {
-                host = config.Config.MongoConn.Host
-        }
-        if config.Config.MongoConn.Port != "" {
-                port = config.Config.MongoConn.Port
-        }
-        if config.Config.MongoConn.Opts != "" {
-                opts = config.Config.MongoConn.Opts
-        }
-
-	//override with settings from env
-	if os.Getenv("MONGO_USER") != "" {
-		user = os.Getenv("MONGO_USER")
-	}
-        if os.Getenv("MONGO_PASS") != "" {
-                pass = os.Getenv("MONGO_PASS")
-        }
-        if os.Getenv("MONGO_HOST") != "" {
-                host = os.Getenv("MONGO_HOST")
-        }
-        if os.Getenv("MONGO_PORT") != "" {
-                port = os.Getenv("MONGO_PORT")
-        }
-        if os.Getenv("MONGO_OPTS") != "" {
-                opts = os.Getenv("MONGO_OPTS")
-        }
+	user = servercfg.GetMongoUser()
+	pass = servercfg.GetMongoPass()
+	host = servercfg.GetMongoHost()
+	port = servercfg.GetMongoPort()
+	opts = servercfg.GetMongoOpts()
 }
 
-//TODO: are we  even using  this besides at startup? Is it truely necessary?
-//TODO: Use config file instead of os.Getenv
 func ConnectDatabase() {
     // Set client options
 

+ 53 - 0
servercfg/mongoconf.go

@@ -0,0 +1,53 @@
+package servercfg
+
+import (
+        "github.com/gravitl/netmaker/config"
+        "os"
+)
+
+func GetMongoUser() string {
+	user := "mongoadmin"
+	if os.Getenv("MONGO_ADMIN") != "" {
+		user = os.Getenv("MONGO_ADMIN")
+	} else if  config.Config.MongoConn.User != "" {
+		user = config.Config.MongoConn.User
+	}
+	return user
+}
+func GetMongoPass() string {
+        pass := "mongopass"
+        if os.Getenv("MONGO_PASS") != "" {
+                pass = os.Getenv("MONGO_PASS")
+        } else if  config.Config.MongoConn.Pass != "" {
+                pass = config.Config.MongoConn.Pass
+        }
+        return pass
+}
+func GetMongoHost() string {
+        host := "127.0.0.1"
+        if os.Getenv("MONGO_HOST") != "" {
+                host = os.Getenv("MONGO_HOST")
+        } else if  config.Config.MongoConn.Host != "" {
+                host = config.Config.MongoConn.Host
+        }
+        return host
+}
+func GetMongoPort() string {
+        port := "27017"
+        if os.Getenv("MONGO_PORT") != "" {
+                port = os.Getenv("MONGO_PORT")
+        } else if  config.Config.MongoConn.Port != "" {
+                port = config.Config.MongoConn.Port
+        }
+        return port
+}
+func GetMongoOpts() string {
+        opts := "/?authSource=admin"
+        if os.Getenv("MONGO_OPTS") != "" {
+                opts = os.Getenv("MONGO_OPTS")
+        } else if  config.Config.MongoConn.Opts != "" {
+                opts = config.Config.MongoConn.Opts
+        }
+        return opts
+}
+

+ 50 - 10
serverctl/getconf.go → servercfg/serverconf.go

@@ -1,4 +1,12 @@
-package serverctl
+package servercfg
+
+import (
+        "github.com/gravitl/netmaker/config"
+	"net/http"
+	"io/ioutil"
+	"os"
+	"errors"
+)
 
 func SetHost() error {
 	remoteip, err := GetPublicIP()
@@ -6,9 +14,41 @@ func SetHost() error {
 		return err
 	}
 	os.Setenv("SERVER_HOST", remoteip)
+	return nil
+}
+func GetConfig() config.ServerConfig {
+	var cfg config.ServerConfig
+	cfg.APIHost = GetAPIHost()
+	cfg.APIPort = GetAPIPort()
+	cfg.GRPCHost = GetGRPCHost()
+	cfg.GRPCPort = GetGRPCPort()
+	cfg.MasterKey = "(hidden)"
+	cfg.AllowedOrigin = GetAllowedOrigin()
+	cfg.RestBackend = "off"
+	if IsRestBackend() {
+		cfg.RestBackend = "on"
+	}
+	cfg.AgentBackend = "off"
+        if IsAgentBackend() {
+                cfg.AgentBackend = "on"
+        }
+	cfg.ClientMode = "off"
+	if IsClientMode() {
+		cfg.ClientMode = "on"
+	}
+	cfg.DNSMode = "off"
+	if IsDNSMode() {
+	        cfg.DNSMode = "on"
+	}
+	cfg.DisableRemoteIPCheck = "off"
+	if DisableRemoteIPCheck() {
+		cfg.DisableRemoteIPCheck = "on"
+	}
+	return cfg
 }
+
 func GetAPIHost() string {
-        serverhost := 127.0.0.1
+        serverhost := "127.0.0.1"
         if os.Getenv("SERVER_HTTP_HOST") != ""  {
                 serverhost = os.Getenv("SERVER_HTTP_HOST")
         } else if config.Config.Server.APIHost != "" {
@@ -28,7 +68,7 @@ func GetAPIPort() string {
 	return apiport
 }
 func GetGRPCHost() string {
-        serverhost := 127.0.0.1
+        serverhost := "127.0.0.1"
         if os.Getenv("SERVER_GRPC_HOST") != ""  {
                 serverhost = os.Getenv("SERVER_GRPC_HOST")
         } else if config.Config.Server.GRPCHost != "" {
@@ -68,7 +108,7 @@ func GetAllowedOrigin() string {
 func IsRestBackend() bool {
         isrest := true
         if os.Getenv("REST_BACKEND") != "" {
-		if os.Getenv("REST_BACKEND") == "off"
+		if os.Getenv("REST_BACKEND") == "off" {
 			isrest = false
 		}
 	} else if config.Config.Server.RestBackend != "" {
@@ -81,7 +121,7 @@ func IsRestBackend() bool {
 func IsAgentBackend() bool {
         isagent := true
         if os.Getenv("AGENT_BACKEND") != "" {
-                if os.Getenv("AGENT_BACKEND") == "off"
+                if os.Getenv("AGENT_BACKEND") == "off" {
                         isagent = false
                 }
         } else if config.Config.Server.AgentBackend != "" {
@@ -94,7 +134,7 @@ func IsAgentBackend() bool {
 func IsClientMode() bool {
         isclient := true
         if os.Getenv("CLIENT_MODE") != "" {
-                if os.Getenv("CLIENT_MODE") == "off"
+                if os.Getenv("CLIENT_MODE") == "off" {
                         isclient = false
                 }
         } else if config.Config.Server.ClientMode != "" {
@@ -107,7 +147,7 @@ func IsClientMode() bool {
 func IsDNSMode() bool {
         isdns := true
         if os.Getenv("DNS_MODE") != "" {
-                if os.Getenv("DNS_MODE") == "off"
+                if os.Getenv("DNS_MODE") == "off" {
                         isdns = false
                 }
         } else if config.Config.Server.DNSMode != "" {
@@ -120,11 +160,11 @@ func IsDNSMode() bool {
 func DisableRemoteIPCheck() bool {
         disabled := false
         if os.Getenv("DISABLE_REMOTE_IP_CHECK") != "" {
-                if os.Getenv("DISABLE_REMOTE_IP_CHECK") == "on"
+                if os.Getenv("DISABLE_REMOTE_IP_CHECK") == "on" {
                         disabled = true
                 }
-        } else if config.Config.Server.DisableRemoteIpCheck != "" {
-                if config.Config.Server.DisableRemoteIpCheck == "on" {
+        } else if config.Config.Server.DisableRemoteIPCheck != "" {
+                if config.Config.Server.DisableRemoteIPCheck == "on" {
                         disabled= true
                 }
        }

+ 7 - 114
serverctl/serverctl.go

@@ -2,10 +2,13 @@ package serverctl
 
 import (
         "fmt"
-	"net/http"
-	"io/ioutil"
 	"github.com/gravitl/netmaker/functions"
+	"github.com/gravitl/netmaker/models"
+	"github.com/gravitl/netmaker/mongoconn"
+	"github.com/gravitl/netmaker/servercfg"
 	"io"
+	"time"
+	"context"
 	"errors"
         "os"
         "os/exec"
@@ -16,7 +19,7 @@ func CreateDefaultNetwork() (bool, error) {
         fmt.Println("Creating default network...")
 
         iscreated := false
-        exists, err := functions.NetworkExists(config.Config.Server.DefaultNetName)
+        exists, err := functions.NetworkExists("default")
 
         if exists || err != nil {
                 fmt.Println("Default network already exists. Skipping...")
@@ -56,116 +59,6 @@ func CreateDefaultNetwork() (bool, error) {
 
 }
 
-func GetHTTPPort() (string, error) {
-
-}
-
-func GetGRPCPort() (string, error) {
-
-}
-
-func GetServerDomain() (string, error) {
-
-}
-
-func modConfig(node *nodepb.Node) error{
-        network := node.Nodenetwork
-        if network == "" {
-                return errors.New("No Network Provided")
-        }
-        modconfig, err := config.ReadConfig(network)
-        if err != nil {
-                return err
-        }
-        nodecfg := modconfig.Node
-        if node.Name != ""{
-                nodecfg.Name = node.Name
-        }
-        if node.Interface != ""{
-                nodecfg.Interface = node.Interface
-        }
-        if node.Nodenetwork != ""{
-                nodecfg.Network = node.Nodenetwork
-        }
-        if node.Macaddress != ""{
-                nodecfg.MacAddress = node.Macaddress
-        }
-        if node.Localaddress != ""{
-                nodecfg.LocalAddress = node.Localaddress
-        }
-        if node.Postup != ""{
-                nodecfg.PostUp = node.Postup
-        }
-        if node.Postdown != ""{
-                nodecfg.PostDown = node.Postdown
-        }
-        if node.Listenport != 0{
-                nodecfg.Port = node.Listenport
-        }
-        if node.Keepalive != 0{
-                nodecfg.KeepAlive = node.Keepalive
-        }
-        if node.Publickey != ""{
-                nodecfg.PublicKey = node.Publickey
-        }
-        if node.Endpoint != ""{
-                nodecfg.Endpoint = node.Endpoint
-        }
-        if node.Password != ""{
-                nodecfg.Password = node.Password
-        }
-        if node.Address != ""{
-                nodecfg.WGAddress = node.Address
-        }
-        if node.Postchanges != "" {
-                nodecfg.PostChanges = node.Postchanges
-        }
-        if node.Localrange != "" && node.Islocal {
-                nodecfg.IsLocal = true
-                nodecfg.LocalRange = node.Localrange
-        }
-        modconfig.Node = nodecfg
-        err = config.Write(modconfig, network)
-        return err
-}
-
-func SetGlobalConfig(globalconf models.GlobalConfig) (error) {
-
-        if err != nil && err != mongo.ErrNoDocuments{
-              log.Fatalf("Unable to set global config: %v", err)
-        }
-
-        collection := mongoconn.Client.Database("netmaker").Collection("config")
-        ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
-
-        create, _, err := functions.GetGlobalConfig()
-        if create {
-                _, err := collection.InsertOne(ctx, globalconf)
-                defer cancel()
-                if err != nil {
-                        if err == mongo.ErrNoDocuments || strings.Contains(err.Error(), "no documents in result"){
-                                return nil
-                        } else {
-                                return err
-                        }
-                }
-        } else {
-                filter := bson.M{"name": "netmaker"}
-                update := bson.D{
-                        {"$set", bson.D{
-                                {"servergrpc", globalconf.ServerGRPC},
-                                {"portgrpc", globalconf.PortGRPC},
-                        }},
-                }
-                err := collection.FindOneAndUpdate(ctx, filter, update).Decode(&globalconf)
-                        if err == mongo.ErrNoDocuments {
-                        //if err == mongo.ErrNoDocuments || strings.Contains(err.Error(), "no documents in result"){
-                                return nil
-                        }
-        }
-        return err
-}
-
 func DownloadNetclient() error {
 	/*
 	// Get the data
@@ -247,7 +140,7 @@ func RemoveNetwork(network string) (bool, error) {
 }
 
 func AddNetwork(network string) (bool, error) {
-	pubip, err := GetPublicIP()
+	pubip, err := servercfg.GetPublicIP()
         if err != nil {
                 fmt.Println("could not get public IP.")
                 return false, err