Files
trojanZ/trojan-master/web/controller/common.go
T
2026-07-26 00:09:57 +08:00

167 lines
4.1 KiB
Go

package controller
import (
"github.com/robfig/cron/v3"
"github.com/shirou/gopsutil/cpu"
"github.com/shirou/gopsutil/disk"
"github.com/shirou/gopsutil/load"
"github.com/shirou/gopsutil/mem"
"github.com/shirou/gopsutil/net"
"time"
"trojan/asset"
"trojan/core"
"trojan/trojan"
)
// ResponseBody 结构体
type ResponseBody struct {
Duration string
Data interface{}
Msg string
}
type speedInfo struct {
Up uint64
Down uint64
}
var si *speedInfo
// TimeCost web函数执行用时统计方法
func TimeCost(start time.Time, body *ResponseBody) {
body.Duration = time.Since(start).String()
}
func clashRules() string {
rules, _ := core.GetValue("clash-rules")
if rules == "" {
rules = string(asset.GetAsset("clash-rules.yaml"))
}
return rules
}
// Version 获取版本信息
func Version() *ResponseBody {
responseBody := ResponseBody{Msg: "success"}
defer TimeCost(time.Now(), &responseBody)
responseBody.Data = map[string]string{
"version": trojan.MVersion,
"buildDate": trojan.BuildDate,
"goVersion": trojan.GoVersion,
"gitVersion": trojan.GitVersion,
"trojanVersion": trojan.Version(),
"trojanUptime": trojan.UpTime(),
"trojanType": trojan.Type(),
}
return &responseBody
}
// SetLoginInfo 设置登录页信息
func SetLoginInfo(title string) *ResponseBody {
responseBody := ResponseBody{Msg: "success"}
defer TimeCost(time.Now(), &responseBody)
err := core.SetValue("login_title", title)
if err != nil {
responseBody.Msg = err.Error()
}
return &responseBody
}
// SetDomain 设置域名
func SetDomain(domain string) *ResponseBody {
responseBody := ResponseBody{Msg: "success"}
defer TimeCost(time.Now(), &responseBody)
trojan.SetDomain(domain)
return &responseBody
}
// SetClashRules 设置clash规则
func SetClashRules(rules string) *ResponseBody {
responseBody := ResponseBody{Msg: "success"}
defer TimeCost(time.Now(), &responseBody)
core.SetValue("clash-rules", rules)
return &responseBody
}
// ResetClashRules 重置clash规则
func ResetClashRules() *ResponseBody {
responseBody := ResponseBody{Msg: "success"}
defer TimeCost(time.Now(), &responseBody)
core.DelValue("clash-rules")
responseBody.Data = clashRules()
return &responseBody
}
// GetClashRules 获取clash规则
func GetClashRules() *ResponseBody {
responseBody := ResponseBody{Msg: "success"}
defer TimeCost(time.Now(), &responseBody)
responseBody.Data = clashRules()
return &responseBody
}
// SetTrojanType 设置trojan类型
func SetTrojanType(tType string) *ResponseBody {
responseBody := ResponseBody{Msg: "success"}
defer TimeCost(time.Now(), &responseBody)
err := trojan.SwitchType(tType)
if err != nil {
responseBody.Msg = err.Error()
}
return &responseBody
}
// CollectTask 启动收集主机信息任务
func CollectTask() {
var recvCount, sentCount uint64
c := cron.New()
lastIO, _ := net.IOCounters(true)
var lastRecvCount, lastSentCount uint64
for _, k := range lastIO {
lastRecvCount = lastRecvCount + k.BytesRecv
lastSentCount = lastSentCount + k.BytesSent
}
si = &speedInfo{}
c.AddFunc("@every 2s", func() {
result, _ := net.IOCounters(true)
recvCount, sentCount = 0, 0
for _, k := range result {
recvCount = recvCount + k.BytesRecv
sentCount = sentCount + k.BytesSent
}
si.Up = (sentCount - lastSentCount) / 2
si.Down = (recvCount - lastRecvCount) / 2
lastSentCount = sentCount
lastRecvCount = recvCount
lastIO = result
})
c.Start()
}
// ServerInfo 获取服务器信息
func ServerInfo() *ResponseBody {
responseBody := ResponseBody{Msg: "success"}
defer TimeCost(time.Now(), &responseBody)
cpuPercent, _ := cpu.Percent(0, false)
vmInfo, _ := mem.VirtualMemory()
smInfo, _ := mem.SwapMemory()
diskInfo, _ := disk.Usage("/")
loadInfo, _ := load.Avg()
tcpCon, _ := net.Connections("tcp")
udpCon, _ := net.Connections("udp")
netCount := map[string]int{
"tcp": len(tcpCon),
"udp": len(udpCon),
}
responseBody.Data = map[string]interface{}{
"cpu": cpuPercent,
"memory": vmInfo,
"swap": smInfo,
"disk": diskInfo,
"load": loadInfo,
"speed": si,
"netCount": netCount,
}
return &responseBody
}