Files
SRCC/main.go
T

119 lines
3.4 KiB
Go
Raw Normal View History

2026-06-22 11:33:18 +08:00
// Copyright (c) 2026 S.A. (SNOWARE). Written for SCU Team.
// Licensed under MulanPubL-2.0.
// You may obtain a copy at: http://license.coscl.org.cn/MulanPubL-2.0
// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND.
// main 包:SRemoteConnectClient 主入口,负责 UAC 提权、启动 EasyTier 子进程、系统托盘管理。
package main
import (
"os"
"os/exec"
"github.com/getlantern/systray"
)
// proc 保存 EasyTier 子进程的引用,用于退出时清理。
var proc *os.Process = nil
// main 程序入口:初始化日志 → 隐藏控制台 → UAC 提权 → 启动 EasyTier → 系统托盘。
func main() {
initLogger()
log.Info().Msg("程序启动")
initConsoleHwnd()
2026-06-22 11:33:18 +08:00
hideConsoleWindow()
p := NewPermission()
if !p.HasUAC() {
log.Warn().Msg("未检测到管理员权限,尝试提权运行")
p.runSelfAsAdmin()
return
}
log.Info().Msg("管理员权限已确认")
log.Info().Msg("开始连接虚拟热点")
proc = connectToVirtualHotspot()
defer cleanup()
log.Info().Msg("启动系统托盘")
systray.Run(onReady, onExit)
}
// onReady 系统托盘就绪回调:设置图标、工具提示、构建右键菜单、注册各菜单项的点击事件。
func onReady() {
log.Info().Msg("系统托盘就绪")
icon := loadIcon()
systray.SetIcon(icon)
systray.SetTooltip("若一切正常,您现可连接到SCU的所有队内服务")
mTitle := systray.AddMenuItem("<<*>> SCU Remote Connect Client 1.4", "已连接")
2026-06-22 11:33:18 +08:00
mTitle.Disable()
systray.AddSeparator()
mQuit := systray.AddMenuItem("退出", "退出程序,关闭现有连接")
mVisitGitea := systray.AddMenuItem("访问代码托管服务 Gitea", "SASWE 代码托管服务")
mVisitCloudreve := systray.AddMenuItem("访问文件分发服务 Cloudreve", "SASWE 小文件分发服务")
systray.AddSeparator()
mShowConsoleWindow := systray.AddMenuItem("显示控制台窗口", "调试用")
mHideConsoleWindow := systray.AddMenuItem("隐藏控制台窗口", "调试用")
// 退出按钮 → 调用 systray.Quit() 触发 onExit
go func() {
<-mQuit.ClickedCh
log.Info().Msg("用户点击退出")
systray.Quit()
}()
// 访问 Gitea → 浏览器打开 SASWE 代码托管
go func() {
for true{
<-mVisitGitea.ClickedCh
2026-06-22 11:33:18 +08:00
log.Info().Msg("用户点击访问 Gitea")
2026-06-22 23:07:06 +08:00
exec.Command("cmd", "/c", "start", "http://103.217.186.98:3000/").Start()}
2026-06-22 11:33:18 +08:00
}()
// 访问 Cloudreve → 浏览器打开 SASWE 文件分发
go func() {
for true{
<-mVisitCloudreve.ClickedCh
2026-06-22 11:33:18 +08:00
log.Info().Msg("用户点击访问 Cloudreve")
2026-06-22 23:07:33 +08:00
exec.Command("cmd", "/c", "start", "http://103.217.186.98:5212/").Start()}
2026-06-22 11:33:18 +08:00
}()
// 显示控制台 → 调用 showConsoleWindow()
go func() {
for range mShowConsoleWindow.ClickedCh {
log.Info().Msg("用户点击显示控制台窗口")
showConsoleWindow()
}
2026-06-22 11:33:18 +08:00
}()
// 隐藏控制台 → 调用 hideConsoleWindow()
go func() {
for range mHideConsoleWindow.ClickedCh {
log.Info().Msg("用户点击隐藏控制台窗口")
hideConsoleWindow()
}
2026-06-22 11:33:18 +08:00
}()
}
// onExit 系统托盘退出回调:清理子进程并记录退出日志。
func onExit() {
cleanup()
log.Info().Msg("程序退出")
}
// cleanup 终止 EasyTier 子进程,防止残留进程占用端口。
func cleanup() {
if proc != nil {
log.Info().Int("pid", proc.Pid).Msg("终止 EasyTier 进程")
if err := proc.Kill(); err != nil {
log.Warn().Err(err).Msg("终止 EasyTier 进程失败")
}
}
}