|
|
package crontask
|
|
|
|
|
|
import (
|
|
|
"autogo/dbsql"
|
|
|
"autogo/models"
|
|
|
"autogo/monkey"
|
|
|
"fmt"
|
|
|
"os/exec"
|
|
|
"strings"
|
|
|
|
|
|
"github.com/robfig/cron/v3"
|
|
|
"github.com/spf13/cast"
|
|
|
)
|
|
|
|
|
|
func Run() {
|
|
|
crontab := cron.New(cron.WithSeconds())
|
|
|
crontab.AddFunc("0 */1 * * * ?", CheckAndroidDevices)
|
|
|
// crontab.AddFunc("0 */1 * * * ?", CheckIOSDevices)
|
|
|
crontab.AddFunc("*/15 * * * * ?", CheckMonkeyTasks)
|
|
|
crontab.Start()
|
|
|
fmt.Println("[Crontab] 定时任务启动")
|
|
|
}
|
|
|
|
|
|
func CheckAndroidDevices() {
|
|
|
// fmt.Println("[Crontab] 检查安卓设备")
|
|
|
command := `devices` // | grep product.marketname'
|
|
|
cmd := exec.Command("adb", command)
|
|
|
out, err := cmd.CombinedOutput()
|
|
|
if err != nil {
|
|
|
fmt.Println(err)
|
|
|
}
|
|
|
strs := strings.Split(string(out), "\n")
|
|
|
|
|
|
device := make(map[string]string)
|
|
|
|
|
|
for i, v := range strs {
|
|
|
if i == 0 || len(v) < 4 {
|
|
|
continue
|
|
|
}
|
|
|
_strs := strings.Split(v, "\t")
|
|
|
device[_strs[0]] = _strs[1]
|
|
|
}
|
|
|
|
|
|
db, err := dbsql.GetConn(dbsql.DSN)
|
|
|
if err != nil {
|
|
|
fmt.Println("[Crontab] 数据库连接失败")
|
|
|
return
|
|
|
}
|
|
|
defer dbsql.Close(db)
|
|
|
|
|
|
var list []models.Device
|
|
|
db.Model(models.Device{}).Where("platform = ? AND is_del = 0", "adr").Find(&list)
|
|
|
for _, v := range list {
|
|
|
if vv, ok := device[v.Udid]; ok {
|
|
|
// 数据表中的设备,adb有获取到
|
|
|
switch v.Status {
|
|
|
case "busy":
|
|
|
continue
|
|
|
case "unauthorized":
|
|
|
if strings.Contains(vv, "device") {
|
|
|
db.Model(models.Device{}).Where("udid = ?", v.Udid).Update("status", "online")
|
|
|
fmt.Println("设备", v.Udid, "已连接")
|
|
|
}
|
|
|
case "offline":
|
|
|
if strings.Contains(vv, "device") {
|
|
|
db.Model(models.Device{}).Where("udid = ?", v.Udid).Update("status", "online")
|
|
|
fmt.Println("设备", v.Udid, "已连接")
|
|
|
} else {
|
|
|
db.Model(models.Device{}).Where("udid = ?", v.Udid).Update("status", "unauthorized")
|
|
|
fmt.Println("设备", v.Udid, "已连接但未认证")
|
|
|
}
|
|
|
case "online":
|
|
|
// 保持亮屏
|
|
|
monkey.KeepAndroidDevice(v.Udid)
|
|
|
}
|
|
|
} else {
|
|
|
// 数据表中的设备,adb没有获取到,视为离线
|
|
|
if v.Status != "offline" {
|
|
|
db.Model(models.Device{}).Where("udid = ?", v.Udid).Update("status", "offline")
|
|
|
fmt.Println("设备", v.Udid, "已离线")
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
func checkTaskPids(pids []models.MonkeyPid) int {
|
|
|
if len(pids) == 0 {
|
|
|
return -1
|
|
|
}
|
|
|
var strs []string
|
|
|
for _, v := range pids {
|
|
|
strs = append(strs, cast.ToString(v.PId))
|
|
|
}
|
|
|
pids_str := strings.Join(strs, "|")
|
|
|
cmd_str := "ps -ef | grep -v -E 'bash|grep' | grep -E '" + pids_str + "'"
|
|
|
fmt.Println(cmd_str)
|
|
|
cmd := exec.Command("bash", "-c", cmd_str)
|
|
|
cmd.Run()
|
|
|
return cmd.ProcessState.ExitCode()
|
|
|
}
|