oxidized 0.20.0 → 0.28.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (222) hide show
  1. checksums.yaml +5 -5
  2. data/.codeclimate.yml +4 -0
  3. data/.github/PULL_REQUEST_TEMPLATE.md +12 -0
  4. data/.github/no-response.yml +13 -0
  5. data/.github/workflows/publishdocker.yml +13 -0
  6. data/.gitignore +4 -0
  7. data/.rubocop.yml +73 -0
  8. data/.rubocop_todo.yml +120 -0
  9. data/.travis.yml +6 -1
  10. data/CHANGELOG.md +693 -243
  11. data/Dockerfile +27 -19
  12. data/LICENSE +201 -0
  13. data/README.md +234 -913
  14. data/Rakefile +48 -7
  15. data/TODO.md +29 -23
  16. data/bin/console +1 -1
  17. data/bin/oxidized +6 -5
  18. data/docs/Configuration.md +313 -0
  19. data/docs/Creating-Models.md +140 -0
  20. data/docs/Hooks.md +274 -0
  21. data/docs/Model-Notes/AireOS.md +11 -0
  22. data/docs/Model-Notes/ArbOS.md +11 -0
  23. data/docs/Model-Notes/Comware.md +13 -0
  24. data/docs/Model-Notes/Cumulus.md +40 -0
  25. data/docs/Model-Notes/EOS.md +12 -0
  26. data/docs/Model-Notes/IOS.md +29 -0
  27. data/docs/Model-Notes/JunOS.md +33 -0
  28. data/docs/Model-Notes/LinuxGeneric.md +24 -0
  29. data/docs/Model-Notes/Netgear.md +87 -0
  30. data/docs/Model-Notes/Nokia.md +9 -0
  31. data/docs/Model-Notes/README.md +24 -0
  32. data/docs/Model-Notes/SmartAX-Huawei.md +35 -0
  33. data/docs/Model-Notes/VRP-Huawei.md +34 -0
  34. data/docs/Model-Notes/Viptela.md +12 -0
  35. data/docs/Model-Notes/XGS4600-Zyxel.md +36 -0
  36. data/docs/Outputs.md +190 -0
  37. data/docs/Ruby-API.md +199 -0
  38. data/docs/Sources.md +171 -0
  39. data/docs/Supported-OS-Types.md +227 -0
  40. data/docs/Troubleshooting.md +66 -0
  41. data/extra/nagios_check_failing_nodes.rb +9 -2
  42. data/extra/oxidized-report-git-commits +21 -40
  43. data/extra/oxidized-ubuntu.haproxy +45 -0
  44. data/extra/oxidized.logrotate +7 -0
  45. data/extra/oxidized.service +13 -0
  46. data/extra/rest_client.rb +7 -10
  47. data/extra/syslog.rb +47 -42
  48. data/lib/oxidized/cli.rb +41 -31
  49. data/lib/oxidized/config/vars.rb +9 -14
  50. data/lib/oxidized/config.rb +20 -13
  51. data/lib/oxidized/core.rb +8 -10
  52. data/lib/oxidized/hook/awssns.rb +6 -7
  53. data/lib/oxidized/hook/ciscosparkdiff.rb +43 -0
  54. data/lib/oxidized/hook/exec.rb +19 -24
  55. data/lib/oxidized/hook/githubrepo.rb +17 -17
  56. data/lib/oxidized/hook/noophook.rb +1 -1
  57. data/lib/oxidized/hook/slackdiff.rb +32 -19
  58. data/lib/oxidized/hook/xmppdiff.rb +59 -0
  59. data/lib/oxidized/hook.rb +63 -64
  60. data/lib/oxidized/input/cli.rb +22 -12
  61. data/lib/oxidized/input/exec.rb +28 -0
  62. data/lib/oxidized/input/ftp.rb +16 -15
  63. data/lib/oxidized/input/http.rb +72 -0
  64. data/lib/oxidized/input/input.rb +6 -6
  65. data/lib/oxidized/input/ssh.rb +64 -56
  66. data/lib/oxidized/input/telnet.rb +59 -102
  67. data/lib/oxidized/input/tftp.rb +9 -10
  68. data/lib/oxidized/jobs.rb +9 -10
  69. data/lib/oxidized/manager.rb +42 -44
  70. data/lib/oxidized/model/acos.rb +19 -20
  71. data/lib/oxidized/model/acsw.rb +62 -0
  72. data/lib/oxidized/model/adtran.rb +26 -0
  73. data/lib/oxidized/model/aen.rb +19 -0
  74. data/lib/oxidized/model/aireos.rb +9 -10
  75. data/lib/oxidized/model/airfiber.rb +22 -0
  76. data/lib/oxidized/model/alteonos.rb +58 -0
  77. data/lib/oxidized/model/alvarion.rb +0 -4
  78. data/lib/oxidized/model/aos.rb +11 -5
  79. data/lib/oxidized/model/aos7.rb +6 -7
  80. data/lib/oxidized/model/aosw.rb +30 -27
  81. data/lib/oxidized/model/apc_aos.rb +2 -5
  82. data/lib/oxidized/model/arbos.rb +26 -0
  83. data/lib/oxidized/model/aricentiss.rb +49 -0
  84. data/lib/oxidized/model/asa.rb +61 -22
  85. data/lib/oxidized/model/asyncos.rb +46 -0
  86. data/lib/oxidized/model/audiocodes.rb +28 -0
  87. data/lib/oxidized/model/audiocodesmp.rb +28 -0
  88. data/lib/oxidized/model/awplus.rb +84 -0
  89. data/lib/oxidized/model/axos.rb +16 -0
  90. data/lib/oxidized/model/boss.rb +77 -0
  91. data/lib/oxidized/model/br6910.rb +42 -45
  92. data/lib/oxidized/model/c4cmts.rb +6 -10
  93. data/lib/oxidized/model/cambium.rb +23 -0
  94. data/lib/oxidized/model/casa.rb +1 -1
  95. data/lib/oxidized/model/catos.rb +1 -3
  96. data/lib/oxidized/model/cisconga.rb +1 -3
  97. data/lib/oxidized/model/ciscosma.rb +42 -0
  98. data/lib/oxidized/model/ciscosmb.rb +30 -10
  99. data/lib/oxidized/model/ciscovpn3k.rb +11 -0
  100. data/lib/oxidized/model/cnos.rb +33 -0
  101. data/lib/oxidized/model/comnetms.rb +43 -0
  102. data/lib/oxidized/model/comtrol.rb +41 -0
  103. data/lib/oxidized/model/comware.rb +28 -16
  104. data/lib/oxidized/model/coriant8600.rb +3 -5
  105. data/lib/oxidized/model/coriantgroove.rb +26 -0
  106. data/lib/oxidized/model/corianttmos.rb +1 -3
  107. data/lib/oxidized/model/cumulus.rb +60 -49
  108. data/lib/oxidized/model/datacom.rb +1 -4
  109. data/lib/oxidized/model/dcnos.rb +46 -0
  110. data/lib/oxidized/model/dellx.rb +76 -0
  111. data/lib/oxidized/model/dlink.rb +5 -4
  112. data/lib/oxidized/model/dnos.rb +11 -5
  113. data/lib/oxidized/model/eciapollo.rb +34 -0
  114. data/lib/oxidized/model/edgecos.rb +49 -0
  115. data/lib/oxidized/model/edgeos.rb +12 -5
  116. data/lib/oxidized/model/edgeswitch.rb +2 -4
  117. data/lib/oxidized/model/enterasys.rb +28 -0
  118. data/lib/oxidized/model/eos.rb +8 -8
  119. data/lib/oxidized/model/fabricos.rb +4 -6
  120. data/lib/oxidized/model/fastiron.rb +66 -0
  121. data/lib/oxidized/model/fiberdriver.rb +2 -2
  122. data/lib/oxidized/model/firebrick.rb +31 -0
  123. data/lib/oxidized/model/firelinuxos.rb +41 -0
  124. data/lib/oxidized/model/firewareos.rb +3 -6
  125. data/lib/oxidized/model/fortios.rb +31 -19
  126. data/lib/oxidized/model/ftos.rb +8 -5
  127. data/lib/oxidized/model/fujitsupy.rb +5 -7
  128. data/lib/oxidized/model/gaiaos.rb +7 -11
  129. data/lib/oxidized/model/gcombnps.rb +84 -0
  130. data/lib/oxidized/model/grandstream.rb +9 -0
  131. data/lib/oxidized/model/hatteras.rb +9 -6
  132. data/lib/oxidized/model/hirschmann.rb +39 -0
  133. data/lib/oxidized/model/hpebladesystem.rb +20 -18
  134. data/lib/oxidized/model/hpemsa.rb +10 -0
  135. data/lib/oxidized/model/hpmsm.rb +84 -0
  136. data/lib/oxidized/model/ibos.rb +55 -0
  137. data/lib/oxidized/model/icotera.rb +27 -0
  138. data/lib/oxidized/model/ios.rb +63 -70
  139. data/lib/oxidized/model/iosxe.rb +5 -0
  140. data/lib/oxidized/model/iosxr.rb +2 -3
  141. data/lib/oxidized/model/ipos.rb +10 -6
  142. data/lib/oxidized/model/ironware.rb +20 -19
  143. data/lib/oxidized/model/isam.rb +5 -6
  144. data/lib/oxidized/model/junos.rb +9 -11
  145. data/lib/oxidized/model/linuxgeneric.rb +74 -0
  146. data/lib/oxidized/model/masteros.rb +3 -6
  147. data/lib/oxidized/model/mlnxos.rb +9 -10
  148. data/lib/oxidized/model/model.rb +72 -46
  149. data/lib/oxidized/model/mtrlrfs.rb +1 -4
  150. data/lib/oxidized/model/ndms.rb +23 -0
  151. data/lib/oxidized/model/netgear.rb +35 -15
  152. data/lib/oxidized/model/netonix.rb +2 -2
  153. data/lib/oxidized/model/netscaler.rb +6 -3
  154. data/lib/oxidized/model/nos.rb +5 -7
  155. data/lib/oxidized/model/nsxconfig.rb +22 -0
  156. data/lib/oxidized/model/nsxfirewall.rb +22 -0
  157. data/lib/oxidized/model/nxos.rb +13 -3
  158. data/lib/oxidized/model/oneos.rb +15 -9
  159. data/lib/oxidized/model/openbsd.rb +63 -0
  160. data/lib/oxidized/model/opengear.rb +3 -5
  161. data/lib/oxidized/model/openwrt.rb +78 -0
  162. data/lib/oxidized/model/opnsense.rb +19 -0
  163. data/lib/oxidized/model/os10.rb +46 -0
  164. data/lib/oxidized/model/outputs.rb +5 -7
  165. data/lib/oxidized/model/panos.rb +11 -12
  166. data/lib/oxidized/model/pfsense.rb +11 -6
  167. data/lib/oxidized/model/planet.rb +14 -17
  168. data/lib/oxidized/model/powerconnect.rb +24 -19
  169. data/lib/oxidized/model/procurve.rb +43 -11
  170. data/lib/oxidized/model/purityos.rb +12 -0
  171. data/lib/oxidized/model/qtech.rb +41 -0
  172. data/lib/oxidized/model/quantaos.rb +4 -6
  173. data/lib/oxidized/model/raisecom.rb +19 -0
  174. data/lib/oxidized/model/routeros.rb +26 -8
  175. data/lib/oxidized/model/saos.rb +1 -2
  176. data/lib/oxidized/model/screenos.rb +8 -11
  177. data/lib/oxidized/model/sgos.rb +45 -0
  178. data/lib/oxidized/model/siklu.rb +1 -3
  179. data/lib/oxidized/model/slxos.rb +59 -0
  180. data/lib/oxidized/model/smartax.rb +25 -0
  181. data/lib/oxidized/model/sonicos.rb +51 -0
  182. data/lib/oxidized/model/speedtouch.rb +34 -0
  183. data/lib/oxidized/model/sros.rb +96 -0
  184. data/lib/oxidized/model/stoneos.rb +32 -0
  185. data/lib/oxidized/model/supermicro.rb +6 -41
  186. data/lib/oxidized/model/tdre.rb +30 -0
  187. data/lib/oxidized/model/telco.rb +24 -0
  188. data/lib/oxidized/model/timos.rb +6 -114
  189. data/lib/oxidized/model/tmos.rb +6 -3
  190. data/lib/oxidized/model/tplink.rb +11 -11
  191. data/lib/oxidized/model/trango.rb +21 -42
  192. data/lib/oxidized/model/ucs.rb +30 -0
  193. data/lib/oxidized/model/viptela.rb +29 -0
  194. data/lib/oxidized/model/voltaire.rb +9 -12
  195. data/lib/oxidized/model/voss.rb +17 -6
  196. data/lib/oxidized/model/vrp.rb +11 -6
  197. data/lib/oxidized/model/vyatta.rb +8 -6
  198. data/lib/oxidized/model/weos.rb +20 -0
  199. data/lib/oxidized/model/xos.rb +20 -8
  200. data/lib/oxidized/model/zhoneolt.rb +2 -2
  201. data/lib/oxidized/model/zynos.rb +1 -3
  202. data/lib/oxidized/model/zynoscli.rb +36 -0
  203. data/lib/oxidized/model/zynosgs.rb +38 -0
  204. data/lib/oxidized/node/stats.rb +33 -8
  205. data/lib/oxidized/node.rb +86 -95
  206. data/lib/oxidized/nodes.rb +48 -44
  207. data/lib/oxidized/output/file.rb +32 -37
  208. data/lib/oxidized/output/git.rb +138 -153
  209. data/lib/oxidized/output/gitcrypt.rb +228 -242
  210. data/lib/oxidized/output/http.rb +35 -34
  211. data/lib/oxidized/output/output.rb +2 -3
  212. data/lib/oxidized/source/csv.rb +50 -44
  213. data/lib/oxidized/source/http.rb +58 -58
  214. data/lib/oxidized/source/source.rb +9 -10
  215. data/lib/oxidized/source/sql.rb +47 -45
  216. data/lib/oxidized/string.rb +18 -14
  217. data/lib/oxidized/version.rb +17 -1
  218. data/lib/oxidized/worker.rb +72 -33
  219. data/oxidized.gemspec +20 -19
  220. metadata +180 -36
  221. data/.ruby-version +0 -1
  222. data/Gemfile.lock +0 -44
@@ -1,40 +1,47 @@
1
1
  class IOS < Oxidized::Model
2
-
3
2
  prompt /^([\w.@()-]+[#>]\s?)$/
4
3
  comment '! '
5
4
 
6
5
  # example how to handle pager
7
- #expect /^\s--More--\s+.*$/ do |data, re|
6
+ # expect /^\s--More--\s+.*$/ do |data, re|
8
7
  # send ' '
9
8
  # data.sub re, ''
10
- #end
9
+ # end
11
10
 
12
11
  # non-preferred way to handle additional PW prompt
13
- #expect /^[\w.]+>$/ do |data|
12
+ # expect /^[\w.]+>$/ do |data|
14
13
  # send "enable\n"
15
14
  # send vars(:enable) + "\n"
16
15
  # data
17
- #end
16
+ # end
18
17
 
19
18
  cmd :all do |cfg|
20
- #cfg.gsub! /\cH+\s{8}/, '' # example how to handle pager
21
- #cfg.gsub! /\cH+/, '' # example how to handle pager
19
+ # cfg.gsub! /\cH+\s{8}/, '' # example how to handle pager
20
+ # cfg.gsub! /\cH+/, '' # example how to handle pager
22
21
  # get rid of errors for commands that don't work on some devices
23
22
  cfg.gsub! /^% Invalid input detected at '\^' marker\.$|^\s+\^$/, ''
24
- cfg.each_line.to_a[1..-2].join
23
+ cfg.cut_both
25
24
  end
26
25
 
27
26
  cmd :secret do |cfg|
28
27
  cfg.gsub! /^(snmp-server community).*/, '\\1 <configuration removed>'
29
- cfg.gsub! /^(username \S+ privilege \d+) (\S+).*/, '\\1 <secret hidden>'
30
- cfg.gsub! /^(username \S+ password \d) (\S+)/, '\\1 <secret hidden>'
31
- cfg.gsub! /^(username \S+ secret \d) (\S+)/, '\\1 <secret hidden>'
32
- cfg.gsub! /^(enable (password|secret) \d) (\S+)/, '\\1 <secret hidden>'
28
+ cfg.gsub! /^(snmp-server host \S+( vrf \S+)?( informs?)?( version (1|2c|3 (noauth|auth|priv)))?)\s+\S+((\s+\S*)*)\s*/, '\\1 <secret hidden> \\7'
29
+ cfg.gsub! /^(username .+ (password|secret) \d) .+/, '\\1 <secret hidden>'
30
+ cfg.gsub! /^(enable (password|secret)( level \d+)? \d) .+/, '\\1 <secret hidden>'
33
31
  cfg.gsub! /^(\s+(?:password|secret)) (?:\d )?\S+/, '\\1 <secret hidden>'
34
32
  cfg.gsub! /^(.*wpa-psk ascii \d) (\S+)/, '\\1 <secret hidden>'
35
33
  cfg.gsub! /^(.*key 7) (\d.+)/, '\\1 <secret hidden>'
36
- cfg.gsub! /^(tacacs-server key \d) (\S+)/, '\\1 <secret hidden>'
34
+ cfg.gsub! /^(tacacs-server (.+ )?key) .+/, '\\1 <secret hidden>'
37
35
  cfg.gsub! /^(crypto isakmp key) (\S+) (.*)/, '\\1 <secret hidden> \\3'
36
+ cfg.gsub! /^(\s+ip ospf message-digest-key \d+ md5) .+/, '\\1 <secret hidden>'
37
+ cfg.gsub! /^(\s+ip ospf authentication-key) .+/, '\\1 <secret hidden>'
38
+ cfg.gsub! /^(\s+neighbor \S+ password) .+/, '\\1 <secret hidden>'
39
+ cfg.gsub! /^(\s+vrrp \d+ authentication text) .+/, '\\1 <secret hidden>'
40
+ cfg.gsub! /^(\s+standby \d+ authentication) .{1,8}$/, '\\1 <secret hidden>'
41
+ cfg.gsub! /^(\s+standby \d+ authentication md5 key-string) .+?( timeout \d+)?$/, '\\1 <secret hidden> \\2'
42
+ cfg.gsub! /^(\s+key-string) .+/, '\\1 <secret hidden>'
43
+ cfg.gsub! /^((tacacs|radius) server [^\n]+\n(\s+[^\n]+\n)*\s+key) [^\n]+$/m, '\1 <secret hidden>'
44
+ cfg.gsub! /^(\s+ppp (chap|pap) password \d) .+/, '\\1 <secret hidden>'
38
45
  cfg
39
46
  end
40
47
 
@@ -42,64 +49,46 @@ class IOS < Oxidized::Model
42
49
  comments = []
43
50
  comments << cfg.lines.first
44
51
  lines = cfg.lines
45
- lines.each_with_index do |line,i|
46
- slave = ''
47
- slaveslot = ''
52
+ lines.each_with_index do |line, i|
53
+ slave = ''
54
+ slaveslot = ''
48
55
 
49
- if line.match /^Slave in slot (\d+) is running/
50
- slave = " Slave:";
51
- slaveslot = ", slot #{$1}";
52
- end
56
+ if line =~ /^Slave in slot (\d+) is running/
57
+ slave = " Slave:"
58
+ slaveslot = ", slot #{Regexp.last_match(1)}"
59
+ end
53
60
 
54
- if line.match /^Compiled (.*)$/
55
- comments << "Image:#{slave} Compiled: #{$1}"
56
- end
61
+ comments << "Image:#{slave} Compiled: #{Regexp.last_match(1)}" if line =~ /^Compiled (.*)$/
57
62
 
58
- if line.match /^(?:Cisco )?IOS .* Software,? \(([A-Za-z0-9_-]*)\), .*Version\s+(.*)$/
59
- comments << "Image:#{slave} Software: #{$1}, #{$2}"
60
- end
63
+ comments << "Image:#{slave} Software: #{Regexp.last_match(1)}, #{Regexp.last_match(2)}" if line =~ /^(?:Cisco )?IOS .* Software,? \(([A-Za-z0-9_-]*)\), .*Version\s+(.*)$/
61
64
 
62
- if line.match /^ROM: (IOS \S+ )?(System )?Bootstrap.*(Version.*)$/
63
- comments << "ROM Bootstrap: #{$3}"
64
- end
65
+ comments << "ROM Bootstrap: #{Regexp.last_match(3)}" if line =~ /^ROM: (IOS \S+ )?(System )?Bootstrap.*(Version.*)$/
65
66
 
66
- if line.match /^BOOTFLASH: .*(Version.*)$/
67
- comments << "BOOTFLASH: #{$1}"
68
- end
67
+ comments << "BOOTFLASH: #{Regexp.last_match(1)}" if line =~ /^BOOTFLASH: .*(Version.*)$/
69
68
 
70
- if line.match /^(\d+[kK]) bytes of (non-volatile|NVRAM)/
71
- comments << "Memory: nvram #{$1}"
72
- end
69
+ comments << "Memory: nvram #{Regexp.last_match(1)}" if line =~ /^(\d+[kK]) bytes of (non-volatile|NVRAM)/
73
70
 
74
- if line.match /^(\d+[kK]) bytes of (flash memory|flash internal|processor board System flash|ATA CompactFlash)/i
75
- comments << "Memory: flash #{$1}"
76
- end
71
+ comments << "Memory: flash #{Regexp.last_match(1)}" if line =~ /^(\d+[kK]) bytes of (flash memory|flash internal|processor board System flash|ATA CompactFlash)/i
77
72
 
78
- if line.match (/^(\d+[kK]) bytes of (Flash|ATA)?.*PCMCIA .*(slot|disk) ?(\d)/i)
79
- comments << "Memory: pcmcia #{$2} #{$3}#{$4} #{$1}";
80
- end
73
+ comments << "Memory: pcmcia #{Regexp.last_match(2)} #{Regexp.last_match(3)}#{Regexp.last_match(4)} #{Regexp.last_match(1)}" if line =~ /^(\d+[kK]) bytes of (Flash|ATA)?.*PCMCIA .*(slot|disk) ?(\d)/i
81
74
 
82
- if line.match /(\S+(?:\sseries)?)\s+(?:\((\S+)\)\s+processor|\(revision[^)]+\)).*\s+with (\S+k) bytes/i
83
- sproc = $1
84
- cpu = $2
85
- mem = $3
86
- cpuxtra = ''
87
- comments << "Chassis type:#{slave} #{sproc}";
88
- comments << "Memory:#{slave} main #{mem}";
89
- # check the next two lines for more CPU info
90
- if cfg.lines[i+1].match /processor board id (\S+)/i
91
- comments << "Processor ID: #{$1}";
92
- end
93
- if cfg.lines[i+2].match /(cpu at |processor: |#{cpu} processor,)/i
94
- # change implementation to impl and prepend comma
95
- cpuxtra = cfg.lines[i+2].gsub(/implementation/,'impl').gsub(/^/,', ').chomp;
96
- end
97
- comments << "CPU:#{slave} #{cpu}#{cpuxtra}#{slaveslot}";
75
+ if line =~ /(\S+(?:\sseries)?)\s+(?:\((\S+)\)\s+processor|\(revision[^)]+\)).*\s+with (\S+k) bytes/i
76
+ sproc = Regexp.last_match(1)
77
+ cpu = Regexp.last_match(2)
78
+ mem = Regexp.last_match(3)
79
+ cpuxtra = ''
80
+ comments << "Chassis type:#{slave} #{sproc}"
81
+ comments << "Memory:#{slave} main #{mem}"
82
+ # check the next two lines for more CPU info
83
+ comments << "Processor ID: #{Regexp.last_match(1)}" if cfg.lines[i + 1] =~ /processor board id (\S+)/i
84
+ if cfg.lines[i + 2] =~ /(cpu at |processor: |#{cpu} processor,)/i
85
+ # change implementation to impl and prepend comma
86
+ cpuxtra = cfg.lines[i + 2].gsub(/implementation/, 'impl').gsub(/^/, ', ').chomp
98
87
  end
88
+ comments << "CPU:#{slave} #{cpu}#{cpuxtra}#{slaveslot}"
89
+ end
99
90
 
100
- if line.match /^System image file is "([^\"]*)"$/
101
- comments << "Image: #{$1}"
102
- end
91
+ comments << "Image: #{Regexp.last_match(1)}" if line =~ /^System image file is "([^"]*)"$/
103
92
  end
104
93
  comments << "\n"
105
94
  comment comments.join "\n"
@@ -107,7 +96,8 @@ class IOS < Oxidized::Model
107
96
 
108
97
  cmd 'show vtp status' do |cfg|
109
98
  cfg.gsub! /^$\n/, ''
110
- cfg.gsub! /^/, 'VTP: ' if (!cfg.empty?)
99
+ cfg.gsub! /Configuration last modified by.*\n/, ''
100
+ cfg.gsub! /^/, 'VTP: ' unless cfg.empty?
111
101
  comment "#{cfg}\n"
112
102
  end
113
103
 
@@ -119,22 +109,26 @@ class IOS < Oxidized::Model
119
109
  cfg = cfg.each_line.to_a[3..-1]
120
110
  cfg = cfg.reject { |line| line.match /^ntp clock-period / }.join
121
111
  cfg.gsub! /^Current configuration : [^\n]*\n/, ''
122
- cfg.gsub! /^\ tunnel\ mpls\ traffic-eng\ bandwidth[^\n]*\n*(
123
- (?:\ [^\n]*\n*)*
124
- tunnel\ mpls\ traffic-eng\ auto-bw)/mx, '\1'
112
+ cfg.gsub! /^! (Last|No) configuration change (at|since).*\n/, ''
113
+ cfg.gsub! /^! NVRAM config last updated.*\n/, ''
114
+ cfg.gsub! /^ tunnel mpls traffic-eng bandwidth[^\n]*\n*(
115
+ (?: [^\n]*\n*)*
116
+ tunnel mpls traffic-eng auto-bw)/mx, '\1'
125
117
  cfg
126
118
  end
127
119
 
128
120
  cfg :telnet do
129
- username /^Username:/
130
- password /^Password:/
121
+ username /^Username:/i
122
+ password /^Password:/i
131
123
  end
132
124
 
133
125
  cfg :telnet, :ssh do
134
126
  # preferred way to handle additional passwords
135
- if vars :enable
136
- post_login do
137
- send "enable\n"
127
+ post_login do
128
+ if vars(:enable) == true
129
+ cmd "enable"
130
+ elsif vars(:enable)
131
+ cmd "enable", /^[pP]assword:/
138
132
  cmd vars(:enable)
139
133
  end
140
134
  end
@@ -142,5 +136,4 @@ class IOS < Oxidized::Model
142
136
  post_login 'terminal width 0'
143
137
  pre_logout 'exit'
144
138
  end
145
-
146
139
  end
@@ -0,0 +1,5 @@
1
+ # IOS parser should work here
2
+
3
+ require_relative 'ios.rb'
4
+
5
+ IOSXE = IOS
@@ -1,5 +1,4 @@
1
1
  class IOSXR < Oxidized::Model
2
-
3
2
  # IOS XR model #
4
3
 
5
4
  prompt /^(\r?[\w.@:\/-]+[#>]\s?)$/
@@ -9,7 +8,7 @@ class IOSXR < Oxidized::Model
9
8
  cfg.each_line.to_a[2..-2].join
10
9
  end
11
10
 
12
- cmd :secret do |cfg|
11
+ cmd :secret do |cfg|
13
12
  cfg.gsub! /^(snmp-server community).*/, '\\1 <configuration removed>'
14
13
  cfg.gsub! /secret (\d+) (\S+).*/, '<secret hidden>'
15
14
  cfg
@@ -36,6 +35,7 @@ class IOSXR < Oxidized::Model
36
35
  cfg :telnet, :ssh do
37
36
  post_login 'terminal length 0'
38
37
  post_login 'terminal width 0'
38
+ post_login 'terminal exec prompt no-timestamp'
39
39
  if vars :enable
40
40
  post_login do
41
41
  send "enable\n"
@@ -44,5 +44,4 @@ class IOSXR < Oxidized::Model
44
44
  end
45
45
  pre_logout 'exit'
46
46
  end
47
-
48
47
  end
@@ -1,21 +1,20 @@
1
1
  class IPOS < Oxidized::Model
2
-
3
2
  # Ericsson SSR (IPOS)
4
3
  # Redback SE (SEOS)
5
4
 
6
- prompt /^([\[\]\w.@-]+[#>]\s?)$/
5
+ prompt /^([\[\]\w.@-]+[#:>]\s?)$/
7
6
  comment '! '
8
7
 
9
8
  cmd 'show chassis' do |cfg|
10
- comment cfg.each_line.to_a[0..-2].join
9
+ comment cfg.cut_tail
11
10
  end
12
11
 
13
12
  cmd 'show hardware' do |cfg|
14
- comment cfg.each_line.to_a[0..-2].join
13
+ comment cfg.cut_tail
15
14
  end
16
15
 
17
16
  cmd 'show release' do |cfg|
18
- comment cfg.each_line.to_a[0..-2].join
17
+ comment cfg.cut_tail
19
18
  end
20
19
 
21
20
  cmd 'show configuration' do |cfg|
@@ -52,10 +51,15 @@ class IPOS < Oxidized::Model
52
51
 
53
52
  cfg :telnet, :ssh do
54
53
  post_login 'terminal length 0'
54
+ if vars :enable
55
+ post_login do
56
+ cmd "enable"
57
+ cmd vars(:enable)
58
+ end
59
+ end
55
60
  pre_logout do
56
61
  send "exit\n"
57
62
  send "n\n"
58
63
  end
59
64
  end
60
-
61
65
  end
@@ -1,19 +1,17 @@
1
1
  class IronWare < Oxidized::Model
2
-
3
- prompt /^.*(telnet|ssh)\@.+[>#]\s?$/i
2
+ prompt /^.*(telnet|ssh)@.+[>#]\s?$/i
4
3
  comment '! '
5
4
 
6
- #to handle pager without enable
7
- #expect /^((.*)--More--(.*))$/ do |data, re|
5
+ # to handle pager without enable
6
+ # expect /^((.*)--More--(.*))$/ do |data, re|
8
7
  # send ' '
9
8
  # data.sub re, ''
10
- #end
11
-
9
+ # end
12
10
 
13
- #to remove backspace (if handle pager without enable)
14
- #expect /^((.*)[\b](.*))$/ do |data, re|
11
+ # to remove backspace (if handle pager without enable)
12
+ # expect /^((.*)[\b](.*))$/ do |data, re|
15
13
  # data.sub re, ''
16
- #end
14
+ # end
17
15
 
18
16
  cmd :all do |cfg|
19
17
  # sometimes ironware inserts arbitrary whitespace after commands are
@@ -22,18 +20,20 @@ class IronWare < Oxidized::Model
22
20
  end
23
21
 
24
22
  cmd 'show version' do |cfg|
25
- cfg.gsub! /(^((.*)[Ss]ystem uptime(.*))$)/, '' #remove unwanted line system uptime
23
+ cfg.gsub! /(^((.*)[Ss]ystem uptime(.*))$)/, '' # remove unwanted line system uptime
26
24
  cfg.gsub! /(^((.*)[Tt]he system started at(.*))$)/, ''
27
- cfg.gsub! /[Uu]p\s?[Tt]ime is .*/,''
25
+ cfg.gsub! /[Uu]p\s?[Tt]ime is .*/, ''
28
26
 
29
27
  comment cfg
30
28
  end
31
29
 
32
30
  cmd 'show chassis' do |cfg|
33
- cfg.encode!("UTF-8", :invalid => :replace, :undef => :replace) #sometimes ironware returns broken encoding
34
- cfg.gsub! /(^((.*)Current temp(.*))$)/, '' #remove unwanted lines current temperature
35
- cfg.gsub! /Speed = [A-Z-]{2,6} \(\d{2,3}\%\)/, '' #remove unwanted lines Speed Fans
36
- cfg.gsub! /current speed is [A-Z]{2,6} \(\d{2,3}\%\)/, ''
31
+ cfg.encode!("UTF-8", invalid: :replace, undef: :replace) # sometimes ironware returns broken encoding
32
+ cfg.gsub! /(^((.*)Current temp(.*))$)/, '' # remove unwanted lines current temperature
33
+ cfg.gsub! /Speed = [A-Z-]{2,6} \(\d{2,3}%\)/, '' # remove unwanted lines Speed Fans
34
+ cfg.gsub! /current speed is [A-Z]{2,6} \(\d{2,3}%\)/, ''
35
+ cfg.gsub! /Fan \d* - STATUS: OK \D*\d*./, '' # Fix for ADX Fan speed reporting
36
+ cfg.gsub! /\d* deg C/, '' # Fix for ADX temperature reporting
37
37
  cfg.gsub! /([\[]*)1([\]]*)<->([\[]*)2([\]]*)(<->([\[]*)3([\]]*))*/, ''
38
38
  cfg.gsub! /\d{2}\.\d deg-C/, 'XX.X deg-C'
39
39
  if cfg.include? "TEMPERATURE"
@@ -50,6 +50,8 @@ class IronWare < Oxidized::Model
50
50
  end
51
51
 
52
52
  cmd 'show flash' do |cfg|
53
+ cfg.gsub! /(\d+) bytes/, '' # Fix for ADX flash size
54
+ cfg.gsub! /(^((.*)Code Flash Free Space(.*))$)/, '' # Brocade
53
55
  comment cfg
54
56
  end
55
57
 
@@ -67,14 +69,14 @@ class IronWare < Oxidized::Model
67
69
  # match expected prompts on both older and newer
68
70
  # versions of IronWare
69
71
  username /^(Please Enter Login Name|Username):/
70
- password /^(Please Enter Password |Password):/
72
+ password /^(Please Enter Password ?|Password):/
71
73
  end
72
74
 
73
- #handle pager with enable
75
+ # handle pager with enable
74
76
  cfg :telnet, :ssh do
75
77
  if vars :enable
76
78
  post_login do
77
- send "enable\n"
79
+ send "enable\r\n"
78
80
  cmd vars(:enable)
79
81
  end
80
82
  end
@@ -83,5 +85,4 @@ class IronWare < Oxidized::Model
83
85
  post_login 'terminal length 0'
84
86
  pre_logout "logout\nexit\nexit\n"
85
87
  end
86
-
87
88
  end
@@ -1,14 +1,14 @@
1
1
  class ISAM < Oxidized::Model
2
- #Alcatel ISAM 7302/7330 FTTN
3
-
2
+ # Alcatel ISAM 7302/7330 FTTN
3
+
4
4
  prompt /^([\w.:@-]+>#\s)$/
5
5
  comment '# '
6
6
 
7
7
  cmd :all do |cfg|
8
- cfg.each_line.to_a[1..-2].join
8
+ cfg.cut_both
9
9
  end
10
10
 
11
- cfg :telnet do
11
+ cfg :telnet do
12
12
  username /^login:\s*/
13
13
  password /^password:\s*/
14
14
  end
@@ -19,7 +19,7 @@ class ISAM < Oxidized::Model
19
19
  post_login 'environment inhibit-alarms print no-more'
20
20
  pre_logout 'logout'
21
21
  end
22
-
22
+
23
23
  cmd 'show software-mngt oswp detail' do |cfg|
24
24
  comment cfg
25
25
  end
@@ -31,5 +31,4 @@ class ISAM < Oxidized::Model
31
31
  cmd 'info configure flat' do |cfg|
32
32
  cfg
33
33
  end
34
-
35
34
  end
@@ -1,27 +1,24 @@
1
1
  class JunOS < Oxidized::Model
2
-
3
- comment '# '
2
+ comment '# '
4
3
 
5
4
  def telnet
6
5
  @input.class.to_s.match(/Telnet/)
7
6
  end
8
7
 
9
8
  cmd :all do |cfg|
10
- cfg = cfg.lines.to_a[1..-2].join if screenscrape
11
- cfg.gsub!(/ scale-subscriber (\s+)(\d+)/,' scale-subscriber <count>')
9
+ cfg = cfg.cut_both if screenscrape
10
+ cfg.gsub!(/ scale-subscriber (\s+)(\d+)/, ' scale-subscriber <count>')
12
11
  cfg.lines.map { |line| line.rstrip }.join("\n") + "\n"
13
12
  end
14
13
 
15
14
  cmd :secret do |cfg|
16
- cfg.gsub!(/encrypted-password (\S+).*/, '<secret removed>')
17
15
  cfg.gsub!(/community (\S+) {/, 'community <hidden> {')
16
+ cfg.gsub!(/ "\$\d\$\S+; ## SECRET-DATA/, ' <secret removed>;')
18
17
  cfg
19
18
  end
20
19
 
21
- cmd 'show configuration | display omit'
22
-
23
20
  cmd 'show version' do |cfg|
24
- @model = $1 if cfg.match(/^Model: (\S+)/)
21
+ @model = Regexp.last_match(1) if cfg =~ /^Model: (\S+)/
25
22
  comment cfg
26
23
  end
27
24
 
@@ -29,7 +26,7 @@ class JunOS < Oxidized::Model
29
26
  out = ''
30
27
  case @model
31
28
  when 'mx960'
32
- out << cmd('show chassis fabric reachability') { |cfg| comment cfg }
29
+ out << cmd('show chassis fabric reachability') { |cfg| comment cfg }
33
30
  when /^(ex22|ex33|ex4|ex8|qfx)/
34
31
  out << cmd('show virtual-chassis') { |cfg| comment cfg }
35
32
  end
@@ -40,13 +37,15 @@ class JunOS < Oxidized::Model
40
37
  cmd('show system license') { |cfg| comment cfg }
41
38
  cmd('show system license keys') { |cfg| comment cfg }
42
39
 
40
+ cmd 'show configuration | display omit'
41
+
43
42
  cfg :telnet do
44
43
  username(/^login:/)
45
44
  password(/^Password:/)
46
45
  end
47
46
 
48
47
  cfg :ssh do
49
- exec true # don't run shell, run each command in exec channel
48
+ exec true # don't run shell, run each command in exec channel
50
49
  end
51
50
 
52
51
  cfg :telnet, :ssh do
@@ -54,5 +53,4 @@ class JunOS < Oxidized::Model
54
53
  post_login 'set cli screen-width 0'
55
54
  pre_logout 'exit'
56
55
  end
57
-
58
56
  end
@@ -0,0 +1,74 @@
1
+ class LinuxGeneric < Oxidized::Model
2
+ prompt /^(\w.*|\W.*)(:|#) /
3
+ comment '# '
4
+
5
+ # add a comment in the final conf
6
+ def add_comment(comment)
7
+ "\n###### #{comment} ######\n"
8
+ end
9
+
10
+ cmd :all do |cfg|
11
+ cfg.gsub! /^(default (\S+).* (expires) ).*/, '\\1 <redacted>'
12
+ cfg.cut_both
13
+ end
14
+
15
+ # show the persistent configuration
16
+ pre do
17
+ cfg = add_comment 'THE HOSTNAME'
18
+ cfg += cmd 'cat /etc/hostname'
19
+
20
+ cfg += add_comment 'THE HOSTS'
21
+ cfg += cmd 'cat /etc/hosts'
22
+
23
+ cfg += add_comment 'THE INTERFACES'
24
+ cfg += cmd 'ip link'
25
+
26
+ cfg += add_comment 'RESOLV.CONF'
27
+ cfg += cmd 'cat /etc/resolv.conf'
28
+
29
+ cfg += add_comment 'IP Routes'
30
+ cfg += cmd 'ip route'
31
+
32
+ cfg += add_comment 'IPv6 Routes'
33
+ cfg += cmd 'ip -6 route'
34
+
35
+ cfg += add_comment 'MOTD'
36
+ cfg += cmd 'cat /etc/motd'
37
+
38
+ cfg += add_comment 'PASSWD'
39
+ cfg += cmd 'cat /etc/passwd'
40
+
41
+ cfg += add_comment 'GROUP'
42
+ cfg += cmd 'cat /etc/group'
43
+
44
+ cfg += add_comment 'nsswitch.conf'
45
+ cfg += cmd 'cat /etc/nsswitch.conf'
46
+
47
+ cfg += add_comment 'VERSION'
48
+ cfg += cmd 'cat /etc/issue'
49
+
50
+ cfg
51
+ end
52
+
53
+ cfg :telnet do
54
+ username /^Username:/
55
+ password /^Password:/
56
+ end
57
+
58
+ cfg :telnet, :ssh do
59
+ post_login do
60
+ if vars(:enable) == true
61
+ cmd "sudo su -", /^\[sudo\] password/
62
+ cmd @node.auth[:password]
63
+ elsif vars(:enable)
64
+ cmd "su -", /^Password:/
65
+ cmd vars(:enable)
66
+ end
67
+ end
68
+
69
+ pre_logout do
70
+ cmd "exit" if vars(:enable)
71
+ end
72
+ pre_logout 'exit'
73
+ end
74
+ end
@@ -1,8 +1,7 @@
1
1
  class MasterOS < Oxidized::Model
2
-
3
2
  # MRV MasterOS model #
4
3
 
5
- comment '!'
4
+ comment '!'
6
5
 
7
6
  cmd :secret do |cfg|
8
7
  cfg.gsub! /^(snmp-server community).*/, '\\1 <configuration removed>'
@@ -11,13 +10,12 @@ comment '!'
11
10
  end
12
11
 
13
12
  cmd :all do |cfg|
14
- cfg.each_line.to_a[1..-2].join
13
+ cfg.cut_both
15
14
  cfg.gsub /^(! Configuration ).*/, '!'
16
15
  end
17
16
 
18
17
  cmd 'show inventory' do |cfg|
19
- cfg = cfg.each_line.to_a[0..-2].join
20
- comment cfg
18
+ comment cfg.cut_tail
21
19
  end
22
20
 
23
21
  cmd 'show plugins' do |cfg|
@@ -43,5 +41,4 @@ comment '!'
43
41
  end
44
42
  pre_logout 'exit'
45
43
  end
46
-
47
44
  end
@@ -1,23 +1,22 @@
1
1
  class MLNXOS < Oxidized::Model
2
-
3
2
  prompt /([\w.@()-\[:\s\]]+[#>]\s)$/
4
- comment '## '
5
-
3
+ comment '## '
4
+
6
5
  # Pager Handling
7
- expect /.+lines\s\d+\-\d+([\s]|\/\d+\s\(END\)\s).+$/ do |data, re|
6
+ expect /.+lines\s\d+-\d+([\s]|\/\d+\s\(END\)\s).+$/ do |data, re|
8
7
  send ' '
9
8
  data.sub re, ''
10
9
  end
11
10
 
12
11
  cmd :all do |cfg|
13
12
  cfg.gsub! /\[\?1h=\r/, '' # Pager Handling
14
- cfg.gsub! /\r\[K/,'' # Pager Handling
13
+ cfg.gsub! /\r\[K/, '' # Pager Handling
15
14
  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
20
- cfg = cfg.lines.to_a[2..-3].join
15
+ cfg.gsub! /^CPU load averages:\s.+/, '' # Omit constantly changing CPU info
16
+ cfg.gsub! /^System memory:\s.+/, '' # Omit constantly changing memory info
17
+ cfg.gsub! /^Uptime:\s.+/, '' # Omit constantly changing uptime info
18
+ cfg.gsub! /.+Generated at\s\d+.+/, '' # Omit constantly changing generation time info
19
+ cfg.lines.to_a[2..-3].join
21
20
  end
22
21
 
23
22
  cmd :secret do |cfg|