feat(rdp): 新增 RDP 远程桌面/SMB/账单同步能力 + 清理编译产物
主要变更: - RDP 远程桌面:新增 backend/pkg/rdp(RDP 引擎 + credssp/display/rle/trace)、 backend/controller/rdp*(连接/凭证/文件/会话/实时)、frontend RDP 组件与 API - Windows SMB 文件传输:backend/pkg/winsmb - 云账单同步:backend/pkg/billingsync + billing_sync/aliyun_billing,前端账单详情 - Agent CLI Kubernetes 工具:kubernetes_action/get、pod_execute/logs - 服务器导入助手:server_import_helpers、ImportCredentialSettings - 国际化与组件重构(cloud/deploy/monitor/server/system 等多模块) - 清理编译产物二进制:移除 backend/server、backend/agent/bin/aiops-agent-* - .gitignore:新增 backend/agent/ 与 .cache/(避免 334MB go-build 缓存误入库) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
1 parent
777d9e4e71
commit
76ec9387f0
202 files changed
+16555
-2543
No files matched your search
@@ -7,6 +7,7 @@ import (
|
||||
|
||||
"ezops/cloud"
|
||||
"ezops/model"
|
||||
"ezops/pkg/crypto"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
"gorm.io/gorm"
|
||||
@@ -14,11 +15,12 @@ import (
|
||||
|
||||
// CloudSyncHandler 云平台同步处理器
|
||||
type CloudSyncHandler struct {
|
||||
db *gorm.DB
|
||||
db *gorm.DB
|
||||
crypt *crypto.SecretBox
|
||||
}
|
||||
|
||||
func NewCloudSyncHandler(db *gorm.DB) *CloudSyncHandler {
|
||||
return &CloudSyncHandler{db: db}
|
||||
func NewCloudSyncHandler(db *gorm.DB, masterKey string) *CloudSyncHandler {
|
||||
return &CloudSyncHandler{db: db, crypt: crypto.NewSecretBox(masterKey)}
|
||||
}
|
||||
|
||||
// SyncRegions 同步云账号的区域列表到本地 regions 表
|
||||
@@ -167,8 +169,12 @@ func (h *CloudSyncHandler) DiscoverInstances(c *gin.Context) {
|
||||
}
|
||||
|
||||
// importRequest 导入主机请求
|
||||
type importRequest struct {
|
||||
Instances []cloud.CloudInstance `json:"instances"`
|
||||
type importInstancesRequest struct {
|
||||
Instances []cloud.CloudInstance `json:"instances"`
|
||||
DefaultPort int `json:"default_port"`
|
||||
CredentialID *uint `json:"credential_id"` // 兼容旧字段:默认 SSH 凭据 // Logan.Li
|
||||
SSHCredentialID *uint `json:"ssh_credential_id"` // Linux 默认 SSH 凭据 // Logan.Li
|
||||
RDPCredentialID *uint `json:"rdp_credential_id"` // Windows 默认 RDP 凭据 // Logan.Li
|
||||
}
|
||||
|
||||
// ImportInstances 将发现的云主机实例导入为本地服务器资产
|
||||
@@ -182,12 +188,32 @@ func (h *CloudSyncHandler) ImportInstances(c *gin.Context) {
|
||||
return
|
||||
}
|
||||
|
||||
var req importRequest
|
||||
var req importInstancesRequest
|
||||
if err := c.ShouldBindJSON(&req); err != nil {
|
||||
c.JSON(http.StatusBadRequest, model.Response{Code: 400, Message: "请求参数错误"})
|
||||
return
|
||||
}
|
||||
|
||||
defaultPort := req.DefaultPort
|
||||
if defaultPort <= 0 {
|
||||
defaultPort = 22
|
||||
}
|
||||
|
||||
sshCredentialID := req.SSHCredentialID
|
||||
if sshCredentialID == nil {
|
||||
sshCredentialID = req.CredentialID
|
||||
}
|
||||
sshCred, sshPlain, hasSSHCred, err := h.loadImportCredential(sshCredentialID, "ssh")
|
||||
if err != nil {
|
||||
c.JSON(http.StatusBadRequest, model.Response{Code: 400, Message: err.Error()})
|
||||
return
|
||||
}
|
||||
rdpCred, rdpPlain, hasRDPCred, err := h.loadImportCredential(req.RDPCredentialID, "rdp")
|
||||
if err != nil {
|
||||
c.JSON(http.StatusBadRequest, model.Response{Code: 400, Message: err.Error()})
|
||||
return
|
||||
}
|
||||
|
||||
imported := 0
|
||||
skipped := 0
|
||||
|
||||
@@ -216,9 +242,16 @@ func (h *CloudSyncHandler) ImportInstances(c *gin.Context) {
|
||||
regionID = ®ion.ID
|
||||
}
|
||||
|
||||
osName := "linux"
|
||||
if inst.OSType != "" {
|
||||
osName = inst.OSType
|
||||
osName := inst.OSType
|
||||
osType := normalizeImportOSType(inst.OSType, inst.InstanceName)
|
||||
protocol := "ssh"
|
||||
username := "root"
|
||||
if osType == "windows" {
|
||||
protocol = "rdp"
|
||||
username = "Administrator"
|
||||
}
|
||||
if osName == "" {
|
||||
osName = osType
|
||||
}
|
||||
status := "stopped"
|
||||
if inst.Status == "Running" {
|
||||
@@ -245,8 +278,12 @@ func (h *CloudSyncHandler) ImportInstances(c *gin.Context) {
|
||||
Hostname: hostname,
|
||||
IP: ipAddr,
|
||||
PublicIP: inst.PublicIP,
|
||||
Port: 22,
|
||||
Username: "root",
|
||||
Port: defaultPort,
|
||||
Username: username,
|
||||
AuthType: "password",
|
||||
OSType: osType,
|
||||
Protocol: protocol,
|
||||
RDPPort: 3389,
|
||||
OS: osName,
|
||||
CPU: inst.CPU,
|
||||
Memory: int64(inst.Memory),
|
||||
@@ -255,6 +292,11 @@ func (h *CloudSyncHandler) ImportInstances(c *gin.Context) {
|
||||
Description: "从 " + account.Provider + " 导入 (" + inst.InstanceID + ")",
|
||||
AgentStatus: "offline",
|
||||
}
|
||||
if protocol == "rdp" && hasRDPCred {
|
||||
applyCredential(rdpCred, rdpPlain, &server)
|
||||
} else if protocol != "rdp" && hasSSHCred {
|
||||
applyCredential(sshCred, sshPlain, &server)
|
||||
}
|
||||
|
||||
if err := h.db.Create(&server).Error; err == nil {
|
||||
imported++
|
||||
|
||||
Reference in new issue
Block a user