mirror of https://github.com/shunfei/cronsun
node: 支持指定用户执行命令
parent
3b7139f52d
commit
5661cce065
|
@ -24,6 +24,7 @@ func main() {
|
||||||
//set cpu usage
|
//set cpu usage
|
||||||
runtime.GOMAXPROCS(*gomax)
|
runtime.GOMAXPROCS(*gomax)
|
||||||
|
|
||||||
|
models.InitPwd()
|
||||||
if err := models.Init(); err != nil {
|
if err := models.Init(); err != nil {
|
||||||
log.Error(err.Error())
|
log.Error(err.Error())
|
||||||
return
|
return
|
||||||
|
|
|
@ -1,15 +1,29 @@
|
||||||
package models
|
package models
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"sunteng/commons/db/imgo"
|
"errors"
|
||||||
|
"os/exec"
|
||||||
|
|
||||||
|
"sunteng/commons/db/imgo"
|
||||||
|
"sunteng/commons/log"
|
||||||
"sunteng/cronsun/conf"
|
"sunteng/cronsun/conf"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
initialized bool
|
initialized bool
|
||||||
|
|
||||||
|
needPassword = false
|
||||||
|
SudoErr = errors.New("sudo need password")
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func InitPwd() {
|
||||||
|
// 不支持 windows
|
||||||
|
if _, err := exec.Command("sh", "-c", "echo |sudo -S echo &>/dev/null").Output(); err != nil {
|
||||||
|
log.Warnf("当前用户 sudo 需要密码,所有指定用户执行的命令都将失败")
|
||||||
|
needPassword = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func Init() (err error) {
|
func Init() (err error) {
|
||||||
if initialized {
|
if initialized {
|
||||||
return
|
return
|
||||||
|
|
|
@ -25,6 +25,7 @@ type Job struct {
|
||||||
Name string `json:"name"`
|
Name string `json:"name"`
|
||||||
Group string `json:"group"`
|
Group string `json:"group"`
|
||||||
Command string `json:"cmd"`
|
Command string `json:"cmd"`
|
||||||
|
User string `json:"user"`
|
||||||
Rules []*JobRule `json:"rules"`
|
Rules []*JobRule `json:"rules"`
|
||||||
Pause bool `json:"pause"` // 可手工控制的状态
|
Pause bool `json:"pause"` // 可手工控制的状态
|
||||||
|
|
||||||
|
@ -170,8 +171,20 @@ func (j *Job) String() string {
|
||||||
|
|
||||||
// Run 执行任务
|
// Run 执行任务
|
||||||
func (j *Job) Run() {
|
func (j *Job) Run() {
|
||||||
cmd, t := strings.Split(j.Command, " "), time.Now()
|
t := time.Now()
|
||||||
out, err := exec.Command(cmd[0], cmd[1:]...).Output()
|
var cmd *exec.Cmd
|
||||||
|
if len(j.User) > 0 {
|
||||||
|
if needPassword {
|
||||||
|
j.Fail(t, SudoErr)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
cmd = exec.Command("sudo", "su", j.User, "-c", j.Command)
|
||||||
|
} else {
|
||||||
|
args := strings.Split(j.Command, " ")
|
||||||
|
cmd = exec.Command(args[0], args[1:]...)
|
||||||
|
}
|
||||||
|
|
||||||
|
out, err := cmd.Output()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
j.Fail(t, err)
|
j.Fail(t, err)
|
||||||
return
|
return
|
||||||
|
|
Loading…
Reference in New Issue