diff options
| author | Shulhan <ms@kilabit.info> | 2025-07-21 00:22:50 +0700 |
|---|---|---|
| committer | Shulhan <ms@kilabit.info> | 2025-07-23 09:32:16 +0700 |
| commit | 3d4c7b48674cd553ce8f670933af9b609992ae77 (patch) | |
| tree | ae35fc18ed901bcb3d13aa3a0e4abf45287f2579 /worker.go | |
| parent | 4d4b26dff03083955871439ee6e0ef9bd07c5a1c (diff) | |
| download | lilin-3d4c7b48674cd553ce8f670933af9b609992ae77.tar.xz | |
wip: implement loading per service configuration
The service configuration is stored under "$BASE_DIR/etc/lilin/service.d".
with ".cfg" as the file extension.
The service configuration use INI format.
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 |
