4 Commits
4 changed files with 86 additions and 13 deletions
+1 -1
View File
@@ -12,7 +12,7 @@ GO ?= $(shell type -a -P go | head -n 1)
VERSION ?= $(shell git describe --tags --dirty) VERSION ?= $(shell git describe --tags --dirty)
build: build:
mkdir build mkdir -p build
cd src/enit; $(GO) build -ldflags "-w -X main.version=$(VERSION)" -o ../../build/enit enit cd src/enit; $(GO) build -ldflags "-w -X main.version=$(VERSION)" -o ../../build/enit enit
cd src/esvm; $(GO) build -ldflags "-w -X main.version=$(VERSION)" -o ../../build/esvm esvm cd src/esvm; $(GO) build -ldflags "-w -X main.version=$(VERSION)" -o ../../build/esvm esvm
cd src/ectl; $(GO) build -ldflags "-w -X main.version=$(VERSION) -X main.sysconfdir=$(SYSCONFDIR) -X main.runstatedir=$(RUNSTATEDIR)" -o ../../build/ectl ectl cd src/ectl; $(GO) build -ldflags "-w -X main.version=$(VERSION) -X main.sysconfdir=$(SYSCONFDIR) -X main.runstatedir=$(RUNSTATEDIR)" -o ../../build/ectl ectl
+38 -8
View File
@@ -35,8 +35,12 @@ func handleServiceSubcommand() {
setupFlagsAndHelp(currentFlagSet, fmt.Sprintf("ectl %s %s <options> <service>", os.Args[1], subcommand), fmt.Sprintf("%s the specified service", strings.Title(subcommand)), os.Args[3:]) setupFlagsAndHelp(currentFlagSet, fmt.Sprintf("ectl %s %s <options> <service>", os.Args[1], subcommand), fmt.Sprintf("%s the specified service", strings.Title(subcommand)), os.Args[3:])
// Dial esvm socket // Dial esvm socket
dialSocket() err := dialSocket()
if err == nil {
defer conn.Close() defer conn.Close()
} else {
log.Fatalf("Error: %s", err)
}
startStopRestartService(subcommand) startStopRestartService(subcommand)
case "enable", "disable": case "enable", "disable":
@@ -53,8 +57,12 @@ func handleServiceSubcommand() {
setupFlagsAndHelp(currentFlagSet, fmt.Sprintf("ectl %s status <options> <service>", os.Args[1]), "Show service status", os.Args[3:]) setupFlagsAndHelp(currentFlagSet, fmt.Sprintf("ectl %s status <options> <service>", os.Args[1]), "Show service status", os.Args[3:])
// Dial esvm socket // Dial esvm socket
dialSocket() err := dialSocket()
if err == nil {
defer conn.Close() defer conn.Close()
} else {
log.Fatalf("Error: %s", err)
}
showServiceStatus() showServiceStatus()
case "list": case "list":
@@ -64,8 +72,12 @@ func handleServiceSubcommand() {
setupFlagsAndHelp(currentFlagSet, fmt.Sprintf("ectl %s reload <options>", os.Args[1]), "List all services", os.Args[3:]) setupFlagsAndHelp(currentFlagSet, fmt.Sprintf("ectl %s reload <options>", os.Args[1]), "List all services", os.Args[3:])
// Dial esvm socket // Dial esvm socket
dialSocket() err := dialSocket()
if err == nil {
defer conn.Close() defer conn.Close()
} else {
log.Fatalf("Error: %s", err)
}
listAllServices() listAllServices()
case "reload": case "reload":
@@ -75,8 +87,12 @@ func handleServiceSubcommand() {
setupFlagsAndHelp(currentFlagSet, fmt.Sprintf("ectl %s reload <options>", os.Args[1]), "Reload all services", os.Args[3:]) setupFlagsAndHelp(currentFlagSet, fmt.Sprintf("ectl %s reload <options>", os.Args[1]), "Reload all services", os.Args[3:])
// Dial esvm socket // Dial esvm socket
dialSocket() err := dialSocket()
if err == nil {
defer conn.Close() defer conn.Close()
} else {
log.Fatalf("Error: %s", err)
}
reloadAllServices() reloadAllServices()
default: default:
@@ -174,6 +190,18 @@ func enableDisableService(subcommand string) {
verb = "disabled" verb = "disabled"
} }
// Ensure service exists
if stage != 0 {
if !serviceExists(service) {
if printJson {
fmt.Printf("{\"error\":\"Service (%s) does not exist\"}\n", verb)
} else {
fmt.Printf("Service (%s) does not exist\n", verb)
}
os.Exit(1)
}
}
// Return if service is already enabled // Return if service is already enabled
if _, enabledStage := isServiceEnabled(service); enabledStage == stage { if _, enabledStage := isServiceEnabled(service); enabledStage == stage {
if printJson { if printJson {
@@ -444,20 +472,22 @@ func setupFlagsAndHelp(flagset *flag.FlagSet, usage, desc string, args []string)
flagset.Parse(args) flagset.Parse(args)
} }
func dialSocket() { func dialSocket() error {
if _, err := os.Stat(path.Join(runstatedir, "esvm/esvm.sock")); err != nil { if _, err := os.Stat(path.Join(runstatedir, "esvm/esvm.sock")); err != nil {
log.Fatalf("Could not find esvm.sock! Error: %s\n", err) return fmt.Errorf("could not find socket! Error: %s", err)
} }
var err error var err error
conn, err = net.Dial("unix", path.Join(runstatedir, "esvm/esvm.sock")) conn, err = net.Dial("unix", path.Join(runstatedir, "esvm/esvm.sock"))
if err != nil { if err != nil {
log.Fatalf("Failed to connect to esvm.sock! Error: %s\n", err) return fmt.Errorf("could not connect to socket! Error: %s", err)
} }
if err := conn.SetDeadline(time.Now().Add(30 * time.Second)); err != nil { if err := conn.SetDeadline(time.Now().Add(30 * time.Second)); err != nil {
log.Fatalf("Failed to set write deadline! Error: %s\n", err) return fmt.Errorf("failed to set socket deadline! Error: %s", err)
} }
return nil
} }
func readAllConn(conn net.Conn) ([]byte, error) { func readAllConn(conn net.Conn) ([]byte, error) {
+24
View File
@@ -9,6 +9,30 @@ import (
"gopkg.in/yaml.v3" "gopkg.in/yaml.v3"
) )
func serviceExists(service string) bool {
dirEntries, err := os.ReadDir(path.Join(sysconfdir, "esvm/services"))
if err != nil {
return false
}
for _, entry := range dirEntries {
var dataMap map[string]any
data, err := os.ReadFile(path.Join(sysconfdir, "esvm/services", entry.Name()))
err = yaml.Unmarshal(data, &dataMap)
if err != nil {
return false
}
if name, ok := dataMap["name"]; ok && name == service {
return true
}
}
return false
}
func isServiceEnabled(service string) (bool, int) { func isServiceEnabled(service string) (bool, int) {
for stage, services := range readEnabledServices() { for stage, services := range readEnabledServices() {
if slices.Contains(services, service) { if slices.Contains(services, service) {
+19
View File
@@ -51,6 +51,8 @@ func main() {
mountVirtualFilesystems() mountVirtualFilesystems()
// Mount filesystems in fstab // Mount filesystems in fstab
mountFilesystems() mountFilesystems()
// Run sysctl
initSysctl()
// Set hostname // Set hostname
setHostname() setHostname()
// Start service manager // Start service manager
@@ -220,6 +222,23 @@ func killProcesses() {
fmt.Println("Done.") fmt.Println("Done.")
} }
func initSysctl() {
// Return if sysctl cannot be found
if _, err := os.Stat("/sbin/sysctl"); err != nil {
return
}
fmt.Print("Running sysctl...")
err := exec.Command("/sbin/sysctl", "--system").Run()
if err != nil {
log.Println("Failed!")
return
}
fmt.Println("Done.")
}
func setHostname() { func setHostname() {
fmt.Print("Setting hostname... ") fmt.Print("Setting hostname... ")