Initial commit

This commit is contained in:
Yuzuki616
2024-09-12 06:04:32 +09:00
commit 3f58fa7f0d
31 changed files with 2814 additions and 0 deletions

103
trigger/handle.go Normal file
View File

@@ -0,0 +1,103 @@
package trigger
import (
"fmt"
"github.com/robfig/cron/v3"
)
func (t *Trigger) addCronHandle(cron any, job cron.FuncJob) (cron.EntryID, error) {
switch cron.(type) {
case string:
return t.c.AddJob(cron.(string), job)
case int:
return t.c.Schedule(newSchedule(cron.(int)), job), nil
default:
return 0, fmt.Errorf("unknown cron type: %T", cron)
}
}
func (t *Trigger) hashEqualsOrStore(name, hash string) bool {
if h, ok := t.hashs[name]; ok {
if h == hash {
return true
}
t.hashs[name] = hash
} else {
t.hashs[name] = hash
}
return false
}
func (t *Trigger) pullNodeHandle() {
t.l.Info("Run pull node task...")
defer t.l.Info("Run pull node task done.")
// get node info
nn := t.p.GetNodeInfo(t.remoteId)
if nn.Err != nil {
t.l.WithError(nn.Err).Error("Get node info failed")
return
}
if t.hashEqualsOrStore("pullNode", nn.GetHash()) {
t.l.Debug("Node is not changed, skip")
return
}
t.l.Debug("Node is changed, triggering handler...")
// update node handler
err := t.h.PullNodeHandle(&nn.NodeInfo)
if err != nil {
t.l.WithError(err).Error("Pull node failed")
return
}
// done
t.l.Debug("trigger handler done.")
}
func (t *Trigger) pullUserHandle() {
t.l.Info("Run pull user task...")
defer t.l.Info("Run pull user task done.")
// get user info
nu := t.p.GetUserList(t.remoteId)
if nu.Err != nil {
t.l.WithError(nu.Err).Error("Get user list failed")
return
}
if t.hashEqualsOrStore("pullUser", nu.GetHash()) {
t.l.Debug("Node is not changed, skip")
return
}
t.l.Debug("user list is changed, triggering handler...")
// triggering update user list handler
err := t.h.PullUserHandle(nu.Users)
if err != nil {
t.l.WithError(err).Error("Pull user handle failed")
return
}
// done
t.l.Debug("trigger handler done.")
}
func (t *Trigger) reportUserHandle() {
t.l.Info("Run report user task...")
defer t.l.Info("Run pull user task done.")
// triggering report user handler
err := t.h.ReportUserHandle()
if err != nil {
t.l.WithError(err).Error("Report user handle failed")
return
}
// done
}
func (t *Trigger) renewCertCron() {
t.l.Info("Run renew cert task...")
defer t.l.Info("Run renew cert task done.")
// triggering renew cert handler
err := t.h.RenewCertHandle()
if err != nil {
t.l.WithError(err).Error("Renew cert handle failed")
return
}
// done
}

17
trigger/schedule.go Normal file
View File

@@ -0,0 +1,17 @@
package trigger
import "time"
type Schedule struct {
interval int
}
func newSchedule(interval int) *Schedule {
return &Schedule{
interval: interval,
}
}
func (s *Schedule) Next(t time.Time) time.Time {
return t.Add(time.Duration(s.interval) * time.Second)
}

88
trigger/trigger.go Normal file
View File

@@ -0,0 +1,88 @@
package trigger
import (
"Ratte/conf"
"Ratte/handler"
"fmt"
"github.com/Yuzuki616/Ratte-Interface/panel"
"github.com/robfig/cron/v3"
"github.com/sirupsen/logrus"
)
type Trigger struct {
l *logrus.Entry
c *cron.Cron
h *handler.Handler
p panel.Panel
remoteId int
remoteC *conf.Remote
hashs map[string]string
}
func NewTrigger(
l *logrus.Entry,
tc *conf.Trigger,
h *handler.Handler,
p panel.Panel,
rm *conf.Remote,
) (*Trigger, error) {
tr := &Trigger{
l: l,
c: cron.New(),
h: h,
p: p,
remoteC: rm,
}
// add pull node cron task
_, err := tr.addCronHandle(tc.PullNodeCron, tr.pullNodeHandle)
if err != nil {
return nil, err
}
// add pull user cron task
_, err = tr.addCronHandle(tc.PullUserCron, tr.pullUserHandle)
if err != nil {
return nil, err
}
// add report user cron task
_, err = tr.addCronHandle(tc.ReportUserCron, tr.reportUserHandle)
if err != nil {
return nil, err
}
// add renew cert cron task
_, err = tr.addCronHandle(tc.RenewCertCron, tr.renewCertCron)
if err != nil {
return nil, err
}
return tr, nil
}
func (t *Trigger) Start() error {
r := t.remoteC
rsp := t.p.AddRemote(&panel.AddRemoteParams{
Baseurl: r.APIHost,
NodeId: r.NodeID,
NodeType: r.NodeType,
Timeout: r.Timeout,
})
if rsp.Err != nil {
return rsp.Err
}
t.remoteId = rsp.RemoteId
t.pullNodeHandle()
t.pullUserHandle()
t.c.Start()
return nil
}
func (t *Trigger) Close() error {
t.c.Stop()
err := t.p.DelRemote(t.remoteId)
if err != nil {
return fmt.Errorf("del remote err: %w", err)
}
return nil
}