package monkey import ( "autogo/common" "autogo/dbsql" "autogo/models" "fmt" "os/exec" "strings" "time" log "github.com/sirupsen/logrus" "github.com/spf13/cast" ) // func runUninstallCmd(package_name string)error{ // cmd_content := "adb " + // } func RunAndroidMonkeyCmd(task models.MonkeyTask, udid string) { db, err := dbsql.GetConn(dbsql.DSN) if err != nil { return } defer dbsql.Close(db) db.Model(models.MonkeyTask{}).Where("id = ?", task.Id).Update("status", "INIT") // python main_adr.py -package music.hising.live.dev -launch_activity sing.lagufun.social.live.ui.activity.SplashActivity cmd_content := "cd /home/app/monkey && nohup python3 main_adr.py" + " -task_id " + cast.ToString(task.Id) if task.PackageURL != "" { pkg_path := "/home/tmp/pkg/" + cast.ToString(time.Now().Unix()) + ".apk" log.Debug("正在下载apk:", task.PackageURL) err := exec.Command("wget", task.PackageURL, "-O", pkg_path).Run() if err != nil { log.Error(err) } cmd_content += " -pkg_path " + pkg_path log.Debug("下载完毕,安装包路径", pkg_path) } cmd_content += " -package " + task.PackageName if task.LaunchActivity != "" { cmd_content += " -launch_activity " + task.LaunchActivity } cmd_content += " -run_time " + cast.ToString(task.RunTime) if udid != "" { cmd_content += " -device_udid " + udid } cmd_content += " >> /home/app/logs/task_output/task_" + cast.ToString(task.Id) + ".log 2>&1" db.Model(models.MonkeyTask{}).Where("id = ?", task.Id).Last(&task) if task.Status != "INIT" { common.PushCorntaskLog("任务状态异常,停止发起Monkey任务:" + task.Status) return } log.Debug("开始调用monkey服务,执行命令") log.Debug(cmd_content) cmd := exec.Command("bash", "-c", cmd_content) err = cmd.Run() if err != nil { log.Error(err) } } func GetAndroidDevices() map[string]string { udid_map := make(map[string]string) cmd := exec.Command("adb", "devices") out, err := cmd.CombinedOutput() if err != nil { fmt.Println(err) } list := strings.Split(string(out), "\n")[1:] for _, v := range list { if len(v) < 1 { continue } fmt.Println(v) name := strings.Split(strings.Trim(strings.Trim(v, "\r"), "\t"), "\t")[0] status := strings.Split(strings.Trim(strings.Trim(v, "\r"), "\t"), "\t")[1] udid_map[name] = status // devices = append(devices, getAndroidDeviceInfo(strings.Split(strings.Trim(strings.Trim(v, "\r"), "\t"), "\t")...)) } return udid_map } type DeviceInfo struct { Udid string `json:"string"` Status string `json:"status"` } func getAndroidDeviceInfo(args ...string) models.MonkeyDevice { var di models.MonkeyDevice di.Platform = "adr" di.Udid = args[0] if args[1] == "device" { di.Status = "online" } else { di.Status = args[1] } di.ProductName = getAndroidDeviceName(di.Udid) return di } func getAndroidDeviceName(udid string) string { command := `getprop` // | grep product.marketname' cmd := exec.Command("adb", "-s", udid, "shell", command) out, err := cmd.CombinedOutput() if err != nil { fmt.Println(err) return udid } strs := strings.Split(string(out), "\n") device_name := "" for _, v := range strs { if strings.Contains(v, "product.brand") { str := strings.Split(strings.Trim(v, "\r"), ": ")[1] device_name = str[1 : len(str)-1] break } } fmt.Println(device_name) return device_name } func KeepDevice(udid string) error { //adb shell input keyevent 3 cmd := exec.Command("adb", "-s", udid, "shell", "input", "keyevent", "4") err := cmd.Run() return err } func killPid(pid int) error { cmd := exec.Command("kill", "-9", cast.ToString(pid)) err := cmd.Run() return err } 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() }