@@ -25,6 +25,7 @@ import (
2525 "github.com/snapserv/nagopher"
2626 "io/ioutil"
2727 "os"
28+ "strings"
2829 "syscall"
2930)
3031
@@ -38,13 +39,16 @@ type Resource interface {
3839type ResourceOpt func (* baseResource )
3940
4041type baseResource struct {
41- nagopher.Resource
42- plugin Plugin
42+ nagopher.Resource `json:"-"`
43+ plugin Plugin
4344
44- persistenceKey string
45+ persistenceKey string
46+ persistenceStore interface {}
4547}
4648
47- const shmOpenFlags = os .O_CREATE | os .O_RDONLY | syscall .O_DSYNC | syscall .O_RSYNC
49+ const shmOpenFlags = os .O_CREATE | syscall .O_DSYNC | syscall .O_RSYNC
50+ const shmReadFlags = shmOpenFlags | os .O_RDONLY
51+ const shmWriteFlags = shmOpenFlags | os .O_WRONLY | os .O_TRUNC
4852const shmDefaultMode = 0600
4953
5054// NewResource instantiates baseResource with the given functional options
@@ -62,27 +66,27 @@ func NewResource(plugin Plugin, options ...ResourceOpt) Resource {
6266}
6367
6468// ResourcePersistence is a functional option for NewResource(), which enables resource persistence with the given key
65- func ResourcePersistence (uniqueKey string ) ResourceOpt {
69+ func ResourcePersistence (uniqueKey string , dataStore interface {} ) ResourceOpt {
6670 return func (r * baseResource ) {
67- r .persistenceKey = r .Plugin ().Name () + uniqueKey
71+ r .persistenceKey = strings .ToLower (".nagocheck-" + r .Plugin ().Name () + "-" + uniqueKey )
72+ r .persistenceStore = dataStore
6873 }
6974}
7075
71- func (r baseResource ) Probe (warnings nagopher.WarningCollection ) ([]nagopher. Metric , error ) {
76+ func (r baseResource ) Setup (warnings nagopher.WarningCollection ) error {
7277 if err := r .loadPersistentData (); err != nil {
73- return []nagopher. Metric {}, fmt .Errorf ("nagopher: unable to load persistent data: %s" , err .Error ())
78+ return fmt .Errorf ("unable to load persistent data: %s" , err .Error ())
7479 }
7580
76- metrics , err := r .Resource .Probe (warnings )
77- if err != nil {
78- return metrics , err
79- }
81+ return nil
82+ }
8083
84+ func (r baseResource ) Teardown (warnings nagopher.WarningCollection ) error {
8185 if err := r .storePersistentData (); err != nil {
82- return []nagopher. Metric {}, fmt .Errorf ("nagopher: unable to store persistent data: %s" , err .Error ())
86+ return fmt .Errorf ("unable to store persistent data: %s" , err .Error ())
8387 }
8488
85- return metrics , err
89+ return nil
8690}
8791
8892func (r * baseResource ) loadPersistentData () (rerr error ) {
@@ -92,7 +96,7 @@ func (r *baseResource) loadPersistentData() (rerr error) {
9296 }
9397
9498 // Attempt to open or create file using SHM
95- file , err := shm .Open (r .persistenceKey , shmOpenFlags , shmDefaultMode )
99+ file , err := shm .Open (r .persistenceKey , shmReadFlags , shmDefaultMode )
96100 if err != nil {
97101 return err
98102 }
@@ -113,7 +117,7 @@ func (r *baseResource) loadPersistentData() (rerr error) {
113117
114118 // Attempt to unmarshal contents as JSON into target
115119 if len (jsonData ) > 0 {
116- if err := json .Unmarshal (jsonData , r ); err != nil {
120+ if err := json .Unmarshal (jsonData , r . persistenceStore ); err != nil {
117121 return err
118122 }
119123 }
@@ -128,13 +132,13 @@ func (r baseResource) storePersistentData() (rerr error) {
128132 }
129133
130134 // Attempt to marshal source into JSON
131- jsonData , err := json .Marshal (r )
135+ jsonData , err := json .Marshal (r . persistenceStore )
132136 if err != nil {
133137 return err
134138 }
135139
136140 // Attempt to open or create file using SHM
137- file , err := shm .Open (r .persistenceKey , shmOpenFlags , shmDefaultMode )
141+ file , err := shm .Open (r .persistenceKey , shmWriteFlags , shmDefaultMode )
138142 if err != nil {
139143 return err
140144 }
0 commit comments