mirror of
https://github.com/InazumaV/Ratte.git
synced 2026-02-03 20:20:14 +00:00
feat: use wire
This commit is contained in:
21
boot/acme.go
Normal file
21
boot/acme.go
Normal file
@@ -0,0 +1,21 @@
|
||||
package boot
|
||||
|
||||
import (
|
||||
"github.com/InazumaV/Ratte/acme"
|
||||
"github.com/InazumaV/Ratte/conf"
|
||||
log "github.com/sirupsen/logrus"
|
||||
)
|
||||
|
||||
type AcmeGroup map[string]*acme.Acme
|
||||
|
||||
func initAcme(a []conf.ACME) AcmeGroup {
|
||||
acmes := make(AcmeGroup, len(a))
|
||||
for _, a := range a {
|
||||
ac, err := acme.NewAcme(&a)
|
||||
if err != nil {
|
||||
log.WithError(err).Fatal("New acme failed")
|
||||
}
|
||||
acmes[a.Name] = ac
|
||||
}
|
||||
return acmes
|
||||
}
|
||||
50
boot/boot.go
Normal file
50
boot/boot.go
Normal file
@@ -0,0 +1,50 @@
|
||||
//go:build wireinject
|
||||
|
||||
package boot
|
||||
|
||||
import (
|
||||
"github.com/InazumaV/Ratte/conf"
|
||||
"github.com/google/wire"
|
||||
)
|
||||
|
||||
var preSet = wire.NewSet(
|
||||
wire.FieldsOf(new(*conf.Conf), "ACME", "Plugin"),
|
||||
wire.FieldsOf(new(conf.Plugins), "Core", "Panel"),
|
||||
initAcme,
|
||||
initCores,
|
||||
initPanels,
|
||||
)
|
||||
var mainSet = wire.NewSet(
|
||||
wire.FieldsOf(new(*conf.Conf), "Node"),
|
||||
initNode,
|
||||
)
|
||||
|
||||
type Boot struct {
|
||||
Acmes AcmeGroup
|
||||
Cores CoreGroup
|
||||
Panels PanelGroup
|
||||
Node *NodeGroup
|
||||
}
|
||||
|
||||
func (b *Boot) Start() error {
|
||||
if err := b.Node.Start(); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (b *Boot) Close() error {
|
||||
b.Node.Close()
|
||||
b.Cores.Close()
|
||||
b.Panels.Close()
|
||||
return nil
|
||||
}
|
||||
|
||||
func InitBoot(c *conf.Conf) (*Boot, error) {
|
||||
wire.Build(
|
||||
preSet,
|
||||
mainSet,
|
||||
wire.Struct(new(Boot), "*"),
|
||||
)
|
||||
return nil, nil
|
||||
}
|
||||
40
boot/core.go
Normal file
40
boot/core.go
Normal file
@@ -0,0 +1,40 @@
|
||||
package boot
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/InazumaV/Ratte-Interface/core"
|
||||
"github.com/InazumaV/Ratte/conf"
|
||||
"os/exec"
|
||||
)
|
||||
|
||||
type CoreGroup map[string]*core.PluginClient
|
||||
|
||||
func (c CoreGroup) Get(name string) *core.PluginClient {
|
||||
if co, ok := c[name]; ok {
|
||||
return co
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (c CoreGroup) Close() {
|
||||
for _, co := range c {
|
||||
co.Close()
|
||||
}
|
||||
}
|
||||
|
||||
func initCores(cc []conf.CorePlugin) (CoreGroup, error) {
|
||||
cores := make(CoreGroup, len(cc))
|
||||
for _, co := range cc {
|
||||
c, err := core.NewClient(nil, exec.Command(co.Path))
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("new core error: %w", err)
|
||||
}
|
||||
err = c.Start(co.DataPath, co.Config)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("start core error: %w", err)
|
||||
}
|
||||
cores[co.Name] = c
|
||||
break
|
||||
}
|
||||
return cores, nil
|
||||
}
|
||||
95
boot/node.go
Normal file
95
boot/node.go
Normal file
@@ -0,0 +1,95 @@
|
||||
package boot
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/InazumaV/Ratte-Interface/core"
|
||||
"github.com/InazumaV/Ratte-Interface/panel"
|
||||
"github.com/InazumaV/Ratte/conf"
|
||||
"github.com/InazumaV/Ratte/handler"
|
||||
"github.com/InazumaV/Ratte/trigger"
|
||||
log "github.com/sirupsen/logrus"
|
||||
)
|
||||
|
||||
type NodeGroup struct {
|
||||
t []*trigger.Trigger
|
||||
h []*handler.Handler
|
||||
}
|
||||
|
||||
func (n NodeGroup) Start() error {
|
||||
for _, t := range n.t {
|
||||
err := t.Start()
|
||||
if err != nil {
|
||||
return fmt.Errorf("start trigger error: %w", err)
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (n NodeGroup) Close() error {
|
||||
for _, t := range n.t {
|
||||
err := t.Close()
|
||||
if err != nil {
|
||||
log.WithError(err).Errorln("Close trigger error")
|
||||
}
|
||||
}
|
||||
for _, h := range n.h {
|
||||
err := h.Close()
|
||||
if err != nil {
|
||||
log.WithError(err).Errorln("Close handler error")
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func initNode(
|
||||
n []conf.Node,
|
||||
acme AcmeGroup,
|
||||
cores CoreGroup,
|
||||
panels PanelGroup) (*NodeGroup, error) {
|
||||
triggers := make([]*trigger.Trigger, 0, len(n))
|
||||
handlers := make([]*handler.Handler, 0, len(n))
|
||||
for _, nd := range n {
|
||||
var co core.Core
|
||||
if c, ok := cores[nd.Options.Core]; ok {
|
||||
co = c
|
||||
} else {
|
||||
return nil, fmt.Errorf("unknown core name: %s", nd.Options.Core)
|
||||
}
|
||||
var pl panel.Panel
|
||||
if p, ok := panels[nd.Options.Panel]; ok {
|
||||
pl = p
|
||||
} else {
|
||||
return nil, fmt.Errorf("")
|
||||
}
|
||||
ac, e := acme[nd.Options.Acme]
|
||||
if !e {
|
||||
return nil, fmt.Errorf("unknown acme name: %s", nd.Options.Acme)
|
||||
}
|
||||
h := handler.New(co, pl, nd.Name, ac, log.WithFields(
|
||||
map[string]interface{}{
|
||||
"node": nd.Name,
|
||||
"service": "handler",
|
||||
},
|
||||
), &nd.Options)
|
||||
handlers = append(handlers, h)
|
||||
tr, err := trigger.New(log.WithFields(
|
||||
map[string]interface{}{
|
||||
"node": nd.Name,
|
||||
"service": "trigger",
|
||||
},
|
||||
), &nd.Trigger, h, pl, &nd.Remote)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("new trigger error: %w", err)
|
||||
}
|
||||
triggers = append(triggers, tr)
|
||||
err = tr.Start()
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("start trigger error: %w", err)
|
||||
}
|
||||
}
|
||||
return &NodeGroup{
|
||||
t: triggers,
|
||||
h: handlers,
|
||||
},
|
||||
nil
|
||||
}
|
||||
40
boot/panel.go
Normal file
40
boot/panel.go
Normal file
@@ -0,0 +1,40 @@
|
||||
package boot
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/InazumaV/Ratte-Interface/panel"
|
||||
"github.com/InazumaV/Ratte/conf"
|
||||
log "github.com/sirupsen/logrus"
|
||||
"os/exec"
|
||||
)
|
||||
|
||||
type PanelGroup map[string]*panel.PluginClient
|
||||
|
||||
func (p *PanelGroup) Get(name string) *panel.PluginClient {
|
||||
if pl, ok := (*p)[name]; ok {
|
||||
return pl
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (p *PanelGroup) Close() error {
|
||||
for _, pl := range *p {
|
||||
err := pl.Close()
|
||||
if err != nil {
|
||||
log.WithError(err).Warn()
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func initPanels(panelsP []conf.Plugin) (PanelGroup, error) {
|
||||
panels := make(PanelGroup, len(panelsP))
|
||||
for _, p := range panelsP {
|
||||
pn, err := panel.NewClient(nil, exec.Command(p.Path))
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("new panel error: %w", err)
|
||||
}
|
||||
panels[p.Name] = pn
|
||||
}
|
||||
return panels, nil
|
||||
}
|
||||
72
boot/wire_gen.go
Normal file
72
boot/wire_gen.go
Normal file
@@ -0,0 +1,72 @@
|
||||
// Code generated by Wire. DO NOT EDIT.
|
||||
|
||||
//go:generate go run -mod=mod github.com/google/wire/cmd/wire
|
||||
//go:build !wireinject
|
||||
// +build !wireinject
|
||||
|
||||
package boot
|
||||
|
||||
import (
|
||||
"github.com/InazumaV/Ratte/conf"
|
||||
"github.com/google/wire"
|
||||
)
|
||||
|
||||
// Injectors from boot.go:
|
||||
|
||||
func InitBoot(c *conf.Conf) (*Boot, error) {
|
||||
v := c.Acme
|
||||
acmeGroup := initAcme(v)
|
||||
plugins := c.Plugin
|
||||
v2 := plugins.Core
|
||||
coreGroup, err := initCores(v2)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
v3 := plugins.Panel
|
||||
panelGroup, err := initPanels(v3)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
v4 := c.Node
|
||||
nodeGroup, err := initNode(v4, acmeGroup, coreGroup, panelGroup)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
boot := &Boot{
|
||||
Acmes: acmeGroup,
|
||||
Cores: coreGroup,
|
||||
Panels: panelGroup,
|
||||
Node: nodeGroup,
|
||||
}
|
||||
return boot, nil
|
||||
}
|
||||
|
||||
// boot.go:
|
||||
|
||||
var preSet = wire.NewSet(wire.FieldsOf(new(*conf.Conf), "ACME", "Plugin"), wire.FieldsOf(new(conf.Plugins), "Core", "Panel"), initAcme,
|
||||
initCores,
|
||||
initPanels,
|
||||
)
|
||||
|
||||
var mainSet = wire.NewSet(wire.FieldsOf(new(*conf.Conf), "Node"), initNode)
|
||||
|
||||
type Boot struct {
|
||||
Acmes AcmeGroup
|
||||
Cores CoreGroup
|
||||
Panels PanelGroup
|
||||
Node *NodeGroup
|
||||
}
|
||||
|
||||
func (b *Boot) Start() error {
|
||||
if err := b.Node.Start(); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (b *Boot) Close() error {
|
||||
b.Node.Close()
|
||||
b.Cores.Close()
|
||||
b.Panels.Close()
|
||||
return nil
|
||||
}
|
||||
215
cmd/ratte/run.go
215
cmd/ratte/run.go
@@ -1,17 +1,11 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/InazumaV/Ratte-Interface/core"
|
||||
"github.com/InazumaV/Ratte-Interface/panel"
|
||||
"github.com/InazumaV/Ratte/acme"
|
||||
"github.com/InazumaV/Ratte/boot"
|
||||
"github.com/InazumaV/Ratte/conf"
|
||||
"github.com/InazumaV/Ratte/handler"
|
||||
"github.com/InazumaV/Ratte/trigger"
|
||||
log "github.com/sirupsen/logrus"
|
||||
"github.com/spf13/cobra"
|
||||
"os"
|
||||
"os/exec"
|
||||
"os/signal"
|
||||
"runtime"
|
||||
"syscall"
|
||||
@@ -32,14 +26,6 @@ func init() {
|
||||
command.AddCommand(&runCommand)
|
||||
}
|
||||
|
||||
var (
|
||||
cores map[string]*core.PluginClient
|
||||
panels map[string]*panel.PluginClient
|
||||
acmes map[string]*acme.Acme
|
||||
handlers []*handler.Handler
|
||||
triggers []*trigger.Trigger
|
||||
)
|
||||
|
||||
func runHandle(_ *cobra.Command, _ []string) {
|
||||
c := conf.New(config)
|
||||
log.WithField("path", config).Info("Load config...")
|
||||
@@ -49,74 +35,36 @@ func runHandle(_ *cobra.Command, _ []string) {
|
||||
}
|
||||
log.WithField("path", config).Info("Loaded.")
|
||||
|
||||
log.Info("Init core plugin...")
|
||||
err = startCores(c.Plugin.Core, c.Core)
|
||||
log.Info("Init...")
|
||||
b, err := boot.InitBoot(c)
|
||||
if err != nil {
|
||||
log.WithError(err).Fatal("Init core plugin failed")
|
||||
log.WithError(err).Fatal("Init failed")
|
||||
}
|
||||
log.Info("Done.")
|
||||
log.Info("Init done.")
|
||||
|
||||
log.Info("Init panel plugin...")
|
||||
err = startPanel(c.Plugin.Panel)
|
||||
log.Info("Start...")
|
||||
err = b.Start()
|
||||
if err != nil {
|
||||
log.WithError(err).Fatal("Init panel plugin failed")
|
||||
log.WithError(err).Fatal("Start failed")
|
||||
}
|
||||
log.Info("Done.")
|
||||
|
||||
log.Info("Init acme...")
|
||||
// new acme
|
||||
acmes = make(map[string]*acme.Acme)
|
||||
for _, a := range c.Acme {
|
||||
ac, err := acme.NewAcme(&a)
|
||||
if err != nil {
|
||||
log.WithError(err).Fatal("New acme failed")
|
||||
}
|
||||
acmes[a.Name] = ac
|
||||
}
|
||||
log.Info("Done.")
|
||||
|
||||
log.Info("Starting...")
|
||||
// new node
|
||||
err = startTriggerAndHandler(c.Node)
|
||||
if err != nil {
|
||||
log.WithError(err).Fatal("Start trigger and handler failed")
|
||||
}
|
||||
log.Info("Started.")
|
||||
|
||||
c.SetErrorHandler(func(err error) {
|
||||
log.WithFields(map[string]interface{}{
|
||||
"error": err,
|
||||
"Services": "ConfWatcher",
|
||||
}).Error("")
|
||||
}).Error("watch config error")
|
||||
})
|
||||
c.SetEventHandler(func(event uint, target ...string) {
|
||||
l := log.WithFields(map[string]interface{}{
|
||||
"Service": "ConfWatcher",
|
||||
})
|
||||
l.Info("Config changed, restart...")
|
||||
err := closeTriggerAndHandler()
|
||||
b, err := boot.InitBoot(c)
|
||||
if err != nil {
|
||||
log.WithError(err).Fatal("Close trigger and handler failed")
|
||||
l.WithError(err).Fatal("Init boot failed")
|
||||
}
|
||||
err = closeCore()
|
||||
err = b.Start()
|
||||
if err != nil {
|
||||
log.WithError(err).Fatal("Close core failed")
|
||||
}
|
||||
err = closePanel()
|
||||
if err != nil {
|
||||
log.WithError(err).Fatal("Close panel failed")
|
||||
}
|
||||
err = startCores(c.Plugin.Core, c.Core)
|
||||
if err != nil {
|
||||
log.WithError(err).Fatal("Start core failed")
|
||||
}
|
||||
err = startPanel(c.Plugin.Panel)
|
||||
if err != nil {
|
||||
log.WithError(err).Fatal("Start panel failed")
|
||||
}
|
||||
err = startTriggerAndHandler(c.Node)
|
||||
if err != nil {
|
||||
log.WithError(err).Fatal("Start trigger and handler failed")
|
||||
l.WithError(err).Fatal("Start boot failed")
|
||||
}
|
||||
l.Info("Restart Done.")
|
||||
})
|
||||
@@ -124,145 +72,14 @@ func runHandle(_ *cobra.Command, _ []string) {
|
||||
if err != nil {
|
||||
log.WithError(err).Fatal("Watch config failed")
|
||||
}
|
||||
log.Info("Start done.")
|
||||
|
||||
runtime.GC()
|
||||
sig := make(chan os.Signal, 0)
|
||||
sig := make(chan os.Signal)
|
||||
signal.Notify(sig, syscall.SIGINT, syscall.SIGKILL, syscall.SIGTERM)
|
||||
<-sig
|
||||
// clear
|
||||
log.Info("Shutting down...")
|
||||
err = closeTriggerAndHandler()
|
||||
if err != nil {
|
||||
log.WithError(err).Fatal("Close trigger and handler failed")
|
||||
}
|
||||
err = closeCore()
|
||||
if err != nil {
|
||||
log.WithError(err).Fatal("Close core failed")
|
||||
}
|
||||
err = closePanel()
|
||||
if err != nil {
|
||||
log.WithError(err).Fatal("Close panel failed")
|
||||
}
|
||||
b.Close()
|
||||
log.Info("Done.")
|
||||
}
|
||||
|
||||
func startCores(coresP []conf.Plugin, cc []conf.Core) error {
|
||||
// new cores
|
||||
cores = make(map[string]*core.PluginClient, len(coresP))
|
||||
for _, ccV := range cc {
|
||||
for _, co := range coresP {
|
||||
if co.Name != ccV.Type {
|
||||
continue
|
||||
}
|
||||
c, err := core.NewClient(nil, exec.Command(co.Path))
|
||||
if err != nil {
|
||||
return fmt.Errorf("new core error: %w", err)
|
||||
}
|
||||
err = c.Start(ccV.DataPath, ccV.Config)
|
||||
if err != nil {
|
||||
return fmt.Errorf("start core error: %w", err)
|
||||
}
|
||||
cores[co.Name] = c
|
||||
break
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func closeCore() error {
|
||||
for _, c := range cores {
|
||||
err := c.Close()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func startPanel(panelsP []conf.Plugin) error {
|
||||
panels = make(map[string]*panel.PluginClient, len(panelsP))
|
||||
for _, p := range panelsP {
|
||||
pn, err := panel.NewClient(nil, exec.Command(p.Path))
|
||||
if err != nil {
|
||||
return fmt.Errorf("new panel error: %w", err)
|
||||
}
|
||||
panels[p.Name] = pn
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func closePanel() error {
|
||||
for _, p := range panels {
|
||||
err := p.Close()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func startTriggerAndHandler(c []conf.Node) error {
|
||||
triggers = make([]*trigger.Trigger, 0, len(c))
|
||||
handlers = make([]*handler.Handler, 0, len(c))
|
||||
for _, nd := range c {
|
||||
var co core.Core
|
||||
if c, ok := cores[nd.Options.Core]; ok {
|
||||
co = c
|
||||
} else {
|
||||
return fmt.Errorf("unknown core name: %s", nd.Options.Core)
|
||||
}
|
||||
var pl panel.Panel
|
||||
if p, ok := panels[nd.Options.Panel]; ok {
|
||||
pl = p
|
||||
} else {
|
||||
return fmt.Errorf("")
|
||||
}
|
||||
var ac *acme.Acme
|
||||
if len(acmes) != 0 {
|
||||
if a, ok := acmes[nd.Options.Acme]; ok {
|
||||
ac = a
|
||||
} else {
|
||||
return fmt.Errorf("unknown acme name: %s", nd.Options.Acme)
|
||||
}
|
||||
}
|
||||
|
||||
h := handler.New(co, pl, nd.Name, ac, log.WithFields(
|
||||
map[string]interface{}{
|
||||
"node": nd.Name,
|
||||
"service": "handler",
|
||||
},
|
||||
), &nd.Options)
|
||||
handlers = append(handlers, h)
|
||||
tr, err := trigger.NewTrigger(log.WithFields(
|
||||
map[string]interface{}{
|
||||
"node": nd.Name,
|
||||
"service": "trigger",
|
||||
},
|
||||
), &nd.Trigger, h, pl, &nd.Remote)
|
||||
if err != nil {
|
||||
return fmt.Errorf("new trigger error: %w", err)
|
||||
}
|
||||
triggers = append(triggers, tr)
|
||||
err = tr.Start()
|
||||
if err != nil {
|
||||
return fmt.Errorf("start trigger error: %w", err)
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func closeTriggerAndHandler() error {
|
||||
for _, t := range triggers {
|
||||
err := t.Close()
|
||||
if err != nil {
|
||||
return fmt.Errorf("close trigger error: %w", err)
|
||||
}
|
||||
}
|
||||
for _, h := range handlers {
|
||||
err := h.Close()
|
||||
if err != nil {
|
||||
return fmt.Errorf("close handler error: %w", err)
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
48
common/starter/starter.go
Normal file
48
common/starter/starter.go
Normal file
@@ -0,0 +1,48 @@
|
||||
package starter
|
||||
|
||||
import "github.com/hashicorp/go-multierror"
|
||||
|
||||
type Starter interface {
|
||||
Start() error
|
||||
Close() error
|
||||
}
|
||||
|
||||
type Group struct {
|
||||
Starters []Starter
|
||||
}
|
||||
|
||||
func NewGroup(starters ...Starter) *Group {
|
||||
return &Group{
|
||||
Starters: starters,
|
||||
}
|
||||
}
|
||||
|
||||
func (g *Group) Add(starter Starter) {
|
||||
g.Starters = append(g.Starters, starter)
|
||||
}
|
||||
|
||||
func (g *Group) Clear(len int) {
|
||||
g.Starters = nil
|
||||
}
|
||||
|
||||
func (g *Group) Start() error {
|
||||
for _, starter := range g.Starters {
|
||||
if err := starter.Start(); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (g *Group) Close() error {
|
||||
var errs error
|
||||
for i := len(g.Starters) - 1; i >= 0; i-- {
|
||||
if err := g.Starters[i].Close(); err != nil {
|
||||
errs = multierror.Append(errs, err)
|
||||
}
|
||||
}
|
||||
if errs != nil {
|
||||
return errs
|
||||
}
|
||||
return nil
|
||||
}
|
||||
@@ -22,7 +22,6 @@ type Conf struct {
|
||||
Log Log `json:"Log,omitempty"`
|
||||
Watcher Watcher `json:"Watcher,omitempty"`
|
||||
Plugin Plugins `json:"Plugin,omitempty"` // Only accept from file path
|
||||
Core []Core `json:"Core,omitempty"`
|
||||
Acme []ACME `json:"Acme,omitempty"`
|
||||
Node []Node `json:"Node,omitempty"`
|
||||
}
|
||||
@@ -35,7 +34,6 @@ func New(path string) *Conf {
|
||||
WatchRemoteConfig: true,
|
||||
},
|
||||
Log: newLog(),
|
||||
Core: make([]Core, 0),
|
||||
Acme: make([]ACME, 0),
|
||||
Plugin: Plugins{},
|
||||
Node: make([]Node, 0),
|
||||
|
||||
@@ -23,7 +23,7 @@ type Remote struct {
|
||||
}
|
||||
|
||||
type Options struct {
|
||||
Core string `json:"Core"`
|
||||
Core string `json:"CorePlugin"`
|
||||
Panel string `json:"Panel"`
|
||||
Acme string `json:"Acme"`
|
||||
Cert Cert `json:"Cert"`
|
||||
|
||||
@@ -5,14 +5,14 @@ import (
|
||||
"github.com/goccy/go-json"
|
||||
)
|
||||
|
||||
type Core struct {
|
||||
Type string `json:"type"`
|
||||
type CorePlugin struct {
|
||||
DataPath string `json:"DataPath,omitempty"`
|
||||
Config json.RawMessage `json:"Config,omitempty"`
|
||||
Plugin
|
||||
}
|
||||
type _core Core
|
||||
type _core CorePlugin
|
||||
|
||||
func (c *Core) UnmarshalJSON(data []byte) error {
|
||||
func (c *CorePlugin) UnmarshalJSON(data []byte) error {
|
||||
err := json.Unmarshal(data, (*_core)(c))
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to unmarshal core: %v", err)
|
||||
@@ -20,12 +20,17 @@ func (c *Core) UnmarshalJSON(data []byte) error {
|
||||
if len(c.Config) == 0 {
|
||||
c.Config = data
|
||||
}
|
||||
|
||||
err = json.Unmarshal(c.Config, &c.Plugin)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to unmarshal core config: %v", err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
type Plugins struct {
|
||||
Core []Plugin `json:"core"`
|
||||
Panel []Plugin `json:"panel"`
|
||||
Core []CorePlugin `json:"core"`
|
||||
Panel []Plugin `json:"panel"`
|
||||
}
|
||||
|
||||
type Plugin struct {
|
||||
|
||||
7
go.mod
7
go.mod
@@ -6,10 +6,13 @@ toolchain go1.24.2
|
||||
|
||||
require (
|
||||
github.com/InazumaV/Ratte-Core-Xray v0.0.0-20250420021044-42b0d35bcd79
|
||||
github.com/InazumaV/Ratte-Interface v0.0.0-20250505045058-84e4bf9f70e4
|
||||
github.com/InazumaV/Ratte-Interface v0.0.0-20250505045848-a0068c2a9be9
|
||||
github.com/InazumaV/Ratte-Panel-V2b v0.0.0-20250420013203-72f8abe3e919
|
||||
github.com/fsnotify/fsnotify v1.7.0
|
||||
github.com/go-acme/lego/v4 v4.18.0
|
||||
github.com/goccy/go-json v0.10.3
|
||||
github.com/google/wire v0.6.0
|
||||
github.com/hashicorp/go-multierror v1.1.1
|
||||
github.com/orcaman/concurrent-map/v2 v2.0.1
|
||||
github.com/robfig/cron/v3 v3.0.1
|
||||
github.com/sirupsen/logrus v1.9.3
|
||||
@@ -37,7 +40,6 @@ require (
|
||||
github.com/Azure/go-autorest/logger v0.2.1 // indirect
|
||||
github.com/Azure/go-autorest/tracing v0.6.0 // indirect
|
||||
github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 // indirect
|
||||
github.com/InazumaV/Ratte-Panel-V2b v0.0.0-20250420013203-72f8abe3e919 // indirect
|
||||
github.com/OpenDNS/vegadns2client v0.0.0-20180418235048-a3fa4a771d87 // indirect
|
||||
github.com/akamai/AkamaiOPEN-edgegrid-golang v1.2.2 // indirect
|
||||
github.com/aliyun/alibaba-cloud-sdk-go v1.62.712 // indirect
|
||||
@@ -100,7 +102,6 @@ require (
|
||||
github.com/hashicorp/errwrap v1.0.0 // indirect
|
||||
github.com/hashicorp/go-cleanhttp v0.5.2 // indirect
|
||||
github.com/hashicorp/go-hclog v1.6.3 // indirect
|
||||
github.com/hashicorp/go-multierror v1.1.1 // indirect
|
||||
github.com/hashicorp/go-plugin v1.6.1 // indirect
|
||||
github.com/hashicorp/go-retryablehttp v0.7.7 // indirect
|
||||
github.com/hashicorp/go-uuid v1.0.3 // indirect
|
||||
|
||||
29
go.sum
29
go.sum
@@ -61,18 +61,10 @@ github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2/go.mod h1:wP83
|
||||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
||||
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
|
||||
github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo=
|
||||
github.com/InazumaV/Ratte-Core-Xray v0.0.0-20250420011040-52d1e89f5633 h1:qkKD34l8OoRQIu0eQA0ddYgFIt7qtuhbUT4aNOJiY8Y=
|
||||
github.com/InazumaV/Ratte-Core-Xray v0.0.0-20250420011040-52d1e89f5633/go.mod h1:ny/t4EsGaUHQMgCl99bAQ2WdXcg2k3exlaE9HxvU8aA=
|
||||
github.com/InazumaV/Ratte-Core-Xray v0.0.0-20250420011803-b1920b6e161d h1:rZ8GsMw8sn9Ip9DdAkUPm/iWuoLwAMeWQg2IgWFKeiU=
|
||||
github.com/InazumaV/Ratte-Core-Xray v0.0.0-20250420011803-b1920b6e161d/go.mod h1:ny/t4EsGaUHQMgCl99bAQ2WdXcg2k3exlaE9HxvU8aA=
|
||||
github.com/InazumaV/Ratte-Core-Xray v0.0.0-20250420015806-459021c808f7 h1:+Lq4O0LMR00QYlmDwdGr/BToRoFEaAtpFqMG5XzyXkQ=
|
||||
github.com/InazumaV/Ratte-Core-Xray v0.0.0-20250420015806-459021c808f7/go.mod h1:GGt1mWh9rdkPD9jT/iKM170Oqk1xm8s1ujH+QIW1nGk=
|
||||
github.com/InazumaV/Ratte-Core-Xray v0.0.0-20250420021044-42b0d35bcd79 h1:PruEu6rjkVS0k877MzT5DdHxYdxoRtfotrr/e5XNofA=
|
||||
github.com/InazumaV/Ratte-Core-Xray v0.0.0-20250420021044-42b0d35bcd79/go.mod h1:GGt1mWh9rdkPD9jT/iKM170Oqk1xm8s1ujH+QIW1nGk=
|
||||
github.com/InazumaV/Ratte-Interface v0.0.0-20250420010428-f7d66abcc4f6 h1:JCFwQG45pQAo33l3/msmeo9v0/XWQCNofCqubAopWto=
|
||||
github.com/InazumaV/Ratte-Interface v0.0.0-20250420010428-f7d66abcc4f6/go.mod h1:UxqxslbpT8Q4qMldSNI6VCX5WFXWDbvE4fXpymp73kA=
|
||||
github.com/InazumaV/Ratte-Interface v0.0.0-20250505045058-84e4bf9f70e4 h1:0xrpixO7Ux3EAHqitA8JgxOqM28I7RGyXa3+yEacXCk=
|
||||
github.com/InazumaV/Ratte-Interface v0.0.0-20250505045058-84e4bf9f70e4/go.mod h1:UxqxslbpT8Q4qMldSNI6VCX5WFXWDbvE4fXpymp73kA=
|
||||
github.com/InazumaV/Ratte-Interface v0.0.0-20250505045848-a0068c2a9be9 h1:+adxGP0iY0EYP8iuva/q0IUgUSwIBEz8ZXWVuW8PTTA=
|
||||
github.com/InazumaV/Ratte-Interface v0.0.0-20250505045848-a0068c2a9be9/go.mod h1:UxqxslbpT8Q4qMldSNI6VCX5WFXWDbvE4fXpymp73kA=
|
||||
github.com/InazumaV/Ratte-Panel-V2b v0.0.0-20250420013203-72f8abe3e919 h1:+Fp5s8BVpk3vQC7N/x3a6sTRZNSU8Jd8G4MenyLnK3g=
|
||||
github.com/InazumaV/Ratte-Panel-V2b v0.0.0-20250420013203-72f8abe3e919/go.mod h1:5EkRRTlqZqG3rp3aP6QiPlrPJKpWtwt5gBtJduFv35E=
|
||||
github.com/OmarTariq612/goech v0.0.0-20240405204721-8e2e1dafd3a0 h1:Wo41lDOevRJSGpevP+8Pk5bANX7fJacO2w04aqLiC5I=
|
||||
@@ -324,11 +316,14 @@ github.com/google/pprof v0.0.0-20240528025155-186aa0362fba/go.mod h1:K1liHPHnj73
|
||||
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
|
||||
github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o=
|
||||
github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw=
|
||||
github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk=
|
||||
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
|
||||
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||
github.com/google/wire v0.6.0 h1:HBkoIh4BdSxoyo9PveV8giw7ZsaBOvzWKfcg/6MrVwI=
|
||||
github.com/google/wire v0.6.0/go.mod h1:F4QhpQ9EDIdJ1Mbop/NZBRB+5yrR6qg3BnctaoUk6NA=
|
||||
github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs=
|
||||
github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0=
|
||||
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
|
||||
@@ -805,8 +800,10 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y
|
||||
golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
||||
golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
||||
golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58=
|
||||
golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc=
|
||||
golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4=
|
||||
golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4=
|
||||
golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg=
|
||||
golang.org/x/crypto v0.36.0 h1:AnAEvhDddvBdpY+uR+MyHmuZzzNqXSe/GvuDeob5L34=
|
||||
golang.org/x/crypto v0.36.0/go.mod h1:Y4J0ReaxCR1IMaabaSMugxJES1EpwhBHhv2bDHklZvc=
|
||||
golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||
@@ -838,6 +835,8 @@ golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
|
||||
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
|
||||
golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
|
||||
golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
|
||||
golang.org/x/mod v0.21.0 h1:vvrHzRwRfVKSiLrG+d4FMl/Qi4ukBCE6kZlTUkDYRT0=
|
||||
golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY=
|
||||
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
@@ -870,7 +869,9 @@ golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su
|
||||
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
|
||||
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
|
||||
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
|
||||
golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk=
|
||||
golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
|
||||
golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY=
|
||||
golang.org/x/net v0.37.0 h1:1zLorHbz+LYj7MQlSf1+2tPIIgibq2eL5xkrGk6f+2c=
|
||||
golang.org/x/net v0.37.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8=
|
||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||
@@ -890,6 +891,8 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ
|
||||
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
|
||||
golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
|
||||
golang.org/x/sync v0.12.0 h1:MHc5BpPuC30uJk597Ri8TV3CNZcTLu6B6z4lJy+g6Jw=
|
||||
golang.org/x/sync v0.12.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
|
||||
golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
@@ -945,8 +948,10 @@ golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||
golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||
golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik=
|
||||
golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
|
||||
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
|
||||
@@ -954,8 +959,10 @@ golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9sn
|
||||
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
||||
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
|
||||
golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
|
||||
golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU=
|
||||
golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U=
|
||||
golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0=
|
||||
golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY=
|
||||
golang.org/x/term v0.30.0 h1:PQ39fJZ+mfadBm0y5WlL4vlM7Sx1Hgf13sMIY2+QS9Y=
|
||||
golang.org/x/term v0.30.0/go.mod h1:NYYFdzHoI5wRh/h5tDMdMqCqPJZEuNqVR5xJLd/n67g=
|
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
@@ -1007,6 +1014,8 @@ golang.org/x/tools v0.0.0-20210114065538-d78b04bdf963/go.mod h1:emZCQorbCU4vsT4f
|
||||
golang.org/x/tools v0.1.6-0.20210726203631-07bc1bf47fb2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
||||
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
|
||||
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
|
||||
golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58=
|
||||
golang.org/x/tools v0.17.0/go.mod h1:xsh6VxdV005rRVaS6SSAf9oiAqljS7UZUacMZ8Bnsps=
|
||||
golang.org/x/tools v0.26.0 h1:v/60pFQmzmT9ExmjDv2gGIfi3OqfKoEP6I5+umXlbnQ=
|
||||
golang.org/x/tools v0.26.0/go.mod h1:TPVVj70c7JJ3WCazhD8OdXcZg/og+b9+tH/KxylGwH0=
|
||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
|
||||
@@ -21,7 +21,7 @@ type Trigger struct {
|
||||
order chan int
|
||||
}
|
||||
|
||||
func NewTrigger(
|
||||
func New(
|
||||
l *logrus.Entry,
|
||||
tc *conf.Trigger,
|
||||
h *handler.Handler,
|
||||
|
||||
Reference in New Issue
Block a user