diff options
Diffstat (limited to 'worker.go')
| -rw-r--r-- | worker.go | 67 |
1 files changed, 60 insertions, 7 deletions
@@ -5,29 +5,82 @@ package lilin import ( "maps" + "os" + "path/filepath" "slices" + "strings" "sync" + + "git.sr.ht/~shulhan/pakakeh.go/lib/ini" ) // worker contains the report of all services. type worker struct { - // Internal service status with key is service name. - services map[string]Service + // Internal service status, where key is service name. + Services map[string]*Service `ini:"service"` sync.Mutex } -func newWorker() (wrk *worker) { - return &worker{ - services: make(map[string]Service), +func newWorker(configDir string) (wrk *worker, err error) { + wrk = &worker{ + Services: make(map[string]*Service), + } + err = wrk.loadServiceDir(configDir) + if err != nil { + return nil, err + } + return wrk, nil +} + +// loadServiceDir Load all the service configurations. +func (wrk *worker) loadServiceDir(configDir string) (err error) { + var serviceDir = filepath.Join(configDir, `service.d`) + + var listde []os.DirEntry + listde, err = os.ReadDir(serviceDir) + if err != nil { + return err + } + + var de os.DirEntry + for _, de = range listde { + if de.IsDir() { + continue + } + var name = de.Name() + if name[0] == '.' { + // Exclude hidden file. + continue + } + if !strings.HasSuffix(name, `.cfg`) { + continue + } + + var serviceCfg = filepath.Join(serviceDir, name) + var rawcfg []byte + + rawcfg, err = os.ReadFile(serviceCfg) + if err != nil { + return err + } + + err = ini.Unmarshal(rawcfg, wrk) + if err != nil { + return err + } + } + for name, service := range wrk.Services { + service.Name = name } + return nil } // summary return all services status ordered by name. func (wrk *worker) summary() (list []Service) { wrk.Lock() - var keys = slices.Sorted(maps.Keys(wrk.services)) + var keys = slices.Sorted(maps.Keys(wrk.Services)) for _, name := range keys { - list = append(list, wrk.services[name]) + list = append(list, *wrk.Services[name]) } wrk.Unlock() return list |
