114 lines
3.3 KiB
Go
114 lines
3.3 KiB
Go
|
|
// 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("程序启动")
|
||
|
|
|
||
|
|
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", "已连接")
|
||
|
|
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() {
|
||
|
|
<-mVisitGitea.ClickedCh
|
||
|
|
log.Info().Msg("用户点击访问 Gitea")
|
||
|
|
exec.Command("cmd", "/c", "start", "http://103.217.186.98:3000/").Start()
|
||
|
|
}()
|
||
|
|
|
||
|
|
// 访问 Cloudreve → 浏览器打开 SASWE 文件分发
|
||
|
|
go func() {
|
||
|
|
<-mVisitCloudreve.ClickedCh
|
||
|
|
log.Info().Msg("用户点击访问 Cloudreve")
|
||
|
|
exec.Command("cmd", "/c", "start", "http://103.217.186.98:5212/").Start()
|
||
|
|
}()
|
||
|
|
|
||
|
|
// 显示控制台 → 调用 showConsoleWindow()
|
||
|
|
go func() {
|
||
|
|
<-mShowConsoleWindow.ClickedCh
|
||
|
|
log.Info().Msg("用户点击显示控制台窗口")
|
||
|
|
showConsoleWindow()
|
||
|
|
}()
|
||
|
|
|
||
|
|
// 隐藏控制台 → 调用 hideConsoleWindow()
|
||
|
|
go func() {
|
||
|
|
<-mHideConsoleWindow.ClickedCh
|
||
|
|
log.Info().Msg("用户点击隐藏控制台窗口")
|
||
|
|
hideConsoleWindow()
|
||
|
|
}()
|
||
|
|
}
|
||
|
|
|
||
|
|
// 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 进程失败")
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|