Browse Source

Merge remote-tracking branch 'origin/feature_v0.8_housekeeping' into feature_v0.8.1_coredns

afeiszli 3 years ago
parent
commit
99c8c6b31d

+ 1 - 1
controllers/common.go

@@ -14,7 +14,6 @@ import (
 	"golang.org/x/crypto/bcrypt"
 )
 
-
 func GetPeersList(networkName string, excludeRelayed bool, relayedNodeAddr string) ([]models.Node, error) {
 	var peers []models.Node
 	var relayNode models.Node
@@ -218,6 +217,7 @@ func GetNode(macaddress string, network string) (models.Node, error) {
 	if err = json.Unmarshal([]byte(data), &node); err != nil {
 		return node, err
 	}
+	node.SetDefaults()
 
 	return node, err
 }

+ 2 - 2
controllers/networkHttpController.go

@@ -133,7 +133,7 @@ func getNetworks(w http.ResponseWriter, r *http.Request) {
 	err := errors.New("Networks Error")
 	if networksSlice[0] == ALL_NETWORK_ACCESS {
 		allnetworks, err = models.GetNetworks()
-		if err != nil && !database.IsEmptyRecord(err){
+		if err != nil && !database.IsEmptyRecord(err) {
 			returnErrorResponse(w, r, formatError(err, "internal"))
 			return
 		}
@@ -390,7 +390,7 @@ func CreateNetwork(network models.Network) error {
 		return err
 	}
 
-	if servercfg.IsClientMode() {
+	if servercfg.IsClientMode() != "off" {
 		var success bool
 		success, err = serverctl.AddNetwork(network.NetID)
 		if err != nil || !success {

+ 1 - 1
controllers/nodeGrpcController.go

@@ -148,7 +148,7 @@ func (s *NodeServiceServer) GetPeers(ctx context.Context, req *nodepb.Object) (*
 		}
 
 		peersData, err := json.Marshal(&peers)
-		functions.PrintUserLog(node.Address,"checked in successfully",3)
+		functions.PrintUserLog(node.Address, "checked in successfully", 3)
 		return &nodepb.Object{
 			Data: string(peersData),
 			Type: nodepb.NODE_TYPE,

+ 23 - 0
docker/Dockerfile-builder

@@ -0,0 +1,23 @@
+FROM alpine:3.13.6
+
+RUN apk add --no-cache --virtual .build-deps bash gcc musl-dev openssl go 
+
+RUN wget -O go.tgz https://dl.google.com/go/go1.17.1.linux-amd64.tar.gz 
+
+RUN tar -C /usr/local -xzf go.tgz 
+
+WORKDIR /usr/local/go/src
+
+RUN chmod +x make.bash
+
+RUN ./make.bash 
+
+ENV PATH="/usr/local/go/bin:$PATH"
+
+ENV GOPATH=/opt/go/ 
+
+ENV PATH=$PATH:$GOPATH/bin 
+
+RUN apk del .build-deps
+
+RUN apk add build-base

+ 0 - 0
Dockerfile-netclient → docker/Dockerfile-netclient


+ 34 - 0
docker/Dockerfile-netmaker-slim

@@ -0,0 +1,34 @@
+#first stage - builder
+FROM gravitl/builder as builder
+
+WORKDIR /app
+
+COPY . .
+
+ENV GO111MODULE=auto
+
+RUN GOOS=linux GOARCH=amd64 CGO_ENABLED=1 /usr/local/go/bin/go build -ldflags="-w -s" -o netmaker main.go
+
+WORKDIR /app/netclient
+
+RUN GOOS=linux GOARCH=amd64 CGO_ENABLED=0 /usr/local/go/bin/go build -ldflags="-w -s" -o netclient main.go
+#second stage
+
+FROM alpine:3.13.6
+# add a c lib
+RUN apk add gcompat iptables
+# set the working directory
+WORKDIR /root/
+
+RUN mkdir /etc/netclient
+
+COPY --from=builder /app/netmaker .
+COPY --from=builder /app/config config
+COPY --from=builder /app/netclient/netclient  /etc/netclient/netclient
+
+RUN chmod 0755 /etc/netclient/netclient
+
+EXPOSE 8081
+EXPOSE 50051
+
+ENTRYPOINT ["./netmaker"]

+ 26 - 0
docker/Dockerfile-netmaker-slim-solo

@@ -0,0 +1,26 @@
+FROM gravitl/builder:latest as builder
+# add glib support daemon manager
+WORKDIR /app
+
+COPY . .
+
+ENV GO111MODULE=auto
+
+RUN GOOS=linux GOARCH=amd64 CGO_ENABLED=1 /usr/local/go/bin/go build -ldflags="-w -s" -o netmaker main.go
+
+FROM alpine:3.13.6
+
+RUN apk add gcompat
+# set the working directory
+WORKDIR /root/
+
+COPY --from=builder /app/netmaker .
+COPY --from=builder /app/config .
+
+RUN mkdir -p config/dnsconfig
+RUN touch config/dnsconfig/Corefile && touch config/dnsconfig/netmaker.hosts
+
+EXPOSE 8081
+EXPOSE 50051
+
+ENTRYPOINT ["./netmaker"]

+ 4 - 0
functions/helpers.go

@@ -556,6 +556,8 @@ func GetNodeByMacAddress(network string, macaddress string) (models.Node, error)
 		return models.Node{}, err
 	}
 
+	node.SetDefaults()
+
 	return node, nil
 }
 
@@ -577,6 +579,8 @@ func GetDeletedNodeByMacAddress(network string, macaddress string) (models.Node,
 		return models.Node{}, err
 	}
 
+	node.SetDefaults()
+
 	return node, nil
 }
 

+ 28 - 2
main.go

@@ -11,6 +11,7 @@ import (
 	"os/signal"
 	"strconv"
 	"sync"
+	"time"
 
 	controller "github.com/gravitl/netmaker/controllers"
 	"github.com/gravitl/netmaker/database"
@@ -19,6 +20,7 @@ import (
 	"github.com/gravitl/netmaker/models"
 	"github.com/gravitl/netmaker/netclient/ncutils"
 	"github.com/gravitl/netmaker/servercfg"
+	"github.com/gravitl/netmaker/serverctl"
 	"google.golang.org/grpc"
 )
 
@@ -37,7 +39,7 @@ func initialize() { // Client Mode Prereq Check
 		log.Fatal(err)
 	}
 	log.Println("database successfully connected.")
-	if servercfg.IsClientMode() {
+	if servercfg.IsClientMode() != "off" {
 		output, err := ncutils.RunCmd("id -u", true)
 		if err != nil {
 			log.Println("Error running 'id -u' for prereq check. Please investigate or disable client mode.")
@@ -51,6 +53,9 @@ func initialize() { // Client Mode Prereq Check
 		if uid != 0 {
 			log.Fatal("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")
+		}
 	}
 
 	if servercfg.IsDNSMode() {
@@ -75,6 +80,13 @@ func startControllers() {
 		waitnetwork.Add(1)
 		go runGRPC(&waitnetwork)
 	}
+
+	// Run the client in goroutine locally if CLIENT_MODE is "contained"
+	if servercfg.IsClientMode() == "contained" {
+		waitnetwork.Add(1)
+		go runClient(&waitnetwork)
+	}
+
 	if servercfg.IsDNSMode() {
 		err := controller.SetDNS()
 		if err != nil {
@@ -96,8 +108,22 @@ func startControllers() {
 	if !servercfg.IsAgentBackend() && !servercfg.IsRestBackend() {
 		log.Println("No Server Mode selected, so nothing is being served! Set either Agent mode (AGENT_BACKEND) or Rest mode (REST_BACKEND) to 'true'.")
 	}
+
 	waitnetwork.Wait()
-	log.Println("exiting")
+	log.Println("[netmaker] exiting")
+}
+
+func runClient(wg *sync.WaitGroup) {
+	defer wg.Done()
+	log.Println("CLIENT_MODE running as contained")
+	go func() {
+		for {
+			if err := serverctl.HandleContainedClient(); err != nil {
+				// PASS
+			}
+			time.Sleep(time.Second * 15)
+		}
+	}()
 }
 
 func runGRPC(wg *sync.WaitGroup) {

+ 1 - 1
models/network.go

@@ -178,7 +178,7 @@ func (network *Network) SetNetworkLastModified() {
 
 func (network *Network) SetDefaults() {
 	if network.DefaultUDPHolePunch == "" {
-		if servercfg.IsClientMode() {
+		if servercfg.IsClientMode() != "off" {
 			network.DefaultUDPHolePunch = "yes"
 		} else {
 			network.DefaultUDPHolePunch = "no"

+ 0 - 19
models/node.go

@@ -532,25 +532,6 @@ func GetAllNodes() ([]Node, error) {
 	return nodes, nil
 }
 
-func GetNode(macaddress string, network string) (Node, error) {
-
-	var node Node
-
-	key, err := GetID(macaddress, network)
-	if err != nil {
-		return node, err
-	}
-	data, err := database.FetchRecord(database.NODES_TABLE_NAME, key)
-	if err != nil {
-		return node, err
-	}
-	if err = json.Unmarshal([]byte(data), &node); err != nil {
-		return node, err
-	}
-
-	return node, err
-}
-
 func GetID(macaddress string, network string) (string, error) {
 	if macaddress == "" || network == "" {
 		return "", errors.New("unable to get record key")

+ 11 - 0
scripts/daemon.sh

@@ -0,0 +1,11 @@
+# create a logs file
+sudo touch /etc/netclient/netclient.logs
+echo "[netclient] created logs file in /etc/netclient/netclient.logs"
+echo "[netclient] Starting netclient checkins"
+# loop and call checkin -n all
+while [ 1 ]; do
+    # add logs to netclient.logs
+    sudo /etc/netclient/netclient checkin -n all >> /etc/netclient/netclient.logs 2&1>
+    sleep 15
+done &
+echo "[netclient] exiting"

+ 12 - 6
servercfg/serverconf.go

@@ -39,8 +39,8 @@ func GetServerConfig() config.ServerConfig {
 		cfg.AgentBackend = "on"
 	}
 	cfg.ClientMode = "off"
-	if IsClientMode() {
-		cfg.ClientMode = "on"
+	if IsClientMode() != "off" {
+		cfg.ClientMode = IsClientMode()
 	}
 	cfg.DNSMode = "off"
 	if IsDNSMode() {
@@ -222,15 +222,21 @@ func IsAgentBackend() bool {
 	}
 	return isagent
 }
-func IsClientMode() bool {
-	isclient := true
+func IsClientMode() string {
+	isclient := "on"
 	if os.Getenv("CLIENT_MODE") != "" {
 		if os.Getenv("CLIENT_MODE") == "off" {
-			isclient = false
+			isclient = "off"
+		}
+		if os.Getenv("CLIENT_MODE") == "contained" {
+			isclient = "contained"
 		}
 	} else if config.Config.Server.ClientMode != "" {
 		if config.Config.Server.ClientMode == "off" {
-			isclient = false
+			isclient = "off"
+		}
+		if config.Config.Server.ClientMode == "contained" {
+			isclient = "contained"
 		}
 	}
 	return isclient

+ 55 - 17
serverctl/serverctl.go

@@ -100,41 +100,79 @@ func RemoveNetwork(network string) (bool, error) {
 
 }
 
-func AddNetwork(network string) (bool, error) {
-	pubip, err := servercfg.GetPublicIP()
-	if err != nil {
-		log.Println("could not get public IP.")
-		return false, err
-	}
+func InitServerNetclient() error {
 	netclientDir := ncutils.GetNetclientPath()
 	netclientPath := ncutils.GetNetclientPathSpecific()
-	_, err = os.Stat(netclientDir)
+	_, err := os.Stat(netclientDir)
 	if os.IsNotExist(err) {
 		os.Mkdir(netclientDir, 744)
 	} else if err != nil {
 		log.Println("could not find or create", netclientDir)
-		return false, err
-	}
-	token, err := functions.CreateServerToken(network)
-	if err != nil {
-		log.Println("could not create server token for " + network)
-		return false, err
+		return err
 	}
 	_, err = os.Stat(netclientPath + "netclient")
 	if os.IsNotExist(err) {
 		err = InstallNetclient()
 		if err != nil {
-			return false, err
+			return err
 		}
 	}
 	err = os.Chmod(netclientPath+"netclient", 0755)
 	if err != nil {
-		log.Println("could not change netclient directory permissions")
+		log.Println("could not change netclient binary permissions")
+		return err
+	}
+	return nil
+}
+
+func HandleContainedClient() error {
+	log.SetFlags(log.Flags() &^ (log.Llongfile | log.Lshortfile))
+
+	netclientPath := ncutils.GetNetclientPathSpecific()
+	checkinCMD := exec.Command(netclientPath+"netclient", "checkin", "-n", "all")
+	if servercfg.GetVerbose() >= 2 {
+		checkinCMD.Stdout = os.Stdout
+	}
+	checkinCMD.Stderr = os.Stderr
+	err := checkinCMD.Start()
+	if err != nil {
+		if servercfg.GetVerbose() >= 2 {
+			log.Println(err)
+		}
+	}
+	err = checkinCMD.Wait()
+	if err != nil {
+		if servercfg.GetVerbose() >= 2 {
+			log.Println(err)
+		}
+	}
+	if servercfg.GetVerbose() >= 3 {
+		log.Println("[server netclient]", "completed a checkin call")
+	}
+	return nil
+}
+
+func AddNetwork(network string) (bool, error) {
+	pubip, err := servercfg.GetPublicIP()
+	if err != nil {
+		log.Println("could not get public IP.")
 		return false, err
 	}
-	functions.PrintUserLog(models.NODE_SERVER_NAME, "executing network join: "+netclientPath+"netclient "+"join "+"-t "+token+" -name "+models.NODE_SERVER_NAME+" -endpoint "+pubip, 0)
+	netclientPath := ncutils.GetNetclientPathSpecific()
 
-	joinCMD := exec.Command(netclientPath+"netclient", "join", "-t", token, "-name", models.NODE_SERVER_NAME, "-endpoint", pubip)
+	token, err := functions.CreateServerToken(network)
+	if err != nil {
+		log.Println("could not create server token for " + network)
+		return false, err
+	}
+
+	functions.PrintUserLog(models.NODE_SERVER_NAME, "executing network join: "+netclientPath+"netclient "+"join "+"-t "+token+" -name "+models.NODE_SERVER_NAME+" -endpoint "+pubip, 0)
+	var joinCMD *exec.Cmd
+	if servercfg.IsClientMode() == "contained" {
+		joinCMD = exec.Command(netclientPath+"netclient", "join", "-t", token, "-name", models.NODE_SERVER_NAME, "-endpoint", pubip, "-daemon", "off", "-dnson", "no")
+	} else {
+		joinCMD = exec.Command(netclientPath+"netclient", "join", "-t", token, "-name", models.NODE_SERVER_NAME, "-endpoint", pubip)
+	}
 	joinCMD.Stdout = os.Stdout
 	joinCMD.Stderr = os.Stderr
 	err = joinCMD.Start()