|
@@ -29,72 +29,63 @@ import (
|
|
|
"google.golang.org/grpc"
|
|
|
)
|
|
|
|
|
|
-var ServerGRPC string
|
|
|
-var PortGRPC string
|
|
|
-
|
|
|
//Start MongoDB Connection and start API Request Handler
|
|
|
func main() {
|
|
|
|
|
|
+ //Client Mode Prereq Check
|
|
|
+ if serverctl.IsClientMode() {
|
|
|
+ cmd := exec.Command("id", "-u")
|
|
|
+ output, err := cmd.Output()
|
|
|
|
|
|
- var dnsmode string
|
|
|
- var clientmode string
|
|
|
- var defaultnet string
|
|
|
- flag.StringVar(&clientmode, "clientmode", "on", "Have a client on the server")
|
|
|
- flag.StringVar(&defaultnet, "defaultnet", "on", "Create a default network")
|
|
|
- flag.StringVar(&dnsmode, "dnsmode", "on", "Add DNS settings")
|
|
|
- flag.Parse()
|
|
|
- if clientmode == "on" {
|
|
|
-
|
|
|
- cmd := exec.Command("id", "-u")
|
|
|
- output, err := cmd.Output()
|
|
|
-
|
|
|
- if err != nil {
|
|
|
- log.Fatal(err)
|
|
|
- }
|
|
|
- i, err := strconv.Atoi(string(output[:len(output)-1]))
|
|
|
- if err != nil {
|
|
|
- log.Fatal(err)
|
|
|
- }
|
|
|
-
|
|
|
- if i != 0 {
|
|
|
- log.Fatal("To run in client mode requires root privileges. Either turn off client mode with the --clientmode=off flag, or run with sudo.")
|
|
|
- }
|
|
|
+ if err != nil {
|
|
|
+ fmt.Println("Error running 'id -u' for prereq check. Please investigate or disable client mode.")
|
|
|
+ log.Fatal(err)
|
|
|
+ }
|
|
|
+ i, err := strconv.Atoi(string(output[:len(output)-1]))
|
|
|
+ if err != nil {
|
|
|
+ fmt.Println("Error retrieving uid from 'id -u' for prereq check. Please investigate or disable client mode.")
|
|
|
+ log.Fatal(err)
|
|
|
+ }
|
|
|
+ if i != 0 {
|
|
|
+ log.Fatal("To run in client mode requires root privileges. Either disable client mode or run with sudo.")
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
- log.Println("Server starting...")
|
|
|
+ //Start Mongodb
|
|
|
mongoconn.ConnectDatabase()
|
|
|
|
|
|
installserver := false
|
|
|
- if !(defaultnet == "off") {
|
|
|
- if config.Config.Server.CreateDefault {
|
|
|
- created, err := createDefaultNetwork()
|
|
|
- if err != nil {
|
|
|
- fmt.Printf("Error creating default network: %v", err)
|
|
|
- }
|
|
|
- if created && clientmode != "off" {
|
|
|
- installserver = true
|
|
|
- }
|
|
|
- }
|
|
|
+
|
|
|
+ //Create the default network (default: 10.10.10.0/24)
|
|
|
+ created, err := serverctl.CreateDefaultNetwork()
|
|
|
+ if err != nil {
|
|
|
+ fmt.Printf("Error creating default network: %v", err)
|
|
|
}
|
|
|
- if dnsmode == "on" {
|
|
|
- err := controller.SetDNS()
|
|
|
- if err != nil {
|
|
|
- fmt.Printf("Error setting DNS: %v", err)
|
|
|
- }
|
|
|
+
|
|
|
+ if created && serverctl.IsClientMode() {
|
|
|
+ installserver = true
|
|
|
}
|
|
|
+
|
|
|
+ //NOTE: Removed Check and Logic for DNS Mode
|
|
|
+ //Reasoning. DNS Logic is very small on server. Can run with little/no impact. Just sets a tiny config file.
|
|
|
+ //Real work is done by CoreDNS
|
|
|
+ //We can just not run CoreDNS. On Agent side is only necessary check for IsDNSMode, which we will pass.
|
|
|
+
|
|
|
var waitnetwork sync.WaitGroup
|
|
|
|
|
|
- if config.Config.Server.AgentBackend {
|
|
|
+ //Run Agent Server
|
|
|
+ if serverctl.IsAgentBackend() {
|
|
|
waitnetwork.Add(1)
|
|
|
go runGRPC(&waitnetwork, installserver)
|
|
|
}
|
|
|
|
|
|
- if config.Config.Server.RestBackend {
|
|
|
+ //Run Rest Server
|
|
|
+ if serverctl.IsRestBackend() {
|
|
|
waitnetwork.Add(1)
|
|
|
controller.HandleRESTRequests(&waitnetwork)
|
|
|
}
|
|
|
- if !config.Config.Server.RestBackend && !config.Config.Server.AgentBackend {
|
|
|
- fmt.Println("Oops! No Server Mode selected. Nothing being served.")
|
|
|
+ if !serverctl.IsAgentBackend() && !serverctl.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()
|
|
|
fmt.Println("Exiting now.")
|
|
@@ -110,36 +101,7 @@ func runGRPC(wg *sync.WaitGroup, installserver bool) {
|
|
|
// Pipe flags to one another (log.LstdFLags = log.Ldate | log.Ltime)
|
|
|
log.SetFlags(log.LstdFlags | log.Lshortfile)
|
|
|
|
|
|
- // Start our listener, 50051 is the default gRPC port
|
|
|
- grpcport := ":50051"
|
|
|
- if config.Config.Server.GrpcPort != "" {
|
|
|
- grpcport = ":" + config.Config.Server.GrpcPort
|
|
|
- }
|
|
|
- if os.Getenv("GRPC_PORT") != "" {
|
|
|
- grpcport = ":" + os.Getenv("GRPC_PORT")
|
|
|
- }
|
|
|
- PortGRPC = grpcport
|
|
|
- if os.Getenv("SERVER_DOMAIN") == "" {
|
|
|
- if config.Config.Server.Host == "" {
|
|
|
- ServerGRPC, _ = serverctl.GetPublicIP()
|
|
|
- } else {
|
|
|
- ServerGRPC = config.Config.Server.Host
|
|
|
- }
|
|
|
- } else {
|
|
|
- ServerGRPC = os.Getenv("SERVER_DOMAIN")
|
|
|
- }
|
|
|
- fmt.Println("GRPC Server set to: " + ServerGRPC)
|
|
|
- fmt.Println("GRPC Port set to: " + PortGRPC)
|
|
|
- var gconf models.GlobalConfig
|
|
|
- gconf.ServerGRPC = ServerGRPC
|
|
|
- gconf.PortGRPC = PortGRPC
|
|
|
- gconf.Name = "netmaker"
|
|
|
- err := setGlobalConfig(gconf)
|
|
|
-
|
|
|
- if err != nil && err != mongo.ErrNoDocuments{
|
|
|
- log.Fatalf("Unable to set global config: %v", err)
|
|
|
- }
|
|
|
-
|
|
|
+ grpcport := serverctl.GetGRPCPort()
|
|
|
|
|
|
listener, err := net.Listen("tcp", grpcport)
|
|
|
// Handle errors if any
|
|
@@ -168,8 +130,8 @@ func runGRPC(wg *sync.WaitGroup, installserver bool) {
|
|
|
fmt.Println("Agent Server succesfully started on port " + grpcport + " (gRPC)")
|
|
|
|
|
|
if installserver {
|
|
|
- fmt.Println("Adding server to " + config.Config.Server.DefaultNetName)
|
|
|
- success, err := serverctl.AddNetwork(config.Config.Server.DefaultNetName)
|
|
|
+ fmt.Println("Adding server to default network")
|
|
|
+ success, err := serverctl.AddNetwork("default")
|
|
|
if err != nil {
|
|
|
fmt.Printf("Error adding to default network: %v", err)
|
|
|
fmt.Println("")
|
|
@@ -184,8 +146,6 @@ func runGRPC(wg *sync.WaitGroup, installserver bool) {
|
|
|
}
|
|
|
fmt.Println("Setup complete. You are ready to begin using netmaker.")
|
|
|
|
|
|
-
|
|
|
-
|
|
|
// Right way to stop the server using a SHUTDOWN HOOK
|
|
|
// Create a channel to receive OS signals
|
|
|
c := make(chan os.Signal)
|
|
@@ -207,84 +167,6 @@ func runGRPC(wg *sync.WaitGroup, installserver bool) {
|
|
|
mongoconn.Client.Disconnect(context.TODO())
|
|
|
fmt.Println("MongoDB connection closed.")
|
|
|
}
|
|
|
-func setGlobalConfig(globalconf models.GlobalConfig) (error) {
|
|
|
-
|
|
|
- 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 createDefaultNetwork() (bool, error) {
|
|
|
-
|
|
|
- iscreated := false
|
|
|
- exists, err := functions.NetworkExists(config.Config.Server.DefaultNetName)
|
|
|
-
|
|
|
- if exists || err != nil {
|
|
|
- fmt.Println("Default network already exists")
|
|
|
- fmt.Println("Skipping default network create")
|
|
|
- return iscreated, err
|
|
|
- } else {
|
|
|
-
|
|
|
- var network models.Network
|
|
|
-
|
|
|
- network.NetID = config.Config.Server.DefaultNetName
|
|
|
- network.AddressRange = config.Config.Server.DefaultNetRange
|
|
|
- network.DisplayName = config.Config.Server.DefaultNetName
|
|
|
- network.SetDefaults()
|
|
|
- network.SetNodesLastModified()
|
|
|
- network.SetNetworkLastModified()
|
|
|
- network.KeyUpdateTimeStamp = time.Now().Unix()
|
|
|
- priv := false
|
|
|
- network.IsLocal = &priv
|
|
|
- network.KeyUpdateTimeStamp = time.Now().Unix()
|
|
|
- allow := true
|
|
|
- network.AllowManualSignUp = &allow
|
|
|
-
|
|
|
- fmt.Println("Creating default network.")
|
|
|
-
|
|
|
-
|
|
|
- collection := mongoconn.Client.Database("netmaker").Collection("networks")
|
|
|
- ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
|
|
|
-
|
|
|
-
|
|
|
- // insert our network into the network table
|
|
|
- _, err = collection.InsertOne(ctx, network)
|
|
|
- defer cancel()
|
|
|
-
|
|
|
- }
|
|
|
- if err == nil {
|
|
|
- iscreated = true
|
|
|
- }
|
|
|
- return iscreated, err
|
|
|
-
|
|
|
-
|
|
|
-}
|
|
|
|
|
|
func authServerUnaryInterceptor() grpc.ServerOption {
|
|
|
return grpc.UnaryInterceptor(controller.AuthServerUnaryInterceptor)
|
|
@@ -292,4 +174,3 @@ func authServerUnaryInterceptor() grpc.ServerOption {
|
|
|
func authServerStreamInterceptor() grpc.ServerOption {
|
|
|
return grpc.StreamInterceptor(controller.AuthServerStreamInterceptor)
|
|
|
}
|
|
|
-
|