mirror of
https://codeberg.org/cunicu/cunicu.git
synced 2025-10-29 04:22:27 +08:00
79 lines
1.4 KiB
Go
79 lines
1.4 KiB
Go
package hooks
|
|
|
|
import (
|
|
"github.com/stv0g/cunicu/pkg/config"
|
|
"github.com/stv0g/cunicu/pkg/core"
|
|
"github.com/stv0g/cunicu/pkg/daemon"
|
|
"github.com/stv0g/cunicu/pkg/daemon/feature/epdisc"
|
|
"go.uber.org/zap"
|
|
)
|
|
|
|
func init() { //nolint:gochecknoinits
|
|
daemon.RegisterFeature("hooks", "Hooks", New, 70)
|
|
}
|
|
|
|
type Hook interface {
|
|
core.AllHandler
|
|
epdisc.OnConnectionStateHandler
|
|
}
|
|
|
|
type Interface struct {
|
|
*daemon.Interface
|
|
|
|
hooks []Hook
|
|
|
|
logger *zap.Logger
|
|
}
|
|
|
|
func New(i *daemon.Interface) (daemon.Feature, error) {
|
|
if len(i.Settings.Hooks) == 0 {
|
|
return nil, nil
|
|
}
|
|
|
|
h := &Interface{
|
|
Interface: i,
|
|
logger: zap.L().Named("hooks").With(zap.String("intf", i.Name())),
|
|
}
|
|
|
|
for _, hks := range i.Settings.Hooks {
|
|
var hk Hook
|
|
switch hks := hks.(type) {
|
|
case *config.ExecHookSetting:
|
|
hk = h.NewExecHook(hks)
|
|
case *config.WebHookSetting:
|
|
hk = h.NewWebHook(hks)
|
|
}
|
|
|
|
h.OnModified(hk)
|
|
h.OnPeer(hk)
|
|
|
|
if f, ok := h.Features["epdisc"]; ok {
|
|
if ep, ok := f.(*epdisc.Interface); ok {
|
|
ep.OnConnectionStateChange(hk)
|
|
}
|
|
}
|
|
|
|
h.hooks = append(h.hooks, hk)
|
|
}
|
|
|
|
return h, nil
|
|
}
|
|
|
|
func (i *Interface) Start() error {
|
|
i.logger.Info("Started hooks")
|
|
|
|
for _, hk := range i.hooks {
|
|
hk.OnInterfaceAdded(i.Interface.Interface)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (i *Interface) Close() error {
|
|
for _, hk := range i.hooks {
|
|
hk.OnInterfaceRemoved(i.Interface.Interface)
|
|
}
|
|
|
|
return nil
|
|
}
|