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

11
handler/cert.go Normal file
View File

@@ -0,0 +1,11 @@
package handler
import "fmt"
func (h *Handler) RenewCertHandle() error {
err := h.acme.RenewCert(h.Options.Cert.CertPath, h.Options.Cert.KeyPath, h.Options.Cert.Domain)
if err != nil {
return fmt.Errorf("renew cert error: %w", err)
}
return nil
}

48
handler/handler.go Normal file
View File

@@ -0,0 +1,48 @@
package handler
import (
"Ratte/acme"
"Ratte/conf"
"github.com/sirupsen/logrus"
"sync/atomic"
)
import "github.com/Yuzuki616/Ratte-Interface/core"
import "github.com/Yuzuki616/Ratte-Interface/panel"
type Handler struct {
c core.Core
p panel.Panel
nodeName string
acme *acme.Acme
l *logrus.Entry
userList []panel.UserInfo
userHash map[string]struct{}
nodeAdded atomic.Bool
*conf.Options
}
func New(
c core.Core,
p panel.Panel,
nodeName string,
ac *acme.Acme,
l *logrus.Entry,
opts *conf.Options) *Handler {
return &Handler{
c: c,
p: p,
nodeName: nodeName,
userList: make([]panel.UserInfo, 0),
userHash: make(map[string]struct{}),
acme: ac,
l: l,
Options: opts,
}
}
func (h *Handler) Close() error {
if h.nodeAdded.Load() {
return h.c.DelNode(h.nodeName)
}
return nil
}

50
handler/node.go Normal file
View File

@@ -0,0 +1,50 @@
package handler
import (
"Ratte/common/maps"
"fmt"
"github.com/Yuzuki616/Ratte-Interface/core"
"github.com/Yuzuki616/Ratte-Interface/panel"
"github.com/Yuzuki616/Ratte-Interface/params"
)
func (h *Handler) PullNodeHandle(n *panel.NodeInfo) error {
if h.nodeAdded.Load() {
err := h.c.DelNode(h.nodeName)
if err != nil {
return fmt.Errorf("del node error: %w", err)
}
} else {
err := h.acme.CreateCert(h.Cert.CertPath, h.Cert.KeyPath, h.Cert.Domain)
if err != nil {
return fmt.Errorf("create cert error: %w", err)
}
}
err := h.c.AddNode(&core.AddNodeParams{
NodeInfo: core.NodeInfo{
CommonNodeInfo: params.CommonNodeInfo{
Type: n.Type,
VMess: n.VMess,
Shadowsocks: n.Shadowsocks,
Trojan: n.Trojan,
Hysteria: n.Hysteria,
Other: n.Other,
ExpandParams: params.ExpandParams{
OtherOptions: maps.Merge(n.OtherOptions, h.Expand),
CustomData: n.CustomData,
},
},
TlsOptions: core.TlsOptions{
CertPath: h.Cert.CertPath,
KeyPath: h.Cert.KeyPath,
},
},
})
if err != nil {
return fmt.Errorf("add node error: %w", err)
}
if h.nodeAdded.Load() {
h.nodeAdded.Store(true)
}
return nil
}

87
handler/user.go Normal file
View File

@@ -0,0 +1,87 @@
package handler
import (
"Ratte/common/slices"
"fmt"
"github.com/Yuzuki616/Ratte-Interface/core"
"github.com/Yuzuki616/Ratte-Interface/panel"
)
func compareUserList(old, new []panel.UserInfo) (deleted []string, added []panel.UserInfo) {
tmp := map[string]struct{}{}
tmp2 := map[string]struct{}{}
for i := range old {
tmp[old[i].GetHashOrKey()] = struct{}{}
}
l := len(tmp)
for i := range new {
e := new[i].GetHashOrKey()
tmp[e] = struct{}{}
tmp2[e] = struct{}{}
if l != len(tmp) {
added = append(added, new[i])
l++
}
}
tmp = nil
l = len(tmp2)
for i := range old {
tmp2[old[i].GetHashOrKey()] = struct{}{}
if l != len(tmp2) {
deleted = append(deleted, old[i].Name)
l++
}
}
return deleted, added
}
func (h *Handler) PullUserHandle(users []panel.UserInfo) error {
del, add := compareUserList(h.userList, users)
cas := slices.RangeToNew[panel.UserInfo, core.UserInfo](add, func(_ int, v panel.UserInfo) core.UserInfo {
return core.UserInfo(v.UserInfo)
})
err := h.c.AddUsers(&core.AddUsersParams{
NodeName: h.nodeName,
Users: cas,
})
if err != nil {
return fmt.Errorf("add user error: %w", err)
}
h.l.Infof("Added %d users", len(users))
err = h.c.DelUsers(&core.DelUsersParams{
NodeName: h.nodeName,
Users: del,
})
if err != nil {
return fmt.Errorf("del user error: %w", err)
}
h.l.Infof("Deleted %d users", len(users))
h.userList = users
return nil
}
func (h *Handler) ReportUserHandle(id int) error {
var err error
req := &core.GetUserTrafficParams{NodeName: h.nodeName}
var users []panel.UserTrafficInfo
slices.Range(h.userList, func(_ int, v panel.UserInfo) bool {
req.Username = v.Name
rsp := h.c.GetUserTraffic(req)
if rsp.Err != nil {
err = rsp.Err
return true
}
if rsp.Up == 0 && rsp.Down == 0 {
return false
}
return false
})
err = h.p.ReportUserTraffic(&panel.ReportUserTrafficParams{
Id: id,
Users: users,
})
if err != nil {
return fmt.Errorf("report user error: %w", err)
}
return nil
}