oxidized 0.19.0 → 0.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
+