mirror of
https://gitee.com/dromara/mayfly-go
synced 2025-11-09 10:50:25 +08:00
62 lines
1.5 KiB
Go
62 lines
1.5 KiB
Go
|
|
package mcm
|
|||
|
|
|
|||
|
|
import (
|
|||
|
|
"mayfly-go/internal/common/consts"
|
|||
|
|
"mayfly-go/pkg/cache"
|
|||
|
|
"time"
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
// 机器客户端连接缓存,指定时间内没有访问则会被关闭
|
|||
|
|
var cliCache = cache.NewTimedCache(consts.MachineConnExpireTime, 5*time.Second).
|
|||
|
|
WithUpdateAccessTime(true).
|
|||
|
|
OnEvicted(func(_, value any) {
|
|||
|
|
value.(*Cli).Close()
|
|||
|
|
})
|
|||
|
|
|
|||
|
|
func init() {
|
|||
|
|
AddCheckSshTunnelMachineUseFunc(func(machineId int) bool {
|
|||
|
|
// 遍历所有机器连接实例,若存在机器连接实例使用该ssh隧道机器,则返回true,表示还在使用中...
|
|||
|
|
items := cliCache.Items()
|
|||
|
|
for _, v := range items {
|
|||
|
|
sshTunnelMachine := v.Value.(*Cli).Info.SshTunnelMachine
|
|||
|
|
if sshTunnelMachine != nil && int(sshTunnelMachine.Id) == machineId {
|
|||
|
|
return true
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return false
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 从缓存中获取客户端信息,不存在则回调获取机器信息函数,并新建
|
|||
|
|
func GetMachineCli(machineId uint64, getMachine func(uint64) (*MachineInfo, error)) (*Cli, error) {
|
|||
|
|
if load, ok := cliCache.Get(machineId); ok {
|
|||
|
|
return load.(*Cli), nil
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
me, err := getMachine(machineId)
|
|||
|
|
if err != nil {
|
|||
|
|
return nil, err
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
c, err := me.Conn()
|
|||
|
|
if err != nil {
|
|||
|
|
return nil, err
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
cliCache.Put(machineId, c)
|
|||
|
|
return c, nil
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 是否存在指定id的客户端连接
|
|||
|
|
func HasCli(machineId uint64) bool {
|
|||
|
|
if _, ok := cliCache.Get(machineId); ok {
|
|||
|
|
return true
|
|||
|
|
}
|
|||
|
|
return false
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 删除指定机器客户端,并关闭客户端连接
|
|||
|
|
func DeleteCli(id uint64) {
|
|||
|
|
cliCache.Delete(id)
|
|||
|
|
}
|