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
@@ -22,9 +22,11 @@ class IronWare < Oxidized::Model
22
22
  end
23
23
 
24
24
  cmd 'show version' do |cfg|
25
- cfg.gsub! /(^((.*)[Ss]ystem uptime(.*))$)/, '' # remove unwanted line system uptime
26
- cfg.gsub! /(^((.*)[Tt]he system started at(.*))$)/, ''
27
- cfg.gsub! /[Uu]p\s?[Tt]ime is .*/, ''
25
+ cfg = cfg.reject_lines [
26
+ /(^((.*)[Ss]ystem uptime(.*))$)/,
27
+ /(^((.*)[Tt]he system started at(.*))$)/,
28
+ /[Uu]p\s?[Tt]ime is .*/
29
+ ]
28
30
 
29
31
  comment cfg
30
32
  end
@@ -36,8 +38,8 @@ class IronWare < Oxidized::Model
36
38
  cfg.gsub! /current speed is [A-Z-]{2,6} \(\d{2,3}%\)/, ''
37
39
  cfg.gsub! /Fan \d* - STATUS: OK \D*\d*./, '' # Fix for ADX Fan speed reporting
38
40
  cfg.gsub! /\d* deg C/, '' # Fix for ADX temperature reporting
39
- cfg.gsub! /([\[]*)1([\]]*)<->([\[]*)2([\]]*)(<->([\[]*)3([\]]*))*/, ''
40
- cfg.gsub! /\d{2}\.\d deg-C/, 'XX.X deg-C'
41
+ cfg.gsub! /(\[*)1(\]*)<->(\[*)2(\]*)(<->(\[*)3(\]*))*/, ''
42
+ cfg.gsub! /\d+\.\d deg-C/, 'XX.X deg-C'
41
43
  if cfg.include? "TEMPERATURE"
42
44
  sc = StringScanner.new cfg
43
45
  out = ''
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'json'
4
+
5
+ class Ivanti < Oxidized::Model
6
+ BINARY_CONFIG_PATH = '/api/v1/system/binary-configuration'
7
+ REALM_AUTH_PATH = '/api/v1/realm_auth'
8
+ DEFAULT_REALM = 'Users'
9
+
10
+ cmd BINARY_CONFIG_PATH do |b64|
11
+ b64.to_s.lines.map(&:strip).join
12
+ end
13
+
14
+ cfg :http do
15
+ @secure = true
16
+ @port = 443
17
+
18
+ @username = @node.auth[:username]
19
+ @password = @node.auth[:password]
20
+
21
+ realm = vars(:realm) || DEFAULT_REALM
22
+ payload = { realm: realm }.to_json
23
+
24
+ response_body = post_http(
25
+ REALM_AUTH_PATH,
26
+ payload,
27
+ 'Content-Type' => 'application/json',
28
+ 'Authorization' => basic_auth_header
29
+ )
30
+
31
+ begin
32
+ login_data = JSON.parse(response_body)
33
+ rescue JSON::ParserError => e
34
+ logger.error(
35
+ "Failed to parse realm_auth response: #{e.class}: #{e.message}, body=#{response_body.inspect}"
36
+ )
37
+ raise Oxidized::OxidizedError, 'Ivanti: realm_auth returned invalid JSON'
38
+ end
39
+
40
+ api_key = login_data['api_key']
41
+
42
+ if api_key.nil? || api_key.empty?
43
+ logger.error(
44
+ "Failed to obtain api_key from realm_auth, response=#{response_body.inspect}"
45
+ )
46
+ raise Oxidized::OxidizedError, 'Ivanti: realm_auth did not return valid api_key'
47
+ end
48
+
49
+ @username = api_key
50
+ @password = ''
51
+
52
+ logger.debug "Obtained api_key #{api_key[0, 4]}... (len=#{api_key.length})"
53
+ end
54
+ end
@@ -1,6 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class JunOS < Oxidized::Model
2
4
  using Refinements
3
-
4
5
  comment '# '
5
6
 
6
7
  def telnet
@@ -10,11 +11,13 @@ class JunOS < Oxidized::Model
10
11
  cmd :all do |cfg|
11
12
  cfg = cfg.cut_both if screenscrape
12
13
  cfg.gsub!(/ scale-subscriber (\s+)(\d+)/, ' scale-subscriber <count>')
14
+ cfg.gsub!(/VMX-BANDWIDTH\s+(\d+) (.*)/, 'VMX-BANDWIDTH <count> \2')
13
15
  cfg.lines.map { |line| line.rstrip }.join("\n") + "\n"
14
16
  end
15
17
 
16
18
  cmd :secret do |cfg|
17
19
  cfg.gsub!(/community (\S+) {/, 'community <hidden> {')
20
+ cfg.gsub!(/(ssh-(rsa|dsa|ecdsa|ecdsa-sk|ed25519|ed25519-sk) )".*; ## SECRET-DATA/, '<secret removed>')
18
21
  cfg.gsub!(/ "\$\d\$\S+; ## SECRET-DATA/, ' <secret removed>;')
19
22
  cfg
20
23
  end
@@ -25,20 +28,24 @@ class JunOS < Oxidized::Model
25
28
  end
26
29
 
27
30
  post do
28
- out = ''
31
+ out = String.new
29
32
  case @model
30
33
  when 'mx960'
31
34
  out << cmd('show chassis fabric reachability') { |cfg| comment cfg }
32
- when /^(ex22|ex33|ex4|ex8|qfx)/
35
+ when /^(ex22|ex3[34]|ex4|ex8|qfx)/
33
36
  out << cmd('show virtual-chassis') { |cfg| comment cfg }
37
+ when /^srx/
38
+ out << cmd('show chassis cluster status') do |cfg|
39
+ cfg.lines.count <= 1 && cfg.include?("error:") ? String.new : comment(cfg)
40
+ end
34
41
  end
35
42
  out
36
43
  end
37
44
 
38
45
  cmd('show chassis hardware') { |cfg| comment cfg }
39
46
  cmd('show system license') do |cfg|
40
- cfg.gsub!(/ fib-scale\s+(\d+)/, ' fib-scale <count>')
41
- cfg.gsub!(/ rib-scale\s+(\d+)/, ' rib-scale <count>')
47
+ cfg.gsub!(/ fib[-\s]scale\s+(\d+)/i, ' fib-scale <count>')
48
+ cfg.gsub!(/ rib[-\s]scale\s+(\d+)/i, ' rib-scale <count>')
42
49
  comment cfg
43
50
  end
44
51
  cmd('show system license keys') { |cfg| comment cfg }
@@ -0,0 +1,33 @@
1
+ class KornfeldOS < Oxidized::Model
2
+ using Refinements
3
+
4
+ # For switches running Kornfeld OS
5
+ #
6
+ # Tested with : Kornfeld D1156 and Kornfeld D2132
7
+
8
+ comment '# '
9
+
10
+ cmd :all do |cfg|
11
+ cfg.gsub! /^% Invalid input detected at '\^' marker\.$|^\s+\^$/, ''
12
+ cfg.each_line.to_a[2..-2].join
13
+ end
14
+
15
+ cmd 'show version | except REPOSITORY | except docker | except Uptime' do |cfg|
16
+ comment cfg
17
+ end
18
+
19
+ cmd 'show platform firmware' do |cfg|
20
+ comment cfg
21
+ end
22
+
23
+ cmd 'show running-configuration' do |cfg|
24
+ cfg.each_line.to_a[0..-1].join
25
+ end
26
+
27
+ cfg :ssh do
28
+ username /^Login:/
29
+ password /^Password:/
30
+ post_login 'terminal length 0'
31
+ pre_logout 'exit'
32
+ end
33
+ end
@@ -42,6 +42,7 @@ class LenovoNOS < Oxidized::Model
42
42
  cfg = cfg.reject { |line| line.match /^Last boot:/ }
43
43
  cfg = cfg.reject { |line| line.match /^Temperature / }
44
44
  cfg = cfg.reject { |line| line.match /^Power Consumption/ }
45
+ cfg = cfg.reject { |line| line.match /^Fan/ }
45
46
 
46
47
  cfg = cfg.join
47
48
  comment_ext("=== show version ===", cfg)
@@ -63,6 +64,7 @@ class LenovoNOS < Oxidized::Model
63
64
  cfg.gsub! /^Current configuration:[^\n]*\n/, ''
64
65
  if vars(:remove_unstable_lines) == true
65
66
  cfg.gsub! /(.* password )"[0-9a-f]+"(.*)/, '\\1<unstable line hidden>\\2'
67
+ cfg.gsub! /(.* administrator-password )"[0-9a-f]+"(.*)/, '\\1<unstable line hidden>\\2'
66
68
  cfg.gsub! /(.*ekey )"[0-9a-f]+"(.*)/, '\\1<unstable line hidden>\\2'
67
69
  end
68
70
  cfg
@@ -8,7 +8,7 @@ class LinksysSRW < Oxidized::Model
8
8
  # Graphical login screen
9
9
  # Just login to get to Main Menu
10
10
  expect /Login Screen/ do
11
- Oxidized.logger.send(:debug, "#{self.class.name}: Login Screen")
11
+ logger.debug "#{self.class.name}: Login Screen"
12
12
  # This is to ensure the whole thing have rendered before we send stuff
13
13
  sleep 0.2
14
14
  send 0x18.chr # CAN Cancel
@@ -21,14 +21,14 @@ class LinksysSRW < Oxidized::Model
21
21
 
22
22
  # Main menu, escape into Pre-cli-shell
23
23
  expect /Switch Main Menu/ do
24
- Oxidized.logger.send(:debug, "#{self.class.name}: Switch menu")
24
+ logger.debug "#{self.class.name}: Switch menu"
25
25
  send 0x1a.chr # SUB Substitite ^z
26
26
  ''
27
27
  end
28
28
 
29
29
  # Pre-cli-shell, start lcli which is ios-ish
30
30
  expect />/ do
31
- Oxidized.logger.send(:debug, "#{self.class.name}: >")
31
+ logger.debug "#{self.class.name}: >"
32
32
  send "lcli\r"
33
33
  ''
34
34
  end
@@ -1,8 +1,9 @@
1
1
  class LinuxGeneric < Oxidized::Model
2
2
  using Refinements
3
3
 
4
- prompt /^(\w.*|\W.*)(:|#) /
4
+ prompt /^\S.*[#$] $/
5
5
  comment '# '
6
+ clean :escape_codes
6
7
 
7
8
  # add a comment in the final conf
8
9
  def add_comment(comment)
@@ -53,7 +54,7 @@ class LinuxGeneric < Oxidized::Model
53
54
  end
54
55
 
55
56
  cfg :telnet do
56
- username /^Username:/
57
+ username /(Username|[Ll]ogin):/
57
58
  password /^Password:/
58
59
  end
59
60
 
@@ -63,6 +64,7 @@ class LinuxGeneric < Oxidized::Model
63
64
  cmd "sudo su -", /^\[sudo\] password/
64
65
  cmd @node.auth[:password]
65
66
  elsif vars(:enable)
67
+ # This will only work without localisation (de: "Passwort:", fr: "Mot de passe :"...)
66
68
  cmd "su -", /^Password:/
67
69
  cmd vars(:enable)
68
70
  end
@@ -0,0 +1,60 @@
1
+ module Oxidized
2
+ class Model
3
+ module Macros
4
+ using Refinements
5
+ VERBS = %i[
6
+ macro
7
+ clean
8
+ ].freeze
9
+
10
+ VERBS.each do |verb|
11
+ define_method(verb) do |name, *args, **kwargs, &block|
12
+ send("#{verb}_#{name}", *args, **kwargs, &block)
13
+ end
14
+ end
15
+
16
+ private
17
+
18
+ def macro_enable(regex: /password/i, inputs: %i[telnet ssh], command: "enable")
19
+ inputs = [inputs].flatten.map(&:to_sym)
20
+ cfg(*inputs) do
21
+ post_login do
22
+ if vars(:enable) == true
23
+ cmd command
24
+ elsif vars(:enable)
25
+ cmd command, regex
26
+ cmd vars(:enable)
27
+ end
28
+ end
29
+ end
30
+ end
31
+
32
+ def clean_escape_codes
33
+ ansi_escape_regex = /
34
+ \r? # Optional carriage return at start
35
+ \e # ESC character - starts escape sequence
36
+ (?: # Non-capturing group for different sequence types:
37
+ # Type 1: CSI (Control Sequence Introducer)
38
+ \[ # Literal '[' - starts CSI sequence
39
+ [0-?]* # Parameter bytes: digits (0-9), semicolon, colon, etc.
40
+ [ -\/]* # Intermediate bytes: space through slash characters
41
+ [@-~] # Final byte: determines the actual command
42
+ | # OR
43
+ # Type 2: Simple escape
44
+ [=>] # Single character commands after ESC
45
+ )
46
+ \r? # Optional carriage return at end
47
+ /x
48
+ expect ansi_escape_regex do |data, re|
49
+ data.gsub re, ''
50
+ end
51
+ end
52
+
53
+ def clean_cut(head: 1, tail: 1)
54
+ cmd :all do |cfg|
55
+ cfg.cut_both(head, tail)
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,34 @@
1
+ begin
2
+ # Mechanize has to be intialized here as the login needs a POST request
3
+ require "mechanize"
4
+ rescue LoadError
5
+ # Oxidized requires mechanize
6
+ raise Oxidized::OxidizedError, "mechanize not found: sudo gem install mechanize"
7
+ end
8
+
9
+ class Mimosab11 < Oxidized::Model
10
+ using Refinements
11
+ # Callback cfg_cb function to login(POST) then get(GET) the configuration
12
+ cfg_cb = lambda do
13
+ @e = Mechanize.new
14
+ # Set login query endpoint(lqe) and login POST data(lqp)
15
+ lqe = "https://#{@node.ip}/?q=index.login&mimosa_ajax=1"
16
+ lgp = { "username" => "configure", "password" => @password }
17
+ # Set get request endpoint(gc) for config
18
+ gc = "https://#{@node.ip}/?q=preferences.configure&mimosa_action=download"
19
+ # Not to verify self signed
20
+ @e.verify_mode = 0
21
+ @e.post(lqe, lgp)
22
+ cfg = @e.get(gc)
23
+ cfg.body
24
+ end
25
+
26
+ cmd cfg_cb do |cfg|
27
+ cfg
28
+ end
29
+
30
+ cfg :http do
31
+ @username = @node.auth[:username]
32
+ @password = @node.auth[:password]
33
+ end
34
+ end
@@ -0,0 +1,33 @@
1
+ class ML66 < Oxidized::Model
2
+ comment '! '
3
+ prompt /.*#/
4
+
5
+ expect /User:.*$/ do |data, re|
6
+ send "admin_user\n"
7
+ send "#{@node.auth[:password]}\n"
8
+ data.sub re, ''
9
+ end
10
+
11
+ cmd 'show version' do |cfg|
12
+ cfg.gsub! "Uptime", ''
13
+ comment cfg
14
+ end
15
+
16
+ cmd 'show inventory hw all' do |cfg|
17
+ comment cfg
18
+ end
19
+
20
+ cmd 'show inventory sw all' do |cfg|
21
+ comment cfg
22
+ end
23
+
24
+ cmd 'show license status all' do |cfg|
25
+ comment cfg
26
+ end
27
+
28
+ cmd 'show running-config'
29
+
30
+ cfg :ssh do
31
+ pre_logout 'logout'
32
+ end
33
+ end
@@ -1,25 +1,20 @@
1
1
  class MLNXOS < Oxidized::Model
2
2
  using Refinements
3
3
 
4
- prompt /([\w.@()-\[:\s\]]+[#>]\s)$/
4
+ prompt /^\r?\S* \[\S+: (master|standby)\] [#>] $/
5
5
  comment '## '
6
+ clean :escape_codes
6
7
 
7
8
  # Pager Handling
8
- expect /.+lines\s\d+-\d+([\s]|\/\d+\s\(END\)\s).+$/ do |data, re|
9
+ # "Normal" pager: "lines 183-204 "
10
+ # Last pager: "lines 256-269/269 (END) "
11
+ expect /lines \d+-\d+( |\/\d+ \(END\) )/ do |data, re|
9
12
  send ' '
10
13
  data.sub re, ''
11
14
  end
12
15
 
13
16
  cmd :all do |cfg|
14
- cfg.gsub! /\[\?1h=\r/, '' # Pager Handling
15
- cfg.gsub! /\[24;1H/, '' # Pager Handling
16
- cfg.gsub! /\r\[K/, '' # Pager Handling
17
- cfg.gsub! /\[K/, '' # Pager Handling
18
- cfg.gsub! /\s/, '' # Linebreak Handling
19
- cfg.gsub! /^CPU load averages:\s.+/, '' # Omit constantly changing CPU info
20
- cfg.gsub! /^System memory:\s.+/, '' # Omit constantly changing memory info
21
- cfg.gsub! /^Uptime:\s.+/, '' # Omit constantly changing uptime info
22
- cfg.gsub! /.+Generated at\s\d+.+/, '' # Omit constantly changing generation time info
17
+ cfg.gsub! /.\x08/, '' # Remove Backspace char
23
18
  cfg.lines.to_a[2..-3].join
24
19
  end
25
20
 
@@ -30,21 +25,30 @@ class MLNXOS < Oxidized::Model
30
25
  end
31
26
 
32
27
  cmd 'show version' do |cfg|
33
- comment cfg
28
+ cfg = cfg.reject_lines [
29
+ /^CPU load averages:\s.+/, # Omit constantly changing CPU info
30
+ /^System memory:\s.+/, # Omit constantly changing memory info
31
+ /^Uptime:\s.+/ # Omit constantly changing uptime info
32
+ ]
33
+ comment cfg + "\n"
34
34
  end
35
35
 
36
36
  cmd 'show inventory' do |cfg|
37
- comment cfg
37
+ comment cfg + "\n"
38
38
  end
39
39
 
40
40
  cmd 'enable'
41
41
 
42
42
  cmd 'show running-config' do |cfg|
43
- cfg
43
+ cfg.reject_lines [
44
+ # Omit constantly changing generation time info
45
+ /.+Generated at\s\d+.+/
46
+ ]
44
47
  end
45
48
 
46
49
  cfg :ssh do
47
50
  password /^Password:\s*/
51
+ post_login 'no cli session paging enable'
48
52
  pre_logout "\nexit"
49
53
  end
50
54
  end