Telnet - EventMachine,Theaded?

时间:2015-07-15 15:08:19

标签: ruby multithreading telnet eventmachine

我有一个项目,我需要通过telnet通过一系列命令更新数千个设备。这些命令不会破坏或导致设备脱机(登录,应用命令,注销)。

我在SNMP适用的地方广泛使用snmp4em。这里的阻止方法将永远存在。

我不熟悉线程,EventMachine(其核心)等,试图从头开始接近这一点。

我一直在看em-simple_telnet。它似乎具有我需要的功能,我的问题是错误编码。如果主机无法访问或登录失败,则会在代码的最高级别(EventMachine.run do)引发错误,我发现这很难rescue

也许我有一个金发碧眼的时刻,但我没有看到解决方案。只要没有失败,以下代码就可以工作。

require 'em-simple_telnet'

File.delete('/tmp/telnetDebug.log') if File.exists?('/tmp/telnetDebug.log')

begin
  EventMachine.run do

    ['device1', 'device2_will_fail', 'device3'].each do |h|
      opts = {
        host: h,
        username: "user",
        password: "pass",
        binmode: true,
        telnetmode: true,
        login_prompt: /[$%#:>]\s\z/n,
        password_prompt: /[$%#:>]\s\z/n,
        prompt: /[$%#:>]\s?\z/n,
        output_log: "/tmp/telnetDebug.log",
      }

      EM::P::SimpleTelnet.new(opts) do |host|
        # already logged in
        puts "Connected"
        puts host.cmd('cmd1') { |c| puts c }
        puts host.cmd('cmd2') { |c| puts c }
        puts host.cmd("exit") { |c| puts c }
      end
    end

  end
rescue Exception => e
  puts e.inspect
end


me@WorkStation:~/ruby_workspace/modem_updates$ ruby modem_update_em.rb
#<EventMachine::Protocols::SimpleTelnet::LoginFailed: Timed out while expecting some kind of prompt.>

我愿意接触那些在这方面有经验的人,并为我的问题提供一些可能的解决方案。有人可以提出如何从错误中恢复的建议(如下所示)?或许还有另一种方法?非常感谢您的专业知识。

0 个答案:

没有答案