diff --git a/content/etc/monit/conf.d/rancher-metadata b/content/etc/monit/conf.d/rancher-metadata index 2b4f58f..80ce347 100644 --- a/content/etc/monit/conf.d/rancher-metadata +++ b/content/etc/monit/conf.d/rancher-metadata @@ -1,3 +1,3 @@ - check process rancher-metadata matching "rancher-metadata" + check process rancher-metadata matching "/var/lib/cattle/bin/rancher-metadata" start program = "/etc/init.d/rancher-metadata start" stop program = "/etc/init.d/rancher-metadata stop" diff --git a/main.go b/main.go index dc5b2cf..e21ad27 100644 --- a/main.go +++ b/main.go @@ -4,6 +4,7 @@ import ( "encoding/json" "flag" "fmt" + "io" "io/ioutil" "net" "net/http" @@ -14,7 +15,6 @@ import ( "strconv" "strings" "syscall" - "time" log "github.com/Sirupsen/logrus" "github.com/golang/gddo/httputil" @@ -49,11 +49,9 @@ var ( router = mux.NewRouter() answers Versions - VERSION string - wantRevision = 1 - loadedRevision = 0 - loading = false - ticker = time.NewTicker(1 * time.Second) + VERSION string + loading = false + reloadChan = make(chan chan error) ) func main() { @@ -116,7 +114,6 @@ func parseFlags() { func loadAnswers() (err error) { log.Debug("Loading answers") loading = true - revision := wantRevision neu, err := ParseAnswers(*answersFile) if err == nil { for _, data := range neu { @@ -132,9 +129,8 @@ func loadAnswers() (err error) { } answers = neu - loadedRevision = revision loading = false - log.Infof("Loaded answers revision %d for %d versions", revision, len(answers)) + log.Infof("Loaded answers") } else { log.Errorf("Failed to load answers: %v", err) } @@ -162,22 +158,18 @@ func watchSignals() { go func() { for _ = range c { log.Info("Received HUP signal") - wantRevision += 1 + reloadChan <- nil } }() go func() { - for { - select { - case <-ticker.C: - //log.Info("Ping") - if !loading && loadedRevision < wantRevision { - loadAnswers() - } + for resp := range reloadChan { + err := loadAnswers() + if resp != nil { + resp <- err } } }() - } func watchHttp() { @@ -190,19 +182,16 @@ func watchHttp() { } func httpReload(w http.ResponseWriter, req *http.Request) { - wantRevision += 1 - waitFor := wantRevision - log.Debugf("Received HTTP reload request, wait for %d, ", waitFor) - - for { - select { - case <-time.After(100 * time.Millisecond): - //log.Debugf("Now at %d, waiting for %d", loadedRevision, waitFor) - if loadedRevision >= waitFor { - fmt.Fprintf(w, "OK %d\r\n", loadedRevision) - return - } - } + log.Debugf("Received HTTP reload request") + respChan := make(chan error) + reloadChan <- respChan + err := <-respChan + + if err == nil { + io.WriteString(w, "OK") + } else { + w.WriteHeader(500) + io.WriteString(w, err.Error()) } } diff --git a/parse.go b/parse.go index 3b4cc5a..26eabe4 100644 --- a/parse.go +++ b/parse.go @@ -48,15 +48,16 @@ func convertKeysToStrings(item interface{}) interface{} { } func ParseAnswers(path string) (out Versions, err error) { + var tmp Versions data, err := ioutil.ReadFile(path) if err != nil { if os.IsNotExist(err) { log.Warn("Failed to find: ", path) + return tmp, nil } return nil, err } - var tmp Versions err = yaml.Unmarshal(data, &tmp) tmp = convertVersionKeysToStrings(tmp)