oxidized 0.25.1 → 0.26.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +30 -9
- data/.rubocop_todo.yml +16 -637
- data/.travis.yml +2 -3
- data/CHANGELOG.md +14 -0
- data/Dockerfile +7 -5
- data/README.md +18 -14
- data/Rakefile +2 -2
- data/bin/console +1 -1
- data/bin/oxidized +2 -2
- data/docs/Configuration.md +6 -0
- data/docs/Model-Notes/README.md +1 -0
- data/docs/Model-Notes/SmartAX-Huawei.md +35 -0
- data/docs/Supported-OS-Types.md +12 -0
- data/extra/nagios_check_failing_nodes.rb +1 -1
- data/extra/rest_client.rb +6 -8
- data/extra/syslog.rb +33 -33
- data/lib/oxidized/cli.rb +25 -26
- data/lib/oxidized/config.rb +9 -9
- data/lib/oxidized/config/vars.rb +3 -7
- data/lib/oxidized/core.rb +4 -7
- data/lib/oxidized/hook.rb +16 -17
- data/lib/oxidized/hook/awssns.rb +4 -4
- data/lib/oxidized/hook/exec.rb +16 -20
- data/lib/oxidized/hook/githubrepo.rb +8 -14
- data/lib/oxidized/hook/noophook.rb +1 -1
- data/lib/oxidized/hook/xmppdiff.rb +1 -1
- data/lib/oxidized/input/cli.rb +12 -12
- data/lib/oxidized/input/ftp.rb +8 -8
- data/lib/oxidized/input/http.rb +37 -14
- data/lib/oxidized/input/input.rb +6 -6
- data/lib/oxidized/input/ssh.rb +31 -31
- data/lib/oxidized/input/telnet.rb +24 -24
- data/lib/oxidized/input/tftp.rb +9 -10
- data/lib/oxidized/jobs.rb +7 -7
- data/lib/oxidized/manager.rb +13 -13
- data/lib/oxidized/model/acos.rb +2 -2
- data/lib/oxidized/model/aireos.rb +3 -3
- data/lib/oxidized/model/aos7.rb +1 -1
- data/lib/oxidized/model/aosw.rb +12 -14
- data/lib/oxidized/model/apc_aos.rb +1 -1
- data/lib/oxidized/model/aricentiss.rb +6 -8
- data/lib/oxidized/model/asa.rb +1 -1
- data/lib/oxidized/model/audiocodesmp.rb +28 -0
- data/lib/oxidized/model/awplus.rb +9 -9
- data/lib/oxidized/model/boss.rb +1 -1
- data/lib/oxidized/model/ciscosmb.rb +1 -1
- data/lib/oxidized/model/ciscovpn3k.rb +11 -0
- data/lib/oxidized/model/comware.rb +1 -1
- data/lib/oxidized/model/cumulus.rb +3 -1
- data/lib/oxidized/model/dellx.rb +5 -5
- data/lib/oxidized/model/edgeos.rb +1 -1
- data/lib/oxidized/model/edgeswitch.rb +1 -1
- data/lib/oxidized/model/fabricos.rb +1 -1
- data/lib/oxidized/model/fortios.rb +5 -5
- data/lib/oxidized/model/ftos.rb +1 -1
- data/lib/oxidized/model/gcombnps.rb +7 -7
- data/lib/oxidized/model/grandstream.rb +9 -0
- data/lib/oxidized/model/hatteras.rb +8 -8
- data/lib/oxidized/model/ios.rb +22 -40
- data/lib/oxidized/model/ironware.rb +1 -1
- data/lib/oxidized/model/junos.rb +1 -1
- data/lib/oxidized/model/mlnxos.rb +1 -1
- data/lib/oxidized/model/model.rb +32 -38
- data/lib/oxidized/model/netgearxs716.rb +23 -0
- data/lib/oxidized/model/netonix.rb +1 -1
- data/lib/oxidized/model/netscaler.rb +1 -1
- data/lib/oxidized/model/nos.rb +2 -2
- data/lib/oxidized/model/nxos.rb +1 -1
- data/lib/oxidized/model/openbsd.rb +3 -2
- data/lib/oxidized/model/outputs.rb +4 -4
- data/lib/oxidized/model/planet.rb +4 -4
- data/lib/oxidized/model/powerconnect.rb +8 -8
- data/lib/oxidized/model/procurve.rb +2 -1
- data/lib/oxidized/model/quantaos.rb +3 -3
- data/lib/oxidized/model/raisecom.rb +19 -0
- data/lib/oxidized/model/siklu.rb +1 -1
- data/lib/oxidized/model/slxos.rb +1 -1
- data/lib/oxidized/model/smartax.rb +25 -0
- data/lib/oxidized/model/sros.rb +4 -4
- data/lib/oxidized/model/tdre.rb +30 -0
- data/lib/oxidized/model/tmos.rb +3 -0
- data/lib/oxidized/model/trango.rb +17 -37
- data/lib/oxidized/model/voltaire.rb +1 -1
- data/lib/oxidized/model/voss.rb +1 -1
- data/lib/oxidized/model/vyatta.rb +1 -1
- data/lib/oxidized/model/xos.rb +1 -1
- data/lib/oxidized/model/zhoneolt.rb +1 -1
- data/lib/oxidized/node.rb +42 -46
- data/lib/oxidized/node/stats.rb +6 -6
- data/lib/oxidized/nodes.rb +42 -42
- data/lib/oxidized/output/file.rb +16 -20
- data/lib/oxidized/output/git.rb +68 -78
- data/lib/oxidized/output/gitcrypt.rb +77 -91
- data/lib/oxidized/output/http.rb +17 -19
- data/lib/oxidized/output/output.rb +1 -1
- data/lib/oxidized/source/csv.rb +3 -3
- data/lib/oxidized/source/http.rb +11 -14
- data/lib/oxidized/source/source.rb +3 -3
- data/lib/oxidized/source/sql.rb +16 -18
- data/lib/oxidized/string.rb +10 -10
- data/lib/oxidized/version.rb +4 -4
- data/lib/oxidized/worker.rb +15 -15
- data/oxidized.gemspec +6 -9
- metadata +32 -25
@@ -19,15 +19,15 @@ class PowerConnect < Oxidized::Model
|
|
19
19
|
end
|
20
20
|
|
21
21
|
cmd 'show version' do |cfg|
|
22
|
-
if
|
23
|
-
@stackable = true if cfg
|
22
|
+
if @stackable.nil?
|
23
|
+
@stackable = true if cfg =~ /(U|u)nit\s/
|
24
24
|
end
|
25
25
|
cfg = cfg.split("\n").reject { |line| line[/Up\sTime/] }
|
26
26
|
comment cfg.join("\n") + "\n"
|
27
27
|
end
|
28
28
|
|
29
29
|
cmd 'show system' do |cfg|
|
30
|
-
@model =
|
30
|
+
@model = Regexp.last_match(1) if cfg =~ /Power[C|c]onnect (\d{4})[P|F]?/
|
31
31
|
clean cfg
|
32
32
|
end
|
33
33
|
|
@@ -45,7 +45,7 @@ class PowerConnect < Oxidized::Model
|
|
45
45
|
if vars(:enable) == true
|
46
46
|
cmd "enable"
|
47
47
|
elsif vars(:enable)
|
48
|
-
cmd "enable",
|
48
|
+
cmd "enable", /[pP]assword:/
|
49
49
|
cmd vars(:enable)
|
50
50
|
end
|
51
51
|
end
|
@@ -56,18 +56,18 @@ class PowerConnect < Oxidized::Model
|
|
56
56
|
pre_logout "exit"
|
57
57
|
end
|
58
58
|
|
59
|
-
def clean
|
59
|
+
def clean(cfg)
|
60
60
|
out = []
|
61
61
|
skip_blocks = 0
|
62
62
|
cfg.each_line do |line|
|
63
63
|
# If this is a stackable switch we should skip this block of information
|
64
|
-
if
|
64
|
+
if line.match(/Up\sTime|Temperature|Power Suppl(ies|y)|Fans/i) && (@stackable == true)
|
65
65
|
skip_blocks = 1
|
66
66
|
# Some switches have another empty line. This is identified by this line having a colon
|
67
|
-
skip_blocks = 2 if line
|
67
|
+
skip_blocks = 2 if line =~ /:/
|
68
68
|
end
|
69
69
|
# If we have lines to skip do this until we reach and empty line
|
70
|
-
if skip_blocks
|
70
|
+
if skip_blocks.positive?
|
71
71
|
skip_blocks -= 1 if /\S/ !~ line
|
72
72
|
next
|
73
73
|
end
|
@@ -28,6 +28,7 @@ class Procurve < Oxidized::Model
|
|
28
28
|
cmd :all do |cfg|
|
29
29
|
cfg = cfg.cut_both
|
30
30
|
cfg = cfg.gsub /^\r/, ''
|
31
|
+
cfg
|
31
32
|
end
|
32
33
|
|
33
34
|
cmd :secret do |cfg|
|
@@ -93,6 +94,6 @@ class Procurve < Oxidized::Model
|
|
93
94
|
end
|
94
95
|
|
95
96
|
cfg :ssh do
|
96
|
-
pty_options(
|
97
|
+
pty_options(chars_wide: 1000)
|
97
98
|
end
|
98
99
|
end
|
@@ -4,9 +4,9 @@ class QuantaOS < Oxidized::Model
|
|
4
4
|
|
5
5
|
cmd 'show run' do |cfg|
|
6
6
|
cfg.each_line.select do |line|
|
7
|
-
not line.match /^!.*$/
|
8
|
-
not line.match /^\((\w|\S)+\) (>|#)$/
|
9
|
-
not line.match /^show run$/
|
7
|
+
(not line.match /^!.*$/) &&
|
8
|
+
(not line.match /^\((\w|\S)+\) (>|#)$/) &&
|
9
|
+
(not line.match /^show run$/)
|
10
10
|
end.join
|
11
11
|
end
|
12
12
|
|
@@ -0,0 +1,19 @@
|
|
1
|
+
class RAISECOM < Oxidized::Model
|
2
|
+
comment '! '
|
3
|
+
prompt /([\w.@-]+[#>]\s?)$/
|
4
|
+
|
5
|
+
cmd 'show version' do |cfg|
|
6
|
+
cfg.gsub! /\s(System uptime is ).*/, ' \\1 <removed>'
|
7
|
+
comment cfg
|
8
|
+
end
|
9
|
+
|
10
|
+
cmd 'show running-config' do |cfg|
|
11
|
+
cfg.gsub! /\s(^radius-encrypt-key ).*/, ' \\1 <removed>'
|
12
|
+
cfg
|
13
|
+
end
|
14
|
+
|
15
|
+
cfg :ssh do
|
16
|
+
post_login 'terminal page-break disable'
|
17
|
+
pre_logout 'exit'
|
18
|
+
end
|
19
|
+
end
|
data/lib/oxidized/model/siklu.rb
CHANGED
data/lib/oxidized/model/slxos.rb
CHANGED
@@ -10,7 +10,7 @@ class SLXOS < Oxidized::Model
|
|
10
10
|
end
|
11
11
|
|
12
12
|
cmd 'show chassis' do |cfg|
|
13
|
-
cfg.encode!("UTF-8", :
|
13
|
+
cfg.encode!("UTF-8", invalid: :replace, undef: :replace) # sometimes ironware returns broken encoding
|
14
14
|
cfg.gsub! /.*Power Usage.*/, '' # remove unwanted lines power usage
|
15
15
|
cfg.gsub! /Time A(live|wake).*/, '' # remove unwanted lines time alive/awake
|
16
16
|
cfg.gsub! /([\[]*)1([\]]*)<->([\[]*)2([\]]*)(<->([\[]*)3([\]]*))*/, ''
|
@@ -0,0 +1,25 @@
|
|
1
|
+
class SmartAX < Oxidized::Model
|
2
|
+
# Huawei SmartAX GPON/EPON/DOCSIS network access devices
|
3
|
+
prompt /^([\w.-]+[>#])$/
|
4
|
+
|
5
|
+
comment '#'
|
6
|
+
|
7
|
+
cfg :telnet do
|
8
|
+
username /^>>User name:$/
|
9
|
+
password /^>>User password:$/
|
10
|
+
end
|
11
|
+
|
12
|
+
cfg :ssh, :telnet do
|
13
|
+
post_login "enable"
|
14
|
+
post_login "undo interactive"
|
15
|
+
post_login "undo smart"
|
16
|
+
post_login "scroll"
|
17
|
+
pre_logout "quit"
|
18
|
+
end
|
19
|
+
|
20
|
+
# 'display current-configuration' returns current configuration stored in memory
|
21
|
+
# 'display saved-configuration' returns configuration stored in the file system which is used upon reboot
|
22
|
+
cmd 'display current-configuration' do |cfg|
|
23
|
+
cfg.cut_both
|
24
|
+
end
|
25
|
+
end
|
data/lib/oxidized/model/sros.rb
CHANGED
@@ -51,7 +51,7 @@ class SROS < Oxidized::Model
|
|
51
51
|
#
|
52
52
|
# Strip carriage returns and backspaces.
|
53
53
|
#
|
54
|
-
cfg.
|
54
|
+
cfg.delete! "\r"
|
55
55
|
cfg.gsub! /[\b][\b][\b]/, "\n"
|
56
56
|
cfg.gsub! /# Finished .*/, ''
|
57
57
|
cfg.gsub! /# Generated .*/, ''
|
@@ -74,7 +74,7 @@ class SROS < Oxidized::Model
|
|
74
74
|
#
|
75
75
|
# Strip carriage returns.
|
76
76
|
#
|
77
|
-
cfg.
|
77
|
+
cfg.delete! "\r"
|
78
78
|
cfg.gsub! /# Finished .*/, ''
|
79
79
|
cfg.gsub! /# Generated .*/, ''
|
80
80
|
comment cfg
|
@@ -87,7 +87,7 @@ class SROS < Oxidized::Model
|
|
87
87
|
#
|
88
88
|
# Strip carriage returns.
|
89
89
|
#
|
90
|
-
cfg.
|
90
|
+
cfg.delete! "\r"
|
91
91
|
cfg.gsub! /# Finished .*/, ''
|
92
92
|
cfg.gsub! /# Generated .*/, ''
|
93
93
|
comment cfg
|
@@ -100,7 +100,7 @@ class SROS < Oxidized::Model
|
|
100
100
|
#
|
101
101
|
# Strip carriage returns.
|
102
102
|
#
|
103
|
-
cfg.
|
103
|
+
cfg.delete! "\r"
|
104
104
|
cfg.gsub! /# Finished .*/, ''
|
105
105
|
cfg.gsub! /# Generated .*/, ''
|
106
106
|
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
class TDRE < Oxidized::Model
|
2
|
+
prompt /^>$/
|
3
|
+
cmd "get -f"
|
4
|
+
|
5
|
+
def ssh
|
6
|
+
@input.class.to_s.match(/SSH/)
|
7
|
+
end
|
8
|
+
|
9
|
+
expect /^>.+$/ do |data, re|
|
10
|
+
send "\r" if ssh
|
11
|
+
data.sub re, ''
|
12
|
+
end
|
13
|
+
|
14
|
+
cmd :all do |cfg|
|
15
|
+
if ssh
|
16
|
+
cfg.lines.to_a[5..-4].join
|
17
|
+
else
|
18
|
+
cfg.lines.to_a[1..-4].join
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
cfg :telnet do
|
23
|
+
username /^Username:/
|
24
|
+
password /^Password:/
|
25
|
+
end
|
26
|
+
|
27
|
+
cfg :telnet, :ssh do
|
28
|
+
pre_logout "DISCONNECT\r"
|
29
|
+
end
|
30
|
+
end
|
data/lib/oxidized/model/tmos.rb
CHANGED
@@ -26,6 +26,9 @@ class TMOS < Oxidized::Model
|
|
26
26
|
cmd 'tmsh -q list' do |cfg|
|
27
27
|
cfg.gsub!(/state (up|down|checking|irule-down)/, '')
|
28
28
|
cfg.gsub!(/errors (\d+)/, '')
|
29
|
+
cfg.gsub!(/^\s+bandwidth-bps (\d+)/, '')
|
30
|
+
cfg.gsub!(/^\s+bandwidth-cps (\d+)/, '')
|
31
|
+
cfg.gsub!(/^\s+bandwidth-pps (\d+)\n/, '')
|
29
32
|
cfg
|
30
33
|
end
|
31
34
|
|
@@ -8,48 +8,28 @@ class Trango < Oxidized::Model
|
|
8
8
|
out = []
|
9
9
|
comments = []
|
10
10
|
cfg.each_line do |line|
|
11
|
-
if line
|
11
|
+
if line =~ /\[Opmode\] (off|on) \[Default Opmode\] (off|on)/
|
12
12
|
out << "opmode " + Regexp.last_match[1]
|
13
13
|
out << "defaultopmode " + Regexp.last_match[2]
|
14
14
|
end
|
15
|
-
if line
|
16
|
-
|
17
|
-
|
18
|
-
if line
|
19
|
-
|
20
|
-
|
21
|
-
if line
|
22
|
-
|
23
|
-
|
24
|
-
if line
|
25
|
-
out << "utype " + Regexp.last_match[1]
|
26
|
-
end
|
27
|
-
if line.match /\[(Hardware Version|Firmware Version|Model|S\/N)\] (\S+)/
|
28
|
-
comments << '# ' + Regexp.last_match[1] + ': ' + Regexp.last_match[2]
|
29
|
-
end
|
30
|
-
if line.match /\[Remarks\] (\S+)/
|
31
|
-
out << "remarks " + Regexp.last_match[1]
|
32
|
-
end
|
33
|
-
if line.match /\[RSSI LED\] (on|off)/
|
34
|
-
out << "rssiled " + Regexp.last_match[1]
|
35
|
-
end
|
36
|
-
if line.match /\[Speed\] (\d+) Mbps/
|
37
|
-
speed = Regexp.last_match[1]
|
38
|
-
end
|
39
|
-
if line.match /\[Tx MIR\] (\d+) Kbps/
|
40
|
-
out << "mir ".concat(Regexp.last_match[1])
|
41
|
-
end
|
42
|
-
if line.match /\[Auto Rate Shift\] (on|off)/
|
15
|
+
out << "power " + Regexp.last_match[1] if line =~ /\[Tx Power\] ([\-\d]+) dBm/
|
16
|
+
out << "freq " + Regexp.last_match[1] + ' ' + Regexp.last_match[2] if line =~ /\[Active Channel\] (\d+) (v|h)/
|
17
|
+
out << "peerid " + Regexp.last_match[1] if line =~ /\[Peer ID\] ([A-F0-9]+)/
|
18
|
+
out << "utype " + Regexp.last_match[1] if line =~ /\[Unit Type\] (\S+)/
|
19
|
+
comments << '# ' + Regexp.last_match[1] + ': ' + Regexp.last_match[2] if line =~ /\[(Hardware Version|Firmware Version|Model|S\/N)\] (\S+)/
|
20
|
+
out << "remarks " + Regexp.last_match[1] if line =~ /\[Remarks\] (\S+)/
|
21
|
+
out << "rssiled " + Regexp.last_match[1] if line =~ /\[RSSI LED\] (on|off)/
|
22
|
+
speed = Regexp.last_match[1] if line =~ /\[Speed\] (\d+) Mbps/
|
23
|
+
out << "mir ".concat(Regexp.last_match[1]) if line =~ /\[Tx MIR\] (\d+) Kbps/
|
24
|
+
if line =~ /\[Auto Rate Shift\] (on|off)/
|
43
25
|
out << "autorateshift ".concat(Regexp.last_match[1])
|
44
|
-
if Regexp.last_match[1].eql? 'off'
|
45
|
-
out << "speed $speed"
|
46
|
-
end
|
47
|
-
end
|
48
|
-
if line.match /\[IP\] (\S+) \[Subnet Mask\] (\S+) \[Gateway\] (\S+)/
|
49
|
-
out << "ipconfig " + Regexp.last_match[1] + ' ' +
|
50
|
-
Regexp.last_match[2] + ' ' +
|
51
|
-
Regexp.last_match[3]
|
26
|
+
out << "speed #{speed}" if Regexp.last_match[1].eql? 'off'
|
52
27
|
end
|
28
|
+
next unless line =~ /\[IP\] (\S+) \[Subnet Mask\] (\S+) \[Gateway\] (\S+)/
|
29
|
+
|
30
|
+
out << "ipconfig " + Regexp.last_match[1] + ' ' +
|
31
|
+
Regexp.last_match[2] + ' ' +
|
32
|
+
Regexp.last_match[3]
|
53
33
|
end
|
54
34
|
comments.push(*out).join "\n"
|
55
35
|
end
|
@@ -16,7 +16,7 @@ class VOLTAIRE < Oxidized::Model
|
|
16
16
|
cfg.gsub! /^System memory:\s.+/, '' # Omit constantly changing memory info
|
17
17
|
cfg.gsub! /^Uptime:\s.+/, '' # Omit constantly changing uptime info
|
18
18
|
cfg.gsub! /.+Generated at\s\d+.+/, '' # Omit constantly changing generation time info
|
19
|
-
cfg
|
19
|
+
cfg.lines.to_a[2..-3].join
|
20
20
|
end
|
21
21
|
|
22
22
|
cmd :secret do |cfg|
|
data/lib/oxidized/model/voss.rb
CHANGED
data/lib/oxidized/model/xos.rb
CHANGED
@@ -23,7 +23,7 @@ class XOS < Oxidized::Model
|
|
23
23
|
end
|
24
24
|
|
25
25
|
cmd 'show switch' do |cfg|
|
26
|
-
comment cfg.each_line.reject { |line| line.match
|
26
|
+
comment cfg.each_line.reject { |line| line.match(/Time:/) || line.match(/boot/i) }.join
|
27
27
|
end
|
28
28
|
|
29
29
|
cmd 'show configuration' do |cfg|
|
@@ -39,7 +39,7 @@ class ZhoneOLT < Oxidized::Model
|
|
39
39
|
end
|
40
40
|
|
41
41
|
cmd 'dump console' do |cfg|
|
42
|
-
cfg
|
42
|
+
cfg.each_line.reject { |line| line.match /To Abort the operation enter Ctrl-C/ }.join
|
43
43
|
end
|
44
44
|
|
45
45
|
# zhone technically supports ssh, but it locks up a ton. Especially when
|
data/lib/oxidized/node.rb
CHANGED
@@ -7,12 +7,12 @@ module Oxidized
|
|
7
7
|
class Node
|
8
8
|
attr_reader :name, :ip, :model, :input, :output, :group, :auth, :prompt, :vars, :last, :repo
|
9
9
|
attr_accessor :running, :user, :email, :msg, :from, :stats, :retry
|
10
|
-
alias
|
10
|
+
alias running? running
|
11
11
|
|
12
|
-
def initialize
|
12
|
+
def initialize(opt)
|
13
13
|
Oxidized.logger.debug 'resolving DNS for %s...' % opt[:name]
|
14
14
|
# remove the prefix if an IP Address is provided with one as IPAddr converts it to a network address.
|
15
|
-
ip_addr,
|
15
|
+
ip_addr, = opt[:ip].to_s.split("/")
|
16
16
|
Oxidized.logger.debug 'IPADDR %s' % ip_addr.to_s
|
17
17
|
@name = opt[:name]
|
18
18
|
@ip = IPAddr.new(ip_addr).to_s rescue nil
|
@@ -38,10 +38,10 @@ module Oxidized
|
|
38
38
|
@input.each do |input|
|
39
39
|
# don't try input if model is missing config block, we may need strong config to class_name map
|
40
40
|
cfg_name = input.to_s.split('::').last.downcase
|
41
|
-
next unless @model.cfg[cfg_name]
|
41
|
+
next unless @model.cfg[cfg_name] && (not @model.cfg[cfg_name].empty?)
|
42
42
|
|
43
43
|
@model.input = input = input.new
|
44
|
-
if config = run_input(input)
|
44
|
+
if (config = run_input(input))
|
45
45
|
Oxidized.logger.debug "lib/oxidized/node.rb: #{input.class.name} ran for #{name} successfully"
|
46
46
|
status = :success
|
47
47
|
break
|
@@ -54,7 +54,7 @@ module Oxidized
|
|
54
54
|
[status, config]
|
55
55
|
end
|
56
56
|
|
57
|
-
def run_input
|
57
|
+
def run_input(input)
|
58
58
|
rescue_fail = {}
|
59
59
|
[input.class::RescueFail, input.class.superclass::RescueFail].each do |hash|
|
60
60
|
hash.each do |level, errors|
|
@@ -64,56 +64,56 @@ module Oxidized
|
|
64
64
|
end
|
65
65
|
end
|
66
66
|
begin
|
67
|
-
input.connect(self)
|
67
|
+
input.connect(self) && input.get
|
68
68
|
rescue *rescue_fail.keys => err
|
69
69
|
resc = ''
|
70
|
-
|
71
|
-
resc = err.class.ancestors.find { |e| rescue_fail.
|
70
|
+
unless (level = rescue_fail[err.class])
|
71
|
+
resc = err.class.ancestors.find { |e| rescue_fail.has_key?(e) }
|
72
72
|
level = rescue_fail[resc]
|
73
73
|
resc = " (rescued #{resc})"
|
74
74
|
end
|
75
|
-
Oxidized.logger.send(level, '%s raised %s%s with msg "%s"' % [
|
75
|
+
Oxidized.logger.send(level, '%s raised %s%s with msg "%s"' % [ip, err.class, resc, err.message])
|
76
76
|
return false
|
77
|
-
rescue => err
|
77
|
+
rescue StandardError => err
|
78
78
|
crashdir = Oxidized.config.crash.directory
|
79
|
-
crashfile = Oxidized.config.crash.hostnames? ?
|
79
|
+
crashfile = Oxidized.config.crash.hostnames? ? name : ip.to_s
|
80
80
|
FileUtils.mkdir_p(crashdir) unless File.directory?(crashdir)
|
81
81
|
|
82
|
-
open File.join(crashdir, crashfile), 'w' do |fh|
|
82
|
+
File.open File.join(crashdir, crashfile), 'w' do |fh|
|
83
83
|
fh.puts Time.now.utc
|
84
84
|
fh.puts err.message + ' [' + err.class.to_s + ']'
|
85
85
|
fh.puts '-' * 50
|
86
86
|
fh.puts err.backtrace
|
87
87
|
end
|
88
|
-
Oxidized.logger.error '%s raised %s with msg "%s", %s saved' % [
|
88
|
+
Oxidized.logger.error '%s raised %s with msg "%s", %s saved' % [ip, err.class, err.message, crashfile]
|
89
89
|
return false
|
90
90
|
end
|
91
91
|
end
|
92
92
|
|
93
93
|
def serialize
|
94
94
|
h = {
|
95
|
-
:
|
96
|
-
:
|
97
|
-
:
|
98
|
-
:
|
99
|
-
:
|
100
|
-
:
|
101
|
-
:
|
102
|
-
:
|
95
|
+
name: @name,
|
96
|
+
full_name: @name,
|
97
|
+
ip: @ip,
|
98
|
+
group: @group,
|
99
|
+
model: @model.class.to_s,
|
100
|
+
last: nil,
|
101
|
+
vars: @vars,
|
102
|
+
mtime: @stats.mtime
|
103
103
|
}
|
104
104
|
h[:full_name] = [@group, @name].join('/') if @group
|
105
105
|
if @last
|
106
106
|
h[:last] = {
|
107
|
-
:
|
108
|
-
:
|
109
|
-
:
|
110
|
-
:
|
107
|
+
start: @last.start,
|
108
|
+
end: @last.end,
|
109
|
+
status: @last.status,
|
110
|
+
time: @last.time
|
111
111
|
}
|
112
112
|
end
|
113
113
|
h
|
114
114
|
end
|
115
115
|
|
116
|
-
def last=
|
116
|
+
def last=(job)
|
117
117
|
if job
|
118
118
|
ostruct = OpenStruct.new
|
119
119
|
ostruct.start = job.start
|
@@ -137,46 +137,42 @@ module Oxidized
|
|
137
137
|
|
138
138
|
private
|
139
139
|
|
140
|
-
def resolve_prompt
|
140
|
+
def resolve_prompt(opt)
|
141
141
|
opt[:prompt] || @model.prompt || Oxidized.config.prompt
|
142
142
|
end
|
143
143
|
|
144
|
-
def resolve_auth
|
144
|
+
def resolve_auth(opt)
|
145
145
|
# Resolve configured username/password
|
146
146
|
{
|
147
|
-
username:
|
148
|
-
password:
|
147
|
+
username: resolve_key(:username, opt),
|
148
|
+
password: resolve_key(:password, opt)
|
149
149
|
}
|
150
150
|
end
|
151
151
|
|
152
|
-
def resolve_input
|
152
|
+
def resolve_input(opt)
|
153
153
|
inputs = resolve_key :input, opt, Oxidized.config.input.default
|
154
154
|
inputs.split(/\s*,\s*/).map do |input|
|
155
|
-
|
156
|
-
Oxidized.mgr.add_input input or raise MethodNotFound, "#{input} not found for node #{ip}"
|
157
|
-
end
|
155
|
+
Oxidized.mgr.add_input(input) || raise(MethodNotFound, "#{input} not found for node #{ip}") unless Oxidized.mgr.input[input]
|
158
156
|
Oxidized.mgr.input[input]
|
159
157
|
end
|
160
158
|
end
|
161
159
|
|
162
|
-
def resolve_output
|
160
|
+
def resolve_output(opt)
|
163
161
|
output = resolve_key :output, opt, Oxidized.config.output.default
|
164
|
-
|
165
|
-
Oxidized.mgr.add_output output or raise MethodNotFound, "#{output} not found for node #{ip}"
|
166
|
-
end
|
162
|
+
Oxidized.mgr.add_output(output) || raise(MethodNotFound, "#{output} not found for node #{ip}") unless Oxidized.mgr.output[output]
|
167
163
|
Oxidized.mgr.output[output]
|
168
164
|
end
|
169
165
|
|
170
|
-
def resolve_model
|
166
|
+
def resolve_model(opt)
|
171
167
|
model = resolve_key :model, opt
|
172
|
-
|
168
|
+
unless Oxidized.mgr.model[model]
|
173
169
|
Oxidized.logger.debug "lib/oxidized/node.rb: Loading model #{model.inspect}"
|
174
|
-
Oxidized.mgr.add_model
|
170
|
+
Oxidized.mgr.add_model(model) || raise(ModelNotFound, "#{model} not found for node #{ip}")
|
175
171
|
end
|
176
172
|
Oxidized.mgr.model[model].new
|
177
173
|
end
|
178
174
|
|
179
|
-
def resolve_repo
|
175
|
+
def resolve_repo(opt)
|
180
176
|
type = git_type opt
|
181
177
|
return nil unless type
|
182
178
|
|
@@ -192,7 +188,7 @@ module Oxidized
|
|
192
188
|
end
|
193
189
|
end
|
194
190
|
|
195
|
-
def resolve_key
|
191
|
+
def resolve_key(key, opt, global = nil)
|
196
192
|
# resolve key, first get global, then get group then get node config
|
197
193
|
key_sym = key.to_sym
|
198
194
|
key_str = key.to_s
|
@@ -200,7 +196,7 @@ module Oxidized
|
|
200
196
|
Oxidized.logger.debug "node.rb: resolving node key '#{key}', with passed global value of '#{value}' and node value '#{opt[key_sym]}'"
|
201
197
|
|
202
198
|
# global
|
203
|
-
if not value
|
199
|
+
if (not value) && Oxidized.config.has_key?(key_str)
|
204
200
|
value = Oxidized.config[key_str]
|
205
201
|
Oxidized.logger.debug "node.rb: setting node key '#{key}' to value '#{value}' from global"
|
206
202
|
end
|
@@ -227,7 +223,7 @@ module Oxidized
|
|
227
223
|
value
|
228
224
|
end
|
229
225
|
|
230
|
-
def git_type
|
226
|
+
def git_type(opt)
|
231
227
|
type = opt[:output] || Oxidized.config.output.default
|
232
228
|
return nil unless type[0..2] == "git"
|
233
229
|
|