mirror of
https://github.com/fosrl/olm.git
synced 2026-02-08 05:56:41 +00:00
Try to fix log rotation and service args
This commit is contained in:
15
main.go
15
main.go
@@ -145,16 +145,27 @@ func main() {
|
|||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
|
case "config":
|
||||||
|
if runtime.GOOS == "windows" {
|
||||||
|
showServiceConfig()
|
||||||
|
} else {
|
||||||
|
fmt.Println("Service configuration is only available on Windows")
|
||||||
|
}
|
||||||
|
return
|
||||||
case "help", "--help", "-h":
|
case "help", "--help", "-h":
|
||||||
fmt.Println("Olm WireGuard VPN Client")
|
fmt.Println("Olm WireGuard VPN Client")
|
||||||
fmt.Println("\nWindows Service Management:")
|
fmt.Println("\nWindows Service Management:")
|
||||||
fmt.Println(" install Install the service")
|
fmt.Println(" install Install the service")
|
||||||
fmt.Println(" remove Remove the service")
|
fmt.Println(" remove Remove the service")
|
||||||
fmt.Println(" start Start the service")
|
fmt.Println(" start [args] Start the service with optional arguments")
|
||||||
fmt.Println(" stop Stop the service")
|
fmt.Println(" stop Stop the service")
|
||||||
fmt.Println(" status Show service status")
|
fmt.Println(" status Show service status")
|
||||||
fmt.Println(" debug Run service in debug mode")
|
fmt.Println(" debug [args] Run service in debug mode with optional arguments")
|
||||||
fmt.Println(" logs Tail the service log file")
|
fmt.Println(" logs Tail the service log file")
|
||||||
|
fmt.Println(" config Show current service configuration")
|
||||||
|
fmt.Println("\nExamples:")
|
||||||
|
fmt.Println(" olm start --enable-http --http-addr :9452")
|
||||||
|
fmt.Println(" olm debug --endpoint https://example.com --id myid --secret mysecret")
|
||||||
fmt.Println("\nFor console mode, run without arguments or with standard flags.")
|
fmt.Println("\nFor console mode, run without arguments or with standard flags.")
|
||||||
return
|
return
|
||||||
default:
|
default:
|
||||||
|
|||||||
@@ -48,3 +48,7 @@ func setupWindowsEventLog() {
|
|||||||
func watchLogFile(end bool) error {
|
func watchLogFile(end bool) error {
|
||||||
return fmt.Errorf("watching log file is only available on Windows")
|
return fmt.Errorf("watching log file is only available on Windows")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func showServiceConfig() {
|
||||||
|
fmt.Println("Service configuration is only available on Windows")
|
||||||
|
}
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ import (
|
|||||||
"os"
|
"os"
|
||||||
"os/signal"
|
"os/signal"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
"strings"
|
||||||
"syscall"
|
"syscall"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
@@ -95,7 +96,7 @@ func (s *olmService) Execute(args []string, r <-chan svc.ChangeRequest, changes
|
|||||||
const cmdsAccepted = svc.AcceptStop | svc.AcceptShutdown
|
const cmdsAccepted = svc.AcceptStop | svc.AcceptShutdown
|
||||||
changes <- svc.Status{State: svc.StartPending}
|
changes <- svc.Status{State: svc.StartPending}
|
||||||
|
|
||||||
s.elog.Info(1, "Service Execute called, starting main logic")
|
s.elog.Info(1, fmt.Sprintf("Service Execute called with args: %v", args))
|
||||||
|
|
||||||
// Load saved service arguments
|
// Load saved service arguments
|
||||||
savedArgs, err := loadServiceArgs()
|
savedArgs, err := loadServiceArgs()
|
||||||
@@ -104,7 +105,24 @@ func (s *olmService) Execute(args []string, r <-chan svc.ChangeRequest, changes
|
|||||||
// Continue with empty args if loading fails
|
// Continue with empty args if loading fails
|
||||||
savedArgs = []string{}
|
savedArgs = []string{}
|
||||||
}
|
}
|
||||||
s.args = savedArgs
|
|
||||||
|
// Combine service start args with saved args, giving priority to service start args
|
||||||
|
finalArgs := []string{}
|
||||||
|
if len(args) > 0 {
|
||||||
|
// Skip the first arg which is typically the service name
|
||||||
|
if len(args) > 1 {
|
||||||
|
finalArgs = append(finalArgs, args[1:]...)
|
||||||
|
}
|
||||||
|
s.elog.Info(1, fmt.Sprintf("Using service start parameters: %v", finalArgs))
|
||||||
|
}
|
||||||
|
|
||||||
|
// If no service start parameters, use saved args
|
||||||
|
if len(finalArgs) == 0 && len(savedArgs) > 0 {
|
||||||
|
finalArgs = savedArgs
|
||||||
|
s.elog.Info(1, fmt.Sprintf("Using saved service args: %v", finalArgs))
|
||||||
|
}
|
||||||
|
|
||||||
|
s.args = finalArgs
|
||||||
|
|
||||||
// Start the main olm functionality
|
// Start the main olm functionality
|
||||||
olmDone := make(chan struct{})
|
olmDone := make(chan struct{})
|
||||||
@@ -309,7 +327,7 @@ func removeService() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func startService(args []string) error {
|
func startService(args []string) error {
|
||||||
// Save the service arguments before starting
|
// Save the service arguments as backup
|
||||||
if len(args) > 0 {
|
if len(args) > 0 {
|
||||||
err := saveServiceArgs(args)
|
err := saveServiceArgs(args)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -329,7 +347,8 @@ func startService(args []string) error {
|
|||||||
}
|
}
|
||||||
defer s.Close()
|
defer s.Close()
|
||||||
|
|
||||||
err = s.Start()
|
// Pass arguments directly to the service start call
|
||||||
|
err = s.Start(args...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("failed to start service: %v", err)
|
return fmt.Errorf("failed to start service: %v", err)
|
||||||
}
|
}
|
||||||
@@ -379,17 +398,12 @@ func debugService(args []string) error {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// fmt.Printf("Starting service in debug mode...\n")
|
// Start the service with the provided arguments
|
||||||
|
err := startService(args)
|
||||||
// Start the service
|
|
||||||
err := startService([]string{}) // Pass empty args since we already saved them
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("failed to start service: %v", err)
|
return fmt.Errorf("failed to start service: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// fmt.Printf("Service started. Watching logs (Press Ctrl+C to stop watching)...\n")
|
|
||||||
// fmt.Printf("================================================================================\n")
|
|
||||||
|
|
||||||
// Watch the log file
|
// Watch the log file
|
||||||
return watchLogFile(true)
|
return watchLogFile(true)
|
||||||
}
|
}
|
||||||
@@ -509,11 +523,89 @@ func getServiceStatus() (string, error) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// showServiceConfig displays current saved service configuration
|
||||||
|
func showServiceConfig() {
|
||||||
|
configPath := getServiceArgsPath()
|
||||||
|
fmt.Printf("Service configuration file: %s\n", configPath)
|
||||||
|
|
||||||
|
args, err := loadServiceArgs()
|
||||||
|
if err != nil {
|
||||||
|
fmt.Printf("No saved configuration found or error loading: %v\n", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(args) == 0 {
|
||||||
|
fmt.Println("No saved service arguments found")
|
||||||
|
} else {
|
||||||
|
fmt.Printf("Saved service arguments: %v\n", args)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func isWindowsService() bool {
|
func isWindowsService() bool {
|
||||||
isWindowsService, err := svc.IsWindowsService()
|
isWindowsService, err := svc.IsWindowsService()
|
||||||
return err == nil && isWindowsService
|
return err == nil && isWindowsService
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// rotateLogFile handles daily log rotation
|
||||||
|
func rotateLogFile(logDir string, logFile string) error {
|
||||||
|
// Get current log file info
|
||||||
|
info, err := os.Stat(logFile)
|
||||||
|
if err != nil {
|
||||||
|
if os.IsNotExist(err) {
|
||||||
|
return nil // No current log file to rotate
|
||||||
|
}
|
||||||
|
return fmt.Errorf("failed to stat log file: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if log file is from today
|
||||||
|
now := time.Now()
|
||||||
|
fileTime := info.ModTime()
|
||||||
|
|
||||||
|
// If the log file is from today, no rotation needed
|
||||||
|
if now.Year() == fileTime.Year() && now.YearDay() == fileTime.YearDay() {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create rotated filename with date
|
||||||
|
rotatedName := fmt.Sprintf("olm-%s.log", fileTime.Format("2006-01-02"))
|
||||||
|
rotatedPath := filepath.Join(logDir, rotatedName)
|
||||||
|
|
||||||
|
// Rename current log file to dated filename
|
||||||
|
err = os.Rename(logFile, rotatedPath)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to rotate log file: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Clean up old log files (keep last 30 days)
|
||||||
|
cleanupOldLogFiles(logDir, 30)
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// cleanupOldLogFiles removes log files older than specified days
|
||||||
|
func cleanupOldLogFiles(logDir string, daysToKeep int) {
|
||||||
|
cutoff := time.Now().AddDate(0, 0, -daysToKeep)
|
||||||
|
|
||||||
|
files, err := os.ReadDir(logDir)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, file := range files {
|
||||||
|
if !file.IsDir() && strings.HasPrefix(file.Name(), "olm-") && strings.HasSuffix(file.Name(), ".log") {
|
||||||
|
filePath := filepath.Join(logDir, file.Name())
|
||||||
|
info, err := file.Info()
|
||||||
|
if err != nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if info.ModTime().Before(cutoff) {
|
||||||
|
os.Remove(filePath)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func setupWindowsEventLog() {
|
func setupWindowsEventLog() {
|
||||||
// Create log directory if it doesn't exist
|
// Create log directory if it doesn't exist
|
||||||
logDir := filepath.Join(os.Getenv("PROGRAMDATA"), "olm", "logs")
|
logDir := filepath.Join(os.Getenv("PROGRAMDATA"), "olm", "logs")
|
||||||
@@ -524,6 +616,14 @@ func setupWindowsEventLog() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
logFile := filepath.Join(logDir, "olm.log")
|
logFile := filepath.Join(logDir, "olm.log")
|
||||||
|
|
||||||
|
// Rotate log file if needed
|
||||||
|
err = rotateLogFile(logDir, logFile)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Printf("Failed to rotate log file: %v\n", err)
|
||||||
|
// Continue anyway to create new log file
|
||||||
|
}
|
||||||
|
|
||||||
file, err := os.OpenFile(logFile, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
|
file, err := os.OpenFile(logFile, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Printf("Failed to open log file: %v\n", err)
|
fmt.Printf("Failed to open log file: %v\n", err)
|
||||||
|
|||||||
Reference in New Issue
Block a user