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

This commit is contained in:
afeiszli 2021-05-05 22:03:37 +00:00
parent 46a81c9767
commit de3d81db3a
10 changed files with 163 additions and 210 deletions

View file

@ -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 {

View file

@ -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(){

View file

@ -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

View file

@ -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")

View file

@ -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
}

23
main.go
View file

@ -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)

View file

@ -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
servercfg/mongoconf.go Normal file
View file

@ -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
}

View file

@ -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
}
}

View file

@ -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