github.com/safing/portbase@v0.19.5/template/module.go (about) 1 package template 2 3 import ( 4 "context" 5 "time" 6 7 "github.com/safing/portbase/config" 8 "github.com/safing/portbase/modules" 9 "github.com/safing/portbase/modules/subsystems" 10 ) 11 12 const ( 13 eventStateUpdate = "state update" 14 ) 15 16 var module *modules.Module 17 18 func init() { 19 // register module 20 module = modules.Register("template", prep, start, stop) // add dependencies... 21 subsystems.Register( 22 "template-subsystem", // ID 23 "Template Subsystem", // name 24 "This subsystem is a template for quick setup", // description 25 module, 26 "config:template", // key space for configuration options registered 27 &config.Option{ 28 Name: "Template Subsystem", 29 Key: "config:subsystems/template", 30 Description: "This option enables the Template Subsystem [TEMPLATE]", 31 OptType: config.OptTypeBool, 32 DefaultValue: false, 33 }, 34 ) 35 36 // register events that other modules can subscribe to 37 module.RegisterEvent(eventStateUpdate, true) 38 } 39 40 func prep() error { 41 // register options 42 err := config.Register(&config.Option{ 43 Name: "language", 44 Key: "template/language", 45 Description: "Sets the language for the template [TEMPLATE]", 46 OptType: config.OptTypeString, 47 ExpertiseLevel: config.ExpertiseLevelUser, // default 48 ReleaseLevel: config.ReleaseLevelStable, // default 49 RequiresRestart: false, // default 50 DefaultValue: "en", 51 ValidationRegex: "^[a-z]{2}$", 52 }) 53 if err != nil { 54 return err 55 } 56 57 // register event hooks 58 // do this in prep() and not in start(), as we don't want to register again if module is turned off and on again 59 err = module.RegisterEventHook( 60 "template", // event source module name 61 "state update", // event source name 62 "react to state changes", // description of hook function 63 eventHandler, // hook function 64 ) 65 if err != nil { 66 return err 67 } 68 69 // hint: event hooks and tasks will not be run if module isn't online 70 return nil 71 } 72 73 func start() error { 74 // register tasks 75 module.NewTask("do something", taskFn).Queue() 76 77 // start service worker 78 module.StartServiceWorker("do something", 0, serviceWorker) 79 80 return nil 81 } 82 83 func stop() error { 84 return nil 85 } 86 87 func serviceWorker(ctx context.Context) error { 88 for { 89 select { 90 case <-time.After(1 * time.Second): 91 err := do() 92 if err != nil { 93 return err 94 } 95 case <-ctx.Done(): 96 return nil 97 } 98 } 99 } 100 101 func taskFn(ctx context.Context, task *modules.Task) error { 102 return do() 103 } 104 105 func eventHandler(ctx context.Context, data interface{}) error { 106 return do() 107 } 108 109 func do() error { 110 return nil 111 }