refactor continues

This commit is contained in:
redanthrax 2022-06-21 16:12:14 -07:00
parent c038774f2c
commit 51f1eab127
30 changed files with 1373 additions and 474 deletions

View file

@ -2,9 +2,11 @@ package services
import (
"fmt"
"time"
"github.com/amidaware/rmmagent/agent/utils"
"github.com/gonutz/w32/v2"
"golang.org/x/sys/windows/svc"
"golang.org/x/sys/windows/svc/mgr"
)
@ -162,3 +164,136 @@ func serviceStartType(num uint32) string {
return "Unknown"
}
}
func ControlService(name, action string) WinSvcResp {
conn, err := mgr.Connect()
if err != nil {
return WinSvcResp{Success: false, ErrorMsg: err.Error()}
}
defer conn.Disconnect()
srv, err := conn.OpenService(name)
if err != nil {
return WinSvcResp{Success: false, ErrorMsg: err.Error()}
}
defer srv.Close()
var status svc.Status
switch action {
case "stop":
status, err = srv.Control(svc.Stop)
if err != nil {
return WinSvcResp{Success: false, ErrorMsg: err.Error()}
}
timeout := time.Now().Add(30 * time.Second)
for status.State != svc.Stopped {
if timeout.Before(time.Now()) {
return WinSvcResp{Success: false, ErrorMsg: "Timed out waiting for service to stop"}
}
time.Sleep(500 * time.Millisecond)
status, err = srv.Query()
if err != nil {
return WinSvcResp{Success: false, ErrorMsg: err.Error()}
}
}
return WinSvcResp{Success: true, ErrorMsg: ""}
case "start":
err := srv.Start()
if err != nil {
return WinSvcResp{Success: false, ErrorMsg: err.Error()}
}
return WinSvcResp{Success: true, ErrorMsg: ""}
}
return WinSvcResp{Success: false, ErrorMsg: "Something went wrong"}
}
func GetServiceDetail(name string) Service {
ret := Service{}
conn, err := mgr.Connect()
if err != nil {
return ret
}
defer conn.Disconnect()
srv, err := conn.OpenService(name)
if err != nil {
return ret
}
defer srv.Close()
q, err := srv.Query()
if err != nil {
return ret
}
conf, err := srv.Config()
if err != nil {
return ret
}
ret.BinPath = utils.CleanString(conf.BinaryPathName)
ret.Description = utils.CleanString(conf.Description)
ret.DisplayName = utils.CleanString(conf.DisplayName)
ret.Name = name
ret.PID = q.ProcessId
ret.StartType = serviceStartType(uint32(conf.StartType))
ret.Status = serviceStatusText(uint32(q.State))
ret.Username = utils.CleanString(conf.ServiceStartName)
ret.DelayedAutoStart = conf.DelayedAutoStart
return ret
}
func EditService(name, startupType string) WinSvcResp {
conn, err := mgr.Connect()
if err != nil {
return WinSvcResp{Success: false, ErrorMsg: err.Error()}
}
defer conn.Disconnect()
srv, err := conn.OpenService(name)
if err != nil {
return WinSvcResp{Success: false, ErrorMsg: err.Error()}
}
defer srv.Close()
conf, err := srv.Config()
if err != nil {
return WinSvcResp{Success: false, ErrorMsg: err.Error()}
}
var startType uint32
switch startupType {
case "auto":
startType = 2
case "autodelay":
startType = 2
case "manual":
startType = 3
case "disabled":
startType = 4
default:
return WinSvcResp{Success: false, ErrorMsg: "Unknown startup type provided"}
}
conf.StartType = startType
switch startupType {
case "autodelay":
conf.DelayedAutoStart = true
case "auto":
conf.DelayedAutoStart = false
}
err = srv.UpdateConfig(conf)
if err != nil {
return WinSvcResp{Success: false, ErrorMsg: err.Error()}
}
return WinSvcResp{Success: true, ErrorMsg: ""}
}

View file

@ -11,3 +11,8 @@ type Service struct {
StartType string `json:"start_type"`
DelayedAutoStart bool `json:"autodelay"`
}
type WinSvcResp struct {
Success bool `json:"success"`
ErrorMsg string `json:"errormsg"`
}