summaryrefslogtreecommitdiff
path: root/state.go
diff options
context:
space:
mode:
Diffstat (limited to 'state.go')
-rw-r--r--state.go78
1 files changed, 77 insertions, 1 deletions
diff --git a/state.go b/state.go
index c3c7eab..67cb1d4 100644
--- a/state.go
+++ b/state.go
@@ -1,5 +1,81 @@
package main
+import (
+ "encoding/json"
+ "fmt"
+ "io/ioutil"
+ "log"
+ "os"
+)
+
type state struct {
- Checks map[string]int
+ stateFile string
+ Checks map[string]int
+}
+
+func newState(config config) (state, error) {
+ stateFile := fmt.Sprintf("%s/state.json", config.StateDir)
+ state := state{stateFile, make(map[string]int)}
+
+ if _, err := os.Stat(stateFile); err != nil {
+ return state, err
+ }
+
+ file, err := os.Open(stateFile)
+ if err != nil {
+ return state, err
+ }
+ defer file.Close()
+
+ // Read the file content
+ bytes, err := ioutil.ReadAll(file)
+ if err != nil {
+ return state, err
+ }
+
+ // Parse the JSON content
+ if err := json.Unmarshal(bytes, &state.Checks); err != nil {
+ return state, err
+ }
+
+ // Clean up obsolete state information
+ var obsolete []string
+ for name := range state.Checks {
+ if _, ok := config.Checks[name]; !ok {
+ obsolete = append(obsolete, name)
+ }
+ }
+
+ for _, name := range obsolete {
+ delete(state.Checks, name)
+ log.Printf("State of %s is obsolete (removed)", name)
+ }
+
+ return state, nil
+}
+
+func (s state) update(name string, status int) bool {
+ oldStatus, ok := s.Checks[name]
+ if !ok {
+ log.Printf("State of %s: %d (new)", name, status)
+ s.Checks[name] = status
+ return true
+ }
+
+ if oldStatus != status {
+ log.Printf("State of %s: %d -> %d (changed)", name, oldStatus, status)
+ s.Checks[name] = status
+ return true
+ }
+
+ log.Printf("State of %s: %d (unchanged)", name, status)
+ return false
+}
+
+func (s state) persist() error {
+ jsonData, err := json.Marshal(s.Checks)
+ if err != nil {
+ return err
+ }
+ return ioutil.WriteFile(s.stateFile, jsonData, os.ModePerm)
}