agent/checkkdump/checkkdump_windows.go (72 lines of code) (raw):
package checkkdump
import (
"bytes"
"strconv"
"strings"
"github.com/aliyun/aliyun_assist_client/agent/log"
"github.com/aliyun/aliyun_assist_client/agent/metrics"
"github.com/aliyun/aliyun_assist_client/agent/taskengine/timermanager"
"github.com/aliyun/aliyun_assist_client/agent/util/process"
)
const (
// DefaultCheckIntervalSeconds is the default interval for report ecs-dump service status
defaultCheckIntervalSeconds = 3600 * 24
)
func CheckKdumpTimer() error {
timerManager := timermanager.GetTimerManager()
timer, err := timerManager.CreateTimerInSeconds(doCheck, defaultCheckIntervalSeconds)
if err != nil {
return err
}
_, err = timer.Run()
if err != nil {
return err
}
return nil
}
func doCheck() {
status, err := serviceStatus()
if err != nil {
log.GetLogger().Error("Get kdump service status err: ", err)
}
metrics.GetKdumpServiceStatusEvent(
"status", status,
).ReportEvent()
}
// 参考 http://gitlab.alibaba-inc.com/ecs-image/imgtools/blob/master/aliyun_plug/ecs_dump_config/windows/1.3/windump.ps1
func serviceStatus() (status string, err error) {
status = "OFF"
out := bytes.Buffer{}
processCmd := process.NewProcessCmd()
if _, _, err = processCmd.SyncRun("", "powershell", []string{"Test-Path \"HKLM:\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\SoftwareProtectionPlatform\""}, &out, &out, nil, nil, 10); err != nil {
return
}
rt := out.String()
rt = strings.Replace(rt, "\n", "", -1)
rt = strings.Replace(rt, "\r", "", -1)
if rt == "True" {
out = bytes.Buffer{}
processCmd = process.NewProcessCmd()
if _, _, err = processCmd.SyncRun("", "powershell", []string{"Get-ChildItem $env:c:\\ -Force | Where-Object { $_.Name -eq \"pagefile.sys\" }"}, &out, &out, nil, nil, 10); err != nil {
return
}
pageStatus := out.String()
pageStatus = strings.Replace(pageStatus, "\n", "", -1)
pageStatus = strings.Replace(pageStatus, "\r", "", -1)
out = bytes.Buffer{}
processCmd = process.NewProcessCmd()
if _, _, err = processCmd.SyncRun("", "powershell", []string{"(Get-ItemProperty \"HKLM:\\SYSTEM\\CurrentControlSet\\Control\\CrashControl\" -Name CrashDumpEnabled).CrashDumpEnabled"}, &out, &out, nil, nil, 10); err != nil {
return
}
levelStr := out.String()
levelStr = strings.Replace(levelStr, "\n", "", -1)
levelStr = strings.Replace(levelStr, "\r", "", -1)
var level int
level, err = strconv.Atoi(levelStr)
if err != nil {
return
}
if level > 0 && level <= 7 && pageStatus != "" {
status = "ON"
}
}
return
}