oxidized 0.29.1 → 0.37.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 (236) hide show
  1. checksums.yaml +4 -4
  2. data/.coderabbit.yaml +21 -0
  3. data/.github/ISSUE_TEMPLATE/bug_report.md +45 -0
  4. data/.github/ISSUE_TEMPLATE/feature_request.md +22 -0
  5. data/.github/ISSUE_TEMPLATE/support-request.md +39 -0
  6. data/.github/workflows/codeql.yml +4 -4
  7. data/.github/workflows/publishdocker.yml +108 -13
  8. data/.github/workflows/ruby.yml +3 -12
  9. data/.github/workflows/stale.yml +6 -1
  10. data/.gitignore +2 -0
  11. data/.rubocop.yml +69 -13
  12. data/.rubocop_todo.yml +13 -143
  13. data/CHANGELOG.md +431 -4
  14. data/CONTRIBUTING.md +189 -0
  15. data/Dockerfile +89 -34
  16. data/README.md +59 -188
  17. data/Rakefile +58 -12
  18. data/bin/oxidized +2 -5
  19. data/docs/Configuration.md +382 -149
  20. data/docs/Creating-Models.md +262 -10
  21. data/docs/DeviceSimulation.md +196 -0
  22. data/docs/Docker.md +246 -0
  23. data/docs/Hooks.md +146 -51
  24. data/docs/Inputs.md +237 -0
  25. data/docs/Issues.md +123 -0
  26. data/docs/Model-Notes/APC.md +72 -0
  27. data/docs/Model-Notes/Cumulus.md +5 -0
  28. data/docs/Model-Notes/EatonNetwork.md +18 -0
  29. data/docs/Model-Notes/ExaLink.md +43 -0
  30. data/docs/Model-Notes/FSOS.md +17 -0
  31. data/docs/Model-Notes/Fortinet.md +75 -0
  32. data/docs/Model-Notes/GrandstreamHT8xx.md +8 -0
  33. data/docs/Model-Notes/HPEAruba.md +32 -0
  34. data/docs/Model-Notes/IvantiConnectSecure.md +59 -0
  35. data/docs/Model-Notes/OS6.md +10 -0
  36. data/docs/Model-Notes/README.md +1 -20
  37. data/docs/Model-Notes/RouterOS.md +28 -0
  38. data/docs/Model-Notes/SikluMHTG.md +7 -0
  39. data/docs/Model-Notes/TrueNAS.md +23 -0
  40. data/docs/Model-Notes/XGS4600-Zyxel.md +5 -0
  41. data/docs/ModelUnitTests.md +219 -0
  42. data/docs/Outputs.md +102 -5
  43. data/docs/Release.md +102 -0
  44. data/docs/Ruby-API.md +135 -2
  45. data/docs/Sources.md +34 -0
  46. data/docs/Supported-OS-Types.md +207 -270
  47. data/docs/Troubleshooting.md +43 -1
  48. data/extra/device2yaml.rb +259 -0
  49. data/extra/gitdiff-msteams.sh +32 -5
  50. data/extra/hooks/modelrules.rb +55 -0
  51. data/extra/hooks/modelrulesadvanced.rb +167 -0
  52. data/extra/hooks/srcipmap.rb +54 -0
  53. data/extra/nagios_check_failing_nodes.rb +1 -1
  54. data/extra/oxidized.runit +1 -1
  55. data/extra/rest_client.rb +5 -4
  56. data/extra/syslog.rb +11 -6
  57. data/lib/oxidized/cli/support.rb +152 -0
  58. data/lib/oxidized/cli.rb +21 -6
  59. data/lib/oxidized/config/vars.rb +33 -14
  60. data/lib/oxidized/config.rb +28 -17
  61. data/lib/oxidized/core.rb +50 -8
  62. data/lib/oxidized/hook/ciscosparkdiff.rb +11 -9
  63. data/lib/oxidized/hook/exec.rb +5 -4
  64. data/lib/oxidized/hook/githubrepo.rb +55 -18
  65. data/lib/oxidized/hook/noophook.rb +2 -2
  66. data/lib/oxidized/hook/slackdiff.rb +50 -14
  67. data/lib/oxidized/hook/xmppdiff.rb +9 -9
  68. data/lib/oxidized/hook.rb +68 -16
  69. data/lib/oxidized/input/cli.rb +8 -3
  70. data/lib/oxidized/input/debugtext.rb +40 -0
  71. data/lib/oxidized/input/debugyaml.rb +82 -0
  72. data/lib/oxidized/input/exec.rb +2 -11
  73. data/lib/oxidized/input/ftp.rb +2 -19
  74. data/lib/oxidized/input/http.rb +67 -17
  75. data/lib/oxidized/input/input.rb +35 -14
  76. data/lib/oxidized/input/scp.rb +27 -0
  77. data/lib/oxidized/input/ssh.rb +59 -83
  78. data/lib/oxidized/input/sshbase.rb +102 -0
  79. data/lib/oxidized/input/telnet.rb +20 -19
  80. data/lib/oxidized/input/tftp.rb +8 -8
  81. data/lib/oxidized/job.rb +18 -7
  82. data/lib/oxidized/jobs.rb +11 -1
  83. data/lib/oxidized/logger.rb +51 -0
  84. data/lib/oxidized/manager.rb +18 -17
  85. data/lib/oxidized/model/acos.rb +2 -1
  86. data/lib/oxidized/model/addpack.rb +26 -0
  87. data/lib/oxidized/model/adtran.rb +5 -1
  88. data/lib/oxidized/model/adva.rb +3 -3
  89. data/lib/oxidized/model/airfiber.rb +1 -1
  90. data/lib/oxidized/model/aos7.rb +11 -0
  91. data/lib/oxidized/model/aoscx.rb +37 -29
  92. data/lib/oxidized/model/aosw.rb +39 -29
  93. data/lib/oxidized/model/apc_aos.rb +7 -2
  94. data/lib/oxidized/model/apcaos.rb +39 -0
  95. data/lib/oxidized/model/aricentiss.rb +9 -2
  96. data/lib/oxidized/model/arubainstant.rb +93 -0
  97. data/lib/oxidized/model/asa.rb +11 -10
  98. data/lib/oxidized/model/asternos.rb +22 -0
  99. data/lib/oxidized/model/asyncos.rb +3 -3
  100. data/lib/oxidized/model/audiocodes.rb +2 -2
  101. data/lib/oxidized/model/awplus.rb +15 -12
  102. data/lib/oxidized/model/axos.rb +1 -1
  103. data/lib/oxidized/model/bdcom.rb +1 -0
  104. data/lib/oxidized/model/c4cmts.rb +1 -2
  105. data/lib/oxidized/model/ciscosma.rb +1 -1
  106. data/lib/oxidized/model/ciscosmb.rb +6 -1
  107. data/lib/oxidized/model/cnos.rb +13 -10
  108. data/lib/oxidized/model/comtrol.rb +1 -1
  109. data/lib/oxidized/model/comware.rb +5 -3
  110. data/lib/oxidized/model/cumulus.rb +14 -2
  111. data/lib/oxidized/model/defacto.rb +26 -0
  112. data/lib/oxidized/model/dellx.rb +1 -1
  113. data/lib/oxidized/model/dlink.rb +5 -2
  114. data/lib/oxidized/model/dlinknextgen.rb +55 -0
  115. data/lib/oxidized/model/dnos.rb +3 -0
  116. data/lib/oxidized/model/dslcommands.rb +93 -0
  117. data/lib/oxidized/model/dslsetup.rb +102 -0
  118. data/lib/oxidized/model/eatonnetwork.rb +70 -0
  119. data/lib/oxidized/model/edgecos.rb +3 -1
  120. data/lib/oxidized/model/edgeos.rb +7 -6
  121. data/lib/oxidized/model/edgeswitch.rb +3 -1
  122. data/lib/oxidized/model/efos.rb +41 -0
  123. data/lib/oxidized/model/eltex.rb +4 -2
  124. data/lib/oxidized/model/enterasys800.rb +2 -2
  125. data/lib/oxidized/model/enterprise_sonic.rb +46 -0
  126. data/lib/oxidized/model/eos.rb +3 -1
  127. data/lib/oxidized/model/exalink.rb +36 -0
  128. data/lib/oxidized/model/f5os.rb +17 -0
  129. data/lib/oxidized/model/fabricos.rb +2 -2
  130. data/lib/oxidized/model/fastiron.rb +5 -3
  131. data/lib/oxidized/model/firebrick.rb +2 -2
  132. data/lib/oxidized/model/firelinuxos.rb +13 -6
  133. data/lib/oxidized/model/firewareos.rb +10 -1
  134. data/lib/oxidized/model/fortigate.rb +160 -0
  135. data/lib/oxidized/model/fortios.rb +38 -48
  136. data/lib/oxidized/model/fsos.rb +46 -0
  137. data/lib/oxidized/model/gaiaos.rb +4 -4
  138. data/lib/oxidized/model/garderos.rb +38 -0
  139. data/lib/oxidized/model/grandstreamht8xx.rb +19 -0
  140. data/lib/oxidized/model/h3c.rb +1 -1
  141. data/lib/oxidized/model/ibos.rb +1 -0
  142. data/lib/oxidized/model/ingate.rb +47 -0
  143. data/lib/oxidized/model/ios.rb +57 -30
  144. data/lib/oxidized/model/iosxr.rb +2 -2
  145. data/lib/oxidized/model/ironware.rb +7 -5
  146. data/lib/oxidized/model/ivanti.rb +54 -0
  147. data/lib/oxidized/model/junos.rb +12 -5
  148. data/lib/oxidized/model/kornfeldos.rb +33 -0
  149. data/lib/oxidized/model/lenovonos.rb +2 -0
  150. data/lib/oxidized/model/linksyssrw.rb +3 -3
  151. data/lib/oxidized/model/linuxgeneric.rb +4 -2
  152. data/lib/oxidized/model/macros.rb +60 -0
  153. data/lib/oxidized/model/mimosab11.rb +34 -0
  154. data/lib/oxidized/model/ml66.rb +33 -0
  155. data/lib/oxidized/model/mlnxos.rb +18 -14
  156. data/lib/oxidized/model/model.rb +98 -103
  157. data/lib/oxidized/model/mtrlrfs.rb +1 -0
  158. data/lib/oxidized/model/ndms.rb +6 -0
  159. data/lib/oxidized/model/netgear.rb +14 -3
  160. data/lib/oxidized/model/netonix.rb +1 -1
  161. data/lib/oxidized/model/netscaler.rb +1 -1
  162. data/lib/oxidized/model/nodegrid.rb +1 -1
  163. data/lib/oxidized/model/nsxdfw.rb +31 -0
  164. data/lib/oxidized/model/nsxfirewall.rb +2 -1
  165. data/lib/oxidized/model/nxos.rb +20 -15
  166. data/lib/oxidized/model/ocnos.rb +42 -0
  167. data/lib/oxidized/model/onefinity.rb +18 -0
  168. data/lib/oxidized/model/openbsd.rb +1 -1
  169. data/lib/oxidized/model/opengear.rb +36 -1
  170. data/lib/oxidized/model/openwrt.rb +6 -6
  171. data/lib/oxidized/model/opnsense.rb +9 -1
  172. data/lib/oxidized/model/os6.rb +48 -0
  173. data/lib/oxidized/model/outputs.rb +5 -0
  174. data/lib/oxidized/model/panos.rb +2 -0
  175. data/lib/oxidized/model/perle.rb +41 -0
  176. data/lib/oxidized/model/pfsense.rb +9 -0
  177. data/lib/oxidized/model/powerconnect.rb +32 -11
  178. data/lib/oxidized/model/procurve.rb +6 -2
  179. data/lib/oxidized/model/qtech.rb +3 -1
  180. data/lib/oxidized/model/quantaos.rb +8 -6
  181. data/lib/oxidized/model/rgos.rb +33 -0
  182. data/lib/oxidized/model/riverbed.rb +104 -0
  183. data/lib/oxidized/model/routeros.rb +18 -11
  184. data/lib/oxidized/model/saos.rb +18 -1
  185. data/lib/oxidized/model/saos10.rb +38 -0
  186. data/lib/oxidized/model/siklu.rb +1 -1
  187. data/lib/oxidized/model/siklumhtg.rb +22 -0
  188. data/lib/oxidized/model/sixwind.rb +28 -0
  189. data/lib/oxidized/model/slxos.rb +3 -3
  190. data/lib/oxidized/model/smartbyte.rb +48 -0
  191. data/lib/oxidized/model/sonicos.rb +27 -20
  192. data/lib/oxidized/model/speedtouch.rb +1 -1
  193. data/lib/oxidized/model/sros.rb +3 -3
  194. data/lib/oxidized/model/srosmd.rb +1 -1
  195. data/lib/oxidized/model/supermicro.rb +1 -1
  196. data/lib/oxidized/model/telco.rb +1 -1
  197. data/lib/oxidized/model/tmos.rb +1 -0
  198. data/lib/oxidized/model/tnsr.rb +57 -0
  199. data/lib/oxidized/model/tplink.rb +5 -5
  200. data/lib/oxidized/model/trango.rb +4 -2
  201. data/lib/oxidized/model/truenas.rb +64 -3
  202. data/lib/oxidized/model/ucs.rb +1 -1
  203. data/lib/oxidized/model/unifiap.rb +144 -0
  204. data/lib/oxidized/model/uplinkolt.rb +46 -0
  205. data/lib/oxidized/model/voltaire.rb +1 -1
  206. data/lib/oxidized/model/voss.rb +3 -0
  207. data/lib/oxidized/model/vrp.rb +5 -1
  208. data/lib/oxidized/model/vyatta.rb +9 -3
  209. data/lib/oxidized/model/vyos.rb +37 -0
  210. data/lib/oxidized/model/xos.rb +10 -1
  211. data/lib/oxidized/model/zhoneolt.rb +4 -2
  212. data/lib/oxidized/model/zynos.rb +67 -3
  213. data/lib/oxidized/model/zynosadsl.rb +14 -0
  214. data/lib/oxidized/model/zynoscli.rb +1 -1
  215. data/lib/oxidized/model/zynosgs.rb +2 -0
  216. data/lib/oxidized/model/zynosmgs.rb +32 -0
  217. data/lib/oxidized/node.rb +99 -64
  218. data/lib/oxidized/nodes.rb +40 -19
  219. data/lib/oxidized/output/file.rb +80 -43
  220. data/lib/oxidized/output/git.rb +295 -151
  221. data/lib/oxidized/output/gitcrypt.rb +193 -185
  222. data/lib/oxidized/output/http.rb +63 -51
  223. data/lib/oxidized/output/output.rb +20 -4
  224. data/lib/oxidized/signals.rb +44 -0
  225. data/lib/oxidized/source/csv.rb +49 -49
  226. data/lib/oxidized/source/http.rb +76 -63
  227. data/lib/oxidized/source/jsonfile.rb +68 -0
  228. data/lib/oxidized/source/source.rb +73 -18
  229. data/lib/oxidized/source/sql.rb +71 -59
  230. data/lib/oxidized/version.rb +6 -4
  231. data/lib/oxidized/worker.rb +57 -29
  232. data/lib/oxidized.rb +4 -24
  233. data/lib/refinements.rb +21 -1
  234. data/oxidized.gemspec +45 -21
  235. metadata +248 -41
  236. data/lib/oxidized/model/timos.rb +0 -10
@@ -0,0 +1,102 @@
1
+ module Oxidized
2
+ class Model
3
+ # Domain Specific Language for model setup
4
+ module DSLSetup
5
+ def prompt(regex = nil)
6
+ @prompt = regex || @prompt
7
+ end
8
+
9
+ def comment(str = "# ")
10
+ @comment = if block_given?
11
+ yield
12
+ elsif not @comment
13
+ str
14
+ else
15
+ @comment
16
+ end
17
+ end
18
+
19
+ def expect(regex, **args, &block)
20
+ process_args_block(@expect, args, [regex, block])
21
+ end
22
+
23
+ def expects
24
+ @expect
25
+ end
26
+
27
+ def cfg(*methods, **args, &block)
28
+ [methods].flatten.each do |method|
29
+ process_args_block(@cfg[method.to_s], args, block)
30
+ end
31
+ end
32
+
33
+ def cfgs
34
+ @cfg
35
+ end
36
+
37
+ # Define multiple inputs as a sequence of equivalent options
38
+ # Example: use ssh or telnet, then scp or ftp:
39
+ # [:ssh, [:scp, :ftp]]
40
+ def inputs(list = nil)
41
+ return @inputs if list.nil?
42
+
43
+ validate_inputs(list)
44
+ @inputs = list
45
+ end
46
+
47
+ # Returns the input sequence for the model as an array of arrays of input
48
+ # classes, filtered and ordered according to the provided +input_classes+
49
+ # (as specified in the oxidized configuration file).
50
+ def input_sequence(input_classes)
51
+ model_inputs = inputs || [
52
+ @cfg.filter_map do |input, block_list|
53
+ input.to_sym unless block_list.empty?
54
+ end
55
+ ]
56
+
57
+ model_inputs.map do |sequence|
58
+ sequence = [sequence] unless sequence.is_a? Array
59
+ selected = input_classes.select { |input| sequence.include?(input.to_sym) }
60
+ logger.error "Needs one of #{sequence.inspect} to be configured" if selected.empty?
61
+
62
+ selected
63
+ end
64
+ end
65
+
66
+ def metadata(position, value = nil, &block)
67
+ return unless %i[top bottom].include? position
68
+
69
+ if block_given?
70
+ @metadata[position] = block
71
+ else
72
+ @metadata[position] = value
73
+ end
74
+ end
75
+
76
+ private
77
+
78
+ def validate_inputs(list)
79
+ message = "inputs must be an array containing symbols or " \
80
+ "arrays of symbols"
81
+
82
+ raise ArgumentError, message unless list.is_a? Array
83
+ raise ArgumentError, message if list.empty?
84
+
85
+ list.each do |group|
86
+ case group
87
+ when Symbol
88
+ # Everything is fine
89
+ when Array
90
+ raise ArgumentError, message if group.empty?
91
+
92
+ group.each do |input|
93
+ raise ArgumentError, message unless input.is_a? Symbol
94
+ end
95
+ else
96
+ raise ArgumentError, message
97
+ end
98
+ end
99
+ end
100
+ end
101
+ end
102
+ end
@@ -0,0 +1,70 @@
1
+ class EatonNetwork < Oxidized::Model
2
+ using Refinements
3
+ # Eaton Gigabit Network Card M3
4
+
5
+ # -p option is a passphrase used to encrypted parts of the config data, the
6
+ # encrypted data is nondeterministic and changes with each run. Use auth
7
+ # password as the passphrase.
8
+ #
9
+ # See docs/Model-Notes/EatonNetwork.md for more info
10
+ post do
11
+ # Get config in post to allow passing auth password to cmd.
12
+ cfg = cmd "save_configuration -p #{@node.auth[:password]}"
13
+ cfg
14
+ end
15
+
16
+ cmd :all do |cfg|
17
+ # `save_configuration` echos the command back, outputs date time info, with
18
+ # last line is the prompt again.
19
+ json_str = cfg.each_line.select { |line| line.match /^\{/ }.join
20
+ json = JSON.parse(json_str)
21
+
22
+ json['features']['userAndSessionManagement']['data']['settings']['all']['1.0']['local']['1.0']['predefinedAccounts'].each do |n|
23
+ n.delete('attemptLogin')
24
+ n['password'].delete('history')
25
+ end
26
+ json['features']['userAndSessionManagement']['data']['settings']['all']['1.0']['local']['1.0']['createdAccounts'].each do |n|
27
+ n.delete('attemptLogin')
28
+ n['password'].delete('history')
29
+ end
30
+
31
+ cfg = JSON.pretty_generate(json)
32
+ cfg
33
+ end
34
+
35
+ cmd :secret do |cfg|
36
+ # Re-parse json to remove secrets by json path
37
+ json = JSON.parse(cfg)
38
+
39
+ json.delete('passphrase')
40
+ json['features']['rms']['data']['settings'].delete('proxyUsername')
41
+ json['features']['rms']['data']['settings'].delete('proxyPassword')
42
+ json['features']['rms']['data']['settings'].delete('username')
43
+ json['features']['rms']['data']['settings'].delete('password')
44
+ json['features']['rms']['data']['settings'].delete('defaultPassword')
45
+
46
+ json['features']['smtp']['data']['dmeData'].delete('password')
47
+
48
+ json['features']['snmp']['data']['dmeData']['v3']['users'].each do |n|
49
+ n['auth'].delete('password')
50
+ n['priv'].delete('password')
51
+ end
52
+
53
+ json['features']['userAndSessionManagement']['data']['settings']['all']['1.0']['ldap']['1.0']['settings']['connectivity']['bind'].delete('password')
54
+ json['features']['userAndSessionManagement']['data']['settings']['all']['1.0']['radius']['1.0']['settings']['connectivity']['primaryServer'].delete('secret')
55
+ json['features']['userAndSessionManagement']['data']['settings']['all']['1.0']['radius']['1.0']['settings']['connectivity']['secondaryServer'].delete('secret')
56
+
57
+ # Added in frimware v2.2.0
58
+ json['features']['peripherals']['data']['dmeData']['ethernet']['ports'].each do |n|
59
+ n.dig('dot1x', 'peap', 'password') && n['dot1x']['peap'].delete('password')
60
+ end
61
+
62
+ cfg = JSON.pretty_generate(json)
63
+ cfg
64
+ end
65
+
66
+ cfg :ssh do
67
+ exec true
68
+ pre_logout 'logout'
69
+ end
70
+ end
@@ -31,7 +31,9 @@ class EdgeCOS < Oxidized::Model
31
31
 
32
32
  cmd 'show system' do |cfg|
33
33
  cfg.gsub! /^.*\sUp Time\s*:.*\n/i, ''
34
- cfg.gsub! /^(.*\sTemperature \d*:).*\n/i, '\\1 <removed>'
34
+ cfg.gsub! /(\sTemperature \d*:)\s*\d+ degrees/, '\\1 <temperature values hidden>'
35
+ cfg.gsub! /^!?\s*Fan \d+ speed:\s+\d+ rpm\s+Fan \d+ speed:\s+\d+ rpm\s+Fan \d+ speed:\s+\d+ rpm$/,
36
+ '<fan speeds hidden>'
35
37
  comment cfg
36
38
  end
37
39
 
@@ -1,7 +1,7 @@
1
1
  class Edgeos < Oxidized::Model
2
2
  using Refinements
3
3
 
4
- # EdgeOS #
4
+ # Ubiquiti EdgeOS #
5
5
 
6
6
  prompt /@.*?:~\$\s/
7
7
 
@@ -10,11 +10,12 @@ class Edgeos < Oxidized::Model
10
10
  end
11
11
 
12
12
  cmd :secret do |cfg|
13
- cfg.gsub! /encrypted-password (\S+).*/, 'encrypted-password <secret removed>'
14
- cfg.gsub! /plaintext-password (\S+).*/, 'plaintext-password <secret removed>'
15
- cfg.gsub! /password (\S+).*/, 'password <secret removed>'
16
- cfg.gsub! /pre-shared-secret (\S+).*/, 'pre-shared-secret <secret removed>'
17
- cfg.gsub! /community (\S+) {/, 'community <hidden> {'
13
+ cfg.gsub!(/(encrypted-password) \S+/, '\1 <secret removed>')
14
+ cfg.gsub!(/(plaintext-password) \S+/, '\1 <secret removed>')
15
+ cfg.gsub!(/(password) \S+/, '\1 <secret removed>')
16
+ cfg.gsub!(/(pre-shared-secret) \S+/, '\1 <secret removed>')
17
+ cfg.gsub!(/(community) \S+ {/, '\1 <hidden> {')
18
+ cfg.gsub!(/(commit-archive location) \S+/, '\1 <secret removed>')
18
19
  cfg
19
20
  end
20
21
 
@@ -8,7 +8,9 @@ class EdgeSwitch < Oxidized::Model
8
8
  prompt /\(.*\)\s[#>]/
9
9
 
10
10
  cmd 'show running-config' do |cfg|
11
- cfg.each_line.to_a[2..-2].reject { |line| line.match(/System Up Time.*/) || line.match(/Current SNTP Synchronized Time.*/) }.join
11
+ cfg.each_line.to_a[2..-2].reject do |line|
12
+ line.match(/System Up Time.*/) || line.match(/Current SNTP Synchronized Time.*/)
13
+ end.join
12
14
  end
13
15
 
14
16
  cfg :telnet do
@@ -0,0 +1,41 @@
1
+ class EFOS < Oxidized::Model
2
+ using Refinements
3
+
4
+ # Enhanced Fabric OS - Broadcom
5
+ comment '! '
6
+ prompt /^([\w.@()-]+[#>]\s?)$/
7
+
8
+ cmd :all do |cfg|
9
+ # Remove the echo of the entered command and the prompt after it
10
+ cfg.cut_both
11
+ end
12
+
13
+ cmd 'show bootvar' do |cfg|
14
+ comment cfg
15
+ end
16
+
17
+ cmd 'show fiber-ports optical-transceiver-info all' do |cfg|
18
+ comment cfg
19
+ end
20
+
21
+ cmd 'show running-config' do |cfg|
22
+ cfg.reject_lines [
23
+ 'System Up Time',
24
+ 'Current System Time:',
25
+ 'Current SNTP Synchronized Time:'
26
+ ]
27
+ end
28
+
29
+ cfg :telnet, :ssh do
30
+ post_login do
31
+ if vars(:enable) == true
32
+ cmd 'enable'
33
+ elsif vars(:enable)
34
+ cmd 'enable', /^[pP]assword:/
35
+ cmd vars(:enable)
36
+ end
37
+ end
38
+ post_login 'terminal length 0'
39
+ pre_logout 'logout'
40
+ end
41
+ end
@@ -3,7 +3,7 @@ class Eltex < Oxidized::Model
3
3
 
4
4
  # Tested with MES2324FB Version: 4.0.7.1 Build: 37 (master)
5
5
 
6
- prompt /^\s?[\w.@\(\)-]+[#>]\s?$/
6
+ prompt /^\s?[\w.@()-]+[#>]\s?$/
7
7
  comment '! '
8
8
 
9
9
  cmd :all do |cfg|
@@ -16,7 +16,7 @@ class Eltex < Oxidized::Model
16
16
  cfg.gsub! /^(enable (password|secret)( level \d+)? \d) .+/, '\\1 <secret hidden>'
17
17
  cfg.gsub! /^(\s+(?:password|secret)) (?:\d )?\S+/, '\\1 <secret hidden>'
18
18
  cfg.gsub! /^(tacacs-server (.+ )?key) .+/, '\\1 <secret hidden>'
19
- cfg.gsub! /^((tacacs|radius) server [^\n]+\n(\s+[^\n]+\n)*\s+key) [^\n]+$/m, '\1 <secret hidden>'
19
+ cfg.gsub! /^((tacacs|radius) server [^\n]+\n( +[^\n]+\n)*\s+key) [^\n]+$/m, '\1 <secret hidden>'
20
20
  cfg.gsub! /username (\S+) privilege (\d+) (\S+).*/, '<secret hidden>'
21
21
  cfg.gsub! /^username \S+ password \d \S+/, '<secret hidden>'
22
22
  cfg.gsub! /^enable password \d \S+/, '<secret hidden>'
@@ -44,6 +44,8 @@ class Eltex < Oxidized::Model
44
44
  end
45
45
  end
46
46
  post_login 'terminal datadump'
47
+ # disable cli pagination for MES2424
48
+ post_login 'set cli pagination off'
47
49
  pre_logout 'disable'
48
50
  pre_logout 'exit'
49
51
  end
@@ -5,7 +5,7 @@ class Enterasys800 < Oxidized::Model
5
5
  # Tested with 08H20G4-24 Fast Ethernet Switch Firmware: Build 01.01.01.0017
6
6
  comment '# '
7
7
 
8
- prompt /([\w \(:.@-]+[#>]\s?)$/
8
+ prompt /([\w (:.@-]+[#>]\s?)$/
9
9
 
10
10
  cfg :telnet do
11
11
  username /UserName:/
@@ -23,7 +23,7 @@ class Enterasys800 < Oxidized::Model
23
23
  cmd :all do |cfg|
24
24
  cfg = cfg.cut_both
25
25
  cfg = cfg.gsub /^[\r\n]|^\s\s\s/, ''
26
- cfg = cfg.gsub /Command: show config effective/, ''
26
+ cfg = cfg.gsub "Command: show config effective", ''
27
27
  cfg
28
28
  end
29
29
 
@@ -0,0 +1,46 @@
1
+ class Enterprise_SONiC < Oxidized::Model # rubocop:disable Naming/ClassAndModuleCamelCase
2
+ using Refinements
3
+
4
+ # Remove ANSI escape codes
5
+ expect /\e\[[0-?]*[ -\/]*[@-~]\r?/ do |data, re|
6
+ data.gsub re, ''
7
+ end
8
+
9
+ # Matches both sonic-cli and linux terminal
10
+ prompt /^(?:[\w.-]+@[\w.-]+:[~\w\/-]+\$|[\w.-]+#)\s*/
11
+ comment "# "
12
+
13
+ def add_comment(comment)
14
+ "\n##### #{comment} #####\n"
15
+ end
16
+
17
+ post do
18
+ cmd 'show running-configuration' do |cfg|
19
+ add_comment('CONFIGURATION') + cfg
20
+ end
21
+ end
22
+
23
+ cmd 'show version' do |cfg|
24
+ cfg = cfg.each_line.reject { |line| line.match /Uptime/ }.join
25
+ add_comment('VERSION') + cfg
26
+ end
27
+
28
+ cmd 'show platform syseeprom' do |cfg|
29
+ add_comment('SYSEEPROM') + cfg
30
+ end
31
+
32
+ cmd :all do |cfg|
33
+ cfg.cut_both
34
+ end
35
+
36
+ cfg :ssh do
37
+ # if user logs in to linux == has admin rights
38
+ if vars(:admin) == true
39
+ post_login do
40
+ cmd "sonic-cli\n"
41
+ end
42
+ end
43
+ post_login 'terminal length 0'
44
+ pre_logout 'exit'
45
+ end
46
+ end
@@ -15,10 +15,12 @@ class EOS < Oxidized::Model
15
15
  cfg.gsub! /^(snmp-server community).*/, '\\1 <configuration removed>'
16
16
  cfg.gsub! /(secret \w+) (\S+).*/, '\\1 <secret hidden>'
17
17
  cfg.gsub! /(password \d+) (\S+).*/, '\\1 <secret hidden>'
18
- cfg.gsub! /^(enable secret).*/, '\\1 <configuration removed>'
18
+ cfg.gsub! /^(enable (?:secret|password)).*/, '\\1 <configuration removed>'
19
19
  cfg.gsub! /^(service unsupported-transceiver).*/, '\\1 <license key removed>'
20
20
  cfg.gsub! /^(tacacs-server key \d+).*/, '\\1 <configuration removed>'
21
+ cfg.gsub! /^(radius-server .+ key \d) \S+/, '\\1 <radius secret hidden>'
21
22
  cfg.gsub! /( {6}key) (\h+ 7) (\h+).*/, '\\1 <secret hidden>'
23
+ cfg.gsub! /(localized|auth (md5|sha\d{0,3})|priv (des|aes\d{0,3})) \S+/, '\\1 <secret hidden>'
22
24
  cfg
23
25
  end
24
26
 
@@ -0,0 +1,36 @@
1
+ class Exalink < Oxidized::Model
2
+ using Refinements
3
+
4
+ prompt /^([\w.@()-]+[#>]\s?)$/
5
+ comment '! '
6
+
7
+ cmd :all do |cfg|
8
+ cfg.gsub! /\r\n?/, "\n"
9
+ cfg.cut_both
10
+ end
11
+
12
+ cmd 'show version' do |cfg|
13
+ comment cfg.reject_lines /uptime/i
14
+ end
15
+
16
+ cmd 'show port' do |cfg|
17
+ comment cfg
18
+ end
19
+
20
+ cmd 'show running-config' do |cfg|
21
+ cfg.gsub! /^(show run.*)$/, '! \1'
22
+ cfg.gsub! /^!Time:[^\n]*\n/, ''
23
+ cfg
24
+ end
25
+
26
+ cfg :telnet do
27
+ username /^login:/
28
+ password /^Password:/
29
+ end
30
+
31
+ cfg :ssh, :telnet do
32
+ post_login 'terminal length 0'
33
+ post_login 'terminal width 0'
34
+ pre_logout 'logout'
35
+ end
36
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ class F5OS < Oxidized::Model
4
+ # F5OS Model #
5
+
6
+ comment '!'
7
+ prompt(/^([\w.@()-]+ ?[#>]\s+)$/)
8
+
9
+ cmd 'show running-config'
10
+
11
+ cfg :ssh do
12
+ post_login do
13
+ cmd 'paginate false'
14
+ end
15
+ pre_logout 'exit'
16
+ end
17
+ end
@@ -4,11 +4,11 @@ class FabricOS < Oxidized::Model
4
4
  # Brocade Fabric OS model #
5
5
  ## FIXME: Only ssh exec mode support, no telnet, no ssh screenscraping
6
6
 
7
- prompt /^([\w]+:+[\w]+[>]\s)$/
7
+ prompt /^(\w+:+\w+>\s)$/
8
8
  comment '# '
9
9
 
10
10
  cmd 'chassisShow' do |cfg|
11
- comment cfg.each_line.reject { |line| line.match(/Time Awake:/) || line.match(/Power Usage \(Watts\):/) || line.match(/Power Usage:/) || line.match(/Time Alive:/) || line.match(/Update:/) }.join
11
+ comment cfg.each_line.reject { |line| line.match(/Time Awake:/) || line.match(/Power Usage \(Watts\):/) || line.match(/Power Usage:/) || line.match(/Time Alive:/) || line.match(/Update:/) || line.match(/PS Voltage input:/) }.join
12
12
  end
13
13
 
14
14
  cmd 'configShow -all' do |cfg|
@@ -1,7 +1,7 @@
1
1
  class FastIron < Oxidized::Model
2
2
  using Refinements
3
3
 
4
- prompt /^([\w.@()-]+[#>]\s?)$/
4
+ prompt /^([\w.@\/()-]+[#>]\s?)$/
5
5
  comment '! '
6
6
 
7
7
  cmd :all do |cfg|
@@ -19,7 +19,9 @@ class FastIron < Oxidized::Model
19
19
  lines.each_with_index do |line, _i|
20
20
  comments << "Version: #{Regexp.last_match(1)}" if line =~ /^\s+SW: Version (.*)$/
21
21
 
22
- comments << "Boot-Monitor Version: #{Regexp.last_match(1)}" if line =~ /^\s+Compressed Boot-Monitor Image size = \d+, Version:(.*)$/
22
+ if line =~ /^\s+Compressed Boot-Monitor Image size = \d+, Version:(.*)$/
23
+ comments << "Boot-Monitor Version: #{Regexp.last_match(1)}"
24
+ end
23
25
 
24
26
  comments << "Serial: #{Regexp.last_match(1)}" if line =~ /^\s+Serial #:(.*)$/
25
27
  end
@@ -41,7 +43,7 @@ class FastIron < Oxidized::Model
41
43
  comment cfg
42
44
  end
43
45
 
44
- cmd 'show stack' do |cfg|
46
+ cmd 'show stack | exclude T=' do |cfg|
45
47
  comment cfg
46
48
  end
47
49
 
@@ -10,8 +10,8 @@ class Firebrick < Oxidized::Model
10
10
  end
11
11
 
12
12
  cmd 'show status' do |cfg|
13
- cfg.gsub! /Status/, ''
14
- cfg.gsub! /------/, ''
13
+ cfg.gsub! "Status", ''
14
+ cfg.gsub! "------", ''
15
15
  cfg.gsub! /Uptime.*/, ''
16
16
  cfg.gsub! /Current time.*/, ''
17
17
  cfg.gsub! /RAM.*/, ''
@@ -3,12 +3,21 @@ class FireLinuxOS < Oxidized::Model
3
3
 
4
4
  # Fire Linux OS is what the new FTD (FirePOWER) series devices from Cisco run. At the backend, it's mostly identical to ASA's.
5
5
 
6
- prompt /^[#>]\(?.+\)?\s?/
7
- comment '! '
6
+ prompt /^[#>]\(?.+\)? ?$/
7
+ comment '! '
8
+
9
+ expect /^Syntax error: .*\n.*$/ do |data, re|
10
+ # The firepower does not remove the entered command, so
11
+ # Send CTRL-U and \n for a fresh prompt
12
+ send "\x15\n"
13
+ data.sub re, ''
14
+ end
8
15
 
9
16
  cmd :all do |cfg|
10
17
  cfg.gsub! /^% Invalid input detected at '\^' marker\.$|^\s+\^$/, ''
11
- cfg.each_line.to_a[1..-2].join
18
+ # Ged rid of ANSI escape codes
19
+ cfg.gsub! /\e\[[0-?]*[ -\/]*[@-~]\r?/, ''
20
+ cfg.cut_both
12
21
  end
13
22
 
14
23
  cmd :secret do |cfg|
@@ -22,9 +31,7 @@ class FireLinuxOS < Oxidized::Model
22
31
  end
23
32
 
24
33
  cmd 'show version system' do |cfg|
25
- cfg = cfg.each_line.reject { |line| line.match /(\s+up\s+\d+\s+)|(.*days.*)/ }
26
- cfg = cfg.join
27
- comment cfg
34
+ comment cfg.reject_lines [/(\s+up\s+\d+\s+)|(.*days.*)/]
28
35
  end
29
36
 
30
37
  cmd 'show inventory' do |cfg|
@@ -1,7 +1,16 @@
1
1
  class FirewareOS < Oxidized::Model
2
2
  using Refinements
3
3
 
4
- prompt /^\[?\w*\]?\w*?(<\w*>)?(#|>)\s*$/
4
+ # matched prompts:
5
+ # [FAULT]WG<managed-by-wsm><master>>
6
+ # WG<managed-by-wsm><master>>
7
+ # WG<managed-by-wsm>>
8
+ # [FAULT]WG<non-master>>
9
+ # [FAULT]WG>
10
+ # WG>
11
+
12
+ prompt /^\[?\w*\]?\w*?(?:<[\w-]+>)*(#|>)\s*$/
13
+
5
14
  comment '-- '
6
15
 
7
16
  cmd :all do |cfg|