重构前最后一份代码(bug较多,请勿使用)
This commit is contained in:
@@ -29,7 +29,7 @@ var (
|
||||
)
|
||||
|
||||
// ================================================================
|
||||
// frpc 二进制提取 (保持不变)
|
||||
// frpc 二进制提取
|
||||
// ================================================================
|
||||
|
||||
func getFrpcPath() (string, error) {
|
||||
@@ -94,7 +94,7 @@ func getFrpcPath() (string, error) {
|
||||
}
|
||||
|
||||
// ================================================================
|
||||
// 配置生成 (保持不变)
|
||||
// 配置生成
|
||||
// ================================================================
|
||||
|
||||
func GenerateFrpcConfig() error {
|
||||
@@ -164,14 +164,10 @@ func GenerateFrpcConfig() error {
|
||||
}
|
||||
|
||||
// ================================================================
|
||||
// 进程管理 (兼容层,实际调用 ProcessManager)
|
||||
// 2.6-preview: 所有进程管理逻辑迁移到 process_manager.go
|
||||
// 进程管理兼容层
|
||||
// ================================================================
|
||||
|
||||
// isFrpcRunning 检查 frpc 是否在运行
|
||||
// 优先使用 ProcessManager,降级到 PID 文件
|
||||
func isFrpcRunning() bool {
|
||||
// 如果 ProcessManager 已初始化,使用它
|
||||
if processManager != nil {
|
||||
status, err := processManager.Status()
|
||||
if err != nil {
|
||||
@@ -183,7 +179,6 @@ func isFrpcRunning() bool {
|
||||
return isFrpcRunningLegacy()
|
||||
}
|
||||
|
||||
// isFrpcRunningLegacy 旧版 PID 文件检测 (降级方案)
|
||||
func isFrpcRunningLegacy() bool {
|
||||
pidData, err := os.ReadFile("./data/frpc.pid")
|
||||
if err != nil {
|
||||
@@ -193,7 +188,6 @@ func isFrpcRunningLegacy() bool {
|
||||
if err != nil {
|
||||
return false
|
||||
}
|
||||
|
||||
if runtime.GOOS == "windows" {
|
||||
cmd := exec.Command("tasklist", "/FI", "PID eq", strconv.Itoa(pid))
|
||||
output, err := cmd.CombinedOutput()
|
||||
@@ -202,7 +196,6 @@ func isFrpcRunningLegacy() bool {
|
||||
}
|
||||
return strings.Contains(string(output), strconv.Itoa(pid))
|
||||
}
|
||||
|
||||
process, err := os.FindProcess(pid)
|
||||
if err != nil {
|
||||
return false
|
||||
@@ -210,8 +203,6 @@ func isFrpcRunningLegacy() bool {
|
||||
return process.Signal(syscall.Signal(0)) == nil
|
||||
}
|
||||
|
||||
// StartFrpc 启动 frpc (幂等)
|
||||
// 优先使用 ProcessManager,降级到旧逻辑
|
||||
func StartFrpc() error {
|
||||
if processManager != nil {
|
||||
log.Println("[INFO] 使用 ProcessManager 启动 frpc")
|
||||
@@ -221,60 +212,47 @@ func StartFrpc() error {
|
||||
return startFrpcLegacy()
|
||||
}
|
||||
|
||||
// startFrpcLegacy 旧版启动逻辑 (降级方案)
|
||||
func startFrpcLegacy() error {
|
||||
frpcPath, err := getFrpcPath()
|
||||
if err != nil {
|
||||
return fmt.Errorf("获取 frpc 路径失败: %w", err)
|
||||
}
|
||||
|
||||
if err := os.MkdirAll("./data", 0755); err != nil {
|
||||
return fmt.Errorf("创建 data 目录失败: %w", err)
|
||||
}
|
||||
|
||||
if _, err := os.Stat("./data/frpc.toml"); os.IsNotExist(err) {
|
||||
if err := GenerateFrpcConfig(); err != nil {
|
||||
return fmt.Errorf("生成配置文件失败: %w", err)
|
||||
}
|
||||
}
|
||||
|
||||
if isFrpcRunningLegacy() {
|
||||
return nil
|
||||
}
|
||||
|
||||
os.Remove("./data/frpc.pid")
|
||||
|
||||
cmd := exec.Command(frpcPath, "-c", "./data/frpc.toml")
|
||||
setWindowHide(cmd)
|
||||
setSysProcAttr(cmd)
|
||||
|
||||
logFile, err := os.OpenFile("./data/frpc.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
|
||||
if err != nil {
|
||||
return fmt.Errorf("打开日志文件失败: %w", err)
|
||||
}
|
||||
cmd.Stdout = logFile
|
||||
cmd.Stderr = logFile
|
||||
|
||||
if err := cmd.Start(); err != nil {
|
||||
return fmt.Errorf("启动 frpc 失败: %w", err)
|
||||
}
|
||||
|
||||
go func() {
|
||||
if err := cmd.Wait(); err != nil {
|
||||
log.Printf("frpc 子进程退出: %v", err)
|
||||
}
|
||||
os.Remove("./data/frpc.pid")
|
||||
}()
|
||||
|
||||
if err := os.WriteFile("./data/frpc.pid", []byte(fmt.Sprintf("%d", cmd.Process.Pid)), 0644); err != nil {
|
||||
return fmt.Errorf("保存 PID 失败: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// StopFrpc 停止 frpc (幂等)
|
||||
// 优先使用 ProcessManager,降级到旧逻辑
|
||||
func StopFrpc() error {
|
||||
if processManager != nil {
|
||||
log.Println("[INFO] 使用 ProcessManager 停止 frpc")
|
||||
@@ -284,7 +262,6 @@ func StopFrpc() error {
|
||||
return stopFrpcLegacy()
|
||||
}
|
||||
|
||||
// stopFrpcLegacy 旧版停止逻辑 (降级方案)
|
||||
func stopFrpcLegacy() error {
|
||||
if runtime.GOOS == "windows" {
|
||||
cmd := exec.Command("taskkill", "/F", "/IM", "frpc.exe")
|
||||
@@ -294,7 +271,6 @@ func stopFrpcLegacy() error {
|
||||
os.Remove("./data/frpc.pid")
|
||||
return nil
|
||||
}
|
||||
|
||||
pidData, err := os.ReadFile("./data/frpc.pid")
|
||||
if err != nil {
|
||||
cmd := exec.Command("pkill", "-f", "frpc")
|
||||
@@ -303,24 +279,19 @@ func stopFrpcLegacy() error {
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
pid, _ := strconv.Atoi(strings.TrimSpace(string(pidData)))
|
||||
process, err := os.FindProcess(pid)
|
||||
if err != nil {
|
||||
os.Remove("./data/frpc.pid")
|
||||
return nil
|
||||
}
|
||||
|
||||
if err := process.Kill(); err != nil {
|
||||
return fmt.Errorf("杀死进程失败: %w", err)
|
||||
}
|
||||
|
||||
os.Remove("./data/frpc.pid")
|
||||
return nil
|
||||
}
|
||||
|
||||
// RestartFrpc 重启 frpc (原子操作)
|
||||
// 优先使用 ProcessManager,降级到旧逻辑
|
||||
func RestartFrpc() error {
|
||||
if processManager != nil {
|
||||
log.Println("[INFO] 使用 ProcessManager 重启 frpc")
|
||||
@@ -333,8 +304,6 @@ func RestartFrpc() error {
|
||||
return startFrpcLegacy()
|
||||
}
|
||||
|
||||
// GetFrpcStatus 获取 frpc 详细状态 (供 API 调用)
|
||||
// 优先使用 ProcessManager,降级到旧逻辑
|
||||
func GetFrpcStatus() (map[string]interface{}, error) {
|
||||
if processManager != nil {
|
||||
status, err := processManager.Status()
|
||||
@@ -347,73 +316,57 @@ func GetFrpcStatus() (map[string]interface{}, error) {
|
||||
"port": status.Port,
|
||||
}, nil
|
||||
}
|
||||
|
||||
// 降级: 返回简单布尔值
|
||||
running := isFrpcRunningLegacy()
|
||||
return map[string]interface{}{
|
||||
"state": map[bool]string{true: "running", false: "stopped"}[running],
|
||||
"pid": 0,
|
||||
"port": 0,
|
||||
"legacy": true,
|
||||
"state": map[bool]string{true: "running", false: "stopped"}[running],
|
||||
"pid": 0,
|
||||
"port": 0,
|
||||
"legacy": true,
|
||||
}, nil
|
||||
}
|
||||
|
||||
// ReloadFrpc 热加载 frpc 配置
|
||||
// 优先尝试 reload,失败则降级到重启
|
||||
func ReloadFrpc() error {
|
||||
// 如果 ProcessManager 未初始化,降级到旧逻辑
|
||||
if processManager == nil {
|
||||
return reloadFrpcLegacy()
|
||||
}
|
||||
|
||||
// 检查 frpc 是否在运行
|
||||
status, err := processManager.Status()
|
||||
if err != nil {
|
||||
return fmt.Errorf("获取 frpc 状态失败: %w", err)
|
||||
}
|
||||
|
||||
if status.State != "running" {
|
||||
// 未运行,直接启动
|
||||
return processManager.Start(nil)
|
||||
}
|
||||
|
||||
// 尝试热加载 (使用 frpc reload 命令)
|
||||
frpcPath, err := getFrpcPath()
|
||||
if err != nil {
|
||||
return fmt.Errorf("获取 frpc 路径失败: %w", err)
|
||||
}
|
||||
|
||||
cmd := exec.Command(frpcPath, "reload", "-c", "./data/frpc.toml")
|
||||
output, err := cmd.CombinedOutput()
|
||||
if err != nil {
|
||||
log.Printf("⚠️ 热加载失败 (%v),降级为重启 frpc", err)
|
||||
log.Printf(" reload 输出: %s", string(output))
|
||||
// 降级: 重启
|
||||
if err := processManager.Restart(nil); err != nil {
|
||||
return fmt.Errorf("重启 frpc 失败: %w", err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
log.Printf("✅ frpc 热加载成功")
|
||||
log.Printf("✅ frpc 热加载成功: %s", string(output))
|
||||
return nil
|
||||
}
|
||||
|
||||
// reloadFrpcLegacy 旧版热加载 (降级方案)
|
||||
func reloadFrpcLegacy() error {
|
||||
if !isFrpcRunningLegacy() {
|
||||
return startFrpcLegacy()
|
||||
}
|
||||
|
||||
frpcPath, err := getFrpcPath()
|
||||
if err != nil {
|
||||
return fmt.Errorf("获取 frpc 路径失败: %w", err)
|
||||
}
|
||||
|
||||
cmd := exec.Command(frpcPath, "reload", "-c", "./data/frpc.toml")
|
||||
output, err := cmd.CombinedOutput()
|
||||
if err != nil {
|
||||
log.Printf("⚠️ 热加载失败 (%v),降级为重启 frpc", err)
|
||||
log.Printf(" reload 输出: %s", string(output))
|
||||
if stopErr := stopFrpcLegacy(); stopErr != nil {
|
||||
return fmt.Errorf("停止 frpc 失败: %w", stopErr)
|
||||
}
|
||||
@@ -422,15 +375,14 @@ func reloadFrpcLegacy() error {
|
||||
}
|
||||
return nil
|
||||
}
|
||||
log.Printf("✅ frpc 热加载成功 (兼容模式)")
|
||||
log.Printf("✅ frpc 热加载成功 (兼容模式): %s", string(output))
|
||||
return nil
|
||||
}
|
||||
|
||||
// ================================================================
|
||||
// 日志读取 (保持不变)
|
||||
// 日志读取
|
||||
// ================================================================
|
||||
|
||||
// readTailLog 读取文件末尾 n 行
|
||||
func readTailLog(filePath string, n int) ([]string, error) {
|
||||
file, err := os.Open(filePath)
|
||||
if err != nil {
|
||||
@@ -502,4 +454,4 @@ func readTailLog(filePath string, n int) ([]string, error) {
|
||||
}
|
||||
|
||||
return lines, nil
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user