mirror of
				https://gitee.com/dromara/mayfly-go
				synced 2025-11-04 08:20: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)
 | 
						||
}
 |