package service import ( "fmt" "gitlab.wodcloud.com/smart-operation/so-operation-api/src/bean/entity" "gitlab.wodcloud.com/smart-operation/so-operation-api/src/bean/vo/request" "gitlab.wodcloud.com/smart-operation/so-operation-api/src/bean/vo/response" "gitlab.wodcloud.com/smart-operation/so-operation-api/src/common/client" "gitlab.wodcloud.com/smart-operation/so-operation-api/src/pkg/beagle/resp" "os" "os/exec" "time" ) type TaskManageSvc struct { User *entity.SystemUser } // AddTaskManage 新增任务 func (t *TaskManageSvc) AddTaskManage(req request.AddTaskManageReq) (err error) { db, err := client.GetDbClient() if err != nil { err = resp.DbConnectError.WithError(err) return } // 校验 任务名称 是否重复 //has, err := db.Table("task_manage").Where("is_delete = 0 AND task_name = ?", req.TaskName).Exist() //if has { // err = resp.DbDataCheckError.WithError(errors.New("任务名称重复")) // return //} //if err != nil { // err = resp.DbSelectError.WithError(err) // return //} taskManage := entity.TaskManage{ TaskName: req.TaskName, TaskDesc: req.TaskDesc, YamlDesc: req.YamlDesc, YamlUrl: req.YamlUrl, HostGroupId: req.HostGroupId, CreateUser: "", CreateTime: time.Now(), UpdateUser: "", UpdateTime: time.Now(), } _, err = db.Table("task_manage").Insert(&taskManage) if err != nil { err = resp.DbInsertError.WithError(err) return } return } // EditTaskManage 编辑任务 func (t *TaskManageSvc) EditTaskManage(req request.EditTaskManageReq) (err error) { db, err := client.GetDbClient() if err != nil { err = resp.DbConnectError.WithError(err) return } taskManage := entity.TaskManage{ TaskDesc: req.TaskDesc, YamlDesc: req.YamlDesc, YamlUrl: req.YamlUrl, HostGroupId: req.HostGroupId, UpdateUser: "", UpdateTime: time.Now(), } //编辑任务 _, err = db.Table("task_manage").Where("is_delete = 0 AND id = ?", req.Id). Cols("task_desc,yaml_desc,yaml_url,host_group_id,update_user,update_time").Update(&taskManage) if err != nil { err = resp.DbUpdateError.WithError(err) return } return } // DelTaskManage 删除任务 func (t *TaskManageSvc) DelTaskManage(req request.DelTaskManageReq) (err error) { db, err := client.GetDbClient() if err != nil { err = resp.DbConnectError.WithError(err) return } //编辑任务 _, err = db.Table("task_manage").In("id", req.Id).Cols("is_delete").Update(&entity.TaskManage{ IsDelete: 1, }) if err != nil { err = resp.DbDeleteError.WithError(err) return } return } // DetailsTaskManage 任务详情 func (t *TaskManageSvc) DetailsTaskManage(id int) (taskManageRes response.TaskManageRes, err error) { db, err := client.GetDbClient() if err != nil { err = resp.DbConnectError.WithError(err) return } //查询任务 _, err = db.Table("task_manage").Where("is_delete = 0 AND id = ?", id).Get(&taskManageRes) if err != nil { err = resp.DbSelectError.WithError(err) return } return } // ListTaskManage 任务列表 func (t *TaskManageSvc) ListTaskManage(req request.ListTaskManageReq) (total int64, taskManageListRes []response.TaskManageRes, err error) { db, err := client.GetDbClient() if err != nil { err = resp.DbConnectError.WithError(err) return } finder := db.Table("task_manage").Where("is_delete = 0") if req.Search != "" { finder.Where(fmt.Sprintf("(task_name LIKE %s OR task_desc LIKE %s OR create_user LIKE %s)", "%"+req.Search+"%", "%"+req.Search+"%", "%"+req.Search+"%")) } if req.CreateDateFrom != "" { finder.Where("create_time >= ?", req.CreateDateFrom) } if req.CreateDateTo != "" { finder.Where("create_time <= ?", req.CreateDateFrom) } finder.OrderBy("id") //查询任务 total, err = finder.Limit(req.PageSize, (req.Page-1)*req.PageSize).FindAndCount(&taskManageListRes) if err != nil { err = resp.DbSelectError.WithError(err) return } return } func (t *TaskManageSvc) ExecScript(req request.ExecScriptReq) (data interface{}, err error) { //获取主机IP var ipList []string db, err := client.GetDbClient() if err != nil { return nil, resp.DbConnectError.WithError(err) } if err := db.Table("host_manage_list").Select("ip").Where("host_group_id = ?", req.HostGroupId).Find(&ipList); err != nil { return nil, resp.DbSelectError.WithError(err) } //写入主机组ip f, err := os.Open("/etc/ansible/hosts") if err != nil { err = resp.FileExecError.WithError(err) return } defer f.Close() for _, v := range ipList { _, err := f.Write([]byte(fmt.Sprintf("%s\n", v))) if err != nil { return nil, resp.FileExecError.WithError(err) } } //写入执行脚本 f2, err := os.Create("/etc/ansible/ansible.yml") if err != nil { return nil, resp.FileExecError.WithError(err) } defer f2.Close() _, err = f2.Write([]byte(req.Script)) if err != nil { return nil, resp.FileExecError.WithError(err) } //写入额外yml参数 if req.Type == 1 { //写入执行脚本 f3, err := os.Create("/etc/ansible/ansible_extra.yml") if err != nil { return nil, resp.FileExecError.WithError(err) } defer f3.Close() _, err = f3.Write([]byte(req.Value)) if err != nil { return nil, resp.FileExecError.WithError(err) } req.Value = fmt.Sprintf("@/etc/ansible/ansible_extra.yml") } cmd := exec.Command("ansible", "-i", "/etc/ansible/hosts", "/etc/ansible/ansible.yml", "--extra-vars", req.Value) output, err := cmd.Output() if err != nil { err = resp.CmdExecError.WithError(err) return } fmt.Println(string(output)) return string(output), nil }