oxidized 0.24.0 → 0.25.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 (122) hide show
  1. checksums.yaml +4 -4
  2. data/.codeclimate.yml +4 -0
  3. data/.rubocop.yml +3 -0
  4. data/CHANGELOG.md +26 -2
  5. data/Dockerfile +8 -32
  6. data/README.md +17 -5
  7. data/bin/oxidized +1 -1
  8. data/docs/Configuration.md +41 -3
  9. data/docs/Hooks.md +26 -0
  10. data/docs/Model-Notes/AireOS.md +1 -2
  11. data/docs/Model-Notes/ArbOS.md +1 -2
  12. data/docs/Model-Notes/Comware.md +1 -2
  13. data/docs/Model-Notes/EOS.md +1 -2
  14. data/docs/Model-Notes/JunOS.md +1 -2
  15. data/docs/Model-Notes/Netgear.md +5 -6
  16. data/docs/Model-Notes/Nokia.md +9 -0
  17. data/docs/Model-Notes/README.md +3 -2
  18. data/docs/Model-Notes/VRP-Huawei.md +1 -2
  19. data/docs/Model-Notes/Viptela.md +12 -0
  20. data/docs/Model-Notes/XGS4600-Zyxel.md +1 -2
  21. data/docs/Ruby-API.md +54 -2
  22. data/docs/Supported-OS-Types.md +12 -0
  23. data/extra/oxidized.service +7 -0
  24. data/lib/oxidized/cli.rb +7 -0
  25. data/lib/oxidized/config.rb +3 -0
  26. data/lib/oxidized/core.rb +1 -0
  27. data/lib/oxidized/hook/ciscosparkdiff.rb +11 -17
  28. data/lib/oxidized/hook/slackdiff.rb +5 -11
  29. data/lib/oxidized/hook/xmppdiff.rb +1 -0
  30. data/lib/oxidized/input/ssh.rb +43 -27
  31. data/lib/oxidized/input/telnet.rb +1 -0
  32. data/lib/oxidized/model/acos.rb +2 -2
  33. data/lib/oxidized/model/acsw.rb +6 -6
  34. data/lib/oxidized/model/adtran.rb +22 -0
  35. data/lib/oxidized/model/aen.rb +2 -2
  36. data/lib/oxidized/model/aireos.rb +3 -2
  37. data/lib/oxidized/model/alteonos.rb +2 -2
  38. data/lib/oxidized/model/aos.rb +1 -1
  39. data/lib/oxidized/model/aos7.rb +1 -1
  40. data/lib/oxidized/model/aosw.rb +5 -3
  41. data/lib/oxidized/model/apc_aos.rb +1 -1
  42. data/lib/oxidized/model/arbos.rb +2 -2
  43. data/lib/oxidized/model/asa.rb +8 -2
  44. data/lib/oxidized/model/awplus.rb +1 -1
  45. data/lib/oxidized/model/axos.rb +16 -0
  46. data/lib/oxidized/model/c4cmts.rb +3 -5
  47. data/lib/oxidized/model/casa.rb +1 -1
  48. data/lib/oxidized/model/catos.rb +1 -1
  49. data/lib/oxidized/model/ciscosma.rb +1 -1
  50. data/lib/oxidized/model/ciscosmb.rb +10 -4
  51. data/lib/oxidized/model/comtrol.rb +41 -0
  52. data/lib/oxidized/model/comware.rb +1 -1
  53. data/lib/oxidized/model/coriantgroove.rb +4 -6
  54. data/lib/oxidized/model/cumulus.rb +14 -1
  55. data/lib/oxidized/model/datacom.rb +1 -2
  56. data/lib/oxidized/model/dcnos.rb +1 -1
  57. data/lib/oxidized/model/dellx.rb +76 -0
  58. data/lib/oxidized/model/dlink.rb +2 -2
  59. data/lib/oxidized/model/dnos.rb +3 -1
  60. data/lib/oxidized/model/eciapollo.rb +34 -0
  61. data/lib/oxidized/model/edgecos.rb +1 -0
  62. data/lib/oxidized/model/edgeos.rb +6 -1
  63. data/lib/oxidized/model/eos.rb +3 -2
  64. data/lib/oxidized/model/fiberdriver.rb +1 -1
  65. data/lib/oxidized/model/firebrick.rb +31 -0
  66. data/lib/oxidized/model/firewareos.rb +1 -1
  67. data/lib/oxidized/model/fortios.rb +5 -4
  68. data/lib/oxidized/model/ftos.rb +4 -1
  69. data/lib/oxidized/model/fujitsupy.rb +3 -3
  70. data/lib/oxidized/model/gaiaos.rb +1 -1
  71. data/lib/oxidized/model/gcombnps.rb +3 -1
  72. data/lib/oxidized/model/hatteras.rb +1 -1
  73. data/lib/oxidized/model/hirschmann.rb +2 -2
  74. data/lib/oxidized/model/hpebladesystem.rb +1 -1
  75. data/lib/oxidized/model/ios.rb +21 -13
  76. data/lib/oxidized/model/ipos.rb +3 -3
  77. data/lib/oxidized/model/ironware.rb +3 -3
  78. data/lib/oxidized/model/isam.rb +1 -1
  79. data/lib/oxidized/model/junos.rb +1 -1
  80. data/lib/oxidized/model/masteros.rb +2 -3
  81. data/lib/oxidized/model/mlnxos.rb +5 -5
  82. data/lib/oxidized/model/model.rb +3 -0
  83. data/lib/oxidized/model/ndms.rb +1 -2
  84. data/lib/oxidized/model/netgear.rb +7 -9
  85. data/lib/oxidized/model/netonix.rb +1 -1
  86. data/lib/oxidized/model/netscaler.rb +6 -1
  87. data/lib/oxidized/model/nos.rb +2 -2
  88. data/lib/oxidized/model/oneos.rb +1 -1
  89. data/lib/oxidized/model/openbsd.rb +8 -22
  90. data/lib/oxidized/model/openwrt.rb +1 -0
  91. data/lib/oxidized/model/opnsense.rb +1 -1
  92. data/lib/oxidized/model/panos.rb +9 -9
  93. data/lib/oxidized/model/pfsense.rb +2 -1
  94. data/lib/oxidized/model/planet.rb +1 -1
  95. data/lib/oxidized/model/powerconnect.rb +7 -4
  96. data/lib/oxidized/model/procurve.rb +7 -5
  97. data/lib/oxidized/model/routeros.rb +1 -1
  98. data/lib/oxidized/model/saos.rb +1 -1
  99. data/lib/oxidized/model/screenos.rb +3 -3
  100. data/lib/oxidized/model/sros.rb +2 -2
  101. data/lib/oxidized/model/stoneos.rb +1 -1
  102. data/lib/oxidized/model/tmos.rb +2 -0
  103. data/lib/oxidized/model/tplink.rb +4 -0
  104. data/lib/oxidized/model/viptela.rb +29 -0
  105. data/lib/oxidized/model/voltaire.rb +5 -5
  106. data/lib/oxidized/model/voss.rb +4 -4
  107. data/lib/oxidized/model/vrp.rb +1 -1
  108. data/lib/oxidized/model/vyatta.rb +1 -1
  109. data/lib/oxidized/model/weos.rb +1 -1
  110. data/lib/oxidized/model/xos.rb +9 -2
  111. data/lib/oxidized/node.rb +20 -31
  112. data/lib/oxidized/nodes.rb +3 -0
  113. data/lib/oxidized/output/git.rb +17 -20
  114. data/lib/oxidized/output/gitcrypt.rb +2 -1
  115. data/lib/oxidized/output/http.rb +19 -12
  116. data/lib/oxidized/source/csv.rb +15 -8
  117. data/lib/oxidized/source/http.rb +26 -22
  118. data/lib/oxidized/string.rb +9 -4
  119. data/lib/oxidized/version.rb +2 -2
  120. data/lib/oxidized/worker.rb +44 -36
  121. data/oxidized.gemspec +1 -4
  122. metadata +26 -16
@@ -0,0 +1,22 @@
1
+ class Adtran < Oxidized::Model
2
+ # Adtran
3
+
4
+ prompt /([\w.@-]+[#>]\s?)$/
5
+
6
+ cmd :secret do |cfg|
7
+ cfg.gsub!(/password (\S+)/, 'password <hidden>')
8
+ cfg
9
+ end
10
+
11
+ cmd 'show running-config'
12
+
13
+ cfg :ssh do
14
+ post_login do
15
+ send "enable\n"
16
+ cmd vars(:enable)
17
+ end
18
+ post_login 'terminal length 0'
19
+ pre_logout 'exit'
20
+ sleep 1
21
+ end
22
+ end
@@ -3,14 +3,14 @@ class AEN < Oxidized::Model
3
3
 
4
4
  comment '# '
5
5
 
6
- prompt /^([-\w.\/:?\[\]\(\)]+:\s?)$/
6
+ prompt /^([-\w.\/:?\[\]()]+:\s?)$/
7
7
 
8
8
  cmd 'configuration generate-script module all' do |cfg|
9
9
  cfg
10
10
  end
11
11
 
12
12
  cmd :all do |cfg|
13
- cfg.each_line.to_a[1..-2].join
13
+ cfg.cut_both
14
14
  end
15
15
 
16
16
  cfg :ssh do
@@ -3,10 +3,10 @@ class Aireos < Oxidized::Model
3
3
  # Used in Cisco WLC 5500
4
4
 
5
5
  comment '# ' # this complains too, can't find real comment char
6
- prompt /^\([^\)]+\)\s>/
6
+ prompt /^\([^)]+\)\s>/
7
7
 
8
8
  cmd :all do |cfg|
9
- cfg.each_line.to_a[1..-2].join
9
+ cfg.cut_both
10
10
  end
11
11
 
12
12
  # show sysinfo?
@@ -44,6 +44,7 @@ class Aireos < Oxidized::Model
44
44
  cfg.each_line do |line|
45
45
  next if line.match /^\s*$/
46
46
  next if line.match /rogue (adhoc|client) (alert|Unknown) [\da-f]{2}:/
47
+
47
48
  line = line[1..-1] if line[0] == "\r"
48
49
  out << line.strip
49
50
  end
@@ -35,13 +35,13 @@ class ALTEONOS < Oxidized::Model
35
35
  end
36
36
 
37
37
  # Answer for Dispay private keys
38
- expect /^Display private keys\?\s?\[y\/n\]\: $/ do |data, re|
38
+ expect /^Display private keys\?\s?\[y\/n\]: $/ do |data, re|
39
39
  send "n\r"
40
40
  data.sub re, ''
41
41
  end
42
42
 
43
43
  # Answer for sync to peer on exit
44
- expect /^Confirm Sync to Peer\s?\[y\/n\]\: $/ do |data, re|
44
+ expect /^Confirm Sync to Peer\s?\[y\/n\]: $/ do |data, re|
45
45
  send "n\r"
46
46
  data.sub re, ''
47
47
  end
@@ -5,7 +5,7 @@ class AOS < Oxidized::Model
5
5
  comment '! '
6
6
 
7
7
  cmd :all do |cfg|
8
- cfg.each_line.to_a[1..-2].join
8
+ cfg.cut_both
9
9
  end
10
10
 
11
11
  cmd 'show system' do |cfg|
@@ -6,7 +6,7 @@ class AOS7 < Oxidized::Model
6
6
 
7
7
  cmd :all do |cfg, cmdstring|
8
8
  new_cfg = comment "COMMAND: #{cmdstring}\n"
9
- new_cfg << cfg.each_line.to_a[1..-2].join
9
+ new_cfg << cfg.cut_both
10
10
  end
11
11
 
12
12
  cmd 'show system' do |cfg|
@@ -13,7 +13,7 @@ class AOSW < Oxidized::Model
13
13
  prompt /^\(?.+\)?\s[#>]/
14
14
 
15
15
  cmd :all do |cfg|
16
- cfg.each_line.to_a[1..-2].join
16
+ cfg.cut_both
17
17
  end
18
18
 
19
19
  cmd :secret do |cfg|
@@ -25,8 +25,8 @@ class AOSW < Oxidized::Model
25
25
  cfg.gsub!(/ sha (\S+)/, ' sha <secret removed>')
26
26
  cfg.gsub!(/ des (\S+)/, ' des <secret removed>')
27
27
  cfg.gsub!(/mobility-manager (\S+) user (\S+) (\S+)/, 'mobility-manager \1 user \2 <secret removed>')
28
- cfg.gsub!(/mgmt-user (\S+) (root|guest\-provisioning|network\-operations|read\-only|location\-api\-mgmt) (\S+)$/, 'mgmt-user \1 \2 <secret removed>') # MAS & Wireless Controler
29
- cfg.gsub!(/mgmt-user (\S+) (\S+)( (read\-only|guest\-mgmt))?$/, 'mgmt-user \1 <secret removed> \3') # IAP
28
+ cfg.gsub!(/mgmt-user (\S+) (root|guest-provisioning|network-operations|read-only|location-api-mgmt) (\S+)$/, 'mgmt-user \1 \2 <secret removed>') # MAS & Wireless Controler
29
+ cfg.gsub!(/mgmt-user (\S+) (\S+)( (read-only|guest-mgmt))?$/, 'mgmt-user \1 <secret removed> \3') # IAP
30
30
  # MAS format: mgmt-user <username> <accesslevel> <password hash>
31
31
  # IAP format (root user): mgmt-user <username> <password hash>
32
32
  # IAP format: mgmt-user <username> <password hash> <access level>
@@ -63,6 +63,7 @@ class AOSW < Oxidized::Model
63
63
  cfg.each_line do |line|
64
64
  next if line.match /^controller config \d+$/
65
65
  next if line.match /^Building Configuration/
66
+
66
67
  out << line.strip
67
68
  end
68
69
  out = out.join "\n"
@@ -106,6 +107,7 @@ class AOSW < Oxidized::Model
106
107
  next if line.match /(Tachometers|Temperatures|Voltages)/
107
108
  next if line.match /((Card|CPU) Temperature|Chassis Fan|VMON1[0-9])/
108
109
  next if line.match /[0-9]+\s+(RPMS?|m?V|C)/i
110
+
109
111
  out << line.strip
110
112
  end
111
113
  out = comment out.join "\n"
@@ -1,6 +1,6 @@
1
1
  class Apc_aos < Oxidized::Model
2
2
  cmd 'config.ini' do |cfg|
3
- cfg.gsub! /^; Configuration file\, generated on.*/, ''
3
+ cfg.gsub! /^; Configuration file, generated on.*/, ''
4
4
  end
5
5
 
6
6
  cfg :ftp do
@@ -5,8 +5,8 @@ class ARBOS < Oxidized::Model
5
5
  comment '# '
6
6
 
7
7
  cmd 'system hardware' do |cfg|
8
- cfg.gsub! /^Boot\ time\:\s.+/, '' # Remove boot timer
9
- cfg.gsub! /^Load\ averages\:\s.+/, '' # Remove CPU load info
8
+ cfg.gsub! /^Boot time:\s.+/, '' # Remove boot timer
9
+ cfg.gsub! /^Load averages:\s.+/, '' # Remove CPU load info
10
10
  cfg = cfg.each_line.to_a[2..-1].join
11
11
  comment cfg
12
12
  end
@@ -6,16 +6,22 @@ class ASA < Oxidized::Model
6
6
  comment '! '
7
7
 
8
8
  cmd :all do |cfg|
9
- cfg.each_line.to_a[1..-2].join
9
+ cfg.cut_both
10
10
  end
11
11
 
12
12
  cmd :secret do |cfg|
13
13
  cfg.gsub! /enable password (\S+) (.*)/, 'enable password <secret hidden> \2'
14
+ cfg.gsub! /^passwd (\S+) (.*)/, 'passwd <secret hidden> \2'
14
15
  cfg.gsub! /username (\S+) password (\S+) (.*)/, 'username \1 password <secret hidden> \3'
15
16
  cfg.gsub! /(ikev[12] ((remote|local)-authentication )?pre-shared-key) (\S+)/, '\1 <secret hidden>'
16
- cfg.gsub! /^(aaa-server TACACS\+? \(\S+\) host.*\n\skey) \S+$/mi, '\1 <secret hidden>'
17
+ cfg.gsub! /^(aaa-server TACACS\+? \(\S+\) host[^\n]*\n(\s+[^\n]+\n)*\skey) \S+$/mi, '\1 <secret hidden>'
18
+ cfg.gsub! /^(aaa-server \S+ \(\S+\) host[^\n]*\n(\s+[^\n]+\n)*\s+key) \S+$/mi, '\1 <secret hidden>'
17
19
  cfg.gsub! /ldap-login-password (\S+)/, 'ldap-login-password <secret hidden>'
18
20
  cfg.gsub! /^snmp-server host (.*) community (\S+)/, 'snmp-server host \1 community <secret hidden>'
21
+ cfg.gsub! /^(failover key) .+/, '\1 <secret hidden>'
22
+ cfg.gsub! /^(\s+ospf message-digest-key \d+ md5) .+/, '\1 <secret hidden>'
23
+ cfg.gsub! /^(\s+ospf authentication-key) .+/, '\1 <secret hidden>'
24
+ cfg.gsub! /^(\s+neighbor \S+ password) .+/, '\1 <secret hidden>'
19
25
  cfg
20
26
  end
21
27
 
@@ -16,7 +16,7 @@ class AWPlus < Oxidized::Model
16
16
  cfg.gsub! /\e\[K/, '' # example how to handle pager - cleareol EL0
17
17
  cfg.gsub! /\e\[7m\e\[m/, '' # example how to handle pager - Reverse SGR7
18
18
  cfg.gsub! /\r/, '' # Filters rogue ^M - see issue #415
19
- cfg.each_line.to_a[1..-2].join
19
+ cfg.cut_both
20
20
  end
21
21
 
22
22
  # Remove passwords from config file.
@@ -0,0 +1,16 @@
1
+ class AxOS < Oxidized::Model
2
+ prompt /(\x1b\[\?7h)?([\w.@()-]+[#]\s?)$/
3
+ comment '! '
4
+
5
+ cmd 'show running-config | nomore' do |cfg|
6
+ cfg.cut_head
7
+ end
8
+
9
+ cmd :all do |cfg|
10
+ cfg.cut_tail
11
+ end
12
+
13
+ cfg :ssh do
14
+ pre_logout 'exit'
15
+ end
16
+ end
@@ -17,9 +17,8 @@ class C4CMTS < Oxidized::Model
17
17
  end
18
18
 
19
19
  cmd 'show environment' do |cfg|
20
- cfg.gsub! /\s+[\-\d]+\s+C\s+[\(\s\d]+\s+\F\)/, '' # remove temperature readings
21
- cfg.each_line.to_a[1..-2].join
22
- comment cfg
20
+ cfg.gsub! /\s+[\-\d]+\s+C\s+[(\s\d]+\s+F\)/, '' # remove temperature readings
21
+ comment cfg.cut_both
23
22
  end
24
23
 
25
24
  cmd 'show version' do |cfg|
@@ -29,8 +28,7 @@ class C4CMTS < Oxidized::Model
29
28
  end
30
29
 
31
30
  cmd 'show running-config' do |cfg|
32
- cfg = cfg.each_line.to_a[1..-2].join
33
- cfg
31
+ cfg.cut_both
34
32
  end
35
33
 
36
34
  cfg :telnet do
@@ -14,7 +14,7 @@ class Casa < Oxidized::Model
14
14
  end
15
15
 
16
16
  cmd :all do |cfg|
17
- cfg.each_line.to_a[1..-2].join
17
+ cfg.cut_both
18
18
  end
19
19
 
20
20
  cmd 'show system' do |cfg|
@@ -3,7 +3,7 @@ class Catos < Oxidized::Model
3
3
  comment '# '
4
4
 
5
5
  cmd :all do |cfg|
6
- cfg.each_line.to_a[1..-2].join
6
+ cfg.cut_both
7
7
  end
8
8
 
9
9
  cmd 'show system' do |cfg|
@@ -4,7 +4,7 @@ class CiscoSMA < Oxidized::Model
4
4
  comment '! '
5
5
 
6
6
  # Select passphrase display option
7
- expect /using loadconfig command\. \[Y\]\>/ do |data, re|
7
+ expect /using loadconfig command\. \[Y\]>/ do |data, re|
8
8
  send "y\n"
9
9
  data.sub re, ''
10
10
  end
@@ -15,7 +15,13 @@ class CiscoSMB < Oxidized::Model
15
15
  cmd :secret do |cfg|
16
16
  cfg.gsub! /^(snmp-server community).*/, '\\1 <configuration removed>'
17
17
  cfg.gsub! /username (\S+) privilege (\d+) (\S+).*/, '<secret hidden>'
18
+ cfg.gsub! /^(username \S+ password encrypted) \S+(.*)/, '\\1 <secret hidden> \\2'
19
+ cfg.gsub! /^(enable password level \d+ encrypted) \S+/, '\\1 <secret hidden>'
18
20
  cfg.gsub! /^(encrypted radius-server key).*/, '\\1 <configuration removed>'
21
+ cfg.gsub! /^(encrypted radius-server host .+ key) \S+(.*)/, '\\1 <secret hidden> \\2'
22
+ cfg.gsub! /^(encrypted tacacs-server key).*/, '\\1 <secret hidden>'
23
+ cfg.gsub! /^(encrypted tacacs-server host .+ key) \S+(.*)/, '\\1 <secret hidden> \\2'
24
+ cfg.gsub! /^(encrypted sntp authentication-key \d+ md5) .*/, '\\1 <secret hidden>'
19
25
  cfg
20
26
  end
21
27
 
@@ -24,7 +30,7 @@ class CiscoSMB < Oxidized::Model
24
30
  end
25
31
 
26
32
  cmd 'show system' do |cfg|
27
- cfg.gsub! /System Up Time.*/, ''
33
+ cfg.gsub! /System Up Time.*\n/, ''
28
34
  comment cfg
29
35
  end
30
36
 
@@ -36,9 +42,9 @@ class CiscoSMB < Oxidized::Model
36
42
  cfg = cfg.each_line.to_a[0..-1].join
37
43
  cfg.gsub! /^Current configuration : [^\n]*\n/, ''
38
44
  cfg.sub! /^(ntp clock-period).*/, '! \1'
39
- cfg.gsub! /^\ tunnel\ mpls\ traffic-eng\ bandwidth[^\n]*\n*(
40
- (?:\ [^\n]*\n*)*
41
- tunnel\ mpls\ traffic-eng\ auto-bw)/mx, '\1'
45
+ cfg.gsub! /^ tunnel mpls traffic-eng bandwidth[^\n]*\n*(
46
+ (?: [^\n]*\n*)*
47
+ tunnel mpls traffic-eng auto-bw)/mx, '\1'
42
48
  cfg
43
49
  end
44
50
 
@@ -0,0 +1,41 @@
1
+ class Comtrol < Oxidized::Model
2
+ # Used in Comtrol Industrial Switches, such as RocketLinx ES8510
3
+
4
+ # Typical prompt "<hostname>#"
5
+ prompt /([#>]\s?)$/
6
+ comment '! '
7
+
8
+ # how to handle pager
9
+ expect /--More--+\s$/ do |data, re|
10
+ send ' '
11
+ data.sub re, ''
12
+ end
13
+
14
+ cmd 'show version' do |cfg|
15
+ comment cfg
16
+ end
17
+
18
+ cmd 'show running-config' do |cfg|
19
+ cfg
20
+ end
21
+
22
+ cfg :telnet do
23
+ username /^User name:/i
24
+ password /^Password:/i
25
+ end
26
+
27
+ cfg :telnet, :ssh do
28
+ if vars :enable
29
+ post_login do
30
+ send "enable\n"
31
+ # Interpret enable: true as meaning we won't be prompted for a password
32
+ unless vars(:enable).is_a? TrueClass
33
+ expect /[pP]assword:\s?$/
34
+ send vars(:enable) + "\n"
35
+ end
36
+ expect /^.+[#]\s?$/
37
+ end
38
+ end
39
+ pre_logout 'exit'
40
+ end
41
+ end
@@ -15,7 +15,7 @@ class Comware < Oxidized::Model
15
15
  # cfg.gsub! /^.*\e\[42D/, '' # example how to handle pager
16
16
  # skip rogue ^M
17
17
  cfg = cfg.gsub /\r/, ''
18
- cfg.each_line.to_a[1..-2].join
18
+ cfg.cut_both
19
19
  end
20
20
 
21
21
  cmd :secret do |cfg|
@@ -8,21 +8,19 @@ class CoriantGroove < Oxidized::Model
8
8
  end
9
9
 
10
10
  cmd 'show inventory' do |cfg|
11
- cfg = cfg.each_line.to_a[0..-2].join
12
- comment cfg
11
+ comment cfg.cut_tail
13
12
  end
14
13
 
15
14
  cmd 'show softwareload' do |cfg|
16
- cfg = cfg.each_line.to_a[0..-2].join
17
- comment cfg
15
+ comment cfg.cut_tail
18
16
  end
19
17
 
20
18
  cmd 'show config | display commands' do |cfg|
21
- cfg.each_line.to_a[1..-1].join
19
+ cfg.cut_head
22
20
  end
23
21
 
24
22
  cfg :ssh do
25
- post_login 'set -f cli-config cli-columns 65535'
23
+ post_login 'set -f cli-config cli-columns 4000'
26
24
  pre_logout 'quit -f'
27
25
  end
28
26
  end
@@ -8,7 +8,7 @@ class Cumulus < Oxidized::Model
8
8
  end
9
9
 
10
10
  cmd :all do |cfg|
11
- cfg.each_line.to_a[1..-2].join
11
+ cfg.cut_both
12
12
  end
13
13
 
14
14
  # show the persistent configuration
@@ -88,6 +88,19 @@ class Cumulus < Oxidized::Model
88
88
  end
89
89
 
90
90
  cfg :telnet, :ssh do
91
+ post_login do
92
+ if vars(:enable) == true
93
+ cmd "sudo su -", /^\[sudo\] password/
94
+ cmd @node.auth[:password]
95
+ elsif vars(:enable)
96
+ cmd "su -", /^Password:/
97
+ cmd vars(:enable)
98
+ end
99
+ end
100
+
101
+ pre_logout do
102
+ cmd "exit" if vars(:enable)
103
+ end
91
104
  pre_logout 'exit'
92
105
  end
93
106
  end
@@ -7,8 +7,7 @@ class DataCom < Oxidized::Model
7
7
  end
8
8
 
9
9
  cmd :all do |cfg|
10
- cfg.each_line.to_a[1..-2].join
11
- cfg.cut_head.cut_tail
10
+ cfg.cut_head.cut_both.cut_tail
12
11
  end
13
12
 
14
13
  cmd 'show firmware' do |cfg|
@@ -8,7 +8,7 @@ class DCNOS < Oxidized::Model
8
8
  comment '! '
9
9
 
10
10
  cmd :all do |cfg|
11
- cfg.each_line.to_a[1..-1].join
11
+ cfg.cut_head
12
12
  end
13
13
 
14
14
  cmd 'show version' do |cfg|
@@ -0,0 +1,76 @@
1
+ class DellX < Oxidized::Model
2
+ # Used in Dell X-Series Switches
3
+
4
+ prompt /[#>]$/
5
+
6
+ comment '! '
7
+
8
+ expect /(^.*)?+[mM]ore\:+.*$/ do |data, re|
9
+ send ' '
10
+ data.sub re, ''
11
+ end
12
+
13
+ cmd :all do |cfg|
14
+ cfg.each_line.to_a[1..-3].join
15
+ end
16
+
17
+ cmd :secret do |cfg|
18
+ cfg.gsub! /^(username \S+ password (?:encrypted )?)\S+(.*)/, '\1<hidden>\2'
19
+ cfg
20
+ end
21
+
22
+ cmd 'show version' do |cfg|
23
+ if @stackable.nil?
24
+ @stackable = true if cfg.match /(U|u)nit\s/
25
+ end
26
+ cfg = cfg.split("\n").reject { |line| line[/Up\sTime/] }
27
+ comment cfg.join("\n") + "\n"
28
+ end
29
+
30
+ cmd 'show system' do |cfg|
31
+ clean cfg
32
+ end
33
+
34
+ cmd 'show running-config' do |cfg|
35
+ cfg.sub(/^(sflow \S+ destination owner \S+ timeout )\d+$/, '! \1<timeout>')
36
+ end
37
+
38
+ cfg :telnet, :ssh do
39
+ username /[uU]ser\s?[nN]ame:$/
40
+ password /[pP]assword:$/
41
+ end
42
+
43
+ cfg :telnet, :ssh do
44
+ if vars :enable
45
+ post_login do
46
+ send "enable\n"
47
+ cmd vars(:enable)
48
+ end
49
+ end
50
+
51
+ pre_logout "logout"
52
+ pre_logout "exit"
53
+ end
54
+
55
+ def clean cfg
56
+ out = []
57
+ skip_blocks = 0
58
+ cfg.each_line do |line|
59
+ # If this is a stackable switch we should skip this block of information
60
+ if line.match /Up\sTime|Temperature|Power Suppl(ies|y)|Fans/i and @stackable == true
61
+ skip_blocks = 1
62
+ # Some switches have another empty line. This is identified by this line having a colon
63
+ skip_blocks = 2 if line.match /:/
64
+ end
65
+ # If we have lines to skip do this until we reach and empty line
66
+ if skip_blocks > 0
67
+ skip_blocks -= 1 if /\S/ !~ line
68
+ next
69
+ end
70
+ out << line.strip
71
+ end
72
+ out = out.reject { |line| line[/Up\sTime/] }
73
+ out = comment out.join "\n"
74
+ out << "\n"
75
+ end
76
+ end