github.com/e154/smart-home@v0.17.2-0.20240311175135-e530a6e5cd45/plugins/autocert/plugin.go (about) 1 // This file is part of the Smart Home 2 // Program complex distribution https://github.com/e154/smart-home 3 // Copyright (C) 2016-2023, Filippov Alex 4 // 5 // This library is free software: you can redistribute it and/or 6 // modify it under the terms of the GNU Lesser General Public 7 // License as published by the Free Software Foundation; either 8 // version 3 of the License, or (at your option) any later version. 9 // 10 // This library is distributed in the hope that it will be useful, 11 // but WITHOUT ANY WARRANTY; without even the implied warranty of 12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 // Library General Public License for more details. 14 // 15 // You should have received a copy of the GNU Lesser General Public 16 // License along with this library. If not, see 17 // <https://www.gnu.org/licenses/>. 18 19 package autocert 20 21 import ( 22 "context" 23 "embed" 24 25 "github.com/e154/smart-home/common/events" 26 "github.com/e154/smart-home/common/logger" 27 m "github.com/e154/smart-home/models" 28 "github.com/e154/smart-home/system/scheduler" 29 "github.com/e154/smart-home/system/supervisor" 30 ) 31 32 var ( 33 log = logger.MustGetLogger("plugins.autocert") 34 ) 35 36 var _ supervisor.Pluggable = (*plugin)(nil) 37 38 //go:embed Readme.md 39 //go:embed Readme.ru.md 40 var F embed.FS 41 42 func init() { 43 supervisor.RegisterPlugin(Name, New) 44 } 45 46 type plugin struct { 47 *supervisor.Plugin 48 task scheduler.EntryID 49 } 50 51 // New ... 52 func New() supervisor.Pluggable { 53 p := &plugin{ 54 Plugin: supervisor.NewPlugin(), 55 } 56 p.F = F 57 return p 58 } 59 60 // Load ... 61 func (p *plugin) Load(ctx context.Context, service supervisor.Service) (err error) { 62 if err = p.Plugin.Load(ctx, service, p.ActorConstructor); err != nil { 63 return 64 } 65 66 _ = p.Service.EventBus().Subscribe("system/entities/+", p.eventHandler) 67 68 p.task, err = p.Service.Scheduler().AddFunc("0 0 0 * * *", func() { 69 p.Actors.Range(func(key, value any) bool { 70 actor := value.(*Actor) 71 go actor.checkCertificate() 72 return true 73 }) 74 }) 75 return 76 } 77 78 // Unload ... 79 func (p *plugin) Unload(ctx context.Context) (err error) { 80 if err = p.Plugin.Unload(ctx); err != nil { 81 return 82 } 83 p.Service.Scheduler().Remove(p.task) 84 _ = p.Service.EventBus().Unsubscribe("system/entities/+", p.eventHandler) 85 return 86 } 87 88 // ActorConstructor ... 89 func (p *plugin) ActorConstructor(entity *m.Entity) (actor supervisor.PluginActor, err error) { 90 actor, err = NewActor(entity, p.Service) 91 return 92 } 93 94 // Name ... 95 func (p plugin) Name() string { 96 return Name 97 } 98 99 func (p *plugin) eventHandler(_ string, msg interface{}) { 100 101 switch v := msg.(type) { 102 case events.EventCallEntityAction: 103 values, ok := p.Check(v) 104 if !ok { 105 return 106 } 107 108 for _, value := range values { 109 actor := value.(*Actor) 110 go actor.addAction(v) 111 } 112 113 default: 114 //fmt.Printf("new event: %v\n", reflect.TypeOf(v).String()) 115 } 116 } 117 118 // Type ... 119 func (p *plugin) Type() supervisor.PluginType { 120 return supervisor.PluginBuiltIn 121 } 122 123 // Depends ... 124 func (p *plugin) Depends() []string { 125 return nil 126 } 127 128 // Version ... 129 func (p *plugin) Version() string { 130 return Version 131 } 132 133 // Options ... 134 func (p *plugin) Options() m.PluginOptions { 135 return m.PluginOptions{ 136 Actors: true, 137 ActorCustomAttrs: false, 138 ActorAttrs: NewAttr(), 139 ActorCustomActions: false, 140 ActorActions: supervisor.ToEntityActionShort(NewActions()), 141 ActorCustomStates: false, 142 ActorStates: supervisor.ToEntityStateShort(NewStates()), 143 ActorCustomSetts: false, 144 ActorSetts: NewSettings(), 145 } 146 }