edgeboxctl/cmd/sysctl/main.go

130 lines
2.8 KiB
Go
Raw Normal View History

package main
2020-11-08 23:48:45 +01:00
import (
"flag"
"fmt"
"log"
"os"
"os/signal"
"syscall"
"time"
2021-02-11 21:31:32 +01:00
"github.com/edgebox-iot/sysctl/internal/diagnostics"
2021-02-13 16:06:13 +01:00
"github.com/edgebox-iot/sysctl/internal/tasks"
"github.com/edgebox-iot/sysctl/internal/utils"
)
2021-02-13 21:49:09 +01:00
const defaultNotReadySleepTime time.Duration = time.Second * 60
const defaultSleepTime time.Duration = time.Second
func main() {
2020-11-08 23:48:45 +01:00
// load command line arguments
2021-02-11 21:31:32 +01:00
version := flag.Bool("version", false, "Get the version info")
2021-02-13 16:06:13 +01:00
db := flag.Bool("database", false, "Get database connection info")
name := flag.String("name", "edgebox", "Name for the service")
flag.Parse()
2021-02-11 21:31:32 +01:00
if *version {
printVersion()
os.Exit(0)
}
2021-02-11 21:31:32 +01:00
2021-02-13 16:06:13 +01:00
if *db {
printDbDetails()
os.Exit(0)
}
log.Printf("Starting Sysctl service for %s", *name)
// setup signal catching
sigs := make(chan os.Signal, 1)
// catch all signals since not explicitly listing
signal.Notify(sigs, syscall.SIGQUIT)
// Cathing specific signals can be done with:
//signal.Notify(sigs,syscall.SIGQUIT)
// method invoked upon seeing signal
go func() {
s := <-sigs
log.Printf("RECEIVED SIGNAL: %s", s)
2021-02-11 21:31:32 +01:00
appCleanup()
os.Exit(1)
}()
printVersion()
2021-02-13 16:06:13 +01:00
printDbDetails()
2021-02-13 16:06:13 +01:00
tick := 0
// infinite loop
for {
2021-02-19 00:08:28 +01:00
if isSystemReady() {
tick++ // Tick is an int, so eventually will "go out of ticks?" Maybe we want to reset the ticks every once in a while, to avoid working with big numbers...
systemIterator(name, tick)
} else {
// Wait about 60 seconds before trying again.
log.Printf("System not ready. Next try will be executed in 60 seconds")
time.Sleep(defaultNotReadySleepTime)
}
}
}
// AppCleanup : cleanup app state before exit
2021-02-11 21:31:32 +01:00
func appCleanup() {
log.Println("Cleaning up app status before exit")
}
2021-02-11 21:31:32 +01:00
func printVersion() {
2021-02-11 21:38:43 +01:00
fmt.Printf(
"\nversion: %s\ncommit: %s\nbuild time: %s\n",
2021-02-11 21:31:32 +01:00
diagnostics.Version, diagnostics.Commit, diagnostics.BuildDate,
)
}
func printDbDetails() {
fmt.Printf(
"\n\nDatabase Connection Information:\n %s\n\n",
utils.GetMySQLDbConnectionDetails(),
)
}
// IsSystemReady : Checks hability of the service to execute commands (Only after "edgebox --build" is ran at least once via SSH, or if built for distribution)
func isSystemReady() bool {
2021-02-13 21:52:08 +01:00
_, err := os.Stat("/home/system/components/ws/.ready")
return !os.IsNotExist(err)
}
// IsDatabaseReady : Checks is it can successfully connect to the task queue db
func isDatabaseReady() bool {
return false
}
func systemIterator(name *string, tick int) {
log.Printf("Tick is %d", tick)
2021-02-19 00:08:28 +01:00
tasks.ExecuteSchedules(tick)
nextTask := tasks.GetNextTask()
if nextTask.Task != "" {
log.Printf("Executing task %s / Args: %s", nextTask.Task, nextTask.Args)
tasks.ExecuteTask(nextTask)
} else {
2021-02-19 00:08:28 +01:00
log.Printf("No tasks to execute.")
}
2021-02-19 00:08:28 +01:00
// Wait about 1 second before resumming operations.
log.Printf("Next instruction will be executed 1 second")
time.Sleep(defaultSleepTime)
}