oxidized 0.20.0 → 0.28.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (222) hide show
  1. checksums.yaml +5 -5
  2. data/.codeclimate.yml +4 -0
  3. data/.github/PULL_REQUEST_TEMPLATE.md +12 -0
  4. data/.github/no-response.yml +13 -0
  5. data/.github/workflows/publishdocker.yml +13 -0
  6. data/.gitignore +4 -0
  7. data/.rubocop.yml +73 -0
  8. data/.rubocop_todo.yml +120 -0
  9. data/.travis.yml +6 -1
  10. data/CHANGELOG.md +693 -243
  11. data/Dockerfile +27 -19
  12. data/LICENSE +201 -0
  13. data/README.md +234 -913
  14. data/Rakefile +48 -7
  15. data/TODO.md +29 -23
  16. data/bin/console +1 -1
  17. data/bin/oxidized +6 -5
  18. data/docs/Configuration.md +313 -0
  19. data/docs/Creating-Models.md +140 -0
  20. data/docs/Hooks.md +274 -0
  21. data/docs/Model-Notes/AireOS.md +11 -0
  22. data/docs/Model-Notes/ArbOS.md +11 -0
  23. data/docs/Model-Notes/Comware.md +13 -0
  24. data/docs/Model-Notes/Cumulus.md +40 -0
  25. data/docs/Model-Notes/EOS.md +12 -0
  26. data/docs/Model-Notes/IOS.md +29 -0
  27. data/docs/Model-Notes/JunOS.md +33 -0
  28. data/docs/Model-Notes/LinuxGeneric.md +24 -0
  29. data/docs/Model-Notes/Netgear.md +87 -0
  30. data/docs/Model-Notes/Nokia.md +9 -0
  31. data/docs/Model-Notes/README.md +24 -0
  32. data/docs/Model-Notes/SmartAX-Huawei.md +35 -0
  33. data/docs/Model-Notes/VRP-Huawei.md +34 -0
  34. data/docs/Model-Notes/Viptela.md +12 -0
  35. data/docs/Model-Notes/XGS4600-Zyxel.md +36 -0
  36. data/docs/Outputs.md +190 -0
  37. data/docs/Ruby-API.md +199 -0
  38. data/docs/Sources.md +171 -0
  39. data/docs/Supported-OS-Types.md +227 -0
  40. data/docs/Troubleshooting.md +66 -0
  41. data/extra/nagios_check_failing_nodes.rb +9 -2
  42. data/extra/oxidized-report-git-commits +21 -40
  43. data/extra/oxidized-ubuntu.haproxy +45 -0
  44. data/extra/oxidized.logrotate +7 -0
  45. data/extra/oxidized.service +13 -0
  46. data/extra/rest_client.rb +7 -10
  47. data/extra/syslog.rb +47 -42
  48. data/lib/oxidized/cli.rb +41 -31
  49. data/lib/oxidized/config/vars.rb +9 -14
  50. data/lib/oxidized/config.rb +20 -13
  51. data/lib/oxidized/core.rb +8 -10
  52. data/lib/oxidized/hook/awssns.rb +6 -7
  53. data/lib/oxidized/hook/ciscosparkdiff.rb +43 -0
  54. data/lib/oxidized/hook/exec.rb +19 -24
  55. data/lib/oxidized/hook/githubrepo.rb +17 -17
  56. data/lib/oxidized/hook/noophook.rb +1 -1
  57. data/lib/oxidized/hook/slackdiff.rb +32 -19
  58. data/lib/oxidized/hook/xmppdiff.rb +59 -0
  59. data/lib/oxidized/hook.rb +63 -64
  60. data/lib/oxidized/input/cli.rb +22 -12
  61. data/lib/oxidized/input/exec.rb +28 -0
  62. data/lib/oxidized/input/ftp.rb +16 -15
  63. data/lib/oxidized/input/http.rb +72 -0
  64. data/lib/oxidized/input/input.rb +6 -6
  65. data/lib/oxidized/input/ssh.rb +64 -56
  66. data/lib/oxidized/input/telnet.rb +59 -102
  67. data/lib/oxidized/input/tftp.rb +9 -10
  68. data/lib/oxidized/jobs.rb +9 -10
  69. data/lib/oxidized/manager.rb +42 -44
  70. data/lib/oxidized/model/acos.rb +19 -20
  71. data/lib/oxidized/model/acsw.rb +62 -0
  72. data/lib/oxidized/model/adtran.rb +26 -0
  73. data/lib/oxidized/model/aen.rb +19 -0
  74. data/lib/oxidized/model/aireos.rb +9 -10
  75. data/lib/oxidized/model/airfiber.rb +22 -0
  76. data/lib/oxidized/model/alteonos.rb +58 -0
  77. data/lib/oxidized/model/alvarion.rb +0 -4
  78. data/lib/oxidized/model/aos.rb +11 -5
  79. data/lib/oxidized/model/aos7.rb +6 -7
  80. data/lib/oxidized/model/aosw.rb +30 -27
  81. data/lib/oxidized/model/apc_aos.rb +2 -5
  82. data/lib/oxidized/model/arbos.rb +26 -0
  83. data/lib/oxidized/model/aricentiss.rb +49 -0
  84. data/lib/oxidized/model/asa.rb +61 -22
  85. data/lib/oxidized/model/asyncos.rb +46 -0
  86. data/lib/oxidized/model/audiocodes.rb +28 -0
  87. data/lib/oxidized/model/audiocodesmp.rb +28 -0
  88. data/lib/oxidized/model/awplus.rb +84 -0
  89. data/lib/oxidized/model/axos.rb +16 -0
  90. data/lib/oxidized/model/boss.rb +77 -0
  91. data/lib/oxidized/model/br6910.rb +42 -45
  92. data/lib/oxidized/model/c4cmts.rb +6 -10
  93. data/lib/oxidized/model/cambium.rb +23 -0
  94. data/lib/oxidized/model/casa.rb +1 -1
  95. data/lib/oxidized/model/catos.rb +1 -3
  96. data/lib/oxidized/model/cisconga.rb +1 -3
  97. data/lib/oxidized/model/ciscosma.rb +42 -0
  98. data/lib/oxidized/model/ciscosmb.rb +30 -10
  99. data/lib/oxidized/model/ciscovpn3k.rb +11 -0
  100. data/lib/oxidized/model/cnos.rb +33 -0
  101. data/lib/oxidized/model/comnetms.rb +43 -0
  102. data/lib/oxidized/model/comtrol.rb +41 -0
  103. data/lib/oxidized/model/comware.rb +28 -16
  104. data/lib/oxidized/model/coriant8600.rb +3 -5
  105. data/lib/oxidized/model/coriantgroove.rb +26 -0
  106. data/lib/oxidized/model/corianttmos.rb +1 -3
  107. data/lib/oxidized/model/cumulus.rb +60 -49
  108. data/lib/oxidized/model/datacom.rb +1 -4
  109. data/lib/oxidized/model/dcnos.rb +46 -0
  110. data/lib/oxidized/model/dellx.rb +76 -0
  111. data/lib/oxidized/model/dlink.rb +5 -4
  112. data/lib/oxidized/model/dnos.rb +11 -5
  113. data/lib/oxidized/model/eciapollo.rb +34 -0
  114. data/lib/oxidized/model/edgecos.rb +49 -0
  115. data/lib/oxidized/model/edgeos.rb +12 -5
  116. data/lib/oxidized/model/edgeswitch.rb +2 -4
  117. data/lib/oxidized/model/enterasys.rb +28 -0
  118. data/lib/oxidized/model/eos.rb +8 -8
  119. data/lib/oxidized/model/fabricos.rb +4 -6
  120. data/lib/oxidized/model/fastiron.rb +66 -0
  121. data/lib/oxidized/model/fiberdriver.rb +2 -2
  122. data/lib/oxidized/model/firebrick.rb +31 -0
  123. data/lib/oxidized/model/firelinuxos.rb +41 -0
  124. data/lib/oxidized/model/firewareos.rb +3 -6
  125. data/lib/oxidized/model/fortios.rb +31 -19
  126. data/lib/oxidized/model/ftos.rb +8 -5
  127. data/lib/oxidized/model/fujitsupy.rb +5 -7
  128. data/lib/oxidized/model/gaiaos.rb +7 -11
  129. data/lib/oxidized/model/gcombnps.rb +84 -0
  130. data/lib/oxidized/model/grandstream.rb +9 -0
  131. data/lib/oxidized/model/hatteras.rb +9 -6
  132. data/lib/oxidized/model/hirschmann.rb +39 -0
  133. data/lib/oxidized/model/hpebladesystem.rb +20 -18
  134. data/lib/oxidized/model/hpemsa.rb +10 -0
  135. data/lib/oxidized/model/hpmsm.rb +84 -0
  136. data/lib/oxidized/model/ibos.rb +55 -0
  137. data/lib/oxidized/model/icotera.rb +27 -0
  138. data/lib/oxidized/model/ios.rb +63 -70
  139. data/lib/oxidized/model/iosxe.rb +5 -0
  140. data/lib/oxidized/model/iosxr.rb +2 -3
  141. data/lib/oxidized/model/ipos.rb +10 -6
  142. data/lib/oxidized/model/ironware.rb +20 -19
  143. data/lib/oxidized/model/isam.rb +5 -6
  144. data/lib/oxidized/model/junos.rb +9 -11
  145. data/lib/oxidized/model/linuxgeneric.rb +74 -0
  146. data/lib/oxidized/model/masteros.rb +3 -6
  147. data/lib/oxidized/model/mlnxos.rb +9 -10
  148. data/lib/oxidized/model/model.rb +72 -46
  149. data/lib/oxidized/model/mtrlrfs.rb +1 -4
  150. data/lib/oxidized/model/ndms.rb +23 -0
  151. data/lib/oxidized/model/netgear.rb +35 -15
  152. data/lib/oxidized/model/netonix.rb +2 -2
  153. data/lib/oxidized/model/netscaler.rb +6 -3
  154. data/lib/oxidized/model/nos.rb +5 -7
  155. data/lib/oxidized/model/nsxconfig.rb +22 -0
  156. data/lib/oxidized/model/nsxfirewall.rb +22 -0
  157. data/lib/oxidized/model/nxos.rb +13 -3
  158. data/lib/oxidized/model/oneos.rb +15 -9
  159. data/lib/oxidized/model/openbsd.rb +63 -0
  160. data/lib/oxidized/model/opengear.rb +3 -5
  161. data/lib/oxidized/model/openwrt.rb +78 -0
  162. data/lib/oxidized/model/opnsense.rb +19 -0
  163. data/lib/oxidized/model/os10.rb +46 -0
  164. data/lib/oxidized/model/outputs.rb +5 -7
  165. data/lib/oxidized/model/panos.rb +11 -12
  166. data/lib/oxidized/model/pfsense.rb +11 -6
  167. data/lib/oxidized/model/planet.rb +14 -17
  168. data/lib/oxidized/model/powerconnect.rb +24 -19
  169. data/lib/oxidized/model/procurve.rb +43 -11
  170. data/lib/oxidized/model/purityos.rb +12 -0
  171. data/lib/oxidized/model/qtech.rb +41 -0
  172. data/lib/oxidized/model/quantaos.rb +4 -6
  173. data/lib/oxidized/model/raisecom.rb +19 -0
  174. data/lib/oxidized/model/routeros.rb +26 -8
  175. data/lib/oxidized/model/saos.rb +1 -2
  176. data/lib/oxidized/model/screenos.rb +8 -11
  177. data/lib/oxidized/model/sgos.rb +45 -0
  178. data/lib/oxidized/model/siklu.rb +1 -3
  179. data/lib/oxidized/model/slxos.rb +59 -0
  180. data/lib/oxidized/model/smartax.rb +25 -0
  181. data/lib/oxidized/model/sonicos.rb +51 -0
  182. data/lib/oxidized/model/speedtouch.rb +34 -0
  183. data/lib/oxidized/model/sros.rb +96 -0
  184. data/lib/oxidized/model/stoneos.rb +32 -0
  185. data/lib/oxidized/model/supermicro.rb +6 -41
  186. data/lib/oxidized/model/tdre.rb +30 -0
  187. data/lib/oxidized/model/telco.rb +24 -0
  188. data/lib/oxidized/model/timos.rb +6 -114
  189. data/lib/oxidized/model/tmos.rb +6 -3
  190. data/lib/oxidized/model/tplink.rb +11 -11
  191. data/lib/oxidized/model/trango.rb +21 -42
  192. data/lib/oxidized/model/ucs.rb +30 -0
  193. data/lib/oxidized/model/viptela.rb +29 -0
  194. data/lib/oxidized/model/voltaire.rb +9 -12
  195. data/lib/oxidized/model/voss.rb +17 -6
  196. data/lib/oxidized/model/vrp.rb +11 -6
  197. data/lib/oxidized/model/vyatta.rb +8 -6
  198. data/lib/oxidized/model/weos.rb +20 -0
  199. data/lib/oxidized/model/xos.rb +20 -8
  200. data/lib/oxidized/model/zhoneolt.rb +2 -2
  201. data/lib/oxidized/model/zynos.rb +1 -3
  202. data/lib/oxidized/model/zynoscli.rb +36 -0
  203. data/lib/oxidized/model/zynosgs.rb +38 -0
  204. data/lib/oxidized/node/stats.rb +33 -8
  205. data/lib/oxidized/node.rb +86 -95
  206. data/lib/oxidized/nodes.rb +48 -44
  207. data/lib/oxidized/output/file.rb +32 -37
  208. data/lib/oxidized/output/git.rb +138 -153
  209. data/lib/oxidized/output/gitcrypt.rb +228 -242
  210. data/lib/oxidized/output/http.rb +35 -34
  211. data/lib/oxidized/output/output.rb +2 -3
  212. data/lib/oxidized/source/csv.rb +50 -44
  213. data/lib/oxidized/source/http.rb +58 -58
  214. data/lib/oxidized/source/source.rb +9 -10
  215. data/lib/oxidized/source/sql.rb +47 -45
  216. data/lib/oxidized/string.rb +18 -14
  217. data/lib/oxidized/version.rb +17 -1
  218. data/lib/oxidized/worker.rb +72 -33
  219. data/oxidized.gemspec +20 -19
  220. metadata +180 -36
  221. data/.ruby-version +0 -1
  222. data/Gemfile.lock +0 -44
@@ -6,43 +6,62 @@ module Oxidized
6
6
  include Oxidized::Config::Vars
7
7
 
8
8
  class << self
9
- def inherited klass
10
- klass.instance_variable_set '@cmd', Hash.new { |h,k| h[k] = [] }
11
- klass.instance_variable_set '@cfg', Hash.new { |h,k| h[k] = [] }
12
- klass.instance_variable_set '@procs', Hash.new { |h,k| h[k] = [] }
13
- klass.instance_variable_set '@expect', []
14
- klass.instance_variable_set '@comment', nil
15
- klass.instance_variable_set '@prompt', nil
16
- end
17
- def comment _comment='# '
18
- return @comment if @comment
19
- @comment = block_given? ? yield : _comment
20
- end
21
- def prompt _prompt=nil
22
- @prompt or @prompt = _prompt
23
- end
24
- def cfg *methods, &block
9
+ def inherited(klass)
10
+ if klass.superclass == Oxidized::Model
11
+ klass.instance_variable_set '@cmd', (Hash.new { |h, k| h[k] = [] })
12
+ klass.instance_variable_set '@cfg', (Hash.new { |h, k| h[k] = [] })
13
+ klass.instance_variable_set '@procs', (Hash.new { |h, k| h[k] = [] })
14
+ klass.instance_variable_set '@expect', []
15
+ klass.instance_variable_set '@comment', nil
16
+ klass.instance_variable_set '@prompt', nil
17
+ else # we're subclassing some existing model, take its variables
18
+ instance_variables.each do |var|
19
+ klass.instance_variable_set var, instance_variable_get(var)
20
+ end
21
+ end
22
+ end
23
+
24
+ def comment(str = "# ")
25
+ @comment = if block_given?
26
+ yield
27
+ elsif not @comment
28
+ str
29
+ else
30
+ @comment
31
+ end
32
+ end
33
+
34
+ def prompt(regex = nil)
35
+ @prompt = regex || @prompt
36
+ end
37
+
38
+ def cfg(*methods, **args, &block)
25
39
  [methods].flatten.each do |method|
26
- @cfg[method.to_s] << block
40
+ process_args_block(@cfg[method.to_s], args, block)
27
41
  end
28
42
  end
43
+
29
44
  def cfgs
30
45
  @cfg
31
46
  end
32
- def cmd _cmd=nil, &block
33
- if _cmd.class == Symbol
34
- @cmd[_cmd] << block
47
+
48
+ def cmd(cmd_arg = nil, **args, &block)
49
+ if cmd_arg.class == Symbol
50
+ process_args_block(@cmd[cmd_arg], args, block)
35
51
  else
36
- @cmd[:cmd] << [_cmd, block]
52
+ process_args_block(@cmd[:cmd], args, [cmd_arg, block])
37
53
  end
38
- Oxidized.logger.debug "lib/oxidized/model/model.rb Added #{_cmd} to the commands list"
54
+ Oxidized.logger.debug "lib/oxidized/model/model.rb Added #{cmd_arg} to the commands list"
39
55
  end
56
+
40
57
  def cmds
41
58
  @cmd
42
59
  end
43
- def expect re, &block
44
- @expect << [re, block]
60
+
61
+ def expect(regex, **args, &block)
62
+ process_args_block(@expect, args, [regex, block])
45
63
  end
64
+
46
65
  def expects
47
66
  @expect
48
67
  end
@@ -54,8 +73,8 @@ module Oxidized
54
73
  # @since 0.0.39
55
74
  # @yield expects block which should return [String]
56
75
  # @return [void]
57
- def pre &block
58
- @procs[:pre] << block
76
+ def pre(**args, &block)
77
+ process_args_block(@procs[:pre], args, block)
59
78
  end
60
79
 
61
80
  # calls the block at the end of the model, adding the output of the block
@@ -65,24 +84,35 @@ module Oxidized
65
84
  # @since 0.0.39
66
85
  # @yield expects block which should return [String]
67
86
  # @return [void]
68
- def post &block
69
- @procs[:post] << block
87
+ def post(**args, &block)
88
+ process_args_block(@procs[:post], args, block)
70
89
  end
71
90
 
72
91
  # @author Saku Ytti <saku@ytti.fi>
73
92
  # @since 0.0.39
74
93
  # @return [Hash] hash proc procs :pre+:post to be prepended/postfixed to output
75
- def procs
76
- @procs
94
+ attr_reader :procs
95
+
96
+ private
97
+
98
+ def process_args_block(target, args, block)
99
+ if args[:clear]
100
+ target.replace([block])
101
+ else
102
+ method = args[:prepend] ? :unshift : :push
103
+ target.send(method, block)
104
+ end
77
105
  end
78
106
  end
79
107
 
80
108
  attr_accessor :input, :node
81
109
 
82
- def cmd string, &block
110
+ def cmd(string, &block)
83
111
  Oxidized.logger.debug "lib/oxidized/model/model.rb Executing #{string}"
84
112
  out = @input.cmd(string)
85
113
  return false unless out
114
+
115
+ out = out.b unless Oxidized.config.input.utf8_encoded?
86
116
  self.class.cmds[:all].each do |all_block|
87
117
  out = instance_exec Oxidized::String.new(out), string, &all_block
88
118
  end
@@ -99,12 +129,12 @@ module Oxidized
99
129
  @input.output
100
130
  end
101
131
 
102
- def send data
132
+ def send(data)
103
133
  @input.send data
104
134
  end
105
135
 
106
- def expect re, &block
107
- self.class.expect re, &block
136
+ def expect(regex, &block)
137
+ self.class.expect regex, &block
108
138
  end
109
139
 
110
140
  def cfg
@@ -115,14 +145,10 @@ module Oxidized
115
145
  self.class.prompt
116
146
  end
117
147
 
118
- def expects data
148
+ def expects(data)
119
149
  self.class.expects.each do |re, cb|
120
150
  if data.match re
121
- if cb.arity == 2
122
- data = instance_exec [data, re], &cb
123
- else
124
- data = instance_exec data, &cb
125
- end
151
+ data = cb.arity == 2 ? instance_exec([data, re], &cb) : instance_exec(data, &cb)
126
152
  end
127
153
  end
128
154
  data
@@ -135,6 +161,7 @@ module Oxidized
135
161
  self.class.cmds[:cmd].each do |command, block|
136
162
  out = cmd command, &block
137
163
  return false unless out
164
+
138
165
  outputs << out
139
166
  end
140
167
  procs[:pre].each do |pre_proc|
@@ -146,9 +173,9 @@ module Oxidized
146
173
  outputs
147
174
  end
148
175
 
149
- def comment _comment
176
+ def comment(str)
150
177
  data = ''
151
- _comment.each_line do |line|
178
+ str.each_line do |line|
152
179
  data << self.class.comment << line
153
180
  end
154
181
  data
@@ -160,12 +187,11 @@ module Oxidized
160
187
 
161
188
  private
162
189
 
163
- def process_cmd_output output, name
164
- output = Oxidized::String.new output if ::String === output
165
- output = Oxidized::String.new '' unless Oxidized::String === output
190
+ def process_cmd_output(output, name)
191
+ output = Oxidized::String.new(output) if output.is_a?(::String)
192
+ output = Oxidized::String.new('') unless output.instance_of?(Oxidized::String)
166
193
  output.set_cmd(name)
167
194
  output
168
195
  end
169
-
170
196
  end
171
197
  end
@@ -1,5 +1,4 @@
1
1
  class Mtrlrfs < Oxidized::Model
2
-
3
2
  # Motorola RFS/Extreme WM
4
3
 
5
4
  comment '# '
@@ -7,7 +6,7 @@ class Mtrlrfs < Oxidized::Model
7
6
  cmd :all do |cfg|
8
7
  # xos inserts leading \r characters and other trailing white space.
9
8
  # this deletes extraneous \r and trailing white space.
10
- cfg.each_line.to_a[1..-2].map{|line|line.delete("\r").rstrip}.join("\n") + "\n"
9
+ cfg.each_line.to_a[1..-2].map { |line| line.delete("\r").rstrip }.join("\n") + "\n"
11
10
  end
12
11
 
13
12
  cmd 'show version' do |cfg|
@@ -32,6 +31,4 @@ class Mtrlrfs < Oxidized::Model
32
31
  send "n\n"
33
32
  end
34
33
  end
35
-
36
34
  end
37
-
@@ -0,0 +1,23 @@
1
+ class NDMS < Oxidized::Model
2
+ # Pull config from Zyxel Keenetic devices from version NDMS >= 2.0
3
+
4
+ comment '! '
5
+
6
+ prompt /^([\w.@()-]+[#>]\s?)/m
7
+
8
+ cmd 'show version' do |cfg|
9
+ cfg = cfg.each_line.to_a[1..-3].join
10
+ comment cfg
11
+ end
12
+
13
+ cmd 'show running-config' do |cfg|
14
+ cfg = cfg.cut_both.each_line.reject { |line| line.match /(clock date|checksum)/ }.join
15
+ cfg
16
+ end
17
+
18
+ cfg :telnet do
19
+ username /^Login:/
20
+ password /^Password:/
21
+ pre_logout 'exit'
22
+ end
23
+ end
@@ -1,32 +1,52 @@
1
1
  class Netgear < Oxidized::Model
2
-
3
2
  comment '!'
4
- prompt /^(\([\w-]+\)\s[#>])$/
3
+ prompt /^(\([\w\s\-.]+\)\s[#>])$/
5
4
 
6
5
  cmd :secret do |cfg|
7
6
  cfg.gsub!(/password (\S+)/, 'password <hidden>')
7
+ cfg.gsub!(/encrypted (\S+)/, 'encrypted <hidden>')
8
+ cfg.gsub!(/snmp-server community (\S+)/, 'snmp-server community <hidden>') # snmp
8
9
  cfg
9
10
  end
10
11
 
12
+ cfg :telnet do
13
+ username /^(User:|Applying Interface configuration, please wait ...)/
14
+ password /^Password:/i
15
+ end
16
+
11
17
  cfg :telnet, :ssh do
12
- if vars :enable
13
- post_login do
14
- cmd 'enable'
15
- # Interpret enable: true as meaning we won't be prompted for a password
16
- unless vars(:enable).is_a? TrueClass
17
- expect /[pP]assword:\s?$/
18
- cmd vars(:enable) + "\n"
19
- end
20
- expect /^.+[#]$/
18
+ post_login do
19
+ if vars(:enable) == true
20
+ cmd "enable"
21
+ elsif vars(:enable)
22
+ cmd "enable", /[pP]assword:\s?$/
23
+ cmd vars(:enable)
21
24
  end
22
25
  end
23
26
  post_login 'terminal length 0'
24
- pre_logout 'exit'
25
- pre_logout 'quit'
27
+ # quit / logout will sometimes prompt the user:
28
+ #
29
+ # The system has unsaved changes.
30
+ # Would you like to save them now? (y/n)
31
+ #
32
+ # So it is safer simply to disconnect and not issue a pre_logout command
26
33
  end
27
34
 
28
- cmd 'show running-config' do |cfg|
29
- cfg.gsub! /^(!.*Time).*$/, '\1'
35
+ cmd :all do |cfg, cmdstring|
36
+ new_cfg = comment "COMMAND: #{cmdstring}\n"
37
+ new_cfg << cfg.each_line.to_a[1..-2].join
30
38
  end
31
39
 
40
+ cmd 'show version' do |cfg|
41
+ cfg.gsub! /(Current Time\.+ ).*/, '\\1 <removed>'
42
+ comment cfg
43
+ end
44
+
45
+ cmd 'show bootvar' do |cfg|
46
+ comment cfg
47
+ end
48
+ cmd 'show running-config' do |cfg|
49
+ cfg.gsub! /(System Up Time\s+).*/, '\\1 <removed>'
50
+ cfg.gsub! /(Current SNTP Synchronized Time:).*/, '\\1 <removed>'
51
+ end
32
52
  end
@@ -1,8 +1,8 @@
1
1
  class Netonix < Oxidized::Model
2
- prompt /^[\w\s.@_\/:-]+#/
2
+ prompt /^[\w\s\(\).@_\/:-]+#/
3
3
 
4
4
  cmd :all do |cfg|
5
- cfg.each_line.to_a[1..-2].join
5
+ cfg.cut_both
6
6
  end
7
7
 
8
8
  cmd 'cat config.json;echo'
@@ -1,6 +1,5 @@
1
1
  class NetScaler < Oxidized::Model
2
-
3
- prompt /^\>\s*$/
2
+ prompt /^([\w\.-]*>\s?)$/
4
3
  comment '# '
5
4
 
6
5
  cmd :all do |cfg|
@@ -15,10 +14,14 @@ class NetScaler < Oxidized::Model
15
14
  comment cfg
16
15
  end
17
16
 
17
+ cmd :secret do |cfg|
18
+ cfg.gsub! /\w+\s(-encrypted)/, '<secret hidden> \\1'
19
+ cfg
20
+ end
21
+
18
22
  cmd 'show ns ns.conf'
19
23
 
20
24
  cfg :ssh do
21
25
  pre_logout 'exit'
22
26
  end
23
-
24
27
  end
@@ -1,16 +1,15 @@
1
1
  class NOS < Oxidized::Model
2
-
3
2
  # Brocade Network Operating System
4
3
 
5
4
  prompt /^(?:\e\[..h)?[\w.-]+# $/
6
5
  comment '! '
7
6
 
8
7
  cmd :all do |cfg|
9
- cfg.each_line.to_a[1..-2].join
8
+ cfg.cut_both
10
9
  end
11
10
 
12
11
  cmd 'show version' do |cfg|
13
- comment cfg
12
+ comment cfg.each_line.reject { |line| line.match /([Ss]ystem [Uu]p\s?[Tt]ime|[Uu]p\s?[Tt]ime is \d)/ }.join
14
13
  end
15
14
 
16
15
  cmd 'show inventory' do |cfg|
@@ -22,11 +21,11 @@ class NOS < Oxidized::Model
22
21
  end
23
22
 
24
23
  cmd 'show chassis' do |cfg|
25
- comment cfg.each_line.reject { |line| line.match /Time/ or line.match /Update/ }.join
24
+ comment cfg.each_line.reject { |line| line.match(/Time/) || line.match(/Update/) }.join
26
25
  end
27
26
 
28
27
  cfg 'show system' do |cfg|
29
- comment cfg.each_line.reject { |line| line.match /Time/ or line.match /speed/ }
28
+ comment(cfg.each_line.reject { |line| line.match(/Time/) || line.match(/speed/) })
30
29
  end
31
30
 
32
31
  cmd 'show running-config | nomore'
@@ -38,8 +37,7 @@ class NOS < Oxidized::Model
38
37
 
39
38
  cfg :telnet, :ssh do
40
39
  post_login 'terminal length 0'
41
- #post_login 'terminal width 0'
40
+ # post_login 'terminal width 0'
42
41
  pre_logout 'exit'
43
42
  end
44
-
45
43
  end
@@ -0,0 +1,22 @@
1
+ require 'net/http'
2
+ class NSXConfig < Oxidized::Model
3
+ cmd "/api/4.0/edges/" do |cfg|
4
+ edges = JSON.parse(cfg.encode('UTF-8', { invalid: :replace, undef: :replace, replace: '?' }))["edgePage"]["data"]
5
+ data = []
6
+ edges.each do |edge|
7
+ firewall_config = cmd "/api/4.0/edges/#{edge['id']}"
8
+ json_config = JSON.parse(firewall_config.encode('UTF-8', { invalid: :replace, undef: :replace, replace: '?' }))
9
+ json_config["edgeInfo"] = "#{edge['id']} #{edge['name']}"
10
+ data.push(json_config)
11
+ end
12
+ JSON.pretty_generate(data)
13
+ end
14
+
15
+ cfg :http do
16
+ @username = @node.auth[:username]
17
+ @password = @node.auth[:password]
18
+ @headers['Content-Type'] = 'application/json'
19
+ @headers['Accept'] = 'application/json'
20
+ @secure = true
21
+ end
22
+ end
@@ -0,0 +1,22 @@
1
+ require 'net/http'
2
+ class NSXFirewall < Oxidized::Model
3
+ cmd "/api/4.0/edges/" do |cfg|
4
+ edges = JSON.parse(cfg.encode('UTF-8', { invalid: :replace, undef: :replace, replace: '?' }))["edgePage"]["data"]
5
+ data = []
6
+ edges.each do |edge|
7
+ firewall_config = cmd "/api/4.0/edges/#{edge['id']}/firewall/config"
8
+ json_config = {}
9
+ json_config["#{edge['id']} #{edge['name']}"] = JSON.parse(firewall_config.encode('UTF-8', { invalid: :replace, undef: :replace, replace: '?' }))
10
+ data.push(json_config)
11
+ end
12
+ JSON.pretty_generate(data)
13
+ end
14
+
15
+ cfg :http do
16
+ @username = @node.auth[:username]
17
+ @password = @node.auth[:password]
18
+ @headers['Content-Type'] = 'application/json'
19
+ @headers['Accept'] = 'application/json'
20
+ @secure = true
21
+ end
22
+ end
@@ -1,8 +1,12 @@
1
1
  class NXOS < Oxidized::Model
2
-
3
2
  prompt /^(\r?[\w.@_()-]+[#]\s?)$/
4
3
  comment '! '
5
4
 
5
+ def filter(cfg)
6
+ cfg.gsub! /\r\n?/, "\n"
7
+ cfg.gsub! prompt, ''
8
+ end
9
+
6
10
  cmd :secret do |cfg|
7
11
  cfg.gsub! /^(snmp-server community).*/, '\\1 <configuration removed>'
8
12
  cfg.gsub! /^(snmp-server user (\S+) (\S+) auth (\S+)) (\S+) (priv) (\S+)/, '\\1 <configuration removed> '
@@ -10,18 +14,24 @@ class NXOS < Oxidized::Model
10
14
  cfg.gsub! /^(radius-server key).*/, '\\1 <secret hidden>'
11
15
  cfg
12
16
  end
13
-
17
+
14
18
  cmd 'show version' do |cfg|
19
+ cfg = filter cfg
15
20
  cfg = cfg.each_line.take_while { |line| not line.match(/uptime/i) }
16
21
  comment cfg.join ""
17
22
  end
18
23
 
19
24
  cmd 'show inventory' do |cfg|
25
+ cfg = filter cfg
20
26
  comment cfg
21
- end
27
+ end
22
28
 
23
29
  cmd 'show running-config' do |cfg|
30
+ cfg = filter cfg
31
+ cfg.gsub! /^(show run.*)$/, '! \1'
24
32
  cfg.gsub! /^!Time:[^\n]*\n/, ''
33
+ cfg.gsub! /^[\w.@_()-]+[#].*$/, ''
34
+ cfg
25
35
  end
26
36
 
27
37
  cfg :ssh, :telnet do
@@ -1,25 +1,24 @@
1
1
  class OneOS < Oxidized::Model
2
-
3
2
  prompt /^([\w.@()-]+#\s?)$/
4
3
  comment '! '
5
4
 
6
5
  # example how to handle pager
7
- #expect /^\s--More--\s+.*$/ do |data, re|
6
+ # expect /^\s--More--\s+.*$/ do |data, re|
8
7
  # send ' '
9
8
  # data.sub re, ''
10
- #end
9
+ # end
11
10
 
12
11
  # non-preferred way to handle additional PW prompt
13
- #expect /^[\w.]+>$/ do |data|
12
+ # expect /^[\w.]+>$/ do |data|
14
13
  # send "enable\n"
15
14
  # send vars(:enable) + "\n"
16
15
  # data
17
- #end
16
+ # end
18
17
 
19
18
  cmd :all do |cfg|
20
- #cfg.gsub! /\cH+\s{8}/, '' # example how to handle pager
21
- #cfg.gsub! /\cH+/, '' # example how to handle pager
22
- cfg.each_line.to_a[1..-2].join
19
+ # cfg.gsub! /\cH+\s{8}/, '' # example how to handle pager
20
+ # cfg.gsub! /\cH+/, '' # example how to handle pager
21
+ cfg.cut_both
23
22
  end
24
23
 
25
24
  cmd :secret do |cfg|
@@ -31,6 +30,14 @@ class OneOS < Oxidized::Model
31
30
  comment cfg
32
31
  end
33
32
 
33
+ cmd 'show system hardware' do |cfg|
34
+ comment cfg
35
+ end
36
+
37
+ cmd 'show product-info-area' do |cfg|
38
+ comment cfg
39
+ end
40
+
34
41
  cmd 'show running-config' do |cfg|
35
42
  cfg = cfg.each_line.to_a[0..-1].join
36
43
  cfg.gsub! /^Building configuration...\s*[^\n]*\n/, ''
@@ -54,5 +61,4 @@ class OneOS < Oxidized::Model
54
61
  post_login 'term len 0'
55
62
  pre_logout 'exit'
56
63
  end
57
-
58
64
  end
@@ -0,0 +1,63 @@
1
+ class Openbsd < Oxidized::Model
2
+ # OpenBSD with custom promp, like user@hostname:~$
3
+ # you can edit the one that your user uses, with root would be /root/.profile using the next PS1 def
4
+ # export PS1="\033[32m\u@\h\033[00m:\033[36m\w\033[00m$ "
5
+
6
+ prompt /^.+@.+\:.+\$/
7
+ comment '# '
8
+
9
+ # Add a comment between files/configs
10
+ def add_comment(comment)
11
+ "\n+++++++++++++++++++++++++++++++++++++++++ #{comment} ++++++++++++++++++++++++++++++++++++++++++++++\n"
12
+ end
13
+
14
+ def add_small_comment(comment)
15
+ "\n=============== #{comment} ===============\n"
16
+ end
17
+
18
+ cmd :all do |cfg|
19
+ cfg.each_line.to_a[1..-2].join
20
+ end
21
+
22
+ # Issue the show commands
23
+ pre do
24
+ cfg = add_comment('HOSTNAME FILE')
25
+ cfg += cmd('cat /etc/myname')
26
+
27
+ cfg += add_comment('RESOLV.CONF FILE')
28
+ cfg += cmd('cat /etc/resolv.conf')
29
+
30
+ cfg += add_comment('NTP.CONF FILE')
31
+ cfg += cmd('cat /etc/ntp.conf')
32
+
33
+ cfg += add_comment('PF FILE')
34
+ cfg += cmd('cat /etc/pf.conf')
35
+
36
+ cfg += add_comment('HOSTS FILE')
37
+ cfg += cmd('cat /etc/hosts')
38
+
39
+ cfg += add_comment('INTERFACE FILES')
40
+ cfg += cmd('tail -n +1 /etc/hostname.*')
41
+
42
+ cfg += add_comment('SNMP FILE')
43
+ cfg += cmd('cat /etc/snmpd.conf')
44
+
45
+ cfg += add_comment('MOTD FILE')
46
+ cfg += cmd('cat /etc/motd')
47
+
48
+ cfg += add_comment('PASSWD FILE')
49
+ cfg += cmd('cat /etc/passwd')
50
+
51
+ cfg += add_small_comment('END')
52
+ cfg
53
+ end
54
+
55
+ cfg :telnet do
56
+ username /^Username:/
57
+ password /^Password:/
58
+ end
59
+
60
+ cfg :telnet, :ssh do
61
+ pre_logout 'exit'
62
+ end
63
+ end
@@ -1,8 +1,7 @@
1
1
  class OpenGear < Oxidized::Model
2
+ comment '# '
2
3
 
3
- comment '# '
4
-
5
- prompt /^(\$\s)?$/
4
+ prompt /^(\$\s)$/
6
5
 
7
6
  cmd :secret do |cfg|
8
7
  cfg.gsub!(/password (\S+)/, 'password <secret removed>')
@@ -15,7 +14,6 @@ class OpenGear < Oxidized::Model
15
14
  cmd 'config -g config'
16
15
 
17
16
  cfg :ssh do
18
- exec true # don't run shell, run each command in exec channel
17
+ exec true # don't run shell, run each command in exec channel
19
18
  end
20
-
21
19
  end