summaryrefslogtreecommitdiff
path: root/lib/oxidized/input/telnet.rb
blob: 0ec08f9c5578944f7074b7f3d52daee9c8e37764 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
module Oxidized
  require 'net/telnet'
  require 'oxidized/input/cli'
  class Telnet < Input
    include CLI 
    attr_reader :telnet

    def connect node
      @node    = node
      @timeout = CFG.timeout
      @node.model.cfg['telnet'].each { |cb| instance_exec &cb }
      begin
        @telnet  = Net::Telnet.new 'Host' => @node.ip, 'Waittime' => @timeout
        expect username
        @telnet.puts @node.auth[:username]
        expect password
        @telnet.puts @node.auth[:password]
        expect @node.prompt
      rescue  Errno::ECONNREFUSED, Timeout::Error
        return false
      end
    end

    def cmd cmd, expect=@node.prompt
      Log.debug "Telnet: #{cmd} @#{@node.name}"
      args = { 'String' => cmd }
      args.merge!({ 'Match' => expect, 'Timeout' => @timeout }) if expect
      begin
        @telnet.cmd args
      rescue Timeout::Error, Errno::ECONNRESET
        return false
      end
    end

    private

    def expect re
      @telnet.waitfor 'Match' => re, 'Timeout' => @timeout
    end

    def disconnect
      begin
        @pre_logout.each { |command| cmd(command, nil) }
        @telnet.close
      rescue Errno::ECONNRESET
      end
    end

    def username re=/^(Username|login)/
      @username or @username = re
    end

    def password re=/^Password/
      @password or @password = re
    end

  end
end