61 lines
1.5 KiB
Go
61 lines
1.5 KiB
Go
package service
|
|
|
|
import (
|
|
"acc-server-manager/local/utl/command"
|
|
"strings"
|
|
)
|
|
|
|
type ServiceManager struct {
|
|
executor *command.CommandExecutor
|
|
psExecutor *command.CommandExecutor
|
|
}
|
|
|
|
func NewServiceManager() *ServiceManager {
|
|
return &ServiceManager{
|
|
executor: &command.CommandExecutor{
|
|
ExePath: "nssm",
|
|
LogOutput: true,
|
|
},
|
|
psExecutor: &command.CommandExecutor{
|
|
ExePath: "powershell",
|
|
LogOutput: true,
|
|
},
|
|
}
|
|
}
|
|
|
|
func (s *ServiceManager) ManageService(serviceName, action string) (string, error) {
|
|
// Run NSSM command through PowerShell to ensure elevation
|
|
output, err := s.psExecutor.ExecuteWithOutput("-nologo", "-noprofile", ".\\nssm", action, serviceName)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
// Clean up output by removing null bytes and trimming whitespace
|
|
cleaned := strings.TrimSpace(strings.ReplaceAll(output, "\x00", ""))
|
|
// Remove \r\n from status strings
|
|
cleaned = strings.TrimSuffix(cleaned, "\r\n")
|
|
|
|
return cleaned, nil
|
|
}
|
|
|
|
func (s *ServiceManager) Status(serviceName string) (string, error) {
|
|
return s.ManageService(serviceName, "status")
|
|
}
|
|
|
|
func (s *ServiceManager) Start(serviceName string) (string, error) {
|
|
return s.ManageService(serviceName, "start")
|
|
}
|
|
|
|
func (s *ServiceManager) Stop(serviceName string) (string, error) {
|
|
return s.ManageService(serviceName, "stop")
|
|
}
|
|
|
|
func (s *ServiceManager) Restart(serviceName string) (string, error) {
|
|
// First stop the service
|
|
if _, err := s.Stop(serviceName); err != nil {
|
|
return "", err
|
|
}
|
|
|
|
// Then start it again
|
|
return s.Start(serviceName)
|
|
} |