All checks were successful
Build Multi-Platform Binaries / build-frontend (push) Successful in 38s
Build Multi-Platform Binaries / build-binaries (amd64, linux, client, true) (push) Successful in 1m47s
Build Multi-Platform Binaries / build-binaries (amd64, darwin, server, false) (push) Successful in 1m48s
Build Multi-Platform Binaries / build-binaries (amd64, windows, client, true) (push) Successful in 1m29s
Build Multi-Platform Binaries / build-binaries (amd64, linux, server, true) (push) Successful in 1m53s
Build Multi-Platform Binaries / build-binaries (arm, 7, linux, client, true) (push) Successful in 1m14s
Build Multi-Platform Binaries / build-binaries (amd64, windows, server, true) (push) Successful in 1m40s
Build Multi-Platform Binaries / build-binaries (arm64, darwin, server, false) (push) Successful in 1m36s
Build Multi-Platform Binaries / build-binaries (arm, 7, linux, server, true) (push) Successful in 1m51s
Build Multi-Platform Binaries / build-binaries (arm64, linux, client, true) (push) Successful in 1m17s
Build Multi-Platform Binaries / build-binaries (arm64, linux, server, true) (push) Successful in 1m50s
Build Multi-Platform Binaries / build-binaries (arm64, windows, server, false) (push) Successful in 1m18s
- 在WebServer中添加TrafficStore存储接口 - 将Web配置从根级别移动到Server.Web子结构下 - 移除Web配置中的BindAddr字段并调整默认值逻辑 - 在前端HomeView中替换模拟流量数据显示真实统计数据 - 添加流量统计API接口(/traffic/stats和/traffic/hourly) - 实现SQLite数据库流量统计表创建和CRUD操作 - 在Relay包中添加带流量统计的数据转发功能 - 在设置页面添加服务器配置编辑和保存功能 - 创建流量统计处理器和相关数据模型定义
102 lines
3.7 KiB
Go
102 lines
3.7 KiB
Go
package handler
|
|
|
|
import (
|
|
"github.com/gotunnel/internal/server/config"
|
|
"github.com/gotunnel/internal/server/db"
|
|
"github.com/gotunnel/pkg/protocol"
|
|
)
|
|
|
|
// AppInterface 应用接口
|
|
type AppInterface interface {
|
|
GetClientStore() db.ClientStore
|
|
GetServer() ServerInterface
|
|
GetConfig() *config.ServerConfig
|
|
GetConfigPath() string
|
|
SaveConfig() error
|
|
GetJSPluginStore() db.JSPluginStore
|
|
GetTrafficStore() db.TrafficStore
|
|
}
|
|
|
|
// ServerInterface 服务端接口
|
|
type ServerInterface interface {
|
|
GetClientStatus(clientID string) (online bool, lastPing, remoteAddr, clientOS, clientArch string)
|
|
GetAllClientStatus() map[string]struct {
|
|
Online bool
|
|
LastPing string
|
|
RemoteAddr string
|
|
OS string
|
|
Arch string
|
|
}
|
|
ReloadConfig() error
|
|
GetBindAddr() string
|
|
GetBindPort() int
|
|
PushConfigToClient(clientID string) error
|
|
DisconnectClient(clientID string) error
|
|
GetPluginList() []PluginInfo
|
|
EnablePlugin(name string) error
|
|
DisablePlugin(name string) error
|
|
InstallPluginsToClient(clientID string, plugins []string) error
|
|
GetPluginConfigSchema(name string) ([]ConfigField, error)
|
|
SyncPluginConfigToClient(clientID string, pluginName string, config map[string]string) error
|
|
InstallJSPluginToClient(clientID string, req JSPluginInstallRequest) error
|
|
RestartClient(clientID string) error
|
|
StartClientPlugin(clientID, pluginID, pluginName, ruleName string) error
|
|
StopClientPlugin(clientID, pluginID, pluginName, ruleName string) error
|
|
RestartClientPlugin(clientID, pluginID, pluginName, ruleName string) error
|
|
UpdateClientPluginConfig(clientID, pluginID, pluginName, ruleName string, config map[string]string, restart bool) error
|
|
SendUpdateToClient(clientID, downloadURL string) error
|
|
// 日志流
|
|
StartClientLogStream(clientID, sessionID string, lines int, follow bool, level string) (<-chan protocol.LogEntry, error)
|
|
StopClientLogStream(sessionID string)
|
|
// 插件状态查询
|
|
GetClientPluginStatus(clientID string) ([]protocol.PluginStatusEntry, error)
|
|
// 插件规则管理
|
|
StartPluginRule(clientID string, rule protocol.ProxyRule) error
|
|
StopPluginRule(clientID string, remotePort int) error
|
|
// 端口检查
|
|
IsPortAvailable(port int, excludeClientID string) bool
|
|
// 插件 API 代理
|
|
ProxyPluginAPIRequest(clientID string, req protocol.PluginAPIRequest) (*protocol.PluginAPIResponse, error)
|
|
}
|
|
|
|
// ConfigField 配置字段
|
|
type ConfigField struct {
|
|
Key string `json:"key"`
|
|
Label string `json:"label"`
|
|
Type string `json:"type"`
|
|
Default string `json:"default,omitempty"`
|
|
Required bool `json:"required,omitempty"`
|
|
Options []string `json:"options,omitempty"`
|
|
Description string `json:"description,omitempty"`
|
|
}
|
|
|
|
// RuleSchema 规则表单模式
|
|
type RuleSchema struct {
|
|
NeedsLocalAddr bool `json:"needs_local_addr"`
|
|
ExtraFields []ConfigField `json:"extra_fields,omitempty"`
|
|
}
|
|
|
|
// PluginInfo 插件信息
|
|
type PluginInfo struct {
|
|
Name string `json:"name"`
|
|
Version string `json:"version"`
|
|
Type string `json:"type"`
|
|
Description string `json:"description"`
|
|
Source string `json:"source"`
|
|
Icon string `json:"icon,omitempty"`
|
|
Enabled bool `json:"enabled"`
|
|
RuleSchema *RuleSchema `json:"rule_schema,omitempty"`
|
|
}
|
|
|
|
// JSPluginInstallRequest JS 插件安装请求
|
|
type JSPluginInstallRequest struct {
|
|
PluginID string `json:"plugin_id"`
|
|
PluginName string `json:"plugin_name"`
|
|
Source string `json:"source"`
|
|
Signature string `json:"signature"`
|
|
RuleName string `json:"rule_name"`
|
|
RemotePort int `json:"remote_port"`
|
|
Config map[string]string `json:"config"`
|
|
AutoStart bool `json:"auto_start"`
|
|
}
|