PDK-Connector

 view release on metacpan or  search on metacpan

lib/PDK/Connector/Role.pm  view on Meta::CPAN

    required => 0,
    default  => '', # 默认空密码
);

# 密码短语属性
has passphrase => (
    is       => 'ro',
    required => 0,
    default  => '', # 默认空密码短语
);

# 特权模式密码属性
has enPassword => (
    is       => 'ro',
    required => 0,
);

# 连接协议属性
has proto => (
    is       => 'ro',
    required => 0,
    default  => 'ssh', # 默认使用SSH协议
);

# 登录成功提示符
has prompt => (
    is       => 'ro',
    required => 0,
    default  => '^\s*\S+[>\]]\s*$', # 默认提示符
);

# 登录特权模式提示符
has enPrompt => (
    is       => 'ro',
    required => 0,
);

# 会话超时时间
has timeout => (
    is       => 'ro',
    required => 0,
    default  => 30, # 默认30秒
);

# 调试模式
has debug => (
    is       => 'ro',
    required => 0,
    default  => 2, # 默认不打印日志
);

# 日志记录文件
has log_file => (
    is      => 'ro',
    lazy    => 1,
    default => sub {
        my $self = shift;

        # 获取用户家目录(跨平台方式)
        my $home = $ENV{PDK_LOG_DIR};
        $home ||= $ENV{HOME} || $ENV{USERPROFILE} || (getpwuid($<))[7];

        # 创建 logs 目录(如果不存在)
        my $log_dir = "$home/logs";
        mkdir $log_dir unless -d $log_dir;

        # 构建日志文件路径,使用设备IP
        my $host = $self->host;
        return "$log_dir/$host.log";
    },
);

# 登录状态标志(内部使用)
has _login_ => (
    is       => 'ro',
    required => 0,
    default  => 0, # 默认未登录
);

# 特权模式状态标志(内部使用)
has _enable_ => (
    is       => 'ro',
    required => 0,
    default  => 0, # 默认未进入特权模式
);

# 登录设备方法
sub login {
    my $self = shift;
    # 如果已登录,直接返回成功
    return { success => $self->{_login_} } if $self->{_login_};

    # 尝试连接设备
    eval {
        $self->connect() if not defined $self->{exp};
    };

    # 处理连接过程中可能出现的异常
    if ($@) {
        # 处理RSA密钥太小的问题
        if ($@ =~ /RSA modulus too small/) {
            eval {
                $self->connect(' -1 '); # 使用SSHv1协议重试
            };
            if ($@) {
                return { success => 0, reason => $@ };
            }
        }
        # 处理不支持的加密算法问题
        elsif ($@ =~ /Selected cipher type <unknown> not supported by server/i) {
            eval {
                $self->connect('-c des '); # 使用DES加密算法重试
            };
            if ($@) {
                return { success => 0, reason => $@ };
            }
        }
        # 处理连接被拒绝的情况(可能是SSH端口关闭)
        elsif ($@ =~ /Connection refused/i) {
            eval {
                $self->{proto} = 'telnet'; # 切换到Telnet协议



( run in 2.509 seconds using v1.01-cache-2.11-cpan-7fcb06a456a )