mirror of
https://github.com/InazumaV/Ratte.git
synced 2026-02-04 04:30:09 +00:00
Initial commit
This commit is contained in:
11
handler/cert.go
Normal file
11
handler/cert.go
Normal 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
48
handler/handler.go
Normal 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
50
handler/node.go
Normal 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
87
handler/user.go
Normal 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
|
||||
}
|
||||
Reference in New Issue
Block a user