diff --git a/README.md b/README.md index 3ad0108..875c3a1 100644 --- a/README.md +++ b/README.md @@ -24,6 +24,14 @@ arguments: - `/healthz` - health endpoint, returns code `200` with text `OK`. Useful for kubernetes pods ready/live probes. +## global env variables + +- `ALLOWED_TASKS` - list comma-separated task names, only tasks with these names will be processed. example: + +``` +ALLOWED_TASKS=sleep,hello_world +``` + ## config format example: diff --git a/go.mod b/go.mod index fd9aee4..5487a96 100644 --- a/go.mod +++ b/go.mod @@ -1,9 +1,11 @@ module github.com/jar3b/concron +go 1.13 + require ( github.com/jar3b/logrus-levelpad-formatter v1.0.0 - github.com/julienschmidt/httprouter v1.2.0 - github.com/robfig/cron v0.0.0-20180505203441-b41be1df6967 - github.com/sirupsen/logrus v1.4.0 - gopkg.in/yaml.v2 v2.2.2 + github.com/julienschmidt/httprouter v1.3.0 + github.com/robfig/cron v1.2.0 + github.com/sirupsen/logrus v1.4.2 + gopkg.in/yaml.v2 v2.2.7 ) diff --git a/src/main.go b/src/main.go index 3d210d0..27f9a54 100644 --- a/src/main.go +++ b/src/main.go @@ -8,6 +8,8 @@ import ( "github.com/julienschmidt/httprouter" log "github.com/sirupsen/logrus" "net/http" + "os" + "strings" ) func healthHandler(w http.ResponseWriter, r *http.Request, ps httprouter.Params) { @@ -39,8 +41,17 @@ func main() { initLog(*debug) + // get allowed tasks + var allowedTasks map[string]bool + if os.Getenv("ALLOWED_TASKS") != "" { + allowedTasks = make(map[string]bool, 0) + for _, t := range strings.Split(os.Getenv("ALLOWED_TASKS"), ",") { + allowedTasks[t] = true + } + } + // manage tasks - taskList, err := tasks.LoadTasks(*configFile) + taskList, err := tasks.LoadTasks(*configFile, &allowedTasks) if err != nil { log.Fatalf("cannot load %s: %v", *configFile, err) return diff --git a/src/tasks/models.go b/src/tasks/models.go index 8e21ded..e96363a 100644 --- a/src/tasks/models.go +++ b/src/tasks/models.go @@ -60,6 +60,9 @@ type Task struct { // task executions execCount int execMap map[int]*taskExecution + + // allowed to run of not + Enabled bool } func (t *Task) init(shell string, systemEnvs *map[string]string) error { @@ -163,7 +166,7 @@ type ConfigDescriptiveInfo struct { Tasks []*Task `yaml:"tasks"` } -func (di *ConfigDescriptiveInfo) InitTasks() []error { +func (di *ConfigDescriptiveInfo) InitTasks(allowedTasksMap *map[string]bool) []error { var errList = make([]error, 0) var err error @@ -174,15 +177,32 @@ func (di *ConfigDescriptiveInfo) InitTasks() []error { env[pair[0]] = pair[1] } - var taskNames []string + var taskNamesEnabled []string + var taskNamesDisabled []string for _, t := range di.Tasks { + t.Enabled = true + if allowedTasksMap != nil { + t.Enabled = (*allowedTasksMap)[t.Name] + } + if err = t.init(di.Shell, &env); err != nil { + t.Enabled = false errList = append(errList, err) } - taskNames = append(taskNames, t.Name) + + if t.Enabled { + taskNamesEnabled = append(taskNamesEnabled, t.Name) + } else { + taskNamesDisabled = append(taskNamesDisabled, t.Name) + } } - log.Infof("%d tasks loaded - %s", len(di.Tasks), strings.Join(taskNames, ", ")) + log.Infof( + "%d tasks loaded - enabled: %s, disabled: %s", + len(di.Tasks), + strings.Join(taskNamesEnabled, ", "), + strings.Join(taskNamesDisabled, ", "), + ) return errList } diff --git a/src/tasks/scheduler.go b/src/tasks/scheduler.go index f72207e..58a3270 100644 --- a/src/tasks/scheduler.go +++ b/src/tasks/scheduler.go @@ -15,6 +15,11 @@ type Scheduler struct { func (s *Scheduler) AddTasks(taskList []*Task) error { s.tasks = taskList for _, task := range s.tasks { + // pass task if it's not enabled + if !task.Enabled { + continue + } + if err := s.cron.AddFunc(task.Crontab, task.Run); err != nil { return err } diff --git a/src/tasks/tasks.go b/src/tasks/tasks.go index 350acf7..08133b5 100644 --- a/src/tasks/tasks.go +++ b/src/tasks/tasks.go @@ -8,7 +8,7 @@ import ( "gopkg.in/yaml.v2" ) -func LoadTasks(configFileName string) (*ConfigDescriptiveInfo, error) { +func LoadTasks(configFileName string, allowedTasks *map[string]bool) (*ConfigDescriptiveInfo, error) { config := ConfigDescriptiveInfo{} data, err := helpers.ReadBinFile(configFileName) if err != nil { @@ -19,8 +19,7 @@ func LoadTasks(configFileName string) (*ConfigDescriptiveInfo, error) { return nil, err } - // init tasks - errList := config.InitTasks() + errList := config.InitTasks(allowedTasks) for _, err := range errList { log.Errorf(fmt.Sprintf("parse task error: %v", err)) }