Compare commits
	
		
			1 Commits 
		
	
	
		
			0ac5d9a677
			...
			d0460cea09
		
	
	| Author | SHA1 | Date | 
|---|---|---|
|  | d0460cea09 | 
|  | @ -13,7 +13,7 @@ jobs: | |||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|     - name: Set up Go | ||||
|       uses: actions/setup-go@v4 | ||||
|       uses: actions/setup-go@v3 | ||||
|       with: | ||||
|         go-version: ^1.15 | ||||
|     - name: Check out code | ||||
|  |  | |||
								
									
									
										
											10
										
									
									Makefile
									
									
									
									
								
								
							
							
										
											10
										
									
									Makefile
									
									
									
									
								|  | @ -21,10 +21,6 @@ build-arm64: | |||
| build-armhf: | ||||
| 	GOOS=linux GOARCH=arm RELEASE=prod make build | ||||
| 
 | ||||
| build-amd64: | ||||
| 	GOOS=linux GOARCH=amd64 RELEASE=prod make build | ||||
| 
 | ||||
| 
 | ||||
| build: | ||||
| 	@echo "Building ${GOOS}-${GOARCH}" | ||||
| 	GOOS=${GOOS} GOARCH=${GOARCH} go build \
 | ||||
|  | @ -45,10 +41,9 @@ test-with-coverage: | |||
| 	go test -tags=unit -timeout=600s -v ./... -coverprofile=coverage.out | ||||
| 
 | ||||
| install: | ||||
| 	sudo systemctl stop edgeboxctl || true | ||||
| 	sudo rm -rf /usr/local/bin/edgeboxctl /usr/local/sbin/edgeboctl /lib/systemd/system/edgeboxctl.service | ||||
| 	sudo systemctl stop edgeboxctl | ||||
| 	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/sbin/edgeboxctl | ||||
| 	sudo cp ./edgeboxctl.service /lib/systemd/system/edgeboxctl.service | ||||
| 	sudo systemctl daemon-reload | ||||
| 	@echo "Edgeboxctl installed successfully" | ||||
|  | @ -58,7 +53,6 @@ install-prod: build-prod install | |||
| install-cloud: build-cloud install | ||||
| install-arm64: build-arm64 install | ||||
| install-armhf: build-armhf install | ||||
| install-amd64: build-amd64 install | ||||
| 
 | ||||
| start: | ||||
| 	systemctl start edgeboxctl | ||||
|  |  | |||
|  | @ -23,9 +23,6 @@ type EdgeApp struct { | |||
| 	InternetAccessible bool             `json:"internet_accessible"` | ||||
| 	NetworkURL         string           `json:"network_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
 | ||||
|  | @ -46,29 +43,9 @@ type EdgeAppService struct { | |||
| 	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 envFilename = "/edgebox.env" | ||||
| const optionsTemplateFilename = "/edgeapp.template.env" | ||||
| const optionsEnvFilename = "/edgeapp.env" | ||||
| const authEnvFilename = "/auth.env" | ||||
| const runnableFilename = "/.run" | ||||
| const appdataFoldername = "/appdata" | ||||
| const myEdgeAppServiceEnvFilename = "/myedgeapp.env" | ||||
| const defaultContainerOperationSleepTime time.Duration = time.Second * 10 | ||||
| 
 | ||||
|  | @ -86,7 +63,6 @@ func GetEdgeApp(ID string) MaybeEdgeApp { | |||
| 
 | ||||
| 		edgeAppName := ID | ||||
| 		edgeAppDescription := "" | ||||
| 		edgeAppOptions := []EdgeAppOption{} | ||||
| 
 | ||||
| 		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 | ||||
| 		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{ | ||||
| 			EdgeApp: EdgeApp{ | ||||
| 				ID:                 ID, | ||||
|  | @ -234,12 +98,8 @@ func GetEdgeApp(ID string) MaybeEdgeApp { | |||
| 				Status:             GetEdgeAppStatus(ID), | ||||
| 				Services:           GetEdgeAppServices(ID), | ||||
| 				InternetAccessible: edgeAppInternetAccessible, | ||||
| 				NetworkURL:         ID + "." + system.GetHostname() + ".local", | ||||
| 				NetworkURL:         ID + system.GetHostname() + ".local", | ||||
| 				InternetURL:        edgeAppInternetURL, | ||||
| 				Options: 		    edgeAppOptions, | ||||
| 				NeedsConfig:        needsConfig, | ||||
| 				Login:				EdgeAppLogin{edgeAppBasicAuthEnabled, edgeAppBasicAuthUsername, edgeAppBasicAuthPassword}, | ||||
| 				 | ||||
| 			}, | ||||
| 			Valid: true, | ||||
| 		} | ||||
|  | @ -294,40 +154,11 @@ func SetEdgeAppInstalled(ID string) bool { | |||
| 
 | ||||
| func SetEdgeAppNotInstalled(ID string) bool { | ||||
| 
 | ||||
| 	// Stop the app first
 | ||||
| 	StopEdgeApp(ID) | ||||
| 
 | ||||
| 	// Now remove any files
 | ||||
| 	result := true | ||||
| 	 | ||||
| 	err := os.Remove(utils.GetPath(utils.EdgeAppsPath) + ID + runnableFilename) | ||||
| 	if err != nil { | ||||
| 		result = false | ||||
| 		log.Println(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) | ||||
| 		log.Fatal(err) | ||||
| 	} | ||||
| 
 | ||||
| 	buildFrameworkContainers() | ||||
|  |  | |||
|  | @ -92,22 +92,6 @@ func SetupCloudOptions() { | |||
| 		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"] != "" { | ||||
| 		utils.WriteOption("EDGEBOXIO_API_TOKEN", cloudEnv["EDGEBOXIO_API_TOKEN"]) | ||||
| 	} | ||||
|  | @ -116,37 +100,6 @@ func SetupCloudOptions() { | |||
| 	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
 | ||||
| func StartService(serviceID string) { | ||||
| 	wsPath := utils.GetPath(utils.WsPath) | ||||
|  |  | |||
|  | @ -33,17 +33,6 @@ type Task struct { | |||
| 	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 { | ||||
| 	DomainName string `json:"domain_name"` | ||||
| } | ||||
|  | @ -64,21 +53,6 @@ type taskStopEdgeAppArgs struct { | |||
| 	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 { | ||||
| 	ID          string `json:"id"` | ||||
| 	InternetURL string `json:"internet_url"` | ||||
|  | @ -288,43 +262,6 @@ func ExecuteTask(task Task) Task { | |||
| 				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": | ||||
| 
 | ||||
| 			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(taskGetStorageDevices()) | ||||
| 		taskStartWs() | ||||
| 		log.Println(taskGetEdgeApps()) | ||||
| 		taskUpdateSystemLoggerServices() | ||||
| 
 | ||||
| 	} | ||||
| 
 | ||||
| 	if tick%5 == 0 { | ||||
|  | @ -451,7 +387,6 @@ func ExecuteSchedules(tick int) { | |||
| 	if tick%30 == 0 { | ||||
| 		// Executing every 30 ticks
 | ||||
| 		log.Println(taskGetEdgeApps()) | ||||
| 		taskUpdateSystemLoggerServices() | ||||
| 		// RESET SOME VARIABLES HERE IF NEEDED, SINCE SYSTEM IS UNBLOCKED
 | ||||
| 		utils.WriteOption("BACKUP_IS_WORKING", "0") | ||||
| 
 | ||||
|  | @ -488,12 +423,6 @@ func ExecuteSchedules(tick int) { | |||
| 		// 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...)
 | ||||
| 
 | ||||
| } | ||||
|  | @ -973,128 +902,6 @@ func taskStopEdgeApp(args taskStopEdgeAppArgs) string { | |||
| 	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 { | ||||
| 	fmt.Println("Executing taskEnableOnline for " + args.ID) | ||||
| 
 | ||||
|  | @ -1147,35 +954,6 @@ func taskSetReleaseVersion() string { | |||
| 	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 { | ||||
| 	fmt.Println("Executing taskGetEdgeApps") | ||||
| 
 | ||||
|  | @ -1222,8 +1000,3 @@ func taskSetupCloudOptions() { | |||
| 	fmt.Println("Executing taskSetupCloudOptions") | ||||
| 	system.SetupCloudOptions() | ||||
| } | ||||
| 
 | ||||
| func taskStartWs() { | ||||
| 	fmt.Println("Executing taskStartWs") | ||||
| 	system.StartWs() | ||||
| } | ||||
|  |  | |||
|  | @ -111,8 +111,6 @@ const ApiPath string = "apiPath" | |||
| const EdgeAppsPath string = "edgeAppsPath" | ||||
| const EdgeAppsBackupPath string = "edgeAppsBackupPath" | ||||
| 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 ;)
 | ||||
| func GetPath(pathKey string) string { | ||||
|  | @ -132,7 +130,7 @@ func GetPath(pathKey string) string { | |||
| 		if env["CLOUD_ENV_FILE_LOCATION"] != "" { | ||||
| 			targetPath = env["CLOUD_ENV_FILE_LOCATION"] | ||||
| 		} else { | ||||
| 			targetPath = "/home/system/components/api/cloud.env" | ||||
| 			targetPath = "/home/system/components/edgeboxctl/cloud.env" | ||||
| 		} | ||||
| 
 | ||||
| 	case ApiEnvFileLocation: | ||||
|  | @ -174,13 +172,6 @@ func GetPath(pathKey string) string { | |||
| 			targetPath = "/home/system/components/ws/" | ||||
| 		} | ||||
| 
 | ||||
| 	case LoggerPath: | ||||
| 		if env["LOGGER_PATH"] != "" { | ||||
| 			targetPath = env["LOGGER_PATH"] | ||||
| 		} else { | ||||
| 			targetPath = "/home/system/components/logger/" | ||||
| 		} | ||||
| 
 | ||||
| 	case BackupPasswordFileLocation: | ||||
| 
 | ||||
| 		if env["BACKUP_PASSWORD_FILE_LOCATION"] != "" { | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue