oxidized 0.28.0 → 0.29.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (140) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/publishdocker.yml +8 -1
  3. data/.github/workflows/ruby.yml +42 -0
  4. data/.rubocop.yml +30 -10
  5. data/.rubocop_todo.yml +95 -41
  6. data/CHANGELOG.md +139 -2
  7. data/Dockerfile +13 -9
  8. data/README.md +66 -32
  9. data/Rakefile +2 -0
  10. data/docs/Configuration.md +49 -7
  11. data/docs/Creating-Models.md +10 -4
  12. data/docs/Hooks.md +35 -6
  13. data/docs/Model-Notes/ADVA.md +12 -0
  14. data/docs/Model-Notes/Cumulus.md +7 -1
  15. data/docs/Model-Notes/IOS.md +36 -0
  16. data/docs/Model-Notes/JunOS.md +3 -3
  17. data/docs/Model-Notes/LenovoNOS.md +29 -0
  18. data/docs/Model-Notes/LinksysSRW.md +15 -0
  19. data/docs/Model-Notes/Nokia.md +3 -0
  20. data/docs/Model-Notes/OS10.md +33 -0
  21. data/docs/Model-Notes/PanOS_API.md +28 -0
  22. data/docs/Model-Notes/README.md +2 -0
  23. data/docs/Sources.md +18 -0
  24. data/docs/Supported-OS-Types.md +51 -6
  25. data/docs/Troubleshooting.md +1 -1
  26. data/extra/gitdiff-msteams.sh +91 -0
  27. data/extra/nagios_check_failing_nodes.rb +6 -9
  28. data/extra/oxidized-report-git-commits +71 -14
  29. data/extra/oxidized.init +2 -5
  30. data/extra/oxidized.logrotate +1 -0
  31. data/extra/oxidized.runit +4 -1
  32. data/extra/oxidized.service +5 -8
  33. data/extra/rest_client.rb +1 -1
  34. data/extra/syslog.rb +2 -2
  35. data/lib/oxidized/cli.rb +1 -1
  36. data/lib/oxidized/config/vars.rb +5 -2
  37. data/lib/oxidized/config.rb +6 -3
  38. data/lib/oxidized/core.rb +1 -1
  39. data/lib/oxidized/hook/exec.rb +6 -6
  40. data/lib/oxidized/hook/githubrepo.rb +42 -11
  41. data/lib/oxidized/hook/slackdiff.rb +2 -2
  42. data/lib/oxidized/hook/xmppdiff.rb +45 -25
  43. data/lib/oxidized/hook.rb +4 -8
  44. data/lib/oxidized/input/exec.rb +1 -1
  45. data/lib/oxidized/input/input.rb +1 -0
  46. data/lib/oxidized/input/ssh.rb +23 -20
  47. data/lib/oxidized/input/telnet.rb +52 -44
  48. data/lib/oxidized/job.rb +1 -0
  49. data/lib/oxidized/jobs.rb +11 -6
  50. data/lib/oxidized/manager.rb +1 -0
  51. data/lib/oxidized/model/acmepacket.rb +38 -0
  52. data/lib/oxidized/model/adtran.rb +5 -3
  53. data/lib/oxidized/model/adva.rb +66 -0
  54. data/lib/oxidized/model/airfiber.rb +1 -1
  55. data/lib/oxidized/model/aoscx.rb +96 -0
  56. data/lib/oxidized/model/aosw.rb +1 -1
  57. data/lib/oxidized/model/asa.rb +2 -0
  58. data/lib/oxidized/model/awplus.rb +1 -1
  59. data/lib/oxidized/model/bdcom.rb +49 -0
  60. data/lib/oxidized/model/cambiumepmp.rb +17 -0
  61. data/lib/oxidized/model/casa.rb +4 -1
  62. data/lib/oxidized/model/ciscoce.rb +12 -0
  63. data/lib/oxidized/model/ciscosmb.rb +2 -0
  64. data/lib/oxidized/model/comware.rb +16 -1
  65. data/lib/oxidized/model/cumulus.rb +58 -44
  66. data/lib/oxidized/model/dellx.rb +1 -3
  67. data/lib/oxidized/model/dlink.rb +2 -1
  68. data/lib/oxidized/model/edgecos.rb +22 -2
  69. data/lib/oxidized/model/edgeswitch.rb +4 -4
  70. data/lib/oxidized/model/eltex.rb +48 -0
  71. data/lib/oxidized/model/enterasys.rb +18 -3
  72. data/lib/oxidized/model/enterasys800.rb +29 -0
  73. data/lib/oxidized/model/eos.rb +2 -1
  74. data/lib/oxidized/model/fabricos.rb +1 -1
  75. data/lib/oxidized/model/fastiron.rb +3 -2
  76. data/lib/oxidized/model/fortios.rb +24 -11
  77. data/lib/oxidized/model/fortiwlc.rb +24 -0
  78. data/lib/oxidized/model/gaiaos.rb +40 -3
  79. data/lib/oxidized/model/h3c.rb +40 -0
  80. data/lib/oxidized/model/hatteras.rb +2 -2
  81. data/lib/oxidized/model/hios.rb +38 -0
  82. data/lib/oxidized/model/hpebladesystem.rb +1 -1
  83. data/lib/oxidized/model/ios.rb +13 -10
  84. data/lib/oxidized/model/iosxe.rb +1 -1
  85. data/lib/oxidized/model/ironware.rb +8 -4
  86. data/lib/oxidized/model/junos.rb +5 -1
  87. data/lib/oxidized/model/lancom.rb +23 -0
  88. data/lib/oxidized/model/lenovonos.rb +82 -0
  89. data/lib/oxidized/model/linksyssrw.rb +71 -0
  90. data/lib/oxidized/model/mlnxos.rb +2 -0
  91. data/lib/oxidized/model/model.rb +29 -3
  92. data/lib/oxidized/model/necix.rb +30 -0
  93. data/lib/oxidized/model/netgear.rb +5 -2
  94. data/lib/oxidized/model/netscaler.rb +38 -1
  95. data/lib/oxidized/model/nodegrid.rb +23 -0
  96. data/lib/oxidized/model/nxos.rb +3 -2
  97. data/lib/oxidized/model/openbsd.rb +9 -0
  98. data/lib/oxidized/model/opengear.rb +1 -1
  99. data/lib/oxidized/model/opnsense.rb +12 -4
  100. data/lib/oxidized/model/panos_api.rb +71 -0
  101. data/lib/oxidized/model/pfsense.rb +12 -7
  102. data/lib/oxidized/model/powerconnect.rb +1 -3
  103. data/lib/oxidized/model/procurve.rb +2 -2
  104. data/lib/oxidized/model/purityos.rb +8 -1
  105. data/lib/oxidized/model/quantaos.rb +1 -5
  106. data/lib/oxidized/model/routeros.rb +15 -2
  107. data/lib/oxidized/model/slxos.rb +1 -0
  108. data/lib/oxidized/model/smartcs.rb +40 -0
  109. data/lib/oxidized/model/sonicos.rb +9 -1
  110. data/lib/oxidized/model/srosmd.rb +97 -0
  111. data/lib/oxidized/model/stoneos.rb +6 -2
  112. data/lib/oxidized/model/supermicro.rb +1 -1
  113. data/lib/oxidized/model/swos.rb +9 -0
  114. data/lib/oxidized/model/timos.rb +1 -1
  115. data/lib/oxidized/model/tmos.rb +2 -1
  116. data/lib/oxidized/model/tplink.rb +2 -0
  117. data/lib/oxidized/model/trango.rb +11 -11
  118. data/lib/oxidized/model/truenas.rb +20 -0
  119. data/lib/oxidized/model/vrp.rb +1 -1
  120. data/lib/oxidized/model/xos.rb +4 -3
  121. data/lib/oxidized/model/yamaha.rb +57 -0
  122. data/lib/oxidized/model/zteolt.rb +52 -0
  123. data/lib/oxidized/model/zy1308.rb +11 -0
  124. data/lib/oxidized/node/stats.rb +1 -0
  125. data/lib/oxidized/node.rb +16 -11
  126. data/lib/oxidized/nodes.rb +7 -6
  127. data/lib/oxidized/output/file.rb +2 -1
  128. data/lib/oxidized/output/git.rb +4 -3
  129. data/lib/oxidized/output/gitcrypt.rb +5 -8
  130. data/lib/oxidized/output/http.rb +2 -0
  131. data/lib/oxidized/source/csv.rb +1 -0
  132. data/lib/oxidized/source/http.rb +4 -0
  133. data/lib/oxidized/source/source.rb +7 -2
  134. data/lib/oxidized/source/sql.rb +15 -5
  135. data/lib/oxidized/string.rb +9 -3
  136. data/lib/oxidized/version.rb +2 -2
  137. data/lib/oxidized/worker.rb +5 -5
  138. data/oxidized.gemspec +22 -16
  139. metadata +116 -29
  140. data/.travis.yml +0 -10
@@ -14,12 +14,49 @@ class NetScaler < Oxidized::Model
14
14
  comment cfg
15
15
  end
16
16
 
17
+ cmd 'show partition' do |cfg|
18
+ comment cfg
19
+ end
20
+
17
21
  cmd :secret do |cfg|
18
22
  cfg.gsub! /\w+\s(-encrypted)/, '<secret hidden> \\1'
19
23
  cfg
20
24
  end
21
25
 
22
- cmd 'show ns ns.conf'
26
+ # check for multiple partitions
27
+ cmd 'show partition' do |cfg|
28
+ @is_multiple_partition = cfg.include? 'Name:'
29
+ end
30
+
31
+ post do
32
+ if @is_multiple_partition
33
+ multiple_partition
34
+ else
35
+ single_partition
36
+ end
37
+ end
38
+
39
+ def single_partition
40
+ # Single partition mode
41
+ cmd 'show ns ns.conf' do |cfg|
42
+ cfg
43
+ end
44
+ end
45
+
46
+ def multiple_partition
47
+ # Multiple partition mode
48
+ cmd 'show partition' do |cfg|
49
+ allcfg = ""
50
+ partitions = [["default"]] + cfg.scan(/Name: (\S+)$/)
51
+ partitions.each do |part|
52
+ allcfg = allcfg + "\n\n####################### [ partition " + part.join(" ") + " ] #######################\n\n"
53
+ cmd "switch ns partition " + part.join(" ") + "; show ns ns.conf; switch ns partition default" do |cfgpartition|
54
+ allcfg += cfgpartition
55
+ end
56
+ end
57
+ allcfg
58
+ end
59
+ end
23
60
 
24
61
  cfg :ssh do
25
62
  pre_logout 'exit'
@@ -0,0 +1,23 @@
1
+ class Nodegrid < Oxidized::Model
2
+ # ZPE Nodegrid (Tested with Nodegrid Gate/Bold/NSR)
3
+ # https://www.zpesystems.com/products/
4
+
5
+ prompt(%r{(?<!@)\[(.*?\s/)\]#})
6
+ comment '# '
7
+
8
+ cmd 'show system/about/' do |cfg|
9
+ comment cfg # Show System, Model, Software Version
10
+ end
11
+
12
+ cmd 'show settings/license/' do |cfg|
13
+ comment cfg # Show License information
14
+ end
15
+
16
+ cmd 'export_settings settings/ --plain-password' do |cfg|
17
+ cfg # Print all system config including keys to be importable via import_settings function
18
+ end
19
+
20
+ cfg :ssh do
21
+ pre_logout 'exit'
22
+ end
23
+ end
@@ -10,15 +10,16 @@ class NXOS < Oxidized::Model
10
10
  cmd :secret do |cfg|
11
11
  cfg.gsub! /^(snmp-server community).*/, '\\1 <configuration removed>'
12
12
  cfg.gsub! /^(snmp-server user (\S+) (\S+) auth (\S+)) (\S+) (priv) (\S+)/, '\\1 <configuration removed> '
13
- cfg.gsub! /^(username \S+ password \d) (\S+)/, '\\1 <secret hidden>'
13
+ cfg.gsub! /(password \d+) (\S+)/, '\\1 <secret hidden>'
14
14
  cfg.gsub! /^(radius-server key).*/, '\\1 <secret hidden>'
15
+ cfg.gsub! /^(tacacs-server host .+ key(?: \d+)?) \S+/, '\\1 <secret hidden>'
15
16
  cfg
16
17
  end
17
18
 
18
19
  cmd 'show version' do |cfg|
19
20
  cfg = filter cfg
20
21
  cfg = cfg.each_line.take_while { |line| not line.match(/uptime/i) }
21
- comment cfg.join ""
22
+ comment cfg.join
22
23
  end
23
24
 
24
25
  cmd 'show inventory' do |cfg|
@@ -48,6 +48,15 @@ class Openbsd < Oxidized::Model
48
48
  cfg += add_comment('PASSWD FILE')
49
49
  cfg += cmd('cat /etc/passwd')
50
50
 
51
+ cfg += add_comment('BGPD FILE')
52
+ cfg += cmd('cat /etc/bgpd.conf')
53
+
54
+ cfg += add_comment('OSPFD FILE')
55
+ cfg += cmd('cat /etc/ospfd.conf')
56
+
57
+ cfg += add_comment('OSPF6D FILE')
58
+ cfg += cmd('cat /etc/ospf6d.conf')
59
+
51
60
  cfg += add_small_comment('END')
52
61
  cfg
53
62
  end
@@ -11,7 +11,7 @@ class OpenGear < Oxidized::Model
11
11
 
12
12
  cmd('cat /etc/version') { |cfg| comment cfg }
13
13
 
14
- cmd 'config -g config'
14
+ cmd('config -g config') { |cfg| cfg }
15
15
 
16
16
  cfg :ssh do
17
17
  exec true # don't run shell, run each command in exec channel
@@ -2,16 +2,24 @@ class OpnSense < Oxidized::Model
2
2
  # minimum required permissions: "System: Shell account access"
3
3
  # must enable SSH and password-based SSH access
4
4
 
5
- cmd :all do |cfg|
6
- cfg.cut_head
7
- end
8
-
9
5
  cmd 'cat /conf/config.xml' do |cfg|
10
6
  cfg.gsub! /\s<revision>\s*<time>\d*<\/time>\s*.*\s*.*\s*<\/revision>/, ''
11
7
  cfg.gsub! /\s<last_rule_upd_time>\d*<\/last_rule_upd_time>/, ''
12
8
  cfg
13
9
  end
14
10
 
11
+ # The comment output has to be at the end since and XML file may not start
12
+ # with a comment.
13
+
14
+ # This gets the version using the opnsense-version command, or from the
15
+ # /usr/local/opnsense/version/opnsense file for earlier versions of OPNsense
16
+ # that lack the opnsense-version command. Newer versions of OPNsense no longer
17
+ # store the version information in this file, so both versions have to be
18
+ # supported here for now.
19
+ cmd 'opnsense-version 2>/dev/null || echo "OPNsense "`cat /usr/local/opnsense/version/opnsense`' do |version|
20
+ xmlcomment version
21
+ end
22
+
15
23
  cfg :ssh do
16
24
  exec true
17
25
  pre_logout 'exit'
@@ -0,0 +1,71 @@
1
+ # PanOS API-based model for Oxidized
2
+ #
3
+ # The API-based model produced an XML configuration file that can actually be
4
+ # restored as a configuration backup. Make sure to use the "http" input for
5
+ # this module.
6
+
7
+ begin
8
+ # Nokogiri is required because the PanOS API, as well as the
9
+ # configuration file format uses XML. It is required to parse API
10
+ # responses, as well as to pretty-print the configuration XML file
11
+ # when saving it.
12
+ require 'nokogiri'
13
+ rescue LoadError
14
+ # Oxidized itself depends on mechanize, which in turn depends on
15
+ # nokogiri, so this should never happen.
16
+ raise Oxidized::OxidizedError, 'nokogiri not found: sudo gem install nokogiri'
17
+ end
18
+
19
+ class PanOS_API < Oxidized::Model # rubocop:disable Naming/ClassAndModuleCamelCase
20
+ # Callback function for getting the configuration file.
21
+ cfg_cb = lambda do
22
+ url_param = URI.encode_www_form(
23
+ user: @node.auth[:username],
24
+ password: @node.auth[:password],
25
+ type: 'keygen'
26
+ )
27
+
28
+ kg_r = get_http "/api?#{url_param}"
29
+
30
+ # Parse the XML API response for the keygen request.
31
+ kg_x = Nokogiri::XML(kg_r)
32
+
33
+ # Check if keygen was successful. If not we'll throw an error.
34
+ status = kg_x.xpath('//response/@status').first
35
+ if status.to_s != 'success'
36
+ msg = kg_x.xpath('//response/result/msg').text
37
+ raise Oxidized::OxidizedError, "Could not generate PanOS API key: #{msg}"
38
+ end
39
+
40
+ # If we reach here, keygen was successful, so get the API key
41
+ # out of the keygen XML response.
42
+ apikey = kg_x.xpath('//response/result/key').text.to_s
43
+
44
+ # Now that we have the API key, we can request a configuration
45
+ # export.
46
+ url_param = URI.encode_www_form(
47
+ key: apikey,
48
+ category: 'configuration',
49
+ type: 'export'
50
+ )
51
+
52
+ cfg = get_http "/api?#{url_param}"
53
+
54
+ # The configuration export is in XML format. Unfortunately,
55
+ # it's just one long line of XML that's not especially human
56
+ # readable or diffable.
57
+ #
58
+ # Thus, we will load the XML document and then emit it again
59
+ # with indentation set up, so that it's still a valid
60
+ # configuration, and also possible to read.
61
+ Nokogiri::XML(cfg).to_xml(indent: 2)
62
+ end
63
+
64
+ # Define the command based on the callback above.
65
+ cmd cfg_cb
66
+
67
+ cfg :http do
68
+ # Palo Alto's API always requires HTTPS as far as I know.
69
+ @secure = true
70
+ end
71
+ end
@@ -1,23 +1,28 @@
1
1
  class PfSense < Oxidized::Model
2
2
  # use other use than 'admin' user, 'admin' user cannot get ssh/exec. See issue #535
3
3
 
4
- cmd :all do |cfg|
5
- cfg.cut_head
6
- end
7
-
8
4
  cmd :secret do |cfg|
9
- cfg.gsub! /(\s+<bcrypt-hash>)[^<]+(<\/bcrypt-hash>)/, '\\1<secret hidden>\\2'
10
- cfg.gsub! /(\s+<password>)[^<]+(<\/password>)/, '\\1<secret hidden>\\2'
11
- cfg.gsub! /(\s+<lighttpd_ls_password>)[^<]+(<\/lighttpd_ls_password>)/, '\\1<secret hidden>\\2'
5
+ cfg.gsub! /(\s+<bcrypt-hash>).+?(<\/bcrypt-hash>)/, '\\1[secret hidden]\\2'
6
+ cfg.gsub! /(\s+<password>).+?(<\/password>)/, '\\1[secret hidden]\\2'
7
+ cfg.gsub! /(\s+<lighttpd_ls_password>).+?(<\/lighttpd_ls_password>)/, '\\1[secret hidden]\\2'
12
8
  cfg
13
9
  end
14
10
 
15
11
  cmd 'cat /cf/conf/config.xml' do |cfg|
12
+ raise "<pfsense> missing in config file!" unless cfg.include? "<pfsense>"
13
+
16
14
  cfg.gsub! /\s<revision>\s*<time>\d*<\/time>\s*.*\s*.*\s*<\/revision>/, ''
17
15
  cfg.gsub! /\s<last_rule_upd_time>\d*<\/last_rule_upd_time>/, ''
18
16
  cfg
19
17
  end
20
18
 
19
+ # The comment output has to be at the end since and XML file may not start
20
+ # with a comment.
21
+
22
+ cmd 'cat /etc/version' do |version|
23
+ xmlcomment "PFsense #{version}"
24
+ end
25
+
21
26
  cfg :ssh do
22
27
  exec true
23
28
  pre_logout 'exit'
@@ -19,9 +19,7 @@ class PowerConnect < Oxidized::Model
19
19
  end
20
20
 
21
21
  cmd 'show version' do |cfg|
22
- if @stackable.nil?
23
- @stackable = true if cfg =~ /(U|u)nit\s/
24
- end
22
+ @stackable = true if @stackable.nil? && (cfg =~ /(U|u)nit\s/)
25
23
  cfg = cfg.split("\n").reject { |line| line[/Up\sTime/] }
26
24
  comment cfg.join("\n") + "\n"
27
25
  end
@@ -1,9 +1,9 @@
1
1
  class Procurve < Oxidized::Model
2
2
  # previous command is repeated followed by "\eE", which sometimes ends up on last line
3
3
  # ssh switches prompt may start with \r, followed by the prompt itself, regex ([\w\s.-]+[#>] ), which ends the line
4
- # telnet switchs may start with various vt100 control characters, regex (\e\[24;[0-9][hH]), follwed by the prompt, followed
4
+ # telnet switches may start with various vt100 control characters, regex (\e\[24;[0-9][hH]), followed by the prompt, followed
5
5
  # by at least 3 other vt100 characters
6
- prompt /(^\r|\e\[24;[0-9][hH])?([\w\s.-]+[#>] )($|(\e\[24;[0-9][0-9]?[hH]){3})/
6
+ prompt /(^\r|\e\[24;[0-9][hH])?([\w\s.-]+(\((config|vlan-[0-9]{1,4}|y\/n)\)|\(o\)nce)?[#>:?\]] {1,2})($|(\e\[24;[0-9][0-9]?[hH]){3})/
7
7
 
8
8
  comment '! '
9
9
 
@@ -4,9 +4,16 @@ class PurityOS < Oxidized::Model
4
4
  prompt /\w+@\S+(\s+\S+)*\s?>\s?$/
5
5
  comment '# '
6
6
 
7
- cmd 'pureconfig list'
7
+ cmd 'pureconfig list' do |cfg|
8
+ cfg.gsub! /^purealert flag \d+$/, ''
9
+ cfg.gsub! /(.*VEEAM-StorageLUNSnap-[0-9a-f].*)/, ''
10
+ cfg.gsub! /(.*VEEAM-ExportLUNSnap-[0-9A-F].*)/, ''
11
+ # remove empty lines
12
+ cfg.each_line.reject { |line| line.match /^[\r\n\s\u0000#]+$/ }.join
13
+ end
8
14
 
9
15
  cfg :ssh do
16
+ pty_options(term: "dumb")
10
17
  pre_logout 'exit'
11
18
  end
12
19
  end
@@ -18,11 +18,7 @@ class QuantaOS < Oxidized::Model
18
18
  cfg :telnet, :ssh do
19
19
  post_login do
20
20
  send "enable\n"
21
- if vars :enable
22
- cmd vars(:enable)
23
- else
24
- cmd ""
25
- end
21
+ cmd vars(:enable) || ""
26
22
  end
27
23
  post_login 'terminal length 0'
28
24
  pre_logout do
@@ -13,11 +13,14 @@ class RouterOS < Oxidized::Model
13
13
  end
14
14
 
15
15
  cmd '/system routerboard print without-paging' do |cfg|
16
+ cfg = cfg.each_line.grep(/(model|firmware-type|current-firmware|serial-number):/).join
16
17
  comment cfg
17
18
  end
18
19
 
19
20
  cmd '/system package update print without-paging' do |cfg|
20
- comment cfg
21
+ version_line = cfg.each_line.grep(/installed-version: /)[0]
22
+ @ros_version = /: ([0-9])/.match(version_line)[1].to_i
23
+ comment version_line
21
24
  end
22
25
 
23
26
  cmd '/system history print without-paging' do |cfg|
@@ -25,11 +28,21 @@ class RouterOS < Oxidized::Model
25
28
  end
26
29
 
27
30
  post do
28
- run_cmd = vars(:remove_secret) ? '/export hide-sensitive' : '/export'
31
+ Oxidized.logger.debug "lib/oxidized/model/routeros.rb: running /export for routeros version #{@ros_version}"
32
+ run_cmd = if vars(:remove_secret)
33
+ '/export hide-sensitive'
34
+ elsif (not @ros_version.nil?) && (@ros_version >= 7)
35
+ '/export show-sensitive'
36
+ else
37
+ '/export'
38
+ end
29
39
  cmd run_cmd do |cfg|
30
40
  cfg.gsub! /\\\r?\n\s+/, '' # strip new line
31
41
  cfg.gsub! /# inactive time\r\n/, '' # Remove time based system comment
32
42
  cfg.gsub! /# received packet from \S+ bad format\r\n/, '' # Remove intermittent VRRP/CARP collision comment
43
+ cfg.gsub! /# poe-out status: short_circuit\r\n/, '' # Remove intermittent POE short_circuit comment
44
+ cfg.gsub! /# Firmware upgraded successfully, please reboot for changes to take effect!\r\n/, '' # Remove transient firmware upgrade comment
45
+ cfg.gsub! /# \S+ not ready\r\n/, '' # Remove intermittent $interface not ready comment
33
46
  cfg = cfg.split("\n").reject { |line| line[/^#\s\w{3}\/\d{2}\/\d{4}.*$/] }
34
47
  cfg.join("\n") + "\n"
35
48
  end
@@ -12,6 +12,7 @@ class SLXOS < Oxidized::Model
12
12
  cmd 'show chassis' do |cfg|
13
13
  cfg.encode!("UTF-8", invalid: :replace, undef: :replace) # sometimes ironware returns broken encoding
14
14
  cfg.gsub! /.*Power Usage.*/, '' # remove unwanted lines power usage
15
+ cfg.gsub! /^Update\:.*$/, '' # remove unwanted current date
15
16
  cfg.gsub! /Time A(live|wake).*/, '' # remove unwanted lines time alive/awake
16
17
  cfg.gsub! /([\[]*)1([\]]*)<->([\[]*)2([\]]*)(<->([\[]*)3([\]]*))*/, ''
17
18
 
@@ -0,0 +1,40 @@
1
+ class SmartCS < Oxidized::Model
2
+ prompt /^\r?([\w.@() -]+[#>]\s?)$/
3
+ comment '# '
4
+
5
+ expect /-more <Press SPACE for another page, 'q' to quit>-/ do |data, re|
6
+ send ' '
7
+ data.sub re, ''
8
+ end
9
+
10
+ cmd :all do |cfg|
11
+ cfg
12
+ end
13
+
14
+ cmd 'show version' do |cfg|
15
+ comment cfg.insert(0, "--------------------------------------------------------------------------------! \n")
16
+ # Unhash below to write a comment in the config file.
17
+ cfg.insert(0, "Starting: show version cmd \n")
18
+ cfg << "\n \nEnding: show version cmd"
19
+ comment cfg << "\n--------------------------------------------------------------------------------! \n \n"
20
+ comment cfg
21
+ end
22
+
23
+ cmd 'show config' do |cfg|
24
+ # remove "Press SPACE for another page" add SPACE(\s)
25
+ cfg.gsub! /\s{5,}/, ""
26
+ end
27
+
28
+ cfg :telnet, :ssh do
29
+ # preferred way to handle additional passwords
30
+ post_login do
31
+ pw = vars(:enable)
32
+ pw ||= ""
33
+ send "su\r"
34
+ expect /[pP]assword:\s?$/
35
+ cmd pw
36
+ end
37
+ pre_logout 'exit'
38
+ pre_logout 'exit'
39
+ end
40
+ end
@@ -17,6 +17,12 @@ class SonicOS < Oxidized::Model
17
17
  cfg.gsub! /bind-password \d\,(\S+)/, 'bind-password <secret hidden> \2'
18
18
  cfg.gsub! /authentication sha1 \d\,(\S+)/, 'authentication sha1 <secret hidden> \2'
19
19
  cfg.gsub! /encryption aes \d\,(\S+)/, 'encryption aes <secret hidden> \2'
20
+ cfg.gsub! /smtp-pass \d\,(\S+)/, 'smtp-pass <secret hidden> \2'
21
+ cfg.gsub! /pop-pass \d\,(\S+)/, 'pop-pass <secret hidden> \2'
22
+ cfg.gsub! /sslvpn password \d\,(\S+)/, 'sslvpn password <secret hidden> \2'
23
+ cfg.gsub! /administrator password \d\,(\S+)/, 'administrator password <secret hidden> \2'
24
+ cfg.gsub! /ftp password \d\,(\S+)/, 'ftp password <secret hidden> \2'
25
+ cfg.gsub! /shared-key \d\,(\S+)/, 'shared-key <secret hidden> \2'
20
26
  cfg
21
27
  end
22
28
 
@@ -38,8 +44,10 @@ class SonicOS < Oxidized::Model
38
44
  def clean(cfg)
39
45
  out = []
40
46
  cfg.each_line do |line|
47
+ next if line =~ /date \d{4}\:\d{2}\:\d{2}/
48
+ next if line =~ /time \d{2}\:\d{2}:\d{2}/
41
49
  next if line =~ /system-time \"\d{2}\/\d{2}\/\d{4} \d{2}\:\d{2}:\d{2}.\d+\"/
42
- next if line =~ /system-uptime "(\s+up\s+\d+\s+)|(.*Days.*)"/
50
+ next if line =~ /system-uptime "((\s+up\s+\d+\s+)|(\d+\s\w+(,\s)?)*)"/
43
51
  next if line =~ /checksum \d+/
44
52
 
45
53
  line = line[1..-1] if line[0] == "\r"
@@ -0,0 +1,97 @@
1
+ class SROSMD < Oxidized::Model
2
+ #
3
+ # Nokia SR OS (TiMOS) (formerly TiMetra, Alcatel, Alcatel-Lucent)
4
+ # Working in Model-Driven CLI mode.
5
+ # Used in 7705 SAR, 7210 SAS, 7450 ESS, 7750 SR, 7950 XRS, and NSP.
6
+ #
7
+
8
+ comment '# '
9
+
10
+ prompt /^([-\w.@:>*]+\s?[#>]\s?)$/
11
+
12
+ cmd :all do |cfg, cmdstring|
13
+ new_cfg = comment "COMMAND: #{cmdstring}\n"
14
+ cfg.gsub! /# Finished .*/, ''
15
+ cfg.gsub! /# Generated .*/, ''
16
+ cfg.delete! "\r"
17
+ new_cfg << cfg.cut_both
18
+ end
19
+
20
+ #
21
+ # Show the system information.
22
+ #
23
+ cmd 'show system information' do |cfg|
24
+ #
25
+ # Strip uptime.
26
+ #
27
+ cfg.sub! /^System Up Time.*\n/, ''
28
+ comment cfg
29
+ end
30
+
31
+ #
32
+ # Show the card state.
33
+ #
34
+ cmd 'show card state' do |cfg|
35
+ comment cfg
36
+ end
37
+
38
+ #
39
+ # Show the chassis information.
40
+ #
41
+ cmd 'show chassis' do |cfg|
42
+ comment cfg.lines.to_a[0..25].reject { |line| line.match /state|Time|Temperature|Status/ }.join
43
+ end
44
+
45
+ #
46
+ # Show the boot log.
47
+ #
48
+ cmd 'file show bootlog.txt' do |cfg|
49
+ cfg.gsub! /[\b][\b][\b]/, "\n"
50
+ comment cfg
51
+ end
52
+
53
+ #
54
+ # Show the running debug configuration.
55
+ #
56
+ cmd 'admin show configuration debug full-context' do |cfg|
57
+ comment cfg
58
+ end
59
+
60
+ #
61
+ # Show the saved debug configuration (admin debug-save).
62
+ #
63
+ cmd 'file show config.dbg' do |cfg|
64
+ comment cfg
65
+ end
66
+
67
+ #
68
+ # Show the running persistent indices.
69
+ #
70
+ cmd 'admin show configuration configure | match persistent-indices post-lines 10000' do |cfg|
71
+ comment cfg
72
+ end
73
+
74
+ #
75
+ # Show the boot options file.
76
+ #
77
+ cmd 'admin show configuration bof full-context' do |cfg|
78
+ cfg
79
+ end
80
+
81
+ #
82
+ # Show the running configuration.
83
+ #
84
+ cmd 'admin show configuration configure full-context' do |cfg|
85
+ cfg
86
+ end
87
+
88
+ cfg :telnet do
89
+ username /^Login: /
90
+ password /^Password: /
91
+ end
92
+
93
+ cfg :telnet, :ssh do
94
+ post_login 'environment more false'
95
+ pre_logout 'logout'
96
+ end
97
+ end
@@ -1,7 +1,7 @@
1
1
  class StoneOS < Oxidized::Model
2
2
  # Hillstone Networks StoneOS software
3
3
 
4
- prompt /^\r?[\w.()-]+[#>](\s)?$/
4
+ prompt /^\r?[\w.()-]+~?[#>](\s)?$/
5
5
  comment '# '
6
6
 
7
7
  expect /^\s.*--More--.*$/ do |data, re|
@@ -10,12 +10,16 @@ class StoneOS < Oxidized::Model
10
10
  end
11
11
 
12
12
  cmd :all do |cfg|
13
+ cfg.gsub! /+.*+/, '' # Linebreak handling
13
14
  cfg.cut_both
14
15
  end
15
16
 
16
- cmd 'show configuration running'
17
+ cmd 'show configuration running' do |cfg|
18
+ cfg.gsub! /^Building configuration.*$/, ''
19
+ end
17
20
 
18
21
  cmd 'show version' do |cfg|
22
+ cfg.gsub! /^Uptime is .*$/, ''
19
23
  comment cfg
20
24
  end
21
25
 
@@ -1,7 +1,7 @@
1
1
  # Backward compatibility shim for deprecated model `supermicro`.
2
2
  # Migrate your source from `supermicro` to `edgecos`.
3
3
 
4
- require_relative 'edgecos.rb'
4
+ require_relative 'edgecos'
5
5
 
6
6
  Supermicro = EdgeCOS
7
7
 
@@ -0,0 +1,9 @@
1
+ # Mikrotik SwOS (Lite)
2
+ class SwOS < Oxidized::Model
3
+ cmd '/backup.swb'
4
+ cfg :http do
5
+ @username = @node.auth[:username]
6
+ @password = @node.auth[:password]
7
+ @secure = false
8
+ end
9
+ end
@@ -1,7 +1,7 @@
1
1
  # Backward compatibility shim for deprecated model `timos`.
2
2
  # Migrate your source from `timos` to `sros`.
3
3
 
4
- require_relative 'sros.rb'
4
+ require_relative 'sros'
5
5
 
6
6
  TiMOS = SROS
7
7
 
@@ -18,6 +18,7 @@ class TMOS < Oxidized::Model
18
18
  cmd 'tmsh -q show sys hardware field-fmt' do |cfg|
19
19
  cfg.gsub!(/fan-speed (\S+)/, '')
20
20
  cfg.gsub!(/temperature (\S+)/, '')
21
+ cfg.gsub!(/humidity (\S+)/, '')
21
22
  comment cfg
22
23
  end
23
24
 
@@ -47,7 +48,7 @@ class TMOS < Oxidized::Model
47
48
 
48
49
  cmd('[ -d "/config/zebos" ] && cat /config/zebos/*/ZebOS.conf') { |cfg| comment cfg }
49
50
 
50
- cmd('cat /config/partitions/*/bigip.conf') { |cfg| comment cfg }
51
+ cmd('cat /config/partitions/*/bigip*.conf') { |cfg| comment cfg }
51
52
 
52
53
  cfg :ssh do
53
54
  exec true # don't run shell, run each command in exec channel
@@ -35,6 +35,8 @@ class TPLink < Oxidized::Model
35
35
  end
36
36
 
37
37
  cmd 'show system-info' do |cfg|
38
+ cfg.gsub! /(System Time\s+-).*/, '\\1 <stripped>'
39
+ cfg.gsub! /(Running Time\s+-).*/, '\\1 <stripped>'
38
40
  comment cfg.each_line.to_a[3..-3].join
39
41
  end
40
42
 
@@ -9,16 +9,16 @@ class Trango < Oxidized::Model
9
9
  comments = []
10
10
  cfg.each_line do |line|
11
11
  if line =~ /\[Opmode\] (off|on) \[Default Opmode\] (off|on)/
12
- out << "opmode " + Regexp.last_match[1]
13
- out << "defaultopmode " + Regexp.last_match[2]
12
+ out << ("opmode " + Regexp.last_match[1])
13
+ out << ("defaultopmode " + Regexp.last_match[2])
14
14
  end
15
- out << "power " + Regexp.last_match[1] if line =~ /\[Tx Power\] ([\-\d]+) dBm/
16
- out << "freq " + Regexp.last_match[1] + ' ' + Regexp.last_match[2] if line =~ /\[Active Channel\] (\d+) (v|h)/
17
- out << "peerid " + Regexp.last_match[1] if line =~ /\[Peer ID\] ([A-F0-9]+)/
18
- out << "utype " + Regexp.last_match[1] if line =~ /\[Unit Type\] (\S+)/
19
- comments << '# ' + Regexp.last_match[1] + ': ' + Regexp.last_match[2] if line =~ /\[(Hardware Version|Firmware Version|Model|S\/N)\] (\S+)/
20
- out << "remarks " + Regexp.last_match[1] if line =~ /\[Remarks\] (\S+)/
21
- out << "rssiled " + Regexp.last_match[1] if line =~ /\[RSSI LED\] (on|off)/
15
+ out << ("power " + Regexp.last_match[1]) if line =~ /\[Tx Power\] ([\-\d]+) dBm/
16
+ out << ("freq " + Regexp.last_match[1] + ' ' + Regexp.last_match[2]) if line =~ /\[Active Channel\] (\d+) (v|h)/
17
+ out << ("peerid " + Regexp.last_match[1]) if line =~ /\[Peer ID\] ([A-F0-9]+)/
18
+ out << ("utype " + Regexp.last_match[1]) if line =~ /\[Unit Type\] (\S+)/
19
+ comments << ('# ' + Regexp.last_match[1] + ': ' + Regexp.last_match[2]) if line =~ /\[(Hardware Version|Firmware Version|Model|S\/N)\] (\S+)/
20
+ out << ("remarks " + Regexp.last_match[1]) if line =~ /\[Remarks\] (\S+)/
21
+ out << ("rssiled " + Regexp.last_match[1]) if line =~ /\[RSSI LED\] (on|off)/
22
22
  speed = Regexp.last_match[1] if line =~ /\[Speed\] (\d+) Mbps/
23
23
  out << "mir ".concat(Regexp.last_match[1]) if line =~ /\[Tx MIR\] (\d+) Kbps/
24
24
  if line =~ /\[Auto Rate Shift\] (on|off)/
@@ -27,9 +27,9 @@ class Trango < Oxidized::Model
27
27
  end
28
28
  next unless line =~ /\[IP\] (\S+) \[Subnet Mask\] (\S+) \[Gateway\] (\S+)/
29
29
 
30
- out << "ipconfig " + Regexp.last_match[1] + ' ' +
30
+ out << ("ipconfig " + Regexp.last_match[1] + ' ' +
31
31
  Regexp.last_match[2] + ' ' +
32
- Regexp.last_match[3]
32
+ Regexp.last_match[3])
33
33
  end
34
34
  comments.push(*out).join "\n"
35
35
  end