Compare commits
	
		
			1 Commits 
		
	
	
		
			0ac5d9a677
			...
			d0460cea09
		
	
	| Author | SHA1 | Date | 
|---|---|---|
|  | d0460cea09 | 
|  | @ -13,7 +13,7 @@ jobs: | ||||||
|     runs-on: ubuntu-latest |     runs-on: ubuntu-latest | ||||||
|     steps: |     steps: | ||||||
|     - name: Set up Go |     - name: Set up Go | ||||||
|       uses: actions/setup-go@v4 |       uses: actions/setup-go@v3 | ||||||
|       with: |       with: | ||||||
|         go-version: ^1.15 |         go-version: ^1.15 | ||||||
|     - name: Check out code |     - name: Check out code | ||||||
|  |  | ||||||
								
									
									
										
											10
										
									
									Makefile
									
									
									
									
								
								
							
							
										
											10
										
									
									Makefile
									
									
									
									
								|  | @ -21,10 +21,6 @@ build-arm64: | ||||||
| build-armhf: | build-armhf: | ||||||
| 	GOOS=linux GOARCH=arm RELEASE=prod make build | 	GOOS=linux GOARCH=arm RELEASE=prod make build | ||||||
| 
 | 
 | ||||||
| build-amd64: |  | ||||||
| 	GOOS=linux GOARCH=amd64 RELEASE=prod make build |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| build: | build: | ||||||
| 	@echo "Building ${GOOS}-${GOARCH}" | 	@echo "Building ${GOOS}-${GOARCH}" | ||||||
| 	GOOS=${GOOS} GOARCH=${GOARCH} go build \
 | 	GOOS=${GOOS} GOARCH=${GOARCH} go build \
 | ||||||
|  | @ -45,10 +41,9 @@ test-with-coverage: | ||||||
| 	go test -tags=unit -timeout=600s -v ./... -coverprofile=coverage.out | 	go test -tags=unit -timeout=600s -v ./... -coverprofile=coverage.out | ||||||
| 
 | 
 | ||||||
| install: | install: | ||||||
| 	sudo systemctl stop edgeboxctl || true | 	sudo systemctl stop edgeboxctl | ||||||
| 	sudo rm -rf /usr/local/bin/edgeboxctl /usr/local/sbin/edgeboctl /lib/systemd/system/edgeboxctl.service | 	sudo rm -rf /usr/local/bin/edgeboxctl /lib/systemd/system/edgeboxctl.service | ||||||
| 	sudo cp ./bin/edgeboxctl /usr/local/bin/edgeboxctl | 	sudo cp ./bin/edgeboxctl /usr/local/bin/edgeboxctl | ||||||
| 	sudo cp ./bin/edgeboxctl /usr/local/sbin/edgeboxctl |  | ||||||
| 	sudo cp ./edgeboxctl.service /lib/systemd/system/edgeboxctl.service | 	sudo cp ./edgeboxctl.service /lib/systemd/system/edgeboxctl.service | ||||||
| 	sudo systemctl daemon-reload | 	sudo systemctl daemon-reload | ||||||
| 	@echo "Edgeboxctl installed successfully" | 	@echo "Edgeboxctl installed successfully" | ||||||
|  | @ -58,7 +53,6 @@ install-prod: build-prod install | ||||||
| install-cloud: build-cloud install | install-cloud: build-cloud install | ||||||
| install-arm64: build-arm64 install | install-arm64: build-arm64 install | ||||||
| install-armhf: build-armhf install | install-armhf: build-armhf install | ||||||
| install-amd64: build-amd64 install |  | ||||||
| 
 | 
 | ||||||
| start: | start: | ||||||
| 	systemctl start edgeboxctl | 	systemctl start edgeboxctl | ||||||
|  |  | ||||||
|  | @ -6,7 +6,7 @@ import ( | ||||||
| 	"os" | 	"os" | ||||||
| 	"strings" | 	"strings" | ||||||
| 	"time" | 	"time" | ||||||
| 	 | 
 | ||||||
| 	"github.com/joho/godotenv" | 	"github.com/joho/godotenv" | ||||||
| 
 | 
 | ||||||
| 	"github.com/edgebox-iot/edgeboxctl/internal/system" | 	"github.com/edgebox-iot/edgeboxctl/internal/system" | ||||||
|  | @ -23,9 +23,6 @@ type EdgeApp struct { | ||||||
| 	InternetAccessible bool             `json:"internet_accessible"` | 	InternetAccessible bool             `json:"internet_accessible"` | ||||||
| 	NetworkURL         string           `json:"network_url"` | 	NetworkURL         string           `json:"network_url"` | ||||||
| 	InternetURL        string           `json:"internet_url"` | 	InternetURL        string           `json:"internet_url"` | ||||||
| 	Options			   []EdgeAppOption  `json:"options"` |  | ||||||
| 	NeedsConfig		   bool             `json:"needs_config"` |  | ||||||
| 	Login              EdgeAppLogin	 	`json:"login"` |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // MaybeEdgeApp : Boolean flag for validation of edgeapp existance
 | // MaybeEdgeApp : Boolean flag for validation of edgeapp existance
 | ||||||
|  | @ -46,29 +43,9 @@ type EdgeAppService struct { | ||||||
| 	IsRunning bool   `json:"is_running"` | 	IsRunning bool   `json:"is_running"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| type EdgeAppOption struct { |  | ||||||
| 	Key             string `json:"key"` |  | ||||||
| 	Value           string `json:"value"` |  | ||||||
| 	DefaultValue    string `json:"default_value"` |  | ||||||
| 	Format          string `json:"format"` |  | ||||||
| 	Description     string `json:"description"` |  | ||||||
| 	IsSecret        bool   `json:"is_secret"` |  | ||||||
| 	IsInstallLocked bool   `json:"is_install_locked"` |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| type EdgeAppLogin struct { |  | ||||||
| 	Enabled  bool   `json:"enabled"` |  | ||||||
| 	Username string `json:"username"` |  | ||||||
| 	Password string `json:"password"` |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| const configFilename = "/edgebox-compose.yml" | const configFilename = "/edgebox-compose.yml" | ||||||
| const envFilename = "/edgebox.env" | const envFilename = "/edgebox.env" | ||||||
| const optionsTemplateFilename = "/edgeapp.template.env" |  | ||||||
| const optionsEnvFilename = "/edgeapp.env" |  | ||||||
| const authEnvFilename = "/auth.env" |  | ||||||
| const runnableFilename = "/.run" | const runnableFilename = "/.run" | ||||||
| const appdataFoldername = "/appdata" |  | ||||||
| const myEdgeAppServiceEnvFilename = "/myedgeapp.env" | const myEdgeAppServiceEnvFilename = "/myedgeapp.env" | ||||||
| const defaultContainerOperationSleepTime time.Duration = time.Second * 10 | const defaultContainerOperationSleepTime time.Duration = time.Second * 10 | ||||||
| 
 | 
 | ||||||
|  | @ -86,7 +63,6 @@ func GetEdgeApp(ID string) MaybeEdgeApp { | ||||||
| 
 | 
 | ||||||
| 		edgeAppName := ID | 		edgeAppName := ID | ||||||
| 		edgeAppDescription := "" | 		edgeAppDescription := "" | ||||||
| 		edgeAppOptions := []EdgeAppOption{} |  | ||||||
| 
 | 
 | ||||||
| 		edgeAppEnv, err := godotenv.Read(utils.GetPath(utils.EdgeAppsPath) + ID + envFilename) | 		edgeAppEnv, err := godotenv.Read(utils.GetPath(utils.EdgeAppsPath) + ID + envFilename) | ||||||
| 
 | 
 | ||||||
|  | @ -101,103 +77,6 @@ func GetEdgeApp(ID string) MaybeEdgeApp { | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		needsConfig := false |  | ||||||
| 		hasFilledOptions := false |  | ||||||
| 		edgeAppOptionsTemplate, err := godotenv.Read(utils.GetPath(utils.EdgeAppsPath) + ID + optionsTemplateFilename) |  | ||||||
| 		if err != nil { |  | ||||||
| 			log.Println("Error loading options template file for edgeapp " + edgeAppName) |  | ||||||
| 		} else { |  | ||||||
| 			// Try to read the edgeAppOptionsEnv file
 |  | ||||||
| 			edgeAppOptionsEnv, err := godotenv.Read(utils.GetPath(utils.EdgeAppsPath) + ID + optionsEnvFilename) |  | ||||||
| 			if err != nil { |  | ||||||
| 				log.Println("Error loading options env file for edgeapp " + edgeAppName) |  | ||||||
| 			} else { |  | ||||||
| 				hasFilledOptions = true |  | ||||||
| 			} |  | ||||||
| 
 |  | ||||||
| 			for key, value := range edgeAppOptionsTemplate { |  | ||||||
| 				 |  | ||||||
| 				optionFilledValue := "" |  | ||||||
| 				if hasFilledOptions { |  | ||||||
| 					// Check if key exists in edgeAppOptionsEnv
 |  | ||||||
| 					optionFilledValue = edgeAppOptionsEnv[key] |  | ||||||
| 				} |  | ||||||
| 
 |  | ||||||
| 				format := "" |  | ||||||
| 				defaultValue := "" |  | ||||||
| 				description := "" |  | ||||||
| 				installLocked := false |  | ||||||
| 
 |  | ||||||
| 				// Parse value to separate by | and get the format, installLocked, description and default value
 |  | ||||||
| 				// Format is the first element
 |  | ||||||
| 				// InstallLocked is the second element
 |  | ||||||
| 				// Description is the third element
 |  | ||||||
| 				// Default value is the fourth element
 |  | ||||||
| 
 |  | ||||||
| 				valueSlices := strings.Split(value, "|") |  | ||||||
| 				if len(valueSlices) > 0 { |  | ||||||
| 					format = valueSlices[0] |  | ||||||
| 				} |  | ||||||
| 				if len(valueSlices) > 1 { |  | ||||||
| 					installLocked = valueSlices[1] == "true" |  | ||||||
| 				} |  | ||||||
| 				if len(valueSlices) > 2 { |  | ||||||
| 					description = valueSlices[2] |  | ||||||
| 				} |  | ||||||
| 				if len(valueSlices) > 3 { |  | ||||||
| 					defaultValue = valueSlices[3] |  | ||||||
| 				} |  | ||||||
| 
 |  | ||||||
| 				// // If value contains ">|", then get everything that is to the right of it as the description
 |  | ||||||
| 				// // and get everything between "<>" as the format
 |  | ||||||
| 				// if strings.Contains(value, ">|") {
 |  | ||||||
| 				// 	description = strings.Split(value, ">|")[1]
 |  | ||||||
| 				// 	// Check if description has default value. That would be everything that is to the right of the last "|"
 |  | ||||||
| 				// 	if strings.Contains(description, "|") {
 |  | ||||||
| 				// 		defaultValue = strings.Split(description, "|")[1]
 |  | ||||||
| 				// 		description = strings.Split(description, "|")[0]
 |  | ||||||
| 				// 	}
 |  | ||||||
| 
 |  | ||||||
| 				// 	value = strings.Split(value, ">|")[0]
 |  | ||||||
| 				// 	// Remove the initial < from value
 |  | ||||||
| 				// 	value = strings.TrimPrefix(value, "<")
 |  | ||||||
| 				// } else {
 |  | ||||||
| 				// 	// Trim initial < and final > from value
 |  | ||||||
| 				// 	value = strings.TrimPrefix(value, "<")
 |  | ||||||
| 				// 	value = strings.TrimSuffix(value, ">")
 |  | ||||||
| 				// }
 |  | ||||||
| 
 |  | ||||||
| 				isSecret := false |  | ||||||
| 
 |  | ||||||
| 				// Check if the lowercased key string contains the letters "pass", "secret", "key"
 |  | ||||||
| 				lowercaseKey := strings.ToLower(key) |  | ||||||
| 				// check if lowercaseInput contains "pass", "key", or "secret", or "token"
 |  | ||||||
| 				if strings.Contains(lowercaseKey, "pass") || |  | ||||||
| 					strings.Contains(lowercaseKey, "key") || |  | ||||||
| 					strings.Contains(lowercaseKey, "secret") || |  | ||||||
| 					strings.Contains(lowercaseKey, "token") { |  | ||||||
| 					isSecret = true |  | ||||||
| 				} |  | ||||||
| 
 |  | ||||||
| 				currentOption := EdgeAppOption{ |  | ||||||
| 					Key:             key, |  | ||||||
| 					Value:           optionFilledValue, |  | ||||||
| 					DefaultValue:    defaultValue, |  | ||||||
| 					Description:     description, |  | ||||||
| 					Format:          format, |  | ||||||
| 					IsSecret:        isSecret, |  | ||||||
| 					IsInstallLocked: installLocked, |  | ||||||
| 				} |  | ||||||
| 				edgeAppOptions = append(edgeAppOptions, currentOption) |  | ||||||
| 
 |  | ||||||
| 				if optionFilledValue == "" { |  | ||||||
| 					needsConfig = true |  | ||||||
| 				} |  | ||||||
| 
 |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 		edgeAppInternetAccessible := false | 		edgeAppInternetAccessible := false | ||||||
| 		edgeAppInternetURL := "" | 		edgeAppInternetURL := "" | ||||||
| 
 | 
 | ||||||
|  | @ -211,21 +90,6 @@ func GetEdgeApp(ID string) MaybeEdgeApp { | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		edgeAppBasicAuthEnabled := false |  | ||||||
| 		edgeAppBasicAuthUsername := "" |  | ||||||
| 		edgeAppBasicAuthPassword := "" |  | ||||||
| 
 |  | ||||||
| 		edgeAppAuthEnv, err := godotenv.Read(utils.GetPath(utils.EdgeAppsPath) + ID + authEnvFilename) |  | ||||||
| 		if err != nil { |  | ||||||
| 			log.Println("No auth.env file found. Login status is disabled.") |  | ||||||
| 		} else { |  | ||||||
| 			if edgeAppAuthEnv["USERNAME"] != "" && edgeAppAuthEnv["PASSWORD"] != "" { |  | ||||||
| 				edgeAppBasicAuthEnabled = true |  | ||||||
| 				edgeAppBasicAuthUsername = edgeAppAuthEnv["USERNAME"] |  | ||||||
| 				edgeAppBasicAuthPassword = edgeAppAuthEnv["PASSWORD"] |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		result = MaybeEdgeApp{ | 		result = MaybeEdgeApp{ | ||||||
| 			EdgeApp: EdgeApp{ | 			EdgeApp: EdgeApp{ | ||||||
| 				ID:                 ID, | 				ID:                 ID, | ||||||
|  | @ -234,12 +98,8 @@ func GetEdgeApp(ID string) MaybeEdgeApp { | ||||||
| 				Status:             GetEdgeAppStatus(ID), | 				Status:             GetEdgeAppStatus(ID), | ||||||
| 				Services:           GetEdgeAppServices(ID), | 				Services:           GetEdgeAppServices(ID), | ||||||
| 				InternetAccessible: edgeAppInternetAccessible, | 				InternetAccessible: edgeAppInternetAccessible, | ||||||
| 				NetworkURL:         ID + "." + system.GetHostname() + ".local", | 				NetworkURL:         ID + system.GetHostname() + ".local", | ||||||
| 				InternetURL:        edgeAppInternetURL, | 				InternetURL:        edgeAppInternetURL, | ||||||
| 				Options: 		    edgeAppOptions, |  | ||||||
| 				NeedsConfig:        needsConfig, |  | ||||||
| 				Login:				EdgeAppLogin{edgeAppBasicAuthEnabled, edgeAppBasicAuthUsername, edgeAppBasicAuthPassword}, |  | ||||||
| 				 |  | ||||||
| 			}, | 			}, | ||||||
| 			Valid: true, | 			Valid: true, | ||||||
| 		} | 		} | ||||||
|  | @ -294,40 +154,11 @@ func SetEdgeAppInstalled(ID string) bool { | ||||||
| 
 | 
 | ||||||
| func SetEdgeAppNotInstalled(ID string) bool { | func SetEdgeAppNotInstalled(ID string) bool { | ||||||
| 
 | 
 | ||||||
| 	// Stop the app first
 |  | ||||||
| 	StopEdgeApp(ID) |  | ||||||
| 
 |  | ||||||
| 	// Now remove any files
 |  | ||||||
| 	result := true | 	result := true | ||||||
| 	 |  | ||||||
| 	err := os.Remove(utils.GetPath(utils.EdgeAppsPath) + ID + runnableFilename) | 	err := os.Remove(utils.GetPath(utils.EdgeAppsPath) + ID + runnableFilename) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		result = false | 		result = false | ||||||
| 		log.Println(err) | 		log.Fatal(err) | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	err = os.Remove(utils.GetPath(utils.EdgeAppsPath) + ID + authEnvFilename) |  | ||||||
| 	if err != nil { |  | ||||||
| 		result = false |  | ||||||
| 		log.Println(err) |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	err = os.RemoveAll(utils.GetPath(utils.EdgeAppsPath) + ID + appdataFoldername) |  | ||||||
| 	if err != nil { |  | ||||||
| 		result = false |  | ||||||
| 		log.Println(err) |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	err = os.Remove(utils.GetPath(utils.EdgeAppsPath) + ID + myEdgeAppServiceEnvFilename) |  | ||||||
| 	if err != nil { |  | ||||||
| 		result = false |  | ||||||
| 		log.Println(err) |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	err = os.Remove(utils.GetPath(utils.EdgeAppsPath) + ID + optionsEnvFilename) |  | ||||||
| 	if err != nil { |  | ||||||
| 		result = false |  | ||||||
| 		log.Println(err) |  | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	buildFrameworkContainers() | 	buildFrameworkContainers() | ||||||
|  |  | ||||||
|  | @ -92,22 +92,6 @@ func SetupCloudOptions() { | ||||||
| 		utils.WriteOption("EMAIL", cloudEnv["EMAIL"]) | 		utils.WriteOption("EMAIL", cloudEnv["EMAIL"]) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if cloudEnv["USERNAME"] != "" { |  | ||||||
| 		utils.WriteOption("USERNAME", cloudEnv["USERNAME"]) |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	if cloudEnv["CLUSTER"] != "" { |  | ||||||
| 		utils.WriteOption("CLUSTER", cloudEnv["CLUSTER"]) |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	if cloudEnv["CLUSTER_IP"] != "" { |  | ||||||
| 		utils.WriteOption("CLUSTER_IP", cloudEnv["CLUSTER_IP"]) |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	if cloudEnv["CLUSTER_SSH_PORT"] != "" { |  | ||||||
| 		utils.WriteOption("CLUSTER_SSH_PORT", cloudEnv["CLUSTER_SSH_PORT"]) |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	if cloudEnv["EDGEBOXIO_API_TOKEN"] != "" { | 	if cloudEnv["EDGEBOXIO_API_TOKEN"] != "" { | ||||||
| 		utils.WriteOption("EDGEBOXIO_API_TOKEN", cloudEnv["EDGEBOXIO_API_TOKEN"]) | 		utils.WriteOption("EDGEBOXIO_API_TOKEN", cloudEnv["EDGEBOXIO_API_TOKEN"]) | ||||||
| 	} | 	} | ||||||
|  | @ -116,37 +100,6 @@ func SetupCloudOptions() { | ||||||
| 	utils.Exec("/", "rm", []string{cloudEnvFileLocationPath}) | 	utils.Exec("/", "rm", []string{cloudEnvFileLocationPath}) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func StartSystemLogger() { |  | ||||||
| 	fmt.Println("Starting system logger") |  | ||||||
| 	loggerPath := utils.GetPath(utils.LoggerPath) |  | ||||||
| 	utils.Exec(loggerPath, "make", []string{"start"}) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // UpdateSystemLoggerServices: Updates the services.txt file with the services that are currently running
 |  | ||||||
| func UpdateSystemLoggerServices(services []string) { |  | ||||||
| 	fmt.Println("Updating system logger services:") |  | ||||||
| 	fmt.Println(services) |  | ||||||
| 	loggerPath := utils.GetPath(utils.LoggerPath) |  | ||||||
| 
 |  | ||||||
| 	utils.Exec(loggerPath, "bash", []string{"-c", "rm services.txt && touch services.txt"}) |  | ||||||
| 
 |  | ||||||
| 	for _, service := range services { |  | ||||||
| 		fmt.Println("Adding " + service + " to services.txt") |  | ||||||
| 		utils.Exec(loggerPath, "bash", []string{"-c", "echo " + service + " >> services.txt"}) |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	// Add empty line at the end of file (best practice)
 |  | ||||||
| 	utils.Exec(loggerPath, "bash", []string{"-c", "echo '' >> services.txt"}) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // StartWs: Starts the webserver service for Edgeapps
 |  | ||||||
| func StartWs() { |  | ||||||
| 	wsPath := utils.GetPath(utils.WsPath) |  | ||||||
| 	fmt.Println("Starting WS") |  | ||||||
| 	cmdargs := []string{"-b"} |  | ||||||
| 	utils.Exec(wsPath, "./ws", cmdargs) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // StartService: Starts a service
 | // StartService: Starts a service
 | ||||||
| func StartService(serviceID string) { | func StartService(serviceID string) { | ||||||
| 	wsPath := utils.GetPath(utils.WsPath) | 	wsPath := utils.GetPath(utils.WsPath) | ||||||
|  |  | ||||||
|  | @ -33,17 +33,6 @@ type Task struct { | ||||||
| 	Updated string         `json:"updated"` | 	Updated string         `json:"updated"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // TaskOption: Struct for Task Options (kv pair)
 |  | ||||||
| type TaskOption struct { |  | ||||||
| 	Key   string `json:"key"` |  | ||||||
| 	Value string `json:"value"` |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| type TaskBasicAuth struct { |  | ||||||
| 	Username string `json:"username"` |  | ||||||
| 	Password string `json:"password"` |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| type taskSetupTunnelArgs struct { | type taskSetupTunnelArgs struct { | ||||||
| 	DomainName string `json:"domain_name"` | 	DomainName string `json:"domain_name"` | ||||||
| } | } | ||||||
|  | @ -64,21 +53,6 @@ type taskStopEdgeAppArgs struct { | ||||||
| 	ID string `json:"id"` | 	ID string `json:"id"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| type taskSetEdgeAppOptionsArgs struct { |  | ||||||
| 	ID string `json:"id"` |  | ||||||
| 	// Options should be an array of "key":"value" pairs
 |  | ||||||
| 	Options []TaskOption `json:"options"` |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| type taskSetEdgeAppBasicAuthArgs struct { |  | ||||||
| 	ID string `json:"id"` |  | ||||||
| 	Login TaskBasicAuth `json:"login"` |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| type taskRemoveEdgeAppBasicAuthArgs struct { |  | ||||||
| 	ID string `json:"id"` |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| type taskEnableOnlineArgs struct { | type taskEnableOnlineArgs struct { | ||||||
| 	ID          string `json:"id"` | 	ID          string `json:"id"` | ||||||
| 	InternetURL string `json:"internet_url"` | 	InternetURL string `json:"internet_url"` | ||||||
|  | @ -288,43 +262,6 @@ func ExecuteTask(task Task) Task { | ||||||
| 				task.Result = sql.NullString{String: taskResult, Valid: true} | 				task.Result = sql.NullString{String: taskResult, Valid: true} | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| 		case "set_edgeapp_options": |  | ||||||
| 
 |  | ||||||
| 			log.Println("Setting EdgeApp Options...") |  | ||||||
| 			var args taskSetEdgeAppOptionsArgs |  | ||||||
| 			// {"id":"podgrab","options":{"PODGRAB_PASSWORD":"fumarmata"}}
 |  | ||||||
| 			err := json.Unmarshal([]byte(task.Args.String), &args) |  | ||||||
| 			if err != nil { |  | ||||||
| 				log.Printf("Error reading arguments of set_edgeapp_options task: %s", err) |  | ||||||
| 			} else { |  | ||||||
| 				taskResult := taskSetEdgeAppOptions(args) |  | ||||||
| 				task.Result = sql.NullString{String: taskResult, Valid: true} |  | ||||||
| 			} |  | ||||||
| 
 |  | ||||||
| 		case "set_edgeapp_basic_auth": |  | ||||||
| 
 |  | ||||||
| 			log.Println("Settig EdgeApp Basic Authentication...") |  | ||||||
| 			var args taskSetEdgeAppBasicAuthArgs |  | ||||||
| 			err := json.Unmarshal([]byte(task.Args.String), &args) |  | ||||||
| 			if err != nil { |  | ||||||
| 				log.Printf("Error reading arguments of set_edgeapp_basic_auth task: %s", err) |  | ||||||
| 			} else { |  | ||||||
| 				taskResult := taskSetEdgeAppBasicAuth(args) |  | ||||||
| 				task.Result = sql.NullString{String: taskResult, Valid: true} |  | ||||||
| 			} |  | ||||||
| 
 |  | ||||||
| 		case "remove_edgeapp_basic_auth": |  | ||||||
| 
 |  | ||||||
| 			log.Println("Removing EdgeApp Basic Authentication...") |  | ||||||
| 			var args taskRemoveEdgeAppBasicAuthArgs |  | ||||||
| 			err := json.Unmarshal([]byte(task.Args.String), &args) |  | ||||||
| 			if err != nil { |  | ||||||
| 				log.Printf("Error reading arguments of remove_edgeapp_basic_auth task: %s", err) |  | ||||||
| 			} else { |  | ||||||
| 				taskResult := taskRemoveEdgeAppBasicAuth(args) |  | ||||||
| 				task.Result = sql.NullString{String: taskResult, Valid: true} |  | ||||||
| 			} |  | ||||||
| 
 |  | ||||||
| 		case "enable_online": | 		case "enable_online": | ||||||
| 
 | 
 | ||||||
| 			log.Println("Enabling online access to EdgeApp...") | 			log.Println("Enabling online access to EdgeApp...") | ||||||
|  | @ -437,9 +374,8 @@ func ExecuteSchedules(tick int) { | ||||||
| 		log.Println("Uptime is " + uptime + " seconds (" + system.GetUptimeFormatted() + ")") | 		log.Println("Uptime is " + uptime + " seconds (" + system.GetUptimeFormatted() + ")") | ||||||
| 
 | 
 | ||||||
| 		log.Println(taskGetStorageDevices()) | 		log.Println(taskGetStorageDevices()) | ||||||
| 		taskStartWs() |  | ||||||
| 		log.Println(taskGetEdgeApps()) | 		log.Println(taskGetEdgeApps()) | ||||||
| 		taskUpdateSystemLoggerServices() | 
 | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if tick%5 == 0 { | 	if tick%5 == 0 { | ||||||
|  | @ -451,7 +387,6 @@ func ExecuteSchedules(tick int) { | ||||||
| 	if tick%30 == 0 { | 	if tick%30 == 0 { | ||||||
| 		// Executing every 30 ticks
 | 		// Executing every 30 ticks
 | ||||||
| 		log.Println(taskGetEdgeApps()) | 		log.Println(taskGetEdgeApps()) | ||||||
| 		taskUpdateSystemLoggerServices() |  | ||||||
| 		// RESET SOME VARIABLES HERE IF NEEDED, SINCE SYSTEM IS UNBLOCKED
 | 		// RESET SOME VARIABLES HERE IF NEEDED, SINCE SYSTEM IS UNBLOCKED
 | ||||||
| 		utils.WriteOption("BACKUP_IS_WORKING", "0") | 		utils.WriteOption("BACKUP_IS_WORKING", "0") | ||||||
| 
 | 
 | ||||||
|  | @ -488,12 +423,6 @@ func ExecuteSchedules(tick int) { | ||||||
| 		// Executing every 3600 ticks (1 hour)
 | 		// Executing every 3600 ticks (1 hour)
 | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if tick%86400 == 0 { |  | ||||||
| 		// Executing every 86400 ticks (+/1 day)
 |  | ||||||
| 		// Ensuring we run a normal build, setting up avahi domain names fresh in the network
 |  | ||||||
| 		taskStartWs() |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	// Just add a schedule here if you need a custom one (every "tick hour", every "tick day", etc...)
 | 	// Just add a schedule here if you need a custom one (every "tick hour", every "tick day", etc...)
 | ||||||
| 
 | 
 | ||||||
| } | } | ||||||
|  | @ -973,128 +902,6 @@ func taskStopEdgeApp(args taskStopEdgeAppArgs) string { | ||||||
| 	return string(resultJSON) | 	return string(resultJSON) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func taskSetEdgeAppOptions(args taskSetEdgeAppOptionsArgs) string { |  | ||||||
| 	// Id is the edgeapp id
 |  | ||||||
| 	appID := args.ID |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 	// Open the file to write the options,
 |  | ||||||
| 	// it is an env file in /home/system/components/apps/<app_id>/edgeapp.env
 |  | ||||||
| 
 |  | ||||||
| 	// Get the path to the edgeapp.env file
 |  | ||||||
| 	edgeappEnvPath := "/home/system/components/apps/" + appID + "/edgeapp.env" |  | ||||||
| 
 |  | ||||||
| 	// If the file does not exist, create it
 |  | ||||||
| 	if _, err := os.Stat(edgeappEnvPath); os.IsNotExist(err) { |  | ||||||
| 		// Create the file
 |  | ||||||
| 		_, err := os.Create(edgeappEnvPath) |  | ||||||
| 		if err != nil { |  | ||||||
| 			log.Printf("Error creating edgeapp.env file: %s", err) |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	// It is an env file, so we can use go-dotenv to write the options
 |  | ||||||
| 	// Open the file
 |  | ||||||
| 	edgeappEnvFile, err := os.OpenFile(edgeappEnvPath, os.O_WRONLY, 0600) |  | ||||||
| 	if err != nil { |  | ||||||
| 		log.Printf("Error opening edgeapp.env file: %s", err) |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	// Write the options to the file
 |  | ||||||
| 	for _, value := range args.Options { |  | ||||||
| 		// Write the option to the file
 |  | ||||||
| 		_, err := edgeappEnvFile.WriteString(value.Key + "=" + value.Value + "\n") |  | ||||||
| 		if err != nil { |  | ||||||
| 			log.Printf("Error writing option to edgeapp.env file: %s", err) |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	 |  | ||||||
| 	// Close the file
 |  | ||||||
| 	err = edgeappEnvFile.Close() |  | ||||||
| 	if err != nil { |  | ||||||
| 		log.Printf("Error closing edgeapp.env file: %s", err) |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	result := edgeapps.GetEdgeAppStatus(appID) |  | ||||||
| 	resultJSON, _ := json.Marshal(result) |  | ||||||
| 
 |  | ||||||
| 	system.StartWs() |  | ||||||
| 	taskGetEdgeApps() // This task will imediatelly update the entry in the api database.
 |  | ||||||
| 
 |  | ||||||
| 	return string(resultJSON) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func taskSetEdgeAppBasicAuth(args taskSetEdgeAppBasicAuthArgs) string { |  | ||||||
| 	// Id is the edgeapp id
 |  | ||||||
| 	appID := args.ID |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 	// Open the file to write the options,
 |  | ||||||
| 	// it is an env file in /home/system/components/apps/<app_id>/auth.env
 |  | ||||||
| 
 |  | ||||||
| 	// Get the path to the auth.env file
 |  | ||||||
| 	edgeappAuthEnvPath := "/home/system/components/apps/" + appID + "/auth.env" |  | ||||||
| 
 |  | ||||||
| 	// If the file does not exist, create it
 |  | ||||||
| 	if _, err := os.Stat(edgeappAuthEnvPath); os.IsNotExist(err) { |  | ||||||
| 		// Create the file
 |  | ||||||
| 		_, err := os.Create(edgeappAuthEnvPath) |  | ||||||
| 		if err != nil { |  | ||||||
| 			log.Printf("Error creating auth.env file: %s", err) |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	// It is an env file, so we can use go-dotenv to write the options
 |  | ||||||
| 	// Open the file
 |  | ||||||
| 	edgeappAuthEnvFile, err := os.OpenFile(edgeappAuthEnvPath, os.O_WRONLY, 0600) |  | ||||||
| 	if err != nil { |  | ||||||
| 		log.Printf("Error opening auth.env file: %s", err) |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	// Write the login values to the file
 |  | ||||||
| 	_, err = edgeappAuthEnvFile.WriteString("USERNAME=" + args.Login.Username + "\n" + "PASSWORD=" + args.Login.Password + "\n") |  | ||||||
| 	if err != nil { |  | ||||||
| 		log.Printf("Error writing credentials to auth.env file: %s", err) |  | ||||||
| 	} |  | ||||||
| 	 |  | ||||||
| 	// Close the file
 |  | ||||||
| 	err = edgeappAuthEnvFile.Close() |  | ||||||
| 	if err != nil { |  | ||||||
| 		log.Printf("Error closing auth.env file: %s", err) |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	result := edgeapps.GetEdgeAppStatus(appID) |  | ||||||
| 	resultJSON, _ := json.Marshal(result) |  | ||||||
| 
 |  | ||||||
| 	system.StartWs() |  | ||||||
| 	taskGetEdgeApps() // This task will imediatelly update the entry in the api database.
 |  | ||||||
| 
 |  | ||||||
| 	return string(resultJSON) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func taskRemoveEdgeAppBasicAuth(args taskRemoveEdgeAppBasicAuthArgs) string { |  | ||||||
| 	// Id is the edgeapp id
 |  | ||||||
| 	appID := args.ID |  | ||||||
| 
 |  | ||||||
| 	// Get the path to the auth.env file
 |  | ||||||
| 	edgeappAuthEnvFile := "/auth.env" |  | ||||||
| 
 |  | ||||||
| 	fmt.Println("Removing auth.env file" + edgeappAuthEnvFile) |  | ||||||
| 
 |  | ||||||
| 	err := os.Remove(utils.GetPath(utils.EdgeAppsPath) + args.ID + edgeappAuthEnvFile) |  | ||||||
| 	if err != nil { |  | ||||||
| 		log.Fatal(err) |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	result := edgeapps.GetEdgeAppStatus(appID) |  | ||||||
| 	resultJSON, _ := json.Marshal(result) |  | ||||||
| 
 |  | ||||||
| 	system.StartWs() |  | ||||||
| 	taskGetEdgeApps() // This task will imediatelly update the entry in the api database.
 |  | ||||||
| 
 |  | ||||||
| 	return string(resultJSON) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func taskEnableOnline(args taskEnableOnlineArgs) string { | func taskEnableOnline(args taskEnableOnlineArgs) string { | ||||||
| 	fmt.Println("Executing taskEnableOnline for " + args.ID) | 	fmt.Println("Executing taskEnableOnline for " + args.ID) | ||||||
| 
 | 
 | ||||||
|  | @ -1147,35 +954,6 @@ func taskSetReleaseVersion() string { | ||||||
| 	return diagnostics.Version | 	return diagnostics.Version | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func taskUpdateSystemLoggerServices() string { |  | ||||||
| 	fmt.Println("Executing taskUpdateSystemLoggerServices") |  | ||||||
| 	// The input is an array of strings
 |  | ||||||
| 	// Each string is a service name to be logged
 |  | ||||||
| 	var input []string |  | ||||||
| 
 |  | ||||||
| 	// Get the services
 |  | ||||||
| 	edgeAppsList := utils.ReadOption("EDGEAPPS_LIST") |  | ||||||
| 	var edgeApps []edgeapps.EdgeApp |  | ||||||
| 	err := json.Unmarshal([]byte(edgeAppsList), &edgeApps) |  | ||||||
| 	if err != nil { |  | ||||||
| 		log.Fatalf("failed to unmarshal EDGEAPPS_LIST: %v", err) |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	for _, edgeApp := range edgeApps { |  | ||||||
| 		for _, service := range edgeApp.Services { |  | ||||||
| 			input = append(input, service.ID) |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	input = append(input, "edgeboxctl") |  | ||||||
| 	input = append(input, "tunnel") |  | ||||||
| 	 |  | ||||||
| 	// Run the system logger
 |  | ||||||
| 	system.UpdateSystemLoggerServices(input) |  | ||||||
| 
 |  | ||||||
| 	return "{\"status\": \"ok\"}" |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func taskGetEdgeApps() string { | func taskGetEdgeApps() string { | ||||||
| 	fmt.Println("Executing taskGetEdgeApps") | 	fmt.Println("Executing taskGetEdgeApps") | ||||||
| 
 | 
 | ||||||
|  | @ -1222,8 +1000,3 @@ func taskSetupCloudOptions() { | ||||||
| 	fmt.Println("Executing taskSetupCloudOptions") | 	fmt.Println("Executing taskSetupCloudOptions") | ||||||
| 	system.SetupCloudOptions() | 	system.SetupCloudOptions() | ||||||
| } | } | ||||||
| 
 |  | ||||||
| func taskStartWs() { |  | ||||||
| 	fmt.Println("Executing taskStartWs") |  | ||||||
| 	system.StartWs() |  | ||||||
| } |  | ||||||
|  |  | ||||||
|  | @ -111,8 +111,6 @@ const ApiPath string = "apiPath" | ||||||
| const EdgeAppsPath string = "edgeAppsPath" | const EdgeAppsPath string = "edgeAppsPath" | ||||||
| const EdgeAppsBackupPath string = "edgeAppsBackupPath" | const EdgeAppsBackupPath string = "edgeAppsBackupPath" | ||||||
| const WsPath string = "wsPath" | const WsPath string = "wsPath" | ||||||
| const LoggerPath string = "loggerPath" |  | ||||||
| 
 |  | ||||||
| 
 | 
 | ||||||
| // GetPath : Returns either the hardcoded path, or a overwritten value via .env file at project root. Register paths here for seamless working code between dev and prod environments ;)
 | // GetPath : Returns either the hardcoded path, or a overwritten value via .env file at project root. Register paths here for seamless working code between dev and prod environments ;)
 | ||||||
| func GetPath(pathKey string) string { | func GetPath(pathKey string) string { | ||||||
|  | @ -132,7 +130,7 @@ func GetPath(pathKey string) string { | ||||||
| 		if env["CLOUD_ENV_FILE_LOCATION"] != "" { | 		if env["CLOUD_ENV_FILE_LOCATION"] != "" { | ||||||
| 			targetPath = env["CLOUD_ENV_FILE_LOCATION"] | 			targetPath = env["CLOUD_ENV_FILE_LOCATION"] | ||||||
| 		} else { | 		} else { | ||||||
| 			targetPath = "/home/system/components/api/cloud.env" | 			targetPath = "/home/system/components/edgeboxctl/cloud.env" | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 	case ApiEnvFileLocation: | 	case ApiEnvFileLocation: | ||||||
|  | @ -174,13 +172,6 @@ func GetPath(pathKey string) string { | ||||||
| 			targetPath = "/home/system/components/ws/" | 			targetPath = "/home/system/components/ws/" | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 	case LoggerPath: |  | ||||||
| 		if env["LOGGER_PATH"] != "" { |  | ||||||
| 			targetPath = env["LOGGER_PATH"] |  | ||||||
| 		} else { |  | ||||||
| 			targetPath = "/home/system/components/logger/" |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 	case BackupPasswordFileLocation: | 	case BackupPasswordFileLocation: | ||||||
| 
 | 
 | ||||||
| 		if env["BACKUP_PASSWORD_FILE_LOCATION"] != "" { | 		if env["BACKUP_PASSWORD_FILE_LOCATION"] != "" { | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue