diff --git a/main.go b/main.go index 45e1303..e6bbc4b 100644 --- a/main.go +++ b/main.go @@ -53,7 +53,9 @@ func main() { fmt.Println("Service removed successfully") return case "start": - err := startService() + // Pass the remaining arguments (after "start") to the service + serviceArgs := os.Args[2:] + err := startService(serviceArgs) if err != nil { fmt.Printf("Failed to start service: %v\n", err) os.Exit(1) @@ -77,7 +79,9 @@ func main() { fmt.Printf("Service status: %s\n", status) return case "debug": - err := debugService() + // Pass the remaining arguments (after "debug") to the service + serviceArgs := os.Args[2:] + err := debugService(serviceArgs) if err != nil { fmt.Printf("Failed to debug service: %v\n", err) os.Exit(1) diff --git a/service_unix.go b/service_unix.go index c616f78..014458f 100644 --- a/service_unix.go +++ b/service_unix.go @@ -15,7 +15,8 @@ func removeService() error { return fmt.Errorf("service management is only available on Windows") } -func startService() error { +func startService(args []string) error { + _ = args // unused on Unix platforms return fmt.Errorf("service management is only available on Windows") } @@ -27,7 +28,8 @@ func getServiceStatus() (string, error) { return "", fmt.Errorf("service management is only available on Windows") } -func debugService() error { +func debugService(args []string) error { + _ = args // unused on Unix platforms return fmt.Errorf("debug service is only available on Windows") } diff --git a/service_windows.go b/service_windows.go index a0cffc7..8d16eb5 100644 --- a/service_windows.go +++ b/service_windows.go @@ -4,6 +4,7 @@ package main import ( "context" + "encoding/json" "fmt" "io" "log" @@ -29,6 +30,54 @@ const ( // Global variable to store service arguments var serviceArgs []string +// getServiceArgsPath returns the path where service arguments are stored +func getServiceArgsPath() string { + logDir := filepath.Join(os.Getenv("PROGRAMDATA"), "Olm") + return filepath.Join(logDir, "service_args.json") +} + +// saveServiceArgs saves the service arguments to a file +func saveServiceArgs(args []string) error { + logDir := filepath.Join(os.Getenv("PROGRAMDATA"), "Olm") + err := os.MkdirAll(logDir, 0755) + if err != nil { + return fmt.Errorf("failed to create config directory: %v", err) + } + + argsPath := getServiceArgsPath() + data, err := json.Marshal(args) + if err != nil { + return fmt.Errorf("failed to marshal service args: %v", err) + } + + err = os.WriteFile(argsPath, data, 0644) + if err != nil { + return fmt.Errorf("failed to write service args: %v", err) + } + + return nil +} + +// loadServiceArgs loads the service arguments from a file +func loadServiceArgs() ([]string, error) { + argsPath := getServiceArgsPath() + data, err := os.ReadFile(argsPath) + if err != nil { + if os.IsNotExist(err) { + return []string{}, nil // Return empty args if file doesn't exist + } + return nil, fmt.Errorf("failed to read service args: %v", err) + } + + var args []string + err = json.Unmarshal(data, &args) + if err != nil { + return nil, fmt.Errorf("failed to unmarshal service args: %v", err) + } + + return args, nil +} + type olmService struct { elog debug.Log ctx context.Context @@ -42,6 +91,15 @@ func (s *olmService) Execute(args []string, r <-chan svc.ChangeRequest, changes s.elog.Info(1, "Service Execute called, starting main logic") + // Load saved service arguments + savedArgs, err := loadServiceArgs() + if err != nil { + s.elog.Error(1, fmt.Sprintf("Failed to load service args: %v", err)) + // Continue with empty args if loading fails + savedArgs = []string{} + } + s.args = savedArgs + // Start the main olm functionality olmDone := make(chan struct{}) go func() { @@ -244,7 +302,15 @@ func removeService() error { return nil } -func startService() error { +func startService(args []string) error { + // Save the service arguments before starting + if len(args) > 0 { + err := saveServiceArgs(args) + if err != nil { + return fmt.Errorf("failed to save service args: %v", err) + } + } + m, err := mgr.Connect() if err != nil { return fmt.Errorf("failed to connect to service manager: %v", err) @@ -298,7 +364,15 @@ func stopService() error { return nil } -func debugService() error { +func debugService(args []string) error { + // Save the service arguments before starting + if len(args) > 0 { + err := saveServiceArgs(args) + if err != nil { + return fmt.Errorf("failed to save service args: %v", err) + } + } + // Get the log file path logDir := filepath.Join(os.Getenv("PROGRAMDATA"), "Olm", "logs") logFile := filepath.Join(logDir, "olm.log") @@ -307,7 +381,7 @@ func debugService() error { fmt.Printf("Log file: %s\n", logFile) // Start the service - err := startService() + err := startService([]string{}) // Pass empty args since we already saved them if err != nil { return fmt.Errorf("failed to start service: %v", err) }