[WIP] Support for cloud version (#17)
* Added build-cloud to Makefile * Fix env var key GOOS * Added taskSetReleaseVersion for edgeboxctl version option write into DB * taskGetSystemUptime to run every 5 ticks * Added support for detecting main disk in cloud version * Added missing import * Finding main device in test * Refactored GetDevices and test to use release_version * Added utils.getIP function, set to run as a 60 tick scheduled task * Added taskEnablePublicDashboard and taskDisablePublicDashboard * Added utils.WriteOption and refactor, added enablePublicDashb0oard * Finalizing online support for dashboard, cloud version support * Added task SetupCloudOptions * Added couple of func description comments * Early return statement (thanks @inverse) * Using IsPublicDashboard in DisablePublicDashboard func * Added constants for release version and device types, added diagnostics.GetReleaseVersion * Removed codecov from test actionpull/19/merge
							parent
							
								
									864d1e8f0f
								
							
						
					
					
						commit
						83d2fdcae1
					
				|  | @ -22,7 +22,7 @@ jobs: | |||
|       run: make build | ||||
|     - name: Test | ||||
|       run: make test-with-coverage | ||||
|     - uses: codecov/codecov-action@v1 | ||||
|       with: | ||||
|         token: ${{ secrets.CODECOV_TOKEN }} | ||||
|         files: coverage.out | ||||
|     # - uses: codecov/codecov-action@v1 | ||||
|     #   with: | ||||
|     #     token: ${{ secrets.CODECOV_TOKEN }} | ||||
|     #     files: coverage.out | ||||
|  |  | |||
								
									
									
										
											3
										
									
									Makefile
									
									
									
									
								
								
							
							
										
											3
										
									
									Makefile
									
									
									
									
								|  | @ -12,6 +12,9 @@ build-all: | |||
| build-prod: | ||||
| 	GOOS=linux GOARCH=arm RELEASE=prod make build | ||||
| 
 | ||||
| build-cloud: | ||||
| 	GOOS=linux GOARCH=amd64 RELEASE=cloud make build | ||||
| 
 | ||||
| build: | ||||
| 	@echo "Building ${GOOS}-${GOARCH}" | ||||
| 	GOOS=${GOOS} GOARCH=${GOARCH} go build \
 | ||||
|  |  | |||
|  | @ -90,6 +90,7 @@ sudo apt-get install docker docker-compose | |||
| Check the following links for more info on [Docker](https://www.docker.com/) and [Docker Compose](https://docs.docker.com/compose/). | ||||
| 
 | ||||
| Aditionally, edgeboxctl needs the following bash commands available wherever it runs: | ||||
| * `arm-linux-gnueabi-gcc` (`sudo apt-get install gcc-arm*`) | ||||
| * `sh` | ||||
| * `rm` | ||||
| * `systemctl` | ||||
|  |  | |||
|  | @ -1,7 +1,18 @@ | |||
| package diagnostics | ||||
| 
 | ||||
| type ReleaseVersion string | ||||
| 
 | ||||
| var Version string | ||||
| 
 | ||||
| var Commit string | ||||
| 
 | ||||
| var BuildDate string | ||||
| 
 | ||||
| const ( | ||||
| 	DEV_VERSION   ReleaseVersion = "dev" | ||||
| 	PROD_VERSION  ReleaseVersion = "prod" | ||||
| 	CLOUD_VERSION ReleaseVersion = "cloud" | ||||
| 	OTHER_VERSION ReleaseVersion = "other" | ||||
| ) | ||||
| 
 | ||||
| func GetReleaseVersion() ReleaseVersion { | ||||
| 	return ReleaseVersion(Version) | ||||
| } | ||||
|  |  | |||
|  | @ -335,6 +335,37 @@ func DisableOnline(ID string) MaybeEdgeApp { | |||
| 
 | ||||
| } | ||||
| 
 | ||||
| func EnablePublicDashboard(InternetURL string) bool { | ||||
| 
 | ||||
| 	envFilePath := utils.GetPath("apiPath") + myEdgeAppServiceEnvFilename | ||||
| 	env, _ := godotenv.Unmarshal("INTERNET_URL=" + InternetURL) | ||||
| 	_ = godotenv.Write(env, envFilePath) | ||||
| 
 | ||||
| 	buildFrameworkContainers() | ||||
| 
 | ||||
| 	return true | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| func DisablePublicDashboard() bool { | ||||
| 	envFilePath := utils.GetPath("apiPath") + myEdgeAppServiceEnvFilename | ||||
| 	if !IsPublicDashboard() { | ||||
| 		log.Println("myedge.app environment file for the dashboard / api not found. No need to delete.") | ||||
| 		return false | ||||
| 	} | ||||
| 
 | ||||
| 	cmdArgs := []string{envFilePath} | ||||
| 	utils.Exec(utils.GetPath("apiPath"), "rm", cmdArgs) | ||||
| 	buildFrameworkContainers() | ||||
| 	return true | ||||
| } | ||||
| 
 | ||||
| func IsPublicDashboard() bool { | ||||
| 	envFilePath := utils.GetPath("apiPath") + myEdgeAppServiceEnvFilename | ||||
| 	_, err := godotenv.Read(envFilePath) | ||||
| 	return err == nil | ||||
| } | ||||
| 
 | ||||
| func buildFrameworkContainers() { | ||||
| 
 | ||||
| 	cmdArgs := []string{utils.GetPath("wsPath") + "ws", "--build"} | ||||
|  |  | |||
|  | @ -6,13 +6,14 @@ import ( | |||
| 	"path/filepath" | ||||
| 	"strings" | ||||
| 
 | ||||
| 	"github.com/edgebox-iot/edgeboxctl/internal/diagnostics" | ||||
| 	"github.com/edgebox-iot/edgeboxctl/internal/utils" | ||||
| 	"github.com/shirou/gopsutil/disk" | ||||
| ) | ||||
| 
 | ||||
| // Device : Struct representing a storage device in the system
 | ||||
| type Device struct { | ||||
| 	ID         string       `json:"id"` | ||||
| 	ID         DeviceIdentifier `json:"id"` | ||||
| 	Name       string           `json:"name"` | ||||
| 	Size       string           `json:"size"` | ||||
| 	InUse      bool             `json:"in_use"` | ||||
|  | @ -66,10 +67,27 @@ type Partition struct { | |||
| 	UsageStat  UsageStat `json:"usage_stat"` | ||||
| } | ||||
| 
 | ||||
| const mainDiskID = "mmcblk0" | ||||
| type DeviceIdentifier string | ||||
| 
 | ||||
| const ( | ||||
| 	DISK_TYPE_SDA   DeviceIdentifier = "sda" | ||||
| 	DISK_TYPE_MCBLK DeviceIdentifier = "mmcblk0" | ||||
| 	DISK_TYPE_VDA   DeviceIdentifier = "vda" | ||||
| ) | ||||
| 
 | ||||
| func GetDeviceIdentifier(release_version diagnostics.ReleaseVersion) DeviceIdentifier { | ||||
| 	switch release_version { | ||||
| 	case diagnostics.CLOUD_VERSION: | ||||
| 		return DISK_TYPE_VDA | ||||
| 	case diagnostics.PROD_VERSION: | ||||
| 		return DISK_TYPE_MCBLK | ||||
| 	} | ||||
| 
 | ||||
| 	return DISK_TYPE_SDA | ||||
| } | ||||
| 
 | ||||
| // GetDevices : Returns a list of all available sotrage devices in structs filled with information
 | ||||
| func GetDevices() []Device { | ||||
| func GetDevices(release_version diagnostics.ReleaseVersion) []Device { | ||||
| 
 | ||||
| 	var devices []Device | ||||
| 
 | ||||
|  | @ -82,6 +100,8 @@ func GetDevices() []Device { | |||
| 	firstDevice := true | ||||
| 	currentDeviceInUseFlag := false | ||||
| 
 | ||||
| 	mainDiskID := GetDeviceIdentifier(release_version) | ||||
| 
 | ||||
| 	for scanner.Scan() { | ||||
| 		// 1 Device is represented here. Extract words in order for filling a Device struct
 | ||||
| 		// Example deviceRawInfo: "mmcblk0 179:0 0 29.7G 0 disk"
 | ||||
|  | @ -122,7 +142,7 @@ func GetDevices() []Device { | |||
| 			mainDevice := false | ||||
| 
 | ||||
| 			device := Device{ | ||||
| 				ID:         deviceRawInfo[0], | ||||
| 				ID:         DeviceIdentifier(deviceRawInfo[0]), | ||||
| 				Name:       deviceRawInfo[0], | ||||
| 				Size:       deviceRawInfo[3], | ||||
| 				MainDevice: mainDevice, | ||||
|  |  | |||
|  | @ -7,25 +7,37 @@ import ( | |||
| ) | ||||
| 
 | ||||
| func TestGetDevices(t *testing.T) { | ||||
| 	result := GetDevices() | ||||
| 
 | ||||
| 	if len(result) == 0 { | ||||
| 	t.Log("Testing with release version dev") | ||||
| 	assertGetDevices(GetDevices("dev"), t) | ||||
| 	t.Log("Testing with release version prod") | ||||
| 	assertGetDevices(GetDevices("prod"), t) | ||||
| 	t.Log("Testing with release version cloud") | ||||
| 	assertGetDevices(GetDevices("cloud"), t) | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| func assertGetDevices(devices []Device, t *testing.T) { | ||||
| 
 | ||||
| 	if len(devices) == 0 { | ||||
| 		t.Log("Expecting at least 1 block device, 0 elements found in slice") | ||||
| 		t.Fail() | ||||
| 	} | ||||
| 
 | ||||
| 	foundDevice := false | ||||
| 
 | ||||
| 	t.Log("Looking for a mmcblk0 or sda device") | ||||
| 	for _, device := range result { | ||||
| 		if device.ID == "mmcblk0" || device.ID == "sda" { | ||||
| 	t.Log("Looking for a mmcblk0, sda or dva device") | ||||
| 	for _, device := range devices { | ||||
| 
 | ||||
| 		if device.ID == "mmcblk0" || device.ID == "sda" || device.ID == "vda" { | ||||
| 			t.Log("Found target device", device.ID) | ||||
| 			foundDevice = true | ||||
| 		} | ||||
| 
 | ||||
| 	} | ||||
| 
 | ||||
| 	if !foundDevice { | ||||
| 		t.Log("Expected to find device mmcblk0 but did not. Devices:", result) | ||||
| 		t.Log("Expected to find device mmcblk0, sda or dva but did not. Devices:", devices) | ||||
| 		t.Fail() | ||||
| 	} | ||||
| } | ||||
|  |  | |||
|  | @ -3,16 +3,23 @@ package system | |||
| import ( | ||||
| 	"fmt" | ||||
| 	"strconv" | ||||
| 	"strings" | ||||
| 
 | ||||
| 	"github.com/edgebox-iot/edgeboxctl/internal/utils" | ||||
| 
 | ||||
| 	"github.com/shirou/gopsutil/host" | ||||
| 	"github.com/joho/godotenv" | ||||
| 
 | ||||
| ) | ||||
| 
 | ||||
| // GetUptimeInSeconds: Returns a value (as string) of the total system uptime
 | ||||
| func GetUptimeInSeconds() string { | ||||
| 	uptime, _ := host.Uptime() | ||||
| 
 | ||||
| 	return strconv.FormatUint(uptime, 10) | ||||
| } | ||||
| 
 | ||||
| // GetUptimeFormatted: Returns a humanized version that can be useful for logging
 | ||||
| func GetUptimeFormatted() string { | ||||
| 	uptime, _ := host.Uptime() | ||||
| 
 | ||||
|  | @ -21,3 +28,61 @@ func GetUptimeFormatted() string { | |||
| 	minutes := ((uptime - (days * 60 * 60 * 24)) - (hours * 60 * 60)) / 60 | ||||
| 	return fmt.Sprintf("%d days, %d hours, %d minutes", days, hours, minutes) | ||||
| } | ||||
| 
 | ||||
| // GetIP: Returns the ip address of the instance 
 | ||||
| func GetIP() string { | ||||
| 	ip := "" | ||||
| 
 | ||||
| 	// Trying to find a valid IP (For direct connection, not tunneled)
 | ||||
| 	ethResult := utils.ExecAndGetLines("/", "ip", []string{"-o", "-4", "addr", "list", "eth0"}) | ||||
| 	for ethResult.Scan() { | ||||
| 		adapterRawInfo := strings.Fields(ethResult.Text()) | ||||
| 		if ip == "" { | ||||
| 			ip = strings.Split(adapterRawInfo[3], "/")[0] | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	// If no IP was found yet, try wlan0
 | ||||
| 	if ip == "" { | ||||
| 		wlanResult := utils.ExecAndGetLines("/", "ip", []string{"-o", "-4", "addr", "list", "wlan0"}) | ||||
| 		for wlanResult.Scan() { | ||||
| 			adapterRawInfo := strings.Fields(wlanResult.Text()) | ||||
| 			if ip == "" { | ||||
| 				ip = strings.Split(adapterRawInfo[3], "/")[0] | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	return ip | ||||
| } | ||||
| 
 | ||||
| func GetHostname() string { | ||||
| 	return utils.Exec("/", "hostname", []string{}) | ||||
| } | ||||
| 
 | ||||
| // SetupCloudOptions: Reads the designated env file looking for options to write into the options table. Meant to be used on initial setup. Deletes source env file after operation.
 | ||||
| func SetupCloudOptions() { | ||||
| 
 | ||||
| 	var cloudEnv map[string]string | ||||
| 	cloudEnv, err := godotenv.Read(utils.GetPath("cloudEnvFileLocation")) | ||||
| 
 | ||||
| 	if err != nil { | ||||
| 		fmt.Println("Error loading .env file for cloud version setup") | ||||
| 	} | ||||
| 
 | ||||
| 	if cloudEnv["NAME"] != "" { | ||||
| 		utils.WriteOption("NAME", cloudEnv["NAME"]) | ||||
| 	} | ||||
| 
 | ||||
| 	if cloudEnv["EMAIL"] != "" { | ||||
| 		utils.WriteOption("EMAIL", cloudEnv["EMAIL"]) | ||||
| 	} | ||||
| 
 | ||||
| 	if cloudEnv["EDGEBOXIO_API_TOKEN"] != "" { | ||||
| 		utils.WriteOption("EDGEBOXIO_API_TOKEN", cloudEnv["EDGEBOXIO_API_TOKEN"]) | ||||
| 	} | ||||
| 
 | ||||
| 	// In the end of this operation takes place, remove the env file as to not overwrite any options once they are set.
 | ||||
| 	utils.Exec("/", "rm", []string{utils.GetPath("cloudEnvFileLocation")}) | ||||
| 
 | ||||
| } | ||||
|  |  | |||
|  | @ -60,6 +60,10 @@ type taskDisableOnlineArgs struct { | |||
| 	ID string `json:"id"` | ||||
| } | ||||
| 
 | ||||
| type taskEnablePublicDashboardArgs struct { | ||||
| 	InternetURL string `json:"internet_url"` | ||||
| } | ||||
| 
 | ||||
| const STATUS_CREATED int = 0 | ||||
| const STATUS_EXECUTING int = 1 | ||||
| const STATUS_FINISHED int = 2 | ||||
|  | @ -122,10 +126,11 @@ func ExecuteTask(task Task) Task { | |||
| 		log.Fatal(err.Error()) | ||||
| 	} | ||||
| 
 | ||||
| 	if diagnostics.Version == "dev" { | ||||
| 	if diagnostics.GetReleaseVersion() == diagnostics.DEV_VERSION { | ||||
| 		log.Printf("Dev environemnt. Not executing tasks.") | ||||
| 	} else { | ||||
| 		log.Println("Task: " + task.Task) | ||||
| 		log.Println("Args: " + task.Args.String) | ||||
| 		switch task.Task { | ||||
| 		case "setup_tunnel": | ||||
| 
 | ||||
|  | @ -211,6 +216,24 @@ func ExecuteTask(task Task) Task { | |||
| 				task.Result = sql.NullString{String: taskResult, Valid: true} | ||||
| 			} | ||||
| 
 | ||||
| 		case "enable_public_dashboard": | ||||
| 
 | ||||
| 			log.Println("Enabling online access to Dashboard...") | ||||
| 			var args taskEnablePublicDashboardArgs | ||||
| 			err := json.Unmarshal([]byte(task.Args.String), &args) | ||||
| 			if err != nil { | ||||
| 				log.Printf("Error reading arguments of enable_public_dashboard task: %s", err) | ||||
| 			} else { | ||||
| 				taskResult := taskEnablePublicDashboard(args) | ||||
| 				task.Result = sql.NullString{String: taskResult, Valid: true} | ||||
| 			} | ||||
| 
 | ||||
| 		case "disable_public_dashboard": | ||||
| 
 | ||||
| 			log.Println("Disabling online access to Dashboard...") | ||||
| 			taskResult := taskDisablePublicDashboard() | ||||
| 			task.Result = sql.NullString{String: taskResult, Valid: true} | ||||
| 
 | ||||
| 		} | ||||
| 
 | ||||
| 	} | ||||
|  | @ -230,7 +253,6 @@ func ExecuteTask(task Task) Task { | |||
| 		if err != nil { | ||||
| 			log.Fatal(err.Error()) | ||||
| 		} | ||||
| 
 | ||||
| 	} else { | ||||
| 		_, err = statement.Exec(STATUS_ERROR, "Error", formatedDatetime, strconv.Itoa(task.ID)) // Execute SQL Statement with Error info
 | ||||
| 		if err != nil { | ||||
|  | @ -255,6 +277,26 @@ func ExecuteSchedules(tick int) { | |||
| 
 | ||||
| 	if tick == 1 { | ||||
| 
 | ||||
| 		ip := taskGetSystemIP() | ||||
| 		log.Println("System IP is: " + ip) | ||||
| 
 | ||||
| 		release := taskSetReleaseVersion() | ||||
| 		log.Println("Setting api option flag for Edgeboxctl (" + release + " version)") | ||||
| 
 | ||||
| 		hostname := taskGetHostname() | ||||
| 		log.Println("Hostname is " + hostname) | ||||
| 
 | ||||
| 		// if diagnostics.Version == "cloud" && !edgeapps.IsPublicDashboard() {
 | ||||
| 		// 	taskEnablePublicDashboard(taskEnablePublicDashboardArgs{
 | ||||
| 		// 		InternetURL: hostname + ".myedge.app",
 | ||||
| 		// 	})
 | ||||
| 		// }
 | ||||
| 
 | ||||
| 		if diagnostics.GetReleaseVersion() == diagnostics.CLOUD_VERSION { | ||||
| 			log.Println("Setting up cloud version options (name, email, api token)") | ||||
| 			taskSetupCloudOptions() | ||||
| 		} | ||||
| 
 | ||||
| 		// Executing on startup (first tick). Schedules run before tasks in the SystemIterator
 | ||||
| 		uptime := taskGetSystemUptime() | ||||
| 		log.Println("Uptime is " + uptime + " seconds (" + system.GetUptimeFormatted() + ")") | ||||
|  | @ -266,18 +308,18 @@ func ExecuteSchedules(tick int) { | |||
| 
 | ||||
| 	if tick%5 == 0 { | ||||
| 		// Executing every 5 ticks
 | ||||
| 		taskGetSystemUptime() | ||||
| 		log.Println(taskGetStorageDevices()) | ||||
| 	} | ||||
| 
 | ||||
| 	if tick%30 == 0 { | ||||
| 		// Executing every 30 ticks
 | ||||
| 		log.Println(taskGetEdgeApps()) | ||||
| 
 | ||||
| 	} | ||||
| 
 | ||||
| 	if tick%60 == 0 { | ||||
| 		// Every 60 ticks...
 | ||||
| 
 | ||||
| 		ip := taskGetSystemIP() | ||||
| 		log.Println("System IP is: " + ip) | ||||
| 	} | ||||
| 
 | ||||
| 	// Just add a schedule here if you need a custom one (every "tick hour", every "tick day", etc...)
 | ||||
|  | @ -285,7 +327,6 @@ func ExecuteSchedules(tick int) { | |||
| } | ||||
| 
 | ||||
| func taskSetupTunnel(args taskSetupTunnelArgs) string { | ||||
| 
 | ||||
| 	fmt.Println("Executing taskSetupTunnel") | ||||
| 
 | ||||
| 	cmdargs := []string{"gen", "--name", args.NodeName, "--token", args.BootnodeToken, args.BootnodeAddress + ":8655", "--prefix", args.AssignedAddress} | ||||
|  | @ -299,181 +340,145 @@ func taskSetupTunnel(args taskSetupTunnelArgs) string { | |||
| 
 | ||||
| 	output := "OK" // Better check / logging of command execution result.
 | ||||
| 	return output | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| func taskInstallEdgeApp(args taskInstallEdgeAppArgs) string { | ||||
| 
 | ||||
| 	fmt.Println("Executing taskInstallEdgeApp for " + args.ID) | ||||
| 
 | ||||
| 	result := edgeapps.SetEdgeAppInstalled(args.ID) | ||||
| 
 | ||||
| 	resultJSON, _ := json.Marshal(result) | ||||
| 
 | ||||
| 	taskGetEdgeApps() | ||||
| 
 | ||||
| 	return string(resultJSON) | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| func taskRemoveEdgeApp(args taskRemoveEdgeAppArgs) string { | ||||
| 
 | ||||
| 	fmt.Println("Executing taskRemoveEdgeApp for " + args.ID) | ||||
| 
 | ||||
| 	// Making sure the application is stopped before setting it as removed.
 | ||||
| 	edgeapps.StopEdgeApp(args.ID) | ||||
| 	result := edgeapps.SetEdgeAppNotInstalled(args.ID) | ||||
| 
 | ||||
| 	resultJSON, _ := json.Marshal(result) | ||||
| 
 | ||||
| 	taskGetEdgeApps() | ||||
| 
 | ||||
| 	return string(resultJSON) | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| func taskStartEdgeApp(args taskStartEdgeAppArgs) string { | ||||
| 
 | ||||
| 	fmt.Println("Executing taskStartEdgeApp for " + args.ID) | ||||
| 
 | ||||
| 	result := edgeapps.RunEdgeApp(args.ID) | ||||
| 
 | ||||
| 	resultJSON, _ := json.Marshal(result) | ||||
| 
 | ||||
| 	taskGetEdgeApps() // This task will imediatelly update the entry in the api database.
 | ||||
| 
 | ||||
| 	return string(resultJSON) | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| func taskStopEdgeApp(args taskStopEdgeAppArgs) string { | ||||
| 
 | ||||
| 	fmt.Println("Executing taskStopEdgeApp for " + args.ID) | ||||
| 
 | ||||
| 	result := edgeapps.StopEdgeApp(args.ID) | ||||
| 
 | ||||
| 	resultJSON, _ := json.Marshal(result) | ||||
| 
 | ||||
| 	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) | ||||
| 
 | ||||
| 	result := edgeapps.EnableOnline(args.ID, args.InternetURL) | ||||
| 
 | ||||
| 	resultJSON, _ := json.Marshal(result) | ||||
| 
 | ||||
| 	taskGetEdgeApps() | ||||
| 
 | ||||
| 	return string(resultJSON) | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| func taskDisableOnline(args taskDisableOnlineArgs) string { | ||||
| 
 | ||||
| 	fmt.Println("Executing taskDisableOnline for " + args.ID) | ||||
| 
 | ||||
| 	result := edgeapps.DisableOnline(args.ID) | ||||
| 
 | ||||
| 	resultJSON, _ := json.Marshal(result) | ||||
| 
 | ||||
| 	taskGetEdgeApps() | ||||
| 
 | ||||
| 	return string(resultJSON) | ||||
| } | ||||
| 
 | ||||
| func taskEnablePublicDashboard(args taskEnablePublicDashboardArgs) string { | ||||
| 	fmt.Println("Enabling taskEnablePublicDashboard") | ||||
| 	result := edgeapps.EnablePublicDashboard(args.InternetURL) | ||||
| 	if result { | ||||
| 
 | ||||
| 		utils.WriteOption("PUBLIC_DASHBOARD", args.InternetURL) | ||||
| 		return "{result: true}" | ||||
| 
 | ||||
| 	} | ||||
| 
 | ||||
| 	return "{result: false}" | ||||
| } | ||||
| 
 | ||||
| func taskDisablePublicDashboard() string { | ||||
| 	fmt.Println("Executing taskDisablePublicDashboard") | ||||
| 	result := edgeapps.DisablePublicDashboard() | ||||
| 	utils.WriteOption("PUBLIC_DASHBOARD", "") | ||||
| 	if result { | ||||
| 		return "{result: true}" | ||||
| 	} | ||||
| 	return "{result: false}" | ||||
| } | ||||
| 
 | ||||
| func taskSetReleaseVersion() string { | ||||
| 
 | ||||
| 	fmt.Println("Executing taskSetReleaseVersion") | ||||
| 
 | ||||
| 	utils.WriteOption("RELEASE_VERSION", diagnostics.Version) | ||||
| 
 | ||||
| 	return diagnostics.Version | ||||
| } | ||||
| 
 | ||||
| func taskGetEdgeApps() string { | ||||
| 
 | ||||
| 	fmt.Println("Executing taskGetEdgeApps") | ||||
| 
 | ||||
| 	edgeApps := edgeapps.GetEdgeApps() | ||||
| 	edgeAppsJSON, _ := json.Marshal(edgeApps) | ||||
| 
 | ||||
| 	db, err := sql.Open("sqlite3", utils.GetSQLiteDbConnectionDetails()) | ||||
| 
 | ||||
| 	if err != nil { | ||||
| 		log.Fatal(err.Error()) | ||||
| 	} | ||||
| 
 | ||||
| 	statement, err := db.Prepare("REPLACE into option (name, value, created, updated) VALUES (?, ?, ?, ?);") // Prepare SQL Statement
 | ||||
| 	if err != nil { | ||||
| 		log.Fatal(err.Error()) | ||||
| 	} | ||||
| 
 | ||||
| 	formatedDatetime := utils.GetSQLiteFormattedDateTime(time.Now()) | ||||
| 
 | ||||
| 	_, err = statement.Exec("EDGEAPPS_LIST", string(edgeAppsJSON), formatedDatetime, formatedDatetime) // Execute SQL Statement
 | ||||
| 	if err != nil { | ||||
| 		log.Fatal(err.Error()) | ||||
| 	} | ||||
| 
 | ||||
| 	db.Close() | ||||
| 
 | ||||
| 	utils.WriteOption("EDGEAPPS_LIST", string(edgeAppsJSON)) | ||||
| 	return string(edgeAppsJSON) | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| func taskGetSystemUptime() string { | ||||
| 	fmt.Println("Executing taskGetSystemUptime") | ||||
| 
 | ||||
| 	uptime := system.GetUptimeInSeconds() | ||||
| 
 | ||||
| 	db, err := sql.Open("sqlite3", utils.GetSQLiteDbConnectionDetails()) | ||||
| 
 | ||||
| 	if err != nil { | ||||
| 		log.Fatal(err.Error()) | ||||
| 	} | ||||
| 
 | ||||
| 	statement, err := db.Prepare("REPLACE into option (name, value, created, updated) VALUES (?, ?, ?, ?);") // Prepare SQL Statement
 | ||||
| 	if err != nil { | ||||
| 		log.Fatal(err.Error()) | ||||
| 	} | ||||
| 
 | ||||
| 	formatedDatetime := utils.GetSQLiteFormattedDateTime(time.Now()) | ||||
| 
 | ||||
| 	_, err = statement.Exec("SYSTEM_UPTIME", uptime, formatedDatetime, formatedDatetime) // Execute SQL Statement
 | ||||
| 	if err != nil { | ||||
| 		log.Fatal(err.Error()) | ||||
| 	} | ||||
| 
 | ||||
| 	db.Close() | ||||
| 
 | ||||
| 	utils.WriteOption("SYSTEM_UPTIME", uptime) | ||||
| 	return uptime | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| func taskGetStorageDevices() string { | ||||
| 	fmt.Println("Executing taskGetStorageDevices") | ||||
| 
 | ||||
| 	devices := storage.GetDevices() | ||||
| 	devices := storage.GetDevices(diagnostics.GetReleaseVersion()) | ||||
| 	devicesJSON, _ := json.Marshal(devices) | ||||
| 
 | ||||
| 	db, err := sql.Open("sqlite3", utils.GetSQLiteDbConnectionDetails()) | ||||
| 
 | ||||
| 	if err != nil { | ||||
| 		log.Fatal(err.Error()) | ||||
| 	} | ||||
| 
 | ||||
| 	statement, err := db.Prepare("REPLACE into option (name, value, created, updated) VALUES (?, ?, ?, ?);") // Prepare SQL Statement
 | ||||
| 	if err != nil { | ||||
| 		log.Fatal(err.Error()) | ||||
| 	} | ||||
| 
 | ||||
| 	formatedDatetime := utils.GetSQLiteFormattedDateTime(time.Now()) | ||||
| 
 | ||||
| 	_, err = statement.Exec("STORAGE_DEVICES_LIST", devicesJSON, formatedDatetime, formatedDatetime) // Execute SQL Statement
 | ||||
| 	if err != nil { | ||||
| 		log.Fatal(err.Error()) | ||||
| 	} | ||||
| 
 | ||||
| 	db.Close() | ||||
| 	utils.WriteOption("STORAGE_DEVICES_LIST", string(devicesJSON)) | ||||
| 
 | ||||
| 	return string(devicesJSON) | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| func taskGetSystemIP() string { | ||||
| 	fmt.Println("Executing taskGetStorageDevices") | ||||
| 	ip := system.GetIP() | ||||
| 	utils.WriteOption("IP_ADDRESS", ip) | ||||
| 	return ip | ||||
| } | ||||
| 
 | ||||
| func taskGetHostname() string { | ||||
| 	fmt.Println("Executing taskGetHostname") | ||||
| 	hostname := system.GetHostname() | ||||
| 	utils.WriteOption("HOSTNAME", hostname) | ||||
| 	return hostname | ||||
| } | ||||
| 
 | ||||
| func taskSetupCloudOptions() { | ||||
| 	fmt.Println("Executing taskSetupCloudOptions") | ||||
| 	system.SetupCloudOptions() | ||||
| } | ||||
|  |  | |||
|  | @ -3,6 +3,7 @@ package utils | |||
| import ( | ||||
| 	"bufio" | ||||
| 	"bytes" | ||||
| 	"database/sql" | ||||
| 	"fmt" | ||||
| 	"io" | ||||
| 	"log" | ||||
|  | @ -112,6 +113,14 @@ func GetPath(pathKey string) string { | |||
| 	} | ||||
| 
 | ||||
| 	switch pathKey { | ||||
| 	case "cloudEnvFileLocation": | ||||
| 
 | ||||
| 		if env["CLOUD_ENV_FILE_LOCATION"] != "" { | ||||
| 			targetPath = env["CLOUD_ENV_FILE_LOCATION"] | ||||
| 		} else { | ||||
| 			targetPath = "/home/system/components/edgeboxctl/cloud.env" | ||||
| 		} | ||||
| 
 | ||||
| 	case "apiEnvFileLocation": | ||||
| 
 | ||||
| 		if env["API_ENV_FILE_LOCATION"] != "" { | ||||
|  | @ -120,6 +129,14 @@ func GetPath(pathKey string) string { | |||
| 			targetPath = "/home/system/components/api/edgebox.env" | ||||
| 		} | ||||
| 
 | ||||
| 	case "apiPath": | ||||
| 
 | ||||
| 		if env["API_PATH"] != "" { | ||||
| 			targetPath = env["APT_PATH"] | ||||
| 		} else { | ||||
| 			targetPath = "/home/system/components/api/" | ||||
| 		} | ||||
| 
 | ||||
| 	case "edgeAppsPath": | ||||
| 
 | ||||
| 		if env["EDGEAPPS_PATH"] != "" { | ||||
|  | @ -145,3 +162,27 @@ func GetPath(pathKey string) string { | |||
| 	return targetPath | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| // WriteOption : Writes a key value pair option into the api shared database
 | ||||
| func WriteOption(optionKey string, optionValue string) { | ||||
| 
 | ||||
| 	db, err := sql.Open("sqlite3", GetSQLiteDbConnectionDetails()) | ||||
| 
 | ||||
| 	if err != nil { | ||||
| 		log.Fatal(err.Error()) | ||||
| 	} | ||||
| 
 | ||||
| 	statement, err := db.Prepare("REPLACE into option (name, value, created, updated) VALUES (?, ?, ?, ?);") // Prepare SQL Statement
 | ||||
| 	if err != nil { | ||||
| 		log.Fatal(err.Error()) | ||||
| 	} | ||||
| 
 | ||||
| 	formatedDatetime := GetSQLiteFormattedDateTime(time.Now()) | ||||
| 
 | ||||
| 	_, err = statement.Exec(optionKey, optionValue, formatedDatetime, formatedDatetime) // Execute SQL Statement
 | ||||
| 	if err != nil { | ||||
| 		log.Fatal(err.Error()) | ||||
| 	} | ||||
| 
 | ||||
| 	db.Close() | ||||
| } | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue