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,37 +1,40 @@
1
1
  class TPLink < Oxidized::Model
2
-
3
2
  # tp-link prompt
4
3
  prompt /^\r?([\w.@()-]+[#>]\s?)$/
5
- comment '! '
4
+ comment '! '
6
5
 
7
6
  # handle paging
8
7
  # workaround for sometimes missing whitespaces with "\s?"
9
8
  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, ''
9
+ send ' '
10
+ data.sub re, ''
12
11
  end
13
12
 
14
13
  # send carriage return because \n with the command is not enough
15
14
  # checks if line ends with prompt >,# or \r,\nm otherwise send \r
16
15
  expect /[^>#\r\n]$/ do |data, re|
17
- send "\r"
18
- data.sub re, ''
16
+ send "\r"
17
+ data.sub re, ''
19
18
  end
20
19
 
21
20
  cmd :all do |cfg|
21
+ # remove unwanted paging line
22
+ cfg.gsub! /^Press any key to contin.*/, ''
22
23
  # normalize linefeeds
23
- cfg.gsub! /(\r|\r\n|\n\r)/,"\n"
24
+ cfg.gsub! /(\r|\r\n|\n\r)/, "\n"
24
25
  # remove empty lines
25
26
  cfg.each_line.reject { |line| line.match /^[\r\n\s\u0000#]+$/ }.join
26
27
  end
27
28
 
28
29
  cmd :secret do |cfg|
30
+ cfg.gsub! /^enable password (\S+)/, 'enable password <secret hidden>'
31
+ cfg.gsub! /^user (\S+) password (\S+) (.*)/, 'user \1 password <secret hidden> \3'
29
32
  cfg.gsub! /^(snmp-server community).*/, '\\1 <configuration removed>'
30
33
  cfg.gsub! /secret (\d+) (\S+).*/, '<secret hidden>'
31
34
  cfg
32
35
  end
33
36
 
34
- cmd 'show system-info' do |cfg|
37
+ cmd 'show system-info' do |cfg|
35
38
  comment cfg.each_line.to_a[3..-3].join
36
39
  end
37
40
 
@@ -58,8 +61,5 @@ class TPLink < Oxidized::Model
58
61
  send "exit\r"
59
62
  send "logout\r"
60
63
  end
61
-
62
64
  end
63
-
64
65
  end
65
-
@@ -1,62 +1,41 @@
1
1
  class Trango < Oxidized::Model
2
2
  # take a Trangolink sysinfo output and turn it into a configuration file
3
-
3
+
4
4
  prompt /^#>\s?/
5
- comment '# '
5
+ comment '# '
6
6
 
7
7
  cmd 'sysinfo' do |cfg|
8
8
  out = []
9
9
  comments = []
10
10
  cfg.each_line do |line|
11
- if line.match /\[Opmode\] (off|on) \[Default Opmode\] (off|on)/
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.match /\[Tx Power\] ([\-\d]+) dBm/
16
- out << "power " + Regexp.last_match[1]
17
- end
18
- if line.match /\[Active Channel\] (\d+) (v|h)/
19
- out << "freq " + Regexp.last_match[1] + ' ' + Regexp.last_match[2]
20
- end
21
- if line.match /\[Peer ID\] ([A-F0-9]+)/
22
- out << "peerid " + Regexp.last_match[1]
23
- end
24
- if line.match /\[Unit Type\] (\S+)/
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
26
+ out << "speed #{speed}" if Regexp.last_match[1].eql? 'off'
47
27
  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]
52
- end
53
- 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]
33
+ end
54
34
  comments.push(*out).join "\n"
55
- end
35
+ end
56
36
 
57
37
  cfg :telnet do
58
38
  password /Password:/
59
39
  pre_logout 'exit'
60
40
  end
61
-
62
41
  end
@@ -0,0 +1,30 @@
1
+ class UCS < Oxidized::Model
2
+ prompt /^(\r?[\w.@_()-]+[#]\s?)$/
3
+ comment '! '
4
+
5
+ cmd 'show version brief' do |cfg|
6
+ comment cfg
7
+ end
8
+
9
+ cmd 'show chassis detail' do |cfg|
10
+ comment cfg
11
+ end
12
+
13
+ cmd 'show fabric-interconnect detail' do |cfg|
14
+ comment cfg
15
+ end
16
+
17
+ cmd 'show configuration all | no-more' do |cfg|
18
+ cfg
19
+ end
20
+
21
+ cfg :ssh, :telnet do
22
+ post_login 'terminal length 0'
23
+ pre_logout 'exit'
24
+ end
25
+
26
+ cfg :telnet do
27
+ username /^login:/
28
+ password /^Password:/
29
+ end
30
+ end
@@ -0,0 +1,29 @@
1
+ class Viptela < Oxidized::Model
2
+ # Cisco Vipetla
3
+
4
+ prompt /[-\w]+#\s$/
5
+ comment '! '
6
+
7
+ cmd :all do |cfg|
8
+ cfg.each_line.to_a[1..-2].join
9
+ end
10
+
11
+ cmd :secret do |cfg|
12
+ cfg.gsub! /(^\s+secret-key|password|auth-password|priv-password)\s+.*$/, '\\1 <secret hidden>'
13
+ cfg.gsub! /(^\s+community)\s.*$/, '\\1 <secret hidden>'
14
+ cfg
15
+ end
16
+
17
+ cmd 'show running-config' do |cfg|
18
+ cfg
19
+ end
20
+
21
+ cmd 'show version' do |cfg|
22
+ comment cfg
23
+ end
24
+
25
+ cfg :ssh do
26
+ post_login 'paginate false'
27
+ pre_logout 'exit'
28
+ end
29
+ end
@@ -1,24 +1,22 @@
1
1
  class VOLTAIRE < Oxidized::Model
2
-
3
2
  prompt /([\w.@()-\[:\s\]]+[#>]\s|(One or more tests have failed.*))$/
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
-
13
11
  cmd :all do |cfg|
14
12
  cfg.gsub! /\[\?1h=\r/, '' # Pager Handling
15
- cfg.gsub! /\r\[K/,'' # Pager Handling
13
+ cfg.gsub! /\r\[K/, '' # Pager Handling
16
14
  cfg.gsub! /\s/, '' # Linebreak Handling
17
- cfg.gsub! /^CPU\ load\ averages\:\s.+/, '' # Omit constantly changing CPU info
18
- cfg.gsub! /^System\ memory\:\s.+/, '' # Omit constantly changing memory info
19
- cfg.gsub! /^Uptime\:\s.+/, '' # Omit constantly changing uptime info
20
- cfg.gsub! /.+Generated\ at\s\d+.+/, '' # Omit constantly changing generation time info
21
- 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
22
20
  end
23
21
 
24
22
  cmd :secret do |cfg|
@@ -27,7 +25,6 @@ class VOLTAIRE < Oxidized::Model
27
25
  cfg
28
26
  end
29
27
 
30
-
31
28
  cmd 'version show' do |cfg|
32
29
  comment cfg
33
30
  end
@@ -1,22 +1,34 @@
1
1
  class Voss < Oxidized::Model
2
- # Avaya VSP Operating System Software(VOSS)
2
+ # Extreme/Avaya VSP Operating System Software(VOSS)
3
3
  # Created by danielcoxman@gmail.com
4
- # May 9, 2017
4
+ # March 16, 2019
5
5
  # This was tested on vsp4k and vsp8k
6
6
 
7
7
  comment '# '
8
8
 
9
9
  prompt /^[^\s#>]+[#>]$/
10
10
 
11
+ # needed for proper formatting after post_login
12
+ cmd('') { |cfg| comment "#{cfg}\n" }
13
+
14
+ # Get sys-info and remove information that changes such has temperature and power
11
15
  cmd 'show sys-info' do |cfg|
12
- comment cfg
16
+ cfg.gsub! /(^((.*)SysUpTime(.*))$)/, 'removed SysUpTime'
17
+ cfg.gsub! /^((.*)Temperature Info :(.*\r?\n){4})/, 'removed Temperature Info and 3 more lines'
18
+ cfg.gsub! /(^((.*)AmbientTemperature(.*):(.*))$)/, 'removed AmbientTemperature'
19
+ cfg.gsub! /(^((.*)Last Change(.*):(.*))$)/, 'remove Last Change'
20
+ cfg.gsub! /(^((.*)Last Statistic Reset(.*):(.*))$)/, 'removed Last Statistic Reset'
21
+ cfg.gsub! /(^((.*)Last Vlan Change(.*):(.*))$)/, 'removed Last Vlan Change'
22
+ cfg.gsub! /(^((.*)Temperature(.*):(.*))$)/, 'removed Temperature'
23
+ cfg.gsub! /(^((.*)Total Power Usage(.*):(.*))$)/, 'removed Total Power Usage'
24
+ comment "#{cfg}\n"
13
25
  end
14
26
 
15
27
  # more the config rather than doing a show run
16
28
  cmd 'more config.cfg' do |cfg|
17
- cfg
18
29
  cfg.gsub! /^[^\s#>]+[#>]$/, ''
19
- cfg.gsub! /^more config.cfg/, ''
30
+ cfg.gsub! /^more config.cfg/, '# more config.cfg'
31
+ cfg
20
32
  end
21
33
 
22
34
  cfg :telnet do
@@ -29,5 +41,4 @@ class Voss < Oxidized::Model
29
41
  post_login 'enable'
30
42
  post_login 'terminal more disable'
31
43
  end
32
-
33
44
  end
@@ -1,25 +1,31 @@
1
1
  class VRP < Oxidized::Model
2
2
  # Huawei VRP
3
-
3
+
4
4
  prompt /^(<[\w.-]+>)$/
5
5
  comment '# '
6
6
 
7
+ cmd :secret do |cfg|
8
+ cfg.gsub! /(pin verify (?:auto|)).*/, '\\1 <PIN hidden>'
9
+ cfg.gsub! /(%\^%#.*%\^%#)/, '<secret hidden>'
10
+ cfg
11
+ end
12
+
7
13
  cmd :all do |cfg|
8
- cfg.each_line.to_a[1..-2].join
14
+ cfg.cut_both
9
15
  end
10
-
16
+
11
17
  cfg :telnet do
12
18
  username /^Username:$/
13
19
  password /^Password:$/
14
20
  end
15
21
 
16
- cfg :telnet, :ssh do
22
+ cfg :telnet, :ssh do
17
23
  post_login 'screen-length 0 temporary'
18
24
  pre_logout 'quit'
19
25
  end
20
26
 
21
27
  cmd 'display version' do |cfg|
22
- cfg = cfg.each_line.select {|l| not l.match /uptime/ }.join
28
+ cfg = cfg.each_line.reject { |l| l.match /uptime/ }.join
23
29
  comment cfg
24
30
  end
25
31
 
@@ -30,5 +36,4 @@ class VRP < Oxidized::Model
30
36
  cmd 'display current-configuration all' do |cfg|
31
37
  cfg
32
38
  end
33
-
34
39
  end
@@ -1,19 +1,22 @@
1
1
  class Vyatta < Oxidized::Model
2
-
3
2
  # Brocade Vyatta / VyOS model #
4
-
5
- prompt /\@.*?\:~\$\s/
3
+
4
+ prompt /@.*?:~\$\s/
6
5
 
7
6
  cmd :all do |cfg|
8
- cfg = cfg.lines.to_a[1..-2].join
7
+ cfg.lines.to_a[1..-2].join
9
8
  end
10
9
 
11
10
  cmd :secret do |cfg|
11
+ cfg.gsub! /encrypted-password (\S+).*/, 'encrypted-password <secret removed>'
12
+ cfg.gsub! /plaintext-password (\S+).*/, 'plaintext-password <secret removed>'
13
+ cfg.gsub! /password (\S+).*/, 'password <secret removed>'
14
+ cfg.gsub! /pre-shared-secret (\S+).*/, 'pre-shared-secret <secret removed>'
12
15
  cfg.gsub! /community (\S+) {/, 'community <hidden> {'
13
16
  cfg
14
17
  end
15
18
 
16
- cmd 'show configuration | no-more'
19
+ cmd 'show configuration commands | no-more'
17
20
 
18
21
  cfg :telnet do
19
22
  username /login:\s/
@@ -23,5 +26,4 @@ class Vyatta < Oxidized::Model
23
26
  cfg :telnet, :ssh do
24
27
  pre_logout 'exit'
25
28
  end
26
-
27
29
  end
@@ -0,0 +1,20 @@
1
+ class WEOS < Oxidized::Model
2
+ # Westell WEOS, works with Westell 8178G, Westell 8266G
3
+
4
+ prompt /^(\s[\w.@-]+[#>]\s?)$/
5
+
6
+ cmd :all do |cfg|
7
+ cfg.cut_both
8
+ end
9
+
10
+ cmd 'show running-config' do |cfg|
11
+ cfg
12
+ end
13
+
14
+ cfg :telnet do
15
+ username /login:/
16
+ password /assword:/
17
+ post_login 'cli more disable'
18
+ pre_logout 'logout'
19
+ end
20
+ end
@@ -1,14 +1,13 @@
1
1
  class XOS < Oxidized::Model
2
-
3
2
  # Extreme Networks XOS
4
3
 
5
- prompt /^*?[\w .-]+# $/
4
+ prompt /^\*?\s?[-\w.~]+(:\d+)? [#>] $/
6
5
  comment '# '
7
6
 
8
7
  cmd :all do |cfg|
9
8
  # xos inserts leading \r characters and other trailing white space.
10
9
  # this deletes extraneous \r and trailing white space.
11
- cfg.each_line.to_a[1..-2].map{|line|line.delete("\r").rstrip}.join("\n") + "\n"
10
+ cfg.each_line.to_a[1..-2].map { |line| line.delete("\r").rstrip }.join("\n") + "\n"
12
11
  end
13
12
 
14
13
  cmd 'show version' do |cfg|
@@ -23,11 +22,18 @@ class XOS < Oxidized::Model
23
22
  comment cfg
24
23
  end
25
24
 
26
- cmd 'show switch'do |cfg|
27
- comment cfg.each_line.reject { |line| line.match /Time:/ or line.match /boot/i }.join
25
+ cmd 'show switch' do |cfg|
26
+ comment cfg.each_line.reject { |line| line.match(/Time:/) || line.match(/boot/i) }.join
27
+ end
28
+
29
+ cmd 'show configuration' do |cfg|
30
+ cfg = cfg.each_line.reject { |line| line.match /^#(\s[\w -]+\s)(Configuration generated)/ }.join
31
+ cfg
28
32
  end
29
33
 
30
- cmd 'show configuration'
34
+ cmd 'show policy detail' do |cfg|
35
+ comment cfg
36
+ end
31
37
 
32
38
  cfg :telnet do
33
39
  username /^login:/
@@ -35,11 +41,17 @@ class XOS < Oxidized::Model
35
41
  end
36
42
 
37
43
  cfg :telnet, :ssh do
38
- post_login 'disable clipaging'
44
+ post_login do
45
+ data = cmd 'disable clipaging session'
46
+ match = data.match /^disable clipaging session\n\*?[\w .-]+(:\d+)? [#>] $/m
47
+ next if match
48
+
49
+ cmd 'disable clipaging'
50
+ end
51
+
39
52
  pre_logout do
40
53
  send "exit\n"
41
54
  send "n\n"
42
55
  end
43
56
  end
44
-
45
57
  end
@@ -18,7 +18,7 @@ class ZhoneOLT < Oxidized::Model
18
18
  end
19
19
 
20
20
  cmd :all do |cfg|
21
- cfg.each_line.to_a[1..-2].map{|line|line.delete("\r").rstrip}.join("\n") + "\n"
21
+ cfg.each_line.to_a[1..-2].map { |line| line.delete("\r").rstrip }.join("\n") + "\n"
22
22
  end
23
23
 
24
24
  cmd 'swversion' do |cfg|
@@ -39,7 +39,7 @@ class ZhoneOLT < Oxidized::Model
39
39
  end
40
40
 
41
41
  cmd 'dump console' do |cfg|
42
- cfg = cfg.each_line.select { |line| not line.match /To Abort the operation enter Ctrl-C/ }.join
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
@@ -1,12 +1,10 @@
1
1
  class ZyNOS < Oxidized::Model
2
-
3
2
  # Used in Zyxel DSLAMs, such as SAM1316
4
3
 
5
- comment '! '
4
+ comment '! '
6
5
 
7
6
  cmd 'config-0'
8
7
 
9
8
  cfg :ftp do
10
9
  end
11
-
12
10
  end
@@ -0,0 +1,36 @@
1
+ class ZyNOSCLI < Oxidized::Model
2
+ # Used in Zyxel DSLAMs, such as SAM1316
3
+
4
+ # Typical prompt "XGS4600#"
5
+ prompt /^([\w.@()-]+[#>]\s\e7)$/
6
+ comment ';; '
7
+
8
+ cmd :all do |cfg|
9
+ cfg.gsub! /^.*\e7/, ''
10
+ end
11
+ cmd 'show stacking'
12
+
13
+ cmd 'show version'
14
+
15
+ cmd 'show running-config'
16
+
17
+ cfg :telnet do
18
+ username /^User name:/i
19
+ password /^Password:/i
20
+ end
21
+
22
+ cfg :telnet, :ssh do
23
+ if vars :enable
24
+ post_login do
25
+ send "enable\n"
26
+ # Interpret enable: true as meaning we won't be prompted for a password
27
+ unless vars(:enable).is_a? TrueClass
28
+ expect /[pP]assword:\s?$/
29
+ send vars(:enable) + "\n"
30
+ end
31
+ expect /^.+[#]$/
32
+ end
33
+ end
34
+ pre_logout 'exit'
35
+ end
36
+ end
@@ -0,0 +1,38 @@
1
+ class ZyNOSGS < Oxidized::Model
2
+ # Used in Zyxel GS1900 switches, tested with GS1900-8
3
+ prompt /^.*# $/
4
+ comment '! '
5
+ expect /^--More--$/ do |data, re|
6
+ send ' '
7
+ data.sub re, ''
8
+ end
9
+
10
+ # replace all used vt100 control sequences
11
+ expect /\e\[\??\d+(;\d+)*[A-Za-z]/ do |data, re|
12
+ data.gsub re, ''
13
+ end
14
+ cmd 'show running-config' do |cfg|
15
+ cfg.gsub! /(System Up Time:) \S+(.*)/, '\\1 <time>'
16
+ # Remove garbage vt100 control sequences
17
+ # Backspace 0x07 char or escape char + control chars
18
+ cfg.gsub! /[\b]|\e\[A|\e\[2K/, ''
19
+ cfg
20
+ end
21
+
22
+ cfg :telnet, :ssh do
23
+ username /^(User name|.*Username):/
24
+ password /^\r?Password:/
25
+ end
26
+ cfg :telnet do
27
+ pre_logout do
28
+ send "exit\r"
29
+ end
30
+ end
31
+ cfg :ssh do
32
+ pre_logout do
33
+ # Yes, that GS1900 switch needs two exit !
34
+ send "exit\n"
35
+ send "exit\n"
36
+ end
37
+ end
38
+ end
@@ -1,33 +1,58 @@
1
1
  module Oxidized
2
2
  class Node
3
3
  class Stats
4
+ attr_reader :mtimes
4
5
  MAX_STAT = 10
5
6
 
6
7
  # @param [Job] job job whose information add to stats
7
8
  # @return [void]
8
- def add job
9
+ def add(job)
9
10
  stat = {
10
- :start => job.start,
11
- :end => job.end,
12
- :time => job.time,
11
+ start: job.start,
12
+ end: job.end,
13
+ time: job.time
13
14
  }
14
15
  @stats[job.status] ||= []
15
- @stats[job.status].shift if @stats[job.status].size > MAX_STAT
16
+ @stats[job.status].shift if @stats[job.status].size > @history_size
16
17
  @stats[job.status].push stat
18
+ @stats[:counter][job.status] += 1
17
19
  end
18
20
 
19
21
  # @param [Symbol] status stats for specific status
20
22
  # @return [Hash,Array] Hash of stats for every status or Array of stats for specific status
21
- def get status=nil
23
+ def get(status = nil)
22
24
  status ? @stats[status] : @stats
23
25
  end
24
26
 
27
+ def get_counter(counter = nil)
28
+ counter ? @stats[:counter][counter] : @stats[:counter]
29
+ end
30
+
31
+ def successes
32
+ @stats[:counter][:success]
33
+ end
34
+
35
+ def failures
36
+ @stats[:counter].reduce(0) { |m, h| h[0] == :success ? m : m + h[1] }
37
+ end
38
+
39
+ def mtime
40
+ mtimes.last
41
+ end
42
+
43
+ def update_mtime
44
+ @mtimes.push Time.now.utc
45
+ @mtimes.shift
46
+ end
47
+
25
48
  private
26
49
 
27
50
  def initialize
28
- @stats = {}
51
+ @history_size = Oxidized.config.stats.history_size? || MAX_STAT
52
+ @mtimes = Array.new(@history_size, "unknown")
53
+ @stats = {}
54
+ @stats[:counter] = Hash.new 0
29
55
  end
30
-
31
56
  end
32
57
  end
33
58
  end