oxidized 0.19.0 → 0.20.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (55) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +17 -0
  3. data/Dockerfile +17 -2
  4. data/Gemfile +0 -1
  5. data/Gemfile.lock +10 -9
  6. data/README.md +205 -10
  7. data/extra/auto-reload-config.runit +1 -1
  8. data/extra/oxidized.init +3 -3
  9. data/extra/update-ca-certificates.runit +7 -0
  10. data/lib/oxidized/config.rb +4 -2
  11. data/lib/oxidized/config/vars.rb +5 -1
  12. data/lib/oxidized/hook/exec.rb +1 -0
  13. data/lib/oxidized/hook/slackdiff.rb +34 -0
  14. data/lib/oxidized/input/ssh.rb +4 -1
  15. data/lib/oxidized/model/aireos.rb +1 -1
  16. data/lib/oxidized/model/airos.rb +9 -4
  17. data/lib/oxidized/model/alvarion.rb +3 -1
  18. data/lib/oxidized/model/aosw.rb +22 -6
  19. data/lib/oxidized/model/asa.rb +3 -2
  20. data/lib/oxidized/model/cisconga.rb +19 -0
  21. data/lib/oxidized/model/comware.rb +6 -0
  22. data/lib/oxidized/model/cumulus.rb +15 -3
  23. data/lib/oxidized/model/fabricos.rb +2 -1
  24. data/lib/oxidized/model/fiberdriver.rb +4 -0
  25. data/lib/oxidized/model/firewareos.rb +7 -1
  26. data/lib/oxidized/model/fortios.rb +15 -4
  27. data/lib/oxidized/model/ios.rb +83 -8
  28. data/lib/oxidized/model/ironware.rb +5 -6
  29. data/lib/oxidized/model/junos.rb +3 -0
  30. data/lib/oxidized/model/mlnxos.rb +5 -1
  31. data/lib/oxidized/model/netgear.rb +32 -0
  32. data/lib/oxidized/model/nxos.rb +14 -1
  33. data/lib/oxidized/model/oneos.rb +58 -0
  34. data/lib/oxidized/model/opengear.rb +2 -0
  35. data/lib/oxidized/model/pfsense.rb +3 -2
  36. data/lib/oxidized/model/powerconnect.rb +1 -0
  37. data/lib/oxidized/model/procurve.rb +8 -3
  38. data/lib/oxidized/model/quantaos.rb +1 -1
  39. data/lib/oxidized/model/routeros.rb +8 -0
  40. data/lib/oxidized/model/saos.rb +3 -1
  41. data/lib/oxidized/model/siklu.rb +19 -0
  42. data/lib/oxidized/model/timos.rb +16 -0
  43. data/lib/oxidized/model/tplink.rb +65 -0
  44. data/lib/oxidized/model/voltaire.rb +56 -0
  45. data/lib/oxidized/model/voss.rb +33 -0
  46. data/lib/oxidized/model/zhoneolt.rb +52 -0
  47. data/lib/oxidized/node.rb +39 -10
  48. data/lib/oxidized/nodes.rb +2 -1
  49. data/lib/oxidized/output/gitcrypt.rb +244 -0
  50. data/lib/oxidized/source/csv.rb +10 -1
  51. data/lib/oxidized/source/http.rb +24 -7
  52. data/lib/oxidized/version.rb +1 -1
  53. data/lib/oxidized/worker.rb +3 -2
  54. data/oxidized.gemspec +2 -1
  55. metadata +29 -4
@@ -30,10 +30,11 @@ class IronWare < Oxidized::Model
30
30
  end
31
31
 
32
32
  cmd 'show chassis' do |cfg|
33
- cfg.encode!("UTF-8", :invalid => :replace) #sometimes ironware returns broken encoding
33
+ cfg.encode!("UTF-8", :invalid => :replace, :undef => :replace) #sometimes ironware returns broken encoding
34
34
  cfg.gsub! /(^((.*)Current temp(.*))$)/, '' #remove unwanted lines current temperature
35
35
  cfg.gsub! /Speed = [A-Z-]{2,6} \(\d{2,3}\%\)/, '' #remove unwanted lines Speed Fans
36
36
  cfg.gsub! /current speed is [A-Z]{2,6} \(\d{2,3}\%\)/, ''
37
+ cfg.gsub! /([\[]*)1([\]]*)<->([\[]*)2([\]]*)(<->([\[]*)3([\]]*))*/, ''
37
38
  cfg.gsub! /\d{2}\.\d deg-C/, 'XX.X deg-C'
38
39
  if cfg.include? "TEMPERATURE"
39
40
  sc = StringScanner.new cfg
@@ -66,23 +67,21 @@ class IronWare < Oxidized::Model
66
67
  # match expected prompts on both older and newer
67
68
  # versions of IronWare
68
69
  username /^(Please Enter Login Name|Username):/
69
- password /^(Please Enter )Password:/
70
+ password /^(Please Enter Password |Password):/
70
71
  end
71
72
 
72
73
  #handle pager with enable
73
74
  cfg :telnet, :ssh do
74
75
  if vars :enable
75
76
  post_login do
76
- send "enable\r\n"
77
+ send "enable\n"
77
78
  cmd vars(:enable)
78
79
  end
79
80
  end
80
81
  post_login ''
81
82
  post_login 'skip-page-display'
82
83
  post_login 'terminal length 0'
83
- pre_logout 'logout'
84
- pre_logout 'exit'
85
- pre_logout 'exit'
84
+ pre_logout "logout\nexit\nexit\n"
86
85
  end
87
86
 
88
87
  end
@@ -8,6 +8,7 @@ class JunOS < Oxidized::Model
8
8
 
9
9
  cmd :all do |cfg|
10
10
  cfg = cfg.lines.to_a[1..-2].join if screenscrape
11
+ cfg.gsub!(/ scale-subscriber (\s+)(\d+)/,' scale-subscriber <count>')
11
12
  cfg.lines.map { |line| line.rstrip }.join("\n") + "\n"
12
13
  end
13
14
 
@@ -36,6 +37,8 @@ class JunOS < Oxidized::Model
36
37
  end
37
38
 
38
39
  cmd('show chassis hardware') { |cfg| comment cfg }
40
+ cmd('show system license') { |cfg| comment cfg }
41
+ cmd('show system license keys') { |cfg| comment cfg }
39
42
 
40
43
  cfg :telnet do
41
44
  username(/^login:/)
@@ -13,6 +13,10 @@ class MLNXOS < Oxidized::Model
13
13
  cfg.gsub! /\[\?1h=\r/, '' # Pager Handling
14
14
  cfg.gsub! /\r\[K/,'' # Pager Handling
15
15
  cfg.gsub! /\s/, '' # Linebreak Handling
16
+ cfg.gsub! /^CPU\ load\ averages\:\s.+/, '' # Omit constantly changing CPU info
17
+ cfg.gsub! /^System\ memory\:\s.+/, '' # Omit constantly changing memory info
18
+ cfg.gsub! /^Uptime\:\s.+/, '' # Omit constantly changing uptime info
19
+ cfg.gsub! /.+Generated\ at\s\d+.+/, '' # Omit constantly changing generation time info
16
20
  cfg = cfg.lines.to_a[2..-3].join
17
21
  end
18
22
 
@@ -38,6 +42,6 @@ class MLNXOS < Oxidized::Model
38
42
 
39
43
  cfg :ssh do
40
44
  password /^Password:\s*/
41
- pre_logout 'exit'
45
+ pre_logout "\nexit"
42
46
  end
43
47
  end
@@ -0,0 +1,32 @@
1
+ class Netgear < Oxidized::Model
2
+
3
+ comment '!'
4
+ prompt /^(\([\w-]+\)\s[#>])$/
5
+
6
+ cmd :secret do |cfg|
7
+ cfg.gsub!(/password (\S+)/, 'password <hidden>')
8
+ cfg
9
+ end
10
+
11
+ cfg :telnet, :ssh do
12
+ if vars :enable
13
+ post_login do
14
+ cmd 'enable'
15
+ # Interpret enable: true as meaning we won't be prompted for a password
16
+ unless vars(:enable).is_a? TrueClass
17
+ expect /[pP]assword:\s?$/
18
+ cmd vars(:enable) + "\n"
19
+ end
20
+ expect /^.+[#]$/
21
+ end
22
+ end
23
+ post_login 'terminal length 0'
24
+ pre_logout 'exit'
25
+ pre_logout 'quit'
26
+ end
27
+
28
+ cmd 'show running-config' do |cfg|
29
+ cfg.gsub! /^(!.*Time).*$/, '\1'
30
+ end
31
+
32
+ end
@@ -3,6 +3,14 @@ class NXOS < Oxidized::Model
3
3
  prompt /^(\r?[\w.@_()-]+[#]\s?)$/
4
4
  comment '! '
5
5
 
6
+ cmd :secret do |cfg|
7
+ cfg.gsub! /^(snmp-server community).*/, '\\1 <configuration removed>'
8
+ cfg.gsub! /^(snmp-server user (\S+) (\S+) auth (\S+)) (\S+) (priv) (\S+)/, '\\1 <configuration removed> '
9
+ cfg.gsub! /^(username \S+ password \d) (\S+)/, '\\1 <secret hidden>'
10
+ cfg.gsub! /^(radius-server key).*/, '\\1 <secret hidden>'
11
+ cfg
12
+ end
13
+
6
14
  cmd 'show version' do |cfg|
7
15
  cfg = cfg.each_line.take_while { |line| not line.match(/uptime/i) }
8
16
  comment cfg.join ""
@@ -16,8 +24,13 @@ class NXOS < Oxidized::Model
16
24
  cfg.gsub! /^!Time:[^\n]*\n/, ''
17
25
  end
18
26
 
19
- cfg :ssh do
27
+ cfg :ssh, :telnet do
20
28
  post_login 'terminal length 0'
21
29
  pre_logout 'exit'
22
30
  end
31
+
32
+ cfg :telnet do
33
+ username /^login:/
34
+ password /^Password:/
35
+ end
23
36
  end
@@ -0,0 +1,58 @@
1
+ class OneOS < Oxidized::Model
2
+
3
+ prompt /^([\w.@()-]+#\s?)$/
4
+ comment '! '
5
+
6
+ # example how to handle pager
7
+ #expect /^\s--More--\s+.*$/ do |data, re|
8
+ # send ' '
9
+ # data.sub re, ''
10
+ #end
11
+
12
+ # non-preferred way to handle additional PW prompt
13
+ #expect /^[\w.]+>$/ do |data|
14
+ # send "enable\n"
15
+ # send vars(:enable) + "\n"
16
+ # data
17
+ #end
18
+
19
+ cmd :all do |cfg|
20
+ #cfg.gsub! /\cH+\s{8}/, '' # example how to handle pager
21
+ #cfg.gsub! /\cH+/, '' # example how to handle pager
22
+ cfg.each_line.to_a[1..-2].join
23
+ end
24
+
25
+ cmd :secret do |cfg|
26
+ cfg.gsub! /^(snmp set-read-community ").*+?(".*)$/, '\\1<secret hidden>\\2'
27
+ cfg
28
+ end
29
+
30
+ cmd 'show version' do |cfg|
31
+ comment cfg
32
+ end
33
+
34
+ cmd 'show running-config' do |cfg|
35
+ cfg = cfg.each_line.to_a[0..-1].join
36
+ cfg.gsub! /^Building configuration...\s*[^\n]*\n/, ''
37
+ cfg.gsub! /^Current configuration :\s*[^\n]*\n/, ''
38
+ cfg
39
+ end
40
+
41
+ cfg :telnet do
42
+ username /^Username:/
43
+ password /^Password:/
44
+ end
45
+
46
+ cfg :telnet, :ssh do
47
+ # preferred way to handle additional passwords
48
+ if vars :enable
49
+ post_login do
50
+ send "enable\n"
51
+ cmd vars(:enable)
52
+ end
53
+ end
54
+ post_login 'term len 0'
55
+ pre_logout 'exit'
56
+ end
57
+
58
+ end
@@ -1,6 +1,8 @@
1
1
  class OpenGear < Oxidized::Model
2
2
 
3
3
  comment '# '
4
+
5
+ prompt /^(\$\s)?$/
4
6
 
5
7
  cmd :secret do |cfg|
6
8
  cfg.gsub!(/password (\S+)/, 'password <secret removed>')
@@ -3,11 +3,12 @@ class PfSense < Oxidized::Model
3
3
  # use other use than 'admin' user, 'admin' user cannot get ssh/exec. See issue #535
4
4
 
5
5
  cmd :all do |cfg|
6
- cfg.each_line.to_a[1..-2].join
6
+ cfg.each_line.to_a[1..-1].join
7
7
  end
8
8
 
9
9
  cmd 'cat /cf/conf/config.xml' do |cfg|
10
- cfg.gsub! /\s<revision>\s*.*\s*<time>\d*<\/time>\s*.*\s*<\/revision>/, ''
10
+ cfg.gsub! /\s<revision>\s*<time>\d*<\/time>\s*.*\s*.*\s*<\/revision>/, ''
11
+ cfg.gsub! /\s<last_rule_upd_time>\d*<\/last_rule_upd_time>/, ''
11
12
  cfg
12
13
  end
13
14
 
@@ -67,6 +67,7 @@ class PowerConnect < Oxidized::Model
67
67
  end
68
68
  out << line.strip
69
69
  end
70
+ out = out.select { |line| not line[/Up\sTime/] }
70
71
  out = comment out.join "\n"
71
72
  out << "\n"
72
73
  end
@@ -1,11 +1,16 @@
1
1
  class Procurve < Oxidized::Model
2
2
 
3
- # some models start lines with \r
3
+ # some models start lines with \r
4
4
  # previous command is repeated followed by "\eE", which sometimes ends up on last line
5
- prompt /^\r?([\w -]+\eE)?([\w.-]+# )$/
5
+ prompt /^\r?([\w.-]+# )$/
6
6
 
7
7
  comment '! '
8
8
 
9
+ # replace next line control sequence with a new line
10
+ expect /(\e\[1M\e\[\??\d+(;\d+)*[A-Za-z]\e\[1L)|(\eE)/ do |data, re|
11
+ data.gsub re, "\n"
12
+ end
13
+
9
14
  # replace all used vt100 control sequences
10
15
  expect /\e\[\??\d+(;\d+)*[A-Za-z]/ do |data, re|
11
16
  data.gsub re, ''
@@ -17,7 +22,7 @@ class Procurve < Oxidized::Model
17
22
  end
18
23
 
19
24
  cmd :all do |cfg|
20
- cfg = cfg.each_line.to_a[1..-3].join
25
+ cfg = cfg.each_line.to_a[1..-2].join
21
26
  cfg = cfg.gsub /^\r/, ''
22
27
  end
23
28
 
@@ -12,7 +12,7 @@ class QuantaOS < Oxidized::Model
12
12
  end
13
13
 
14
14
  cfg :telnet do
15
- username /^Username:/
15
+ username /^User(name)?:/
16
16
  password /^Password:/
17
17
  end
18
18
 
@@ -6,6 +6,10 @@ class RouterOS < Oxidized::Model
6
6
  comment cfg
7
7
  end
8
8
 
9
+ cmd '/system package update print' do |cfg|
10
+ comment cfg
11
+ end
12
+
9
13
  cmd '/export' do |cfg|
10
14
  cfg.gsub! /\x1B\[([0-9]{1,3}((;[0-9]{1,3})*)?)?[m|K]/, '' # strip ANSI colours
11
15
  cfg.gsub! /\\\r\n\s+/, '' # strip new line
@@ -18,6 +22,10 @@ class RouterOS < Oxidized::Model
18
22
  password /^Password:/
19
23
  end
20
24
 
25
+ cfg :telnet, :ssh do
26
+ pre_logout 'quit'
27
+ end
28
+
21
29
  cfg :ssh do
22
30
  exec true
23
31
  end
@@ -2,7 +2,7 @@ class SAOS < Oxidized::Model
2
2
 
3
3
  # Ciena SAOS switch
4
4
  # used for 6.x devices
5
-
5
+
6
6
  comment '! '
7
7
 
8
8
  cmd :all do |cfg|
@@ -10,6 +10,8 @@ class SAOS < Oxidized::Model
10
10
  end
11
11
 
12
12
  cmd 'configuration show' do |cfg|
13
+ cfg.gsub! /^! Created: [^\n]*\n/, ''
14
+ cfg.gsub! /^! On terminal: [^\n]*\n/, ''
13
15
  cfg
14
16
  end
15
17
 
@@ -0,0 +1,19 @@
1
+ class Siklu < Oxidized::Model
2
+
3
+ # Siklu EtherHaul #
4
+
5
+ prompt /^[\w-]+>$/
6
+
7
+ cmd 'copy startup-configuration display' do |cfg|
8
+ cfg.each_line.to_a[2..2].join
9
+ end
10
+
11
+ cmd 'copy running-configuration display' do |cfg|
12
+ cfg.each_line.to_a[3..-2].join
13
+ end
14
+
15
+ cfg :ssh do
16
+ pre_logout 'exit'
17
+ end
18
+
19
+ end
@@ -18,6 +18,8 @@ class TiMOS < Oxidized::Model
18
18
  # Show the boot options file.
19
19
  #
20
20
  cmd 'show bof' do |cfg|
21
+ cfg.gsub! /# Finished .*/, ''
22
+ cfg.gsub! /# Generated .*/, ''
21
23
  comment cfg
22
24
  end
23
25
 
@@ -29,6 +31,8 @@ class TiMOS < Oxidized::Model
29
31
  # Strip uptime.
30
32
  #
31
33
  cfg.sub! /^System Up Time.*\n/, ''
34
+ cfg.gsub! /# Finished .*/, ''
35
+ cfg.gsub! /# Generated .*/, ''
32
36
  comment cfg
33
37
  end
34
38
 
@@ -36,6 +40,8 @@ class TiMOS < Oxidized::Model
36
40
  # Show the card state.
37
41
  #
38
42
  cmd 'show card state' do |cfg|
43
+ cfg.gsub! /# Finished .*/, ''
44
+ cfg.gsub! /# Generated .*/, ''
39
45
  comment cfg
40
46
  end
41
47
 
@@ -48,6 +54,8 @@ class TiMOS < Oxidized::Model
48
54
  #
49
55
  cfg.gsub! /\r/, ''
50
56
  cfg.gsub! /[\b][\b][\b]/, "\n"
57
+ cfg.gsub! /# Finished .*/, ''
58
+ cfg.gsub! /# Generated .*/, ''
51
59
  comment cfg
52
60
  end
53
61
 
@@ -55,6 +63,8 @@ class TiMOS < Oxidized::Model
55
63
  # Show the running debug configuration.
56
64
  #
57
65
  cmd 'show debug' do |cfg|
66
+ cfg.gsub! /# Finished .*/, ''
67
+ cfg.gsub! /# Generated .*/, ''
58
68
  comment cfg
59
69
  end
60
70
 
@@ -66,6 +76,8 @@ class TiMOS < Oxidized::Model
66
76
  # Strip carriage returns.
67
77
  #
68
78
  cfg.gsub! /\r/, ''
79
+ cfg.gsub! /# Finished .*/, ''
80
+ cfg.gsub! /# Generated .*/, ''
69
81
  comment cfg
70
82
  end
71
83
 
@@ -77,6 +89,8 @@ class TiMOS < Oxidized::Model
77
89
  # Strip carriage returns.
78
90
  #
79
91
  cfg.gsub! /\r/, ''
92
+ cfg.gsub! /# Finished .*/, ''
93
+ cfg.gsub! /# Generated .*/, ''
80
94
  comment cfg
81
95
  end
82
96
 
@@ -88,6 +102,8 @@ class TiMOS < Oxidized::Model
88
102
  # Strip carriage returns.
89
103
  #
90
104
  cfg.gsub! /\r/, ''
105
+ cfg.gsub! /# Finished .*/, ''
106
+ cfg.gsub! /# Generated .*/, ''
91
107
  end
92
108
 
93
109
  cfg :telnet do
@@ -0,0 +1,65 @@
1
+ class TPLink < Oxidized::Model
2
+
3
+ # tp-link prompt
4
+ prompt /^\r?([\w.@()-]+[#>]\s?)$/
5
+ comment '! '
6
+
7
+ # handle paging
8
+ # workaround for sometimes missing whitespaces with "\s?"
9
+ expect /Press\s?any\s?key\s?to\s?continue\s?\(Q\s?to\s?quit\)/ do |data, re|
10
+ send ' '
11
+ data.sub re, ''
12
+ end
13
+
14
+ # send carriage return because \n with the command is not enough
15
+ # checks if line ends with prompt >,# or \r,\nm otherwise send \r
16
+ expect /[^>#\r\n]$/ do |data, re|
17
+ send "\r"
18
+ data.sub re, ''
19
+ end
20
+
21
+ cmd :all do |cfg|
22
+ # normalize linefeeds
23
+ cfg.gsub! /(\r|\r\n|\n\r)/,"\n"
24
+ # remove empty lines
25
+ cfg.each_line.reject { |line| line.match /^[\r\n\s\u0000#]+$/ }.join
26
+ end
27
+
28
+ cmd :secret do |cfg|
29
+ cfg.gsub! /^(snmp-server community).*/, '\\1 <configuration removed>'
30
+ cfg.gsub! /secret (\d+) (\S+).*/, '<secret hidden>'
31
+ cfg
32
+ end
33
+
34
+ cmd 'show system-info' do |cfg|
35
+ comment cfg.each_line.to_a[3..-3].join
36
+ end
37
+
38
+ cmd 'show running-config' do |cfg|
39
+ lines = cfg.each_line.to_a[1..-1]
40
+ # cut config after "end"
41
+ lines[0..lines.index("end\n")].join
42
+ end
43
+
44
+ cfg :telnet, :ssh do
45
+ username /^User ?[nN]ame:/
46
+ password /^\r?Password:/
47
+ end
48
+
49
+ cfg :telnet, :ssh do
50
+ if vars :enable
51
+ post_login do
52
+ send "enable\r"
53
+ cmd vars(:enable)
54
+ end
55
+ end
56
+
57
+ pre_logout do
58
+ send "exit\r"
59
+ send "logout\r"
60
+ end
61
+
62
+ end
63
+
64
+ end
65
+