diff --git a/cmd/goplum/goplum.go b/cmd/goplum/goplum.go index a8910a8..7622668 100644 --- a/cmd/goplum/goplum.go +++ b/cmd/goplum/goplum.go @@ -1,6 +1,7 @@ package main import ( + "github.com/csmith/goplum" "github.com/csmith/goplum/internal" "log" "os" @@ -14,4 +15,6 @@ func main() { for i := range plugins { log.Printf("Plugin %d is '%s' with %d checks, %d notifiers\n", i, plugins[i].Name(), len(plugins[i].Checks()), len(plugins[i].Notifiers())) } + + goplum.Initialise(plugins, "config.json") } diff --git a/cmd/goplumdev/goplumdev.go b/cmd/goplumdev/goplumdev.go index e86048f..558d369 100644 --- a/cmd/goplumdev/goplumdev.go +++ b/cmd/goplumdev/goplumdev.go @@ -15,4 +15,6 @@ func main() { for i := range plugins { log.Printf("Plugin %d is '%s' with %d checks, %d notifiers\n", i, plugins[i].Name(), len(plugins[i].Checks()), len(plugins[i].Notifiers())) } + + goplum.Initialise(plugins, "config.json") } diff --git a/config.go b/config.go new file mode 100644 index 0000000..fabd926 --- /dev/null +++ b/config.go @@ -0,0 +1,29 @@ +package goplum + +import ( + "encoding/json" + "os" + "time" +) + +type Config struct { + Checks []ConfiguredCheck `json:"checks"` +} + +type ConfiguredCheck struct { + Name string `json:"name"` + Check string `json:"check"` + Interval time.Duration `json:"interval"` + Params json.RawMessage `json:"params"` +} + +func LoadConfig(path string) (*Config, error) { + f, err := os.Open(path) + if err != nil { + return nil, err + } + defer f.Close() + + config := &Config{} + return config, json.NewDecoder(f).Decode(config) +} diff --git a/config.json b/config.json new file mode 100644 index 0000000..31e7ae2 --- /dev/null +++ b/config.json @@ -0,0 +1,11 @@ +{ + "checks": [ + { + "name": "Google", + "check": "http", + "params": { + "url": "https://www.google.com/" + } + } + ] +} diff --git a/plugins.go b/plugins.go index ad98a17..f967fcd 100644 --- a/plugins.go +++ b/plugins.go @@ -12,8 +12,7 @@ type Plugin interface { // e.g. making a HTTP request, or opening a TCP socket. type Check interface { Name() string - Help() string - Create(config json.RawMessage) Task + Create(config json.RawMessage) (Task, error) } type Task interface { diff --git a/plugins/http/http.go b/plugins/http/http.go index 46f6a15..eff6313 100644 --- a/plugins/http/http.go +++ b/plugins/http/http.go @@ -1,6 +1,10 @@ package http -import "github.com/csmith/goplum" +import ( + "encoding/json" + "github.com/csmith/goplum" + "net/http" +) type Plugin struct{} @@ -9,10 +13,40 @@ func (h Plugin) Name() string { } func (h Plugin) Checks() []goplum.Check { - return nil + return []goplum.Check{Check{}} } func (h Plugin) Notifiers() []goplum.Notifier { return nil } +type params struct { + Url string `json:"url"` +} + +type Check struct{} + +func (c Check) Name() string { + return "http" +} + +func (c Check) Create(config json.RawMessage) (goplum.Task, error) { + p := params{} + err := json.Unmarshal(config, &p) + if err != nil { + return nil, err + } + + return Task{p}, nil +} + +type Task struct { + params params +} + +func (t Task) Execute() goplum.Result { + r, err := http.Get(t.params.Url) + return goplum.Result{ + Good: err == nil && r.StatusCode >= 400, + } +} diff --git a/plum.go b/plum.go new file mode 100644 index 0000000..f466c2b --- /dev/null +++ b/plum.go @@ -0,0 +1,35 @@ +package goplum + +import "log" + +func Initialise(plugins []Plugin, configPath string) { + config, err := LoadConfig(configPath) + if err != nil { + log.Fatalf("Unable to read config: %v", err) + } + + checks := make(map[string]Check) + for i := range plugins { + cs := plugins[i].Checks() + for j := range cs { + checks[cs[j].Name()] = cs[j] + } + } + log.Printf("Found %d checks from %d plugins\n", len(checks), len(plugins)) + + tasks := make([]Task, 0) + for i := range config.Checks { + cc := config.Checks[i] + check, ok := checks[cc.Check] + if !ok { + log.Fatalf("Invalid check name in config: %s", cc.Check) + } + + t, err := check.Create(cc.Params) + if err != nil { + log.Fatalf("Unable to create check '%s': %v", cc.Name, err) + } + + tasks = append(tasks, t) + } +}