mirror of
https://github.com/InazumaV/Ratte.git
synced 2026-02-04 04:30:09 +00:00
Initial commit
This commit is contained in:
103
trigger/handle.go
Normal file
103
trigger/handle.go
Normal 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
17
trigger/schedule.go
Normal 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
88
trigger/trigger.go
Normal 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
|
||||
}
|
||||
Reference in New Issue
Block a user