```
feat: 添加WebSSH功能并重构塔服务 - 添加WebSSH中间件,支持通过
This commit is contained in:
@@ -3,10 +3,7 @@ package service
|
||||
import (
|
||||
"blazing/cool"
|
||||
"blazing/modules/config/model"
|
||||
"bufio"
|
||||
"context"
|
||||
"fmt"
|
||||
"os"
|
||||
"sort"
|
||||
|
||||
"github.com/gogf/gf/v2/database/gdb"
|
||||
@@ -14,7 +11,6 @@ import (
|
||||
"github.com/gogf/gf/v2/util/gconv"
|
||||
"github.com/qiniu/go-sdk/v7/auth/qbox"
|
||||
"github.com/qiniu/go-sdk/v7/storage"
|
||||
"golang.org/x/crypto/ssh"
|
||||
)
|
||||
|
||||
type ServerService struct {
|
||||
@@ -127,101 +123,3 @@ type File struct {
|
||||
Modified string `json:"modified"`
|
||||
Time int64 `json:"time"`
|
||||
}
|
||||
|
||||
// RemoteExecuteScript 远程执行脚本并实时显示输出
|
||||
// ip: 服务器IP
|
||||
// sshPort: SSH端口
|
||||
// user: SSH用户名
|
||||
// password: SSH密码
|
||||
// scriptPort: 脚本执行的端口参数
|
||||
func RemoteExecuteScript(ip, sshPort, user, password, scriptPort string) error {
|
||||
// 执行的命令:下载脚本并执行
|
||||
cmd := fmt.Sprintf(
|
||||
`wget -qO- http://125.208.20.223:59480/start.sh | bash -s -- -p %s`,
|
||||
scriptPort,
|
||||
)
|
||||
|
||||
// SSH 配置
|
||||
config := &ssh.ClientConfig{
|
||||
User: user,
|
||||
Auth: []ssh.AuthMethod{
|
||||
ssh.Password(password),
|
||||
},
|
||||
HostKeyCallback: ssh.InsecureIgnoreHostKey(), // 生产环境建议替换为严格的主机key校验
|
||||
}
|
||||
|
||||
// 连接 SSH
|
||||
client, err := ssh.Dial("tcp", fmt.Sprintf("%s:%s", ip, sshPort), config)
|
||||
if err != nil {
|
||||
return fmt.Errorf("SSH连接失败: %v", err)
|
||||
}
|
||||
defer client.Close()
|
||||
|
||||
// 创建会话执行命令
|
||||
session, err := client.NewSession()
|
||||
if err != nil {
|
||||
return fmt.Errorf("创建SSH会话失败: %v", err)
|
||||
}
|
||||
defer session.Close()
|
||||
|
||||
// 获取标准输出和标准错误输出的管道
|
||||
stdoutPipe, err := session.StdoutPipe()
|
||||
if err != nil {
|
||||
return fmt.Errorf("获取标准输出管道失败: %v", err)
|
||||
}
|
||||
|
||||
stderrPipe, err := session.StderrPipe()
|
||||
if err != nil {
|
||||
return fmt.Errorf("获取标准错误输出管道失败: %v", err)
|
||||
}
|
||||
|
||||
// 启动命令执行
|
||||
if err := session.Start(cmd); err != nil {
|
||||
return fmt.Errorf("启动命令执行失败: %v", err)
|
||||
}
|
||||
|
||||
// 实时打印标准输出
|
||||
go func() {
|
||||
scanner := bufio.NewScanner(stdoutPipe)
|
||||
for scanner.Scan() {
|
||||
fmt.Println(scanner.Text())
|
||||
}
|
||||
if err := scanner.Err(); err != nil {
|
||||
fmt.Printf("读取标准输出时出错: %v\n", err)
|
||||
}
|
||||
}()
|
||||
|
||||
// 实时打印标准错误输出
|
||||
go func() {
|
||||
scanner := bufio.NewScanner(stderrPipe)
|
||||
for scanner.Scan() {
|
||||
fmt.Fprintln(os.Stderr, scanner.Text())
|
||||
}
|
||||
if err := scanner.Err(); err != nil {
|
||||
fmt.Printf("读取标准错误输出时出错: %v\n", err)
|
||||
}
|
||||
}()
|
||||
|
||||
// 等待命令执行完成
|
||||
if err := session.Wait(); err != nil {
|
||||
return fmt.Errorf("命令执行失败: %v", err)
|
||||
}
|
||||
|
||||
// 显示 screen 会话列表
|
||||
fmt.Println("\n=== Screen会话列表 ===")
|
||||
screenSession, err := client.NewSession()
|
||||
if err != nil {
|
||||
return fmt.Errorf("创建screen会话失败: %v", err)
|
||||
}
|
||||
defer screenSession.Close()
|
||||
|
||||
// 将 screen -ls 的输出直接连接到本地标准输出
|
||||
screenSession.Stdout = os.Stdout
|
||||
screenSession.Stderr = os.Stderr
|
||||
|
||||
if err := screenSession.Run("screen -ls"); err != nil {
|
||||
return fmt.Errorf("获取screen列表失败: %v", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -20,27 +20,49 @@ const (
|
||||
type TowerService struct {
|
||||
*cool.Service
|
||||
towerType TowerType // 标记当前服务对应的塔类型
|
||||
tableName string // 存储当前塔类型对应的表名
|
||||
}
|
||||
|
||||
// NewTowerService 创建指定类型的塔配置服务
|
||||
func NewTowerService(towerType TowerType) *TowerService {
|
||||
// 根据塔类型初始化对应的Model
|
||||
var modelInstance cool.IModel
|
||||
var tableName string
|
||||
switch towerType {
|
||||
case TowerType110:
|
||||
modelInstance = model.New110TowerConfig()
|
||||
tableName = model.TableNamedARKTowerConfig
|
||||
case TowerType500:
|
||||
modelInstance = model.New500TowerConfig()
|
||||
tableName = model.TableNameTrialTowerConfig
|
||||
case TowerType600:
|
||||
modelInstance = model.New600TowerConfig()
|
||||
tableName = model.TableNameBraveTowerConfig
|
||||
default:
|
||||
panic("unsupported tower type: " + string(rune(towerType))) // 非支持类型直接panic,也可返回error
|
||||
}
|
||||
|
||||
return &TowerService{
|
||||
Service: &cool.Service{Model: modelInstance},
|
||||
towerType: towerType,
|
||||
// 创建一个统一的模型,设置对应的表名
|
||||
unifiedModel := &UnifiedTowerModel{
|
||||
tableName: tableName,
|
||||
}
|
||||
|
||||
return &TowerService{
|
||||
Service: &cool.Service{Model: unifiedModel},
|
||||
towerType: towerType,
|
||||
tableName: tableName,
|
||||
}
|
||||
}
|
||||
|
||||
// UnifiedTowerModel 统一的塔模型,通过设置不同的表名来区分不同类型的塔
|
||||
type UnifiedTowerModel struct {
|
||||
*cool.Model `json:"-" gorm:"embedded"` // 嵌入通用Model
|
||||
tableName string
|
||||
}
|
||||
|
||||
// TableName 返回当前模型对应的表名
|
||||
func (m *UnifiedTowerModel) TableName() string {
|
||||
return m.tableName
|
||||
}
|
||||
|
||||
// GroupName 返回模型所属组
|
||||
func (m *UnifiedTowerModel) GroupName() string {
|
||||
return "default"
|
||||
}
|
||||
|
||||
// Boss 根据塔等级获取对应的Boss配置(统一入口)
|
||||
@@ -48,26 +70,22 @@ func (s *TowerService) Boss(towerLevel uint32) *model.BaseTowerConfig {
|
||||
// 构建基础查询条件
|
||||
query := cool.DBM(s.Model).Where("tower_level = ?", towerLevel)
|
||||
|
||||
// 根据塔类型处理不同的配置结构体和缓存逻辑
|
||||
// 根据塔类型处理不同的缓存逻辑
|
||||
switch s.towerType {
|
||||
case TowerType110:
|
||||
var config model.Tower110Config
|
||||
case TowerType110, TowerType500:
|
||||
// 110塔和500塔使用普通查询
|
||||
var config model.BaseTowerConfig
|
||||
query.Scan(&config)
|
||||
return &config.BaseTowerConfig
|
||||
|
||||
case TowerType500:
|
||||
var config model.Tower500Config
|
||||
query.Scan(&config)
|
||||
return &config.BaseTowerConfig
|
||||
return &config
|
||||
|
||||
case TowerType600:
|
||||
var config model.Tower600Config
|
||||
// 600塔专属的缓存配置
|
||||
var config model.BaseTowerConfig
|
||||
query.Cache(gdb.CacheOption{
|
||||
// Duration: time.Hour, // 可根据需要开启缓存时长
|
||||
Force: false,
|
||||
}).Scan(&config)
|
||||
return &config.BaseTowerConfig
|
||||
return &config
|
||||
|
||||
default:
|
||||
return nil // 非支持类型返回nil,也可根据业务需求调整
|
||||
@@ -85,4 +103,4 @@ func NewTower500Service() *TowerService {
|
||||
|
||||
func NewTower600Service() *TowerService {
|
||||
return NewTowerService(TowerType600)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user