74 lines
1.2 KiB
Go
74 lines
1.2 KiB
Go
package scheduler
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/gob"
|
|
"local/firestormy/logger"
|
|
"os/exec"
|
|
|
|
"github.com/google/uuid"
|
|
)
|
|
|
|
type Job struct {
|
|
Name string
|
|
Schedule string
|
|
Raw string
|
|
Runner Runner
|
|
foo func()
|
|
}
|
|
|
|
func NewJob(runner Runner, schedule, raw string) (*Job, error) {
|
|
switch runner {
|
|
case Bash:
|
|
return newBashJob(schedule, raw)
|
|
default:
|
|
return nil, ErrBadRunner
|
|
}
|
|
}
|
|
|
|
func newBashJob(schedule, sh string) (*Job, error) {
|
|
if !validCron(schedule) {
|
|
return nil, ErrBadCron
|
|
}
|
|
return &Job{
|
|
Name: uuid.New().String(),
|
|
Schedule: schedule,
|
|
Raw: sh,
|
|
Runner: Bash,
|
|
foo: func() {
|
|
cmd := exec.Command("bash", "-c", sh)
|
|
out, err := cmd.CombinedOutput()
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
logger.New().Info("executed %s: %s", sh, out)
|
|
},
|
|
}, nil
|
|
}
|
|
|
|
func (j *Job) Run() {
|
|
j.foo()
|
|
}
|
|
|
|
func (j *Job) Encode() ([]byte, error) {
|
|
buff := bytes.NewBuffer(nil)
|
|
encoder := gob.NewEncoder(buff)
|
|
err := encoder.Encode(*j)
|
|
return buff.Bytes(), err
|
|
}
|
|
|
|
func (j *Job) Decode(b []byte) error {
|
|
buff := bytes.NewReader(b)
|
|
decoder := gob.NewDecoder(buff)
|
|
err := decoder.Decode(j)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
k, err := NewJob(j.Runner, j.Schedule, j.Raw)
|
|
if err == nil {
|
|
k.Name = j.Name
|
|
*j = *k
|
|
}
|
|
return err
|
|
}
|