oxidized 0.30.1 → 0.32.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (111) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby.yml +3 -4
  3. data/.github/workflows/stale.yml +4 -2
  4. data/.rubocop.yml +18 -3
  5. data/.rubocop_todo.yml +4 -11
  6. data/CHANGELOG.md +93 -1
  7. data/CONTRIBUTING.md +5 -0
  8. data/Dockerfile +84 -20
  9. data/README.md +5 -21
  10. data/Rakefile +31 -2
  11. data/docs/Configuration.md +50 -14
  12. data/docs/Creating-Models.md +75 -4
  13. data/docs/DeviceSimulation.md +184 -0
  14. data/docs/Hooks.md +39 -5
  15. data/docs/Issues.md +97 -0
  16. data/docs/Model-Notes/APC_AOS.md +29 -16
  17. data/docs/Model-Notes/Cumulus.md +5 -0
  18. data/docs/Model-Notes/FSOS.md +6 -0
  19. data/docs/Model-Notes/FortiOS.md +21 -5
  20. data/docs/Model-Notes/HPEAruba.md +31 -0
  21. data/docs/Model-Notes/OS6.md +10 -0
  22. data/docs/Model-Notes/RouterOS.md +15 -0
  23. data/docs/Model-Notes/SikluMHTG.md +7 -0
  24. data/docs/ModelUnitTests.md +186 -0
  25. data/docs/Outputs.md +2 -0
  26. data/docs/Release.md +18 -15
  27. data/docs/Sources.md +21 -0
  28. data/docs/Supported-OS-Types.md +14 -7
  29. data/docs/Troubleshooting.md +35 -0
  30. data/examples/podman-compose/Makefile +59 -17
  31. data/examples/podman-compose/README.md +63 -27
  32. data/examples/podman-compose/docker-compose.yml +11 -2
  33. data/examples/podman-compose/gitserver/.gitignore +1 -0
  34. data/examples/podman-compose/gitserver/Dockerfile +14 -0
  35. data/examples/podman-compose/model-simulation/Dockerfile-model +1 -1
  36. data/examples/podman-compose/model-simulation/asternos.sh +2 -0
  37. data/examples/podman-compose/oxidized-config/.gitignore +2 -0
  38. data/examples/podman-compose/oxidized-config/config +1 -1
  39. data/examples/podman-compose/oxidized-config/config_csv-file +46 -0
  40. data/examples/podman-compose/oxidized-config/config_csv-gitserver +56 -0
  41. data/examples/podman-compose/oxidized-ssh/.gitignore +1 -0
  42. data/extra/device2yaml.rb +245 -0
  43. data/extra/gitdiff-msteams.sh +32 -5
  44. data/extra/nagios_check_failing_nodes.rb +1 -1
  45. data/extra/rest_client.rb +1 -1
  46. data/lib/oxidized/config.rb +8 -2
  47. data/lib/oxidized/hook/githubrepo.rb +37 -7
  48. data/lib/oxidized/hook/slackdiff.rb +29 -7
  49. data/lib/oxidized/input/http.rb +1 -0
  50. data/lib/oxidized/input/ssh.rb +13 -5
  51. data/lib/oxidized/input/telnet.rb +1 -1
  52. data/lib/oxidized/manager.rb +17 -16
  53. data/lib/oxidized/model/aos7.rb +2 -0
  54. data/lib/oxidized/model/aoscx.rb +16 -2
  55. data/lib/oxidized/model/aosw.rb +8 -2
  56. data/lib/oxidized/model/apc_aos.rb +1 -1
  57. data/lib/oxidized/model/arubainstant.rb +90 -0
  58. data/lib/oxidized/model/asa.rb +2 -1
  59. data/lib/oxidized/model/asyncos.rb +1 -1
  60. data/lib/oxidized/model/audiocodes.rb +2 -2
  61. data/lib/oxidized/model/cnos.rb +13 -10
  62. data/lib/oxidized/model/cumulus.rb +19 -2
  63. data/lib/oxidized/model/dlink.rb +1 -0
  64. data/lib/oxidized/model/dlinknextgen.rb +3 -0
  65. data/lib/oxidized/model/edgecos.rb +2 -1
  66. data/lib/oxidized/model/enterprise_sonic.rb +46 -0
  67. data/lib/oxidized/model/eos.rb +2 -0
  68. data/lib/oxidized/model/f5os.rb +17 -0
  69. data/lib/oxidized/model/firewareos.rb +10 -1
  70. data/lib/oxidized/model/fortios.rb +24 -1
  71. data/lib/oxidized/model/fsos.rb +5 -1
  72. data/lib/oxidized/model/garderos.rb +43 -0
  73. data/lib/oxidized/model/h3c.rb +1 -1
  74. data/lib/oxidized/model/ibos.rb +1 -0
  75. data/lib/oxidized/model/ios.rb +20 -12
  76. data/lib/oxidized/model/iosxr.rb +1 -1
  77. data/lib/oxidized/model/junos.rb +1 -1
  78. data/lib/oxidized/model/kornfeldos.rb +33 -0
  79. data/lib/oxidized/model/lenovonos.rb +2 -0
  80. data/lib/oxidized/model/linuxgeneric.rb +1 -1
  81. data/lib/oxidized/model/model.rb +2 -2
  82. data/lib/oxidized/model/netgear.rb +1 -1
  83. data/lib/oxidized/model/nodegrid.rb +1 -1
  84. data/lib/oxidized/model/nsxdfw.rb +30 -0
  85. data/lib/oxidized/model/nxos.rb +2 -1
  86. data/lib/oxidized/model/os6.rb +48 -0
  87. data/lib/oxidized/model/rgos.rb +1 -1
  88. data/lib/oxidized/model/riverbed.rb +104 -0
  89. data/lib/oxidized/model/routeros.rb +2 -2
  90. data/lib/oxidized/model/saos.rb +18 -1
  91. data/lib/oxidized/model/siklumhtg.rb +22 -0
  92. data/lib/oxidized/model/sonicos.rb +8 -2
  93. data/lib/oxidized/model/tplink.rb +1 -0
  94. data/lib/oxidized/model/uplinkolt.rb +46 -0
  95. data/lib/oxidized/model/vyatta.rb +2 -2
  96. data/lib/oxidized/model/xos.rb +7 -0
  97. data/lib/oxidized/node.rb +30 -18
  98. data/lib/oxidized/nodes.rb +13 -5
  99. data/lib/oxidized/output/file.rb +45 -42
  100. data/lib/oxidized/output/git.rb +185 -160
  101. data/lib/oxidized/output/gitcrypt.rb +188 -186
  102. data/lib/oxidized/output/http.rb +53 -51
  103. data/lib/oxidized/output/output.rb +6 -4
  104. data/lib/oxidized/source/csv.rb +44 -49
  105. data/lib/oxidized/source/http.rb +63 -81
  106. data/lib/oxidized/source/jsonfile.rb +63 -0
  107. data/lib/oxidized/source/source.rb +73 -18
  108. data/lib/oxidized/source/sql.rb +66 -59
  109. data/lib/oxidized/version.rb +2 -2
  110. data/oxidized.gemspec +25 -18
  111. metadata +115 -21
@@ -1,7 +1,19 @@
1
1
  class Cumulus < Oxidized::Model
2
2
  using Refinements
3
3
 
4
- prompt /^(([\w.-]*)@(.*)):/
4
+ # Remove ANSI escape codes
5
+ expect /\e\[[0-?]*[ -\/]*[@-~]\r?/ do |data, re|
6
+ data.gsub re, ''
7
+ end
8
+
9
+ # The prompt contains ANSI escape codes, which have already been removed
10
+ # from the expect call above
11
+ # ^ : match begin of line, to have the most specific prompt
12
+ # [\w.-]+@[\w.-]+ : user@hostname
13
+ # (:mgmt)? : optional when logged in out of band
14
+ # :~[#$] $ : end of prompt, containing the linux path,
15
+ # which is always "~" in our context
16
+ prompt /^[\w.-]+@[\w.-]+(:mgmt)?:~[#$] $/
5
17
  comment '# '
6
18
 
7
19
  # add a comment in the final conf
@@ -21,9 +33,12 @@ class Cumulus < Oxidized::Model
21
33
  # show the persistent configuration
22
34
  pre do
23
35
  use_nclu = vars(:cumulus_use_nclu) || false
36
+ use_nvue = vars(:cumulus_use_nvue) || false
24
37
 
25
38
  if use_nclu
26
39
  cfg = cmd 'net show configuration commands'
40
+ elsif use_nvue
41
+ cfg = cmd 'nv config show --color off'
27
42
  else
28
43
  # Set FRR or Quagga in config
29
44
  routing_daemon = vars(:cumulus_routing_daemon) ? vars(:cumulus_routing_daemon).downcase : 'quagga'
@@ -76,7 +91,9 @@ class Cumulus < Oxidized::Model
76
91
  cfg += cmd 'cat /etc/cumulus/switchd.conf'
77
92
 
78
93
  cfg += add_comment 'PORTS'
79
- cfg += cmd 'cat /etc/cumulus/ports.conf'
94
+ # in some configurations, ports.conf has no trailing Line Feed,
95
+ # which breaks the prompt, so we add one
96
+ cfg += cmd "cat /etc/cumulus/ports.conf; echo"
80
97
 
81
98
  cfg += add_comment 'TRAFFIC'
82
99
  cfg += cmd 'cat /etc/cumulus/datapath/traffic.conf'
@@ -37,6 +37,7 @@ class Dlink < Oxidized::Model
37
37
 
38
38
  cfg :telnet, :ssh do
39
39
  post_login 'disable clipaging'
40
+ post_login 'enable admin' if vars(:enable) == true
40
41
  pre_logout 'logout'
41
42
  end
42
43
  end
@@ -35,6 +35,9 @@ class DlinkNextGen < Oxidized::Model
35
35
  cmd 'show running-config' do |cfg|
36
36
  cfg.gsub! /^(snmp-server community ["\w]+) \S+/, '\\1 <removed>'
37
37
  cfg.gsub! /^(username [\w.@-]+ privilege \d{1,2} password \d{1,2}) \S+/, '\\1 <removed>'
38
+ cfg.gsub! /^(!System Up Time).*/, '\\1 <removed>'
39
+ cfg.gsub! /^(!Current SNTP Synchronized Time:).*/, '\\1 <removed>'
40
+ cfg.gsub! /^(\s+ppp (chap|pap) password \d) .+/, '\\1 <secret hidden>'
38
41
  cfg
39
42
  end
40
43
 
@@ -31,7 +31,8 @@ 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*\s*:\s*).*/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$/, '<fan speeds hidden>'
35
36
  comment cfg
36
37
  end
37
38
 
@@ -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
@@ -18,7 +18,9 @@ class EOS < Oxidized::Model
18
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,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
@@ -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|
@@ -22,6 +22,8 @@ class FortiOS < Oxidized::Model
22
22
  end
23
23
 
24
24
  cmd :secret do |cfg|
25
+ # Remove private key for encrypted configs
26
+ cfg.gsub! /^(\#private-encryption-key=).+/, '\\1 <configuration removed>'
25
27
  # ENC indicates an encrypted password, and secret indicates a secret string
26
28
  cfg.gsub! /(set .+ ENC) .+/, '\\1 <configuration removed>'
27
29
  cfg.gsub! /(set .*secret) .+/, '\\1 <configuration removed>'
@@ -73,10 +75,31 @@ class FortiOS < Oxidized::Model
73
75
 
74
76
  cfg << cmd('end') if @vdom_enabled
75
77
 
76
- ['show | grep .', 'show full-configuration', 'show'].each do |fullcmd|
78
+ # Different OS have different commands - we use the first that works
79
+ # - For fortigate > 7 and possibly earlier versions, we use:
80
+ # show | grep . # backup as in fortigate GUI
81
+ # show full-configuration | grep . # bakup including default values
82
+ # | grep is used to avoid the --More-- prompt
83
+ # - It is not documented which systems need the commands without | grep:
84
+ # show full-configuration
85
+ # show
86
+ # Document it here and make a PR on github if you know!
87
+ # By default, we use the configuration without default values
88
+ # If fullconfig: true is set in the configuration, we get the full config
89
+ commandlist = if vars(:fullconfig)
90
+ ['show full-configuration | grep .',
91
+ 'show full-configuration', 'show']
92
+ else
93
+ ['show | grep .',
94
+ 'show full-configuration', 'show']
95
+ end
96
+
97
+ commandlist.each do |fullcmd|
77
98
  fullcfg = cmd(fullcmd)
78
99
  next if fullcfg.lines[1..3].join =~ /(Parsing error at|command parse error)/ # Don't show for unsupported devices (e.g. FortiAnalyzer, FortiManager, FortiMail)
79
100
 
101
+ fullcfg.gsub! /(set comments "Error \(No order (found )?for (account )?ID \d+\) on).*/, '\\1 <stripped>"'
102
+
80
103
  cfg << fullcfg
81
104
  break
82
105
  end
@@ -2,6 +2,7 @@ class FSOS < Oxidized::Model
2
2
  # Fiberstore / fs.com
3
3
  using Refinements
4
4
  comment '! '
5
+ prompt /^([\w.@()-]+[#>]\s?)$/
5
6
 
6
7
  # Handle paging
7
8
  expect /^ --More--.*$/ do |data, re|
@@ -13,6 +14,9 @@ class FSOS < Oxidized::Model
13
14
  cfg.gsub! /(secret \w+) (\S+).*/, '\\1 <secret hidden>'
14
15
  cfg.gsub! /(password \d+) (\S+).*/, '\\1 <secret hidden>'
15
16
  cfg.gsub! /(snmp-server community \d+) (\S+).*/, '\\1 <secret hidden>'
17
+ cfg.gsub! /^(snmp-server host \S+( udp-port \d+)?( permit|deny \d+)?( informs?)?( traps?)?(( version v3 (priv|auth|noauth))|( version (v1|v2c))?)) +\S+( .*)?$*/, '\\1 <secret hidden>'
18
+ cfg.gsub! /^(snmp-server user \S+ \S+ v3( priv (des|aes128|aes256|aes256-c))?( auth (md5|sha|sha256) \d+)) +\S+( .*)?$*/, '\\1 <secret hidden>'
19
+ cfg.gsub! /^(.*key \d+) (\S+).*/, '\\1 <secret hidden>'
16
20
  cfg
17
21
  end
18
22
 
@@ -37,7 +41,7 @@ class FSOS < Oxidized::Model
37
41
  cfg :telnet, :ssh do
38
42
  post_login 'enable'
39
43
  post_login 'terminal length 0'
40
- post_login 'terminal width 256'
44
+ post_login 'terminal width 512'
41
45
  pre_logout 'exit'
42
46
  pre_logout 'exit'
43
47
  end
@@ -0,0 +1,43 @@
1
+ class Garderos < Oxidized::Model
2
+ using Refinements
3
+ # Garderos GmbH https://www.garderos.com/
4
+ # Routers for harsh environments
5
+ # grs = Garderos Router Software
6
+
7
+ # Remove ANSI escape codes
8
+ expect /\e\[[0-?]*[ -\/]*[@-~]\r?/ do |data, re|
9
+ data.gsub re, ''
10
+ end
11
+
12
+ # the prompt does not need to match escape codes, as they have been removed above
13
+ prompt /[\w-]+# /
14
+ comment '# '
15
+
16
+ cmd :all do |cfg|
17
+ # Remove the echo of the entered command and the prompt after it
18
+ cfg.cut_both
19
+ end
20
+
21
+ cmd 'show system version' do |cfg|
22
+ comment "#{cfg}\n"
23
+ end
24
+
25
+ cmd 'show system serial' do |cfg|
26
+ comment "#{cfg}\n"
27
+ end
28
+
29
+ # If we have a radio modem installed, we'd like to list the SIM Card
30
+ cmd 'show hardware wwan wwan0 sim' do |cfg|
31
+ if cfg.start_with? 'Unknown command'
32
+ String.new('')
33
+ else
34
+ comment "#{cfg}\n"
35
+ end
36
+ end
37
+
38
+ cmd 'show configuration running'
39
+
40
+ cfg :ssh do
41
+ pre_logout 'exit'
42
+ end
43
+ end
@@ -3,7 +3,7 @@ class H3C < Oxidized::Model
3
3
 
4
4
  # H3C
5
5
 
6
- prompt /^.*(<[\w.-]+>)$/
6
+ prompt /^.*([<\[][\w.-]+[>\]])$/
7
7
  comment '# '
8
8
 
9
9
  cmd :secret do |cfg|
@@ -22,6 +22,7 @@ class IBOS < Oxidized::Model
22
22
 
23
23
  # radius server 10.1.1.1 secret public
24
24
  cfg.gsub! /^radius server (\S+) secret (\S+)(.*)/, 'radius server \\1 secret <hidden> \\3'
25
+ cfg
25
26
  end
26
27
 
27
28
  cmd 'show version' do |cfg|
@@ -27,23 +27,29 @@ class IOS < Oxidized::Model
27
27
 
28
28
  cmd :secret do |cfg|
29
29
  cfg.gsub! /^(snmp-server community).*/, '\\1 <configuration removed>'
30
- 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'
30
+ cfg.gsub! /^(snmp-server host \S+( vrf \S+)?( informs?)?( version (1|2c))?) +\S+( .*)?$*/, '\\1 <secret hidden>\\6'
31
31
  cfg.gsub! /^(username .+ (password|secret) \d) .+/, '\\1 <secret hidden>'
32
32
  cfg.gsub! /^(enable (password|secret)( level \d+)? \d) .+/, '\\1 <secret hidden>'
33
- cfg.gsub! /^(\s+(?:password|secret)) (?:\d )?\S+/, '\\1 <secret hidden>'
33
+ cfg.gsub! /^( +(?:password|secret)) (?:\d )?\S+/, '\\1 <secret hidden>'
34
34
  cfg.gsub! /^(.*wpa-psk ascii \d) (\S+)/, '\\1 <secret hidden>'
35
35
  cfg.gsub! /^(.*key 7) (\d.+)/, '\\1 <secret hidden>'
36
36
  cfg.gsub! /^(tacacs-server (.+ )?key) .+/, '\\1 <secret hidden>'
37
37
  cfg.gsub! /^(crypto isakmp key) (\S+) (.*)/, '\\1 <secret hidden> \\3'
38
- cfg.gsub! /^(\s+ip ospf message-digest-key \d+ md5) .+/, '\\1 <secret hidden>'
39
- cfg.gsub! /^(\s+ip ospf authentication-key) .+/, '\\1 <secret hidden>'
40
- cfg.gsub! /^(\s+neighbor \S+ password) .+/, '\\1 <secret hidden>'
41
- cfg.gsub! /^(\s+vrrp \d+ authentication text) .+/, '\\1 <secret hidden>'
42
- cfg.gsub! /^(\s+standby \d+ authentication) .{1,8}$/, '\\1 <secret hidden>'
43
- cfg.gsub! /^(\s+standby \d+ authentication md5 key-string) .+?( timeout \d+)?$/, '\\1 <secret hidden> \\2'
44
- cfg.gsub! /^(\s+key-string) .+/, '\\1 <secret hidden>'
45
- cfg.gsub! /^((tacacs|radius) server [^\n]+\n(\s+[^\n]+\n)*\s+key) [^\n]+$/m, '\1 <secret hidden>'
46
- cfg.gsub! /^(\s+ppp (chap|pap) password \d) .+/, '\\1 <secret hidden>'
38
+ cfg.gsub! /^( +ip ospf message-digest-key \d+ md5) .+/, '\\1 <secret hidden>'
39
+ cfg.gsub! /^( +ip ospf authentication-key) .+/, '\\1 <secret hidden>'
40
+ cfg.gsub! /^( +neighbor \S+ password) .+/, '\\1 <secret hidden>'
41
+ cfg.gsub! /^( +vrrp \d+ authentication text) .+/, '\\1 <secret hidden>'
42
+ cfg.gsub! /^( +standby \d+ authentication) .{1,8}$/, '\\1 <secret hidden>'
43
+ cfg.gsub! /^( +standby \d+ authentication md5 key-string) .+?( timeout \d+)?$/, '\\1 <secret hidden> \\2'
44
+ cfg.gsub! /^( +key-string) .+/, '\\1 <secret hidden>'
45
+ cfg.gsub! /^((tacacs|radius) server [^\n]+\n( +[^\n]+\n)* +key) [^\n]+$/m, '\1 <secret hidden>'
46
+ cfg.gsub! /^( +ppp (chap|pap) password \d) .+/, '\\1 <secret hidden>'
47
+ cfg.gsub! /^( +security wpa psk set-key (?:ascii|hex) \d) (.*)$/, '\\1 <secret hidden>'
48
+ cfg.gsub! /^( +dot1x username \S+ password \d) (.*)$/, '\\1 <secret hidden>'
49
+ cfg.gsub! /^( +mgmtuser username \S+ password \d) (.*) (secret \d) (.*)$/, '\\1 <secret hidden> \\3 <secret hidden>'
50
+ cfg.gsub! /^( +client \S+ server-key \d) (.*)$/, '\\1 <secret hidden>'
51
+ cfg.gsub! /^( +domain-password) \S+ ?(.*)/, '\\1 <secret hidden> \\2'
52
+ cfg.gsub! /^( +pre-shared-key).*/, '\\1 <configuration removed>'
47
53
  cfg
48
54
  end
49
55
 
@@ -74,7 +80,7 @@ class IOS < Oxidized::Model
74
80
 
75
81
  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
76
82
 
77
- if line =~ /(\S+(?:\sseries)?)\s+(?:\((\S+)\)\s+processor|\(revision[^)]+\)).*\s+with (\S+k) bytes/i
83
+ if line =~ /(\S+(?:\sseries)?)\s+(?:\(([\S ]+)\)\s+processor|\(revision[^)]+\)).*\s+with (\S+k) bytes/i
78
84
  sproc = Regexp.last_match(1)
79
85
  cpu = Regexp.last_match(2)
80
86
  mem = Regexp.last_match(3)
@@ -118,6 +124,8 @@ class IOS < Oxidized::Model
118
124
  cfg.gsub! /^ tunnel mpls traffic-eng bandwidth[^\n]*\n*(
119
125
  (?: [^\n]*\n*)*
120
126
  tunnel mpls traffic-eng auto-bw)/mx, '\1'
127
+ # get rid of values of custom SNMP OID's
128
+ cfg.gsub! /^(\s+expression) \d+$/, '\\1 <value removed>'
121
129
  cfg
122
130
  end
123
131
  end
@@ -16,7 +16,7 @@ class IOSXR < Oxidized::Model
16
16
  cfg
17
17
  end
18
18
 
19
- cmd 'admin show inventory' do |cfg|
19
+ cmd 'show inventory all' do |cfg|
20
20
  comment cfg
21
21
  end
22
22
 
@@ -26,7 +26,7 @@ class JunOS < Oxidized::Model
26
26
  end
27
27
 
28
28
  post do
29
- out = ''
29
+ out = String.new('')
30
30
  case @model
31
31
  when 'mx960'
32
32
  out << cmd('show chassis fabric reachability') { |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
@@ -1,7 +1,7 @@
1
1
  class LinuxGeneric < Oxidized::Model
2
2
  using Refinements
3
3
 
4
- prompt /^(\w.*|\W.*)(:|#) /
4
+ prompt /^(\w.*|\W.*)[:#$] /
5
5
  comment '# '
6
6
 
7
7
  # add a comment in the final conf
@@ -184,7 +184,7 @@ module Oxidized
184
184
  end
185
185
 
186
186
  def comment(str)
187
- data = ''
187
+ data = String.new('')
188
188
  str.each_line do |line|
189
189
  data << self.class.comment << line
190
190
  end
@@ -202,7 +202,7 @@ module Oxidized
202
202
  # Also, XML Comments must not contain --. So we put a space between
203
203
  # any double hyphens, by replacing any - that is followed by another -
204
204
  # with '- '
205
- data = ''
205
+ data = String.new('')
206
206
  str.each_line do |_line|
207
207
  data << '<!-- ' << str.gsub(/-(?=-)/, '- ').chomp << " -->\n"
208
208
  end
@@ -2,7 +2,7 @@ class Netgear < Oxidized::Model
2
2
  using Refinements
3
3
 
4
4
  comment '!'
5
- prompt /^(\([\w\s\-\+.]+\)\s?[#>])$/
5
+ prompt /^\(?[\w \-+.]+\)? ?[#>] ?$/
6
6
 
7
7
  cmd :secret do |cfg|
8
8
  cfg.gsub!(/password (\S+)/, 'password <hidden>')
@@ -4,7 +4,7 @@ class Nodegrid < Oxidized::Model
4
4
  # ZPE Nodegrid (Tested with Nodegrid Gate/Bold/NSR)
5
5
  # https://www.zpesystems.com/products/
6
6
 
7
- prompt(%r{(?<!@)\[(.*?\s/)\]#})
7
+ prompt /(?<!@)\[(.*?\s\/)\]#/
8
8
  comment '# '
9
9
 
10
10
  cmd 'show system/about/' do |cfg|
@@ -0,0 +1,30 @@
1
+ require 'net/http'
2
+ class NSXDfw < Oxidized::Model
3
+ using Refinements
4
+
5
+ cmd "/policy/api/v1/infra/domains/" do |cfg|
6
+ domains = JSON.parse(cfg.encode('UTF-8', { invalid: :replace, undef: :replace, replace: '?' }))["results"]
7
+ domain_config = {}
8
+ domains.each do |domain|
9
+ domain_config[domain['id']] = {}
10
+ policies_data = cmd "/policy/api/v1/infra/domains/#{domain['id']}/security-policies/"
11
+ policies = JSON.parse(policies_data.encode('UTF-8', { invalid: :replace, undef: :replace, replace: '?' }))["results"]
12
+ policies_config = {}
13
+ policies.each do |policy|
14
+ rules_data = cmd "/policy/api/v1/infra/domains/#{domain['id']}/security-policies/#{policy['id']}/rules"
15
+ rules = JSON.parse(rules_data.encode('UTF-8', { invalid: :replace, undef: :replace, replace: '?' }))["results"]
16
+ policies_config[policy['id']] = rules
17
+ end
18
+ domain_config[domain['id']] = policies_config
19
+ end
20
+ JSON.pretty_generate(domain_config)
21
+ end
22
+
23
+ cfg :http do
24
+ @username = @node.auth[:username]
25
+ @password = @node.auth[:password]
26
+ @headers['Content-Type'] = 'application/json'
27
+ @headers['Accept'] = 'application/json'
28
+ @secure = true
29
+ end
30
+ end
@@ -13,8 +13,9 @@ class NXOS < Oxidized::Model
13
13
  cfg.gsub! /^(snmp-server community).*/, '\\1 <secret hidden>'
14
14
  cfg.gsub! /^(snmp-server user (\S+) (\S+) auth (\S+)) (\S+) (priv) (\S+)/, '\\1 <secret hidden> '
15
15
  cfg.gsub! /^(snmp-server host.*? )\S+( udp-port \d+)?$/, '\\1<secret hidden>\\2'
16
+ cfg.gsub! /^(snmp-server mib community-map) \S+ ?(.*)/, '\\1 <secret hidden> \\2'
16
17
  cfg.gsub! /(password \d+) (\S+)/, '\\1 <secret hidden>'
17
- cfg.gsub! /^(radius-server key).*/, '\\1 <secret hidden>'
18
+ cfg.gsub! /^(radius-server .*key(?: \d+)?) \S+/, '\\1 <secret hidden>'
18
19
  cfg.gsub! /^(tacacs-server .*key(?: \d+)?) \S+/, '\\1 <secret hidden>'
19
20
  cfg
20
21
  end
@@ -0,0 +1,48 @@
1
+ class OS6 < Oxidized::Model
2
+ using Refinements
3
+
4
+ # For switches running Dell EMC Networking OS6 #
5
+ #
6
+ # Tested with : Dell PowerSwitch N2048
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 :secret do |cfg|
16
+ cfg.gsub! /(password )(\S+)/, '\1<secret hidden>'
17
+ cfg
18
+ end
19
+
20
+ cmd 'show version' do |cfg|
21
+ comment cfg
22
+ end
23
+
24
+ cmd 'show interfaces transceiver properties' do |cfg|
25
+ comment cfg
26
+ end
27
+
28
+ cmd 'show running-config' do |cfg|
29
+ cfg.each_line.to_a[3..-1].join
30
+ end
31
+
32
+ cfg :telnet do
33
+ username /^Login:/
34
+ password /^Password:/
35
+ end
36
+
37
+ cfg :telnet, :ssh do
38
+ if vars :enable
39
+ post_login do
40
+ send "enable\n"
41
+ cmd vars(:enable)
42
+ end
43
+ end
44
+ post_login 'terminal length 0'
45
+ pre_logout 'exit'
46
+ pre_logout 'exit'
47
+ end
48
+ end
@@ -12,7 +12,7 @@ class RGOS < Oxidized::Model
12
12
 
13
13
  cmd 'show version' do |cfg|
14
14
  cfg = cfg.each_line.reject { |line| line.match /^System start time/ }.join
15
- cfg = cfg.each_line.reject { |line| line.match /^System uptime/ }.join
15
+ cfg = cfg.each_line.reject { |line| line.match /^\s*System uptime/ }.join
16
16
  comment "#{cfg.cut_both}\n"
17
17
  end
18
18