Create crond scheduler and dependencies and store to disk

This commit is contained in:
bel
2020-03-12 15:14:25 -06:00
parent f022b26987
commit 65655080dd
12 changed files with 514 additions and 0 deletions

73
scheduler/job.go Normal file
View File

@@ -0,0 +1,73 @@
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
}