agent/checkkdump/checkkdump_linux.go (114 lines of code) (raw):
package checkkdump
import (
"bytes"
"fmt"
"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/osutil"
"github.com/aliyun/aliyun_assist_client/agent/util/process"
"github.com/aliyun/aliyun_assist_client/agent/util/systemdutil"
)
const (
// defaultCheckIntervalSeconds is the default interval for report ecs-dump service status
defaultCheckIntervalSeconds = 3600 * 24
)
const (
LINUX_SYSTEMD int = iota
LINUX_SYSV
)
// 参考 http://gitlab.alibaba-inc.com/ecs-image/imgtools/blob/master/aliyun_plug/ecs_dump_config/linux/1.5/kdump.sh
var distroMap map[string]string = map[string]string{
"Debian": "debian",
"Ubuntu": "ubuntu",
"SUSE Linux": "suse",
}
var serviceType int // linux服务管理系统的类型 systemd/sysv
var distribution string // linux发行版
var majorVer string // linux系统主版本号
var kdumpServiceName string // kdump服务名称
func CheckKdumpTimer() error {
if systemdutil.IsRunningSystemd() {
serviceType = LINUX_SYSTEMD
} else {
serviceType = LINUX_SYSV
}
// 确定 linux 发行版
platFormName, err := osutil.OriginPlatformName()
if err != nil {
log.GetLogger().Warn("Get platFormName err: ", err)
err = nil
}
for key, value := range distroMap {
if strings.Contains(platFormName, key) {
distribution = value
break
}
}
// 确定kdump的服务名称
kdumpServiceName = "kdump"
majorVer, _ = getLinuxOsMajorVer()
if distribution == "ubuntu" || distribution == "debian" {
kdumpServiceName = "kdump-tools"
} else if distribution == "suse" {
if majorVer == "11" {
kdumpServiceName = "boot.kdump"
}
}
// 创建定时器
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/linux/1.5/kdump.sh
func serviceStatus() (status string, err error) {
status = "OFF"
var out bytes.Buffer
var cmd string
// check kdump installed
// debian, ubuntu
if serviceType == LINUX_SYSTEMD {
// systemd
out = bytes.Buffer{}
cmd = fmt.Sprintf("systemctl is-enabled %s", kdumpServiceName)
processCmd := process.NewProcessCmd()
if _, _, err = processCmd.SyncRun("", "bash", []string{"-c", cmd}, &out, &out, nil, nil, 10); err != nil {
return
}
rt := out.String()
rt = strings.Replace(rt, "\n", "", -1)
if rt == "enabled" {
status = "ON"
}
} else {
// sysv
out = bytes.Buffer{}
cmd = fmt.Sprintf("chkconfig --list %s |grep -q on", kdumpServiceName)
processCmd := process.NewProcessCmd()
var exitCode int
if exitCode, _, err = processCmd.SyncRun("", "bash", []string{"-c", cmd}, &out, &out, nil, nil, 10); err != nil {
return
}
if exitCode == 0 {
status = "ON"
}
}
return
}
func getLinuxOsMajorVer() (majorVer string, err error) {
var out bytes.Buffer
processCmd := process.NewProcessCmd()
if _, _, err = processCmd.SyncRun("", "bash", []string{"-c", "lsb_release -r 2>/dev/null |awk '{print $NF}' |awk -F. '{print $1}'"}, &out, &out, nil, nil, 10); err != nil {
return
}
majorVer = out.String()
majorVer = strings.Replace(majorVer, "\n", "", -1)
return
}