oxidized 0.31.0 → 0.32.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (63) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby.yml +2 -3
  3. data/.rubocop.yml +1 -2
  4. data/.rubocop_todo.yml +6 -6
  5. data/CHANGELOG.md +32 -0
  6. data/Dockerfile +5 -2
  7. data/Rakefile +28 -0
  8. data/docs/Configuration.md +14 -2
  9. data/docs/Creating-Models.md +52 -22
  10. data/docs/DeviceSimulation.md +184 -0
  11. data/docs/Hooks.md +5 -5
  12. data/docs/Issues.md +15 -9
  13. data/docs/Model-Notes/APC_AOS.md +29 -16
  14. data/docs/Model-Notes/FSOS.md +1 -0
  15. data/docs/ModelUnitTests.md +186 -0
  16. data/docs/Supported-OS-Types.md +3 -2
  17. data/examples/podman-compose/Makefile +1 -2
  18. data/{examples/device-simulation → extra}/device2yaml.rb +32 -12
  19. data/extra/gitdiff-msteams.sh +32 -5
  20. data/extra/nagios_check_failing_nodes.rb +1 -1
  21. data/extra/rest_client.rb +1 -1
  22. data/lib/oxidized/config.rb +1 -1
  23. data/lib/oxidized/input/ssh.rb +13 -5
  24. data/lib/oxidized/model/aos7.rb +2 -0
  25. data/lib/oxidized/model/aosw.rb +1 -1
  26. data/lib/oxidized/model/apc_aos.rb +1 -1
  27. data/lib/oxidized/model/arubainstant.rb +1 -1
  28. data/lib/oxidized/model/asa.rb +2 -1
  29. data/lib/oxidized/model/asyncos.rb +1 -1
  30. data/lib/oxidized/model/cumulus.rb +16 -2
  31. data/lib/oxidized/model/enterprise_sonic.rb +46 -0
  32. data/lib/oxidized/model/fsos.rb +5 -1
  33. data/lib/oxidized/model/garderos.rb +4 -4
  34. data/lib/oxidized/model/junos.rb +1 -1
  35. data/lib/oxidized/model/kornfeldos.rb +33 -0
  36. data/lib/oxidized/model/model.rb +2 -2
  37. data/lib/oxidized/model/sonicos.rb +8 -2
  38. data/lib/oxidized/model/tplink.rb +1 -0
  39. data/lib/oxidized/model/xos.rb +1 -1
  40. data/lib/oxidized/source/source.rb +32 -2
  41. data/lib/oxidized/version.rb +2 -2
  42. data/oxidized.gemspec +7 -6
  43. metadata +33 -35
  44. data/examples/device-simulation/README.md +0 -173
  45. data/examples/device-simulation/cmdsets/aoscx +0 -9
  46. data/examples/device-simulation/cmdsets/arubainstant +0 -5
  47. data/examples/device-simulation/cmdsets/asa +0 -7
  48. data/examples/device-simulation/cmdsets/ios +0 -7
  49. data/examples/device-simulation/cmdsets/nxos +0 -5
  50. data/examples/device-simulation/cmdsets/routeros +0 -5
  51. data/examples/device-simulation/cmdsets/srosmd +0 -11
  52. data/examples/device-simulation/yaml/aoscx_R0X25A-6410_FL.10.10.1100.yaml +0 -2281
  53. data/examples/device-simulation/yaml/aoscx_R8N85A-C6000-48G-CL4_PL.10.08.1010.yaml +0 -451
  54. data/examples/device-simulation/yaml/arubainstant_IAP515_8.10.0.6_VWLC.yaml +0 -213
  55. data/examples/device-simulation/yaml/asa_5512_9.12-4-67_single-context.yaml +0 -531
  56. data/examples/device-simulation/yaml/asr920_16.8.1b.yaml +0 -1122
  57. data/examples/device-simulation/yaml/garderos_R7709_003_006_068.yaml +0 -101
  58. data/examples/device-simulation/yaml/iosxe_C9200L-24P-4G_17.09.04a.yaml +0 -514
  59. data/examples/device-simulation/yaml/iosxe_C9800-L-F-K9_17.06.05.yaml +0 -417
  60. data/examples/device-simulation/yaml/riverbed_915.yaml +0 -123
  61. data/examples/device-simulation/yaml/routeros_CHR_7.10.1.yaml +0 -145
  62. data/examples/device-simulation/yaml/routeros_CHR_7.16.yaml +0 -79
  63. data/examples/device-simulation/yaml/routeros_L009UiGS_7.15.2.yaml +0 -353
@@ -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
@@ -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
@@ -3,8 +3,14 @@ class SonicOS < Oxidized::Model
3
3
 
4
4
  # Applies to Sonicwall NSA series firewalls
5
5
 
6
- prompt /^\w+@\w+[>]\(?.+\)?\s?/
7
- comment '! '
6
+ prompt /^\w+@[\w\-]+[>]\(?.+\)?\s?/
7
+ comment '! '
8
+
9
+ # Accept policiy message (see Issue #3339). Tested on 6.5 and 7.1
10
+ expect /Accept The Policy Banner \(yes\)\?\r\nyes: $/ do |data, re|
11
+ send "yes\n"
12
+ data.sub re, ''
13
+ end
8
14
 
9
15
  cmd :all do |cfg|
10
16
  cfg.each_line.to_a[1..-2].join
@@ -58,6 +58,7 @@ class TPLink < Oxidized::Model
58
58
  if vars(:enable) == true
59
59
  cmd "enable"
60
60
  elsif vars(:enable)
61
+ cmd "enable", /^[pP]assword:/
61
62
  cmd vars(:enable)
62
63
  end
63
64
  end
@@ -13,7 +13,7 @@ class XOS < Oxidized::Model
13
13
  end
14
14
 
15
15
  cmd :secret do |cfg|
16
- cfg.gsub! /^(configure radius (netlogin|mgmt-access) (primary|secondary) shared-secret encrypted).+/, '\\1 <secret hidden>'
16
+ cfg.gsub! /^(configure (radius|radius-accounting) (netlogin|mgmt-access) (primary|secondary) shared-secret encrypted).+/, '\\1 <secret hidden>'
17
17
  cfg.gsub! /^(configure account admin encrypted).+/, '\\1 <secret hidden>'
18
18
  cfg.gsub! /^(create account (admin|user) (.+) encrypted).+/, '\\1 <secret hidden>'
19
19
  cfg
@@ -8,12 +8,42 @@ module Oxidized
8
8
  @group_map = Oxidized.config.group_map || {}
9
9
  end
10
10
 
11
+ # common code of #map_model and #map_group
12
+ def map_value(map_hash, original_value)
13
+ map_hash.each do |key, new_value|
14
+ mthd = key.instance_of?(Regexp) ? :match : :eql?
15
+ return new_value if original_value.send(mthd, key)
16
+ end
17
+ original_value
18
+ end
19
+
20
+ # search a match for model in the configuration and returns it.
21
+ # If no match is found, return model
22
+ #
23
+ # model can be matched against a string or a regexp:
24
+ #
25
+ # model_map:
26
+ # cisco: ios
27
+ # juniper: junos
28
+ # !ruby/regexp /procurve/: procurve
11
29
  def map_model(model)
12
- @model_map.has_key?(model) ? @model_map[model] : model
30
+ map_value(@model_map, model)
13
31
  end
14
32
 
33
+ # search a match for group in the configuration and returns it.
34
+ # If no match is found, return group
35
+ #
36
+ # group can be matched against a string or a regexp:
37
+ #
38
+ # group_map:
39
+ # alias1: groupA
40
+ # alias2: groupA
41
+ # alias3: groupB
42
+ # alias4: groupB
43
+ # !ruby/regexp /specialgroup/: groupS
44
+ # aliasN: groupZ
15
45
  def map_group(group)
16
- @group_map.has_key?(group) ? @group_map[group] : group
46
+ map_value(@group_map, group)
17
47
  end
18
48
 
19
49
  def node_var_interpolate(var)
@@ -1,6 +1,6 @@
1
1
  module Oxidized
2
- VERSION = '0.31.0'.freeze
3
- VERSION_FULL = '0.31.0'.freeze
2
+ VERSION = '0.32.0'.freeze
3
+ VERSION_FULL = '0.32.0'.freeze
4
4
  def self.version_set
5
5
  version_full = %x(git describe --tags).chop rescue ""
6
6
  version = %x(git describe --tags --abbrev=0).chop rescue ""
data/oxidized.gemspec CHANGED
@@ -26,20 +26,21 @@ Gem::Specification.new do |s|
26
26
  s.add_dependency 'ed25519', '~> 1.2'
27
27
  s.add_dependency 'net-ftp', '~> 0.2'
28
28
  s.add_dependency 'net-http-digest_auth', '~> 1.4'
29
- s.add_dependency 'net-scp', '~> 4.0'
29
+ s.add_dependency 'net-scp', '~> 4.1'
30
30
  s.add_dependency 'net-ssh', '~> 7.3'
31
31
  s.add_dependency 'net-telnet', '~> 0.2'
32
+ s.add_dependency 'ostruct', '~> 0.6'
32
33
  s.add_dependency 'psych', '~> 5.0'
33
34
  s.add_dependency 'rugged', '~> 1.6'
34
35
  s.add_dependency 'slop', '~> 4.6'
35
36
 
36
37
  s.add_development_dependency 'bundler', '~> 2.2'
37
38
  s.add_development_dependency 'git', '~> 2'
38
- s.add_development_dependency 'minitest', '~> 5.18'
39
+ s.add_development_dependency 'minitest', '~> 5.25.4'
39
40
  s.add_development_dependency 'mocha', '~> 2.1'
40
- s.add_development_dependency 'pry', '~> 0.14.2'
41
+ s.add_development_dependency 'pry', '~> 0.15.0'
41
42
  s.add_development_dependency 'rake', '~> 13.0'
42
- s.add_development_dependency 'rubocop', '~> 1.68.0'
43
+ s.add_development_dependency 'rubocop', '~> 1.72.0'
43
44
  s.add_development_dependency 'rubocop-minitest', '~> 0.36.0'
44
45
  s.add_development_dependency 'rubocop-rake', '~> 0.6.0'
45
46
  s.add_development_dependency 'rubocop-sequel', '~> 0.3.3'
@@ -48,6 +49,6 @@ Gem::Specification.new do |s|
48
49
  s.add_development_dependency 'simplecov-html', '~> 0.13.1'
49
50
 
50
51
  # Dependencies on optional libraries, used for unit tests & development
51
- s.add_development_dependency 'oxidized-web', '>= 0.14.0'
52
- s.add_development_dependency 'sequel', '~> 5.63'
52
+ s.add_development_dependency 'oxidized-web', '>= 0.15.0'
53
+ s.add_development_dependency 'sequel', '~> 5.88.0'
53
54
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: oxidized
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.31.0
4
+ version: 0.32.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Saku Ytti
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2024-11-29 00:00:00.000000000 Z
13
+ date: 2025-02-17 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: asetus
@@ -88,14 +88,14 @@ dependencies:
88
88
  requirements:
89
89
  - - "~>"
90
90
  - !ruby/object:Gem::Version
91
- version: '4.0'
91
+ version: '4.1'
92
92
  type: :runtime
93
93
  prerelease: false
94
94
  version_requirements: !ruby/object:Gem::Requirement
95
95
  requirements:
96
96
  - - "~>"
97
97
  - !ruby/object:Gem::Version
98
- version: '4.0'
98
+ version: '4.1'
99
99
  - !ruby/object:Gem::Dependency
100
100
  name: net-ssh
101
101
  requirement: !ruby/object:Gem::Requirement
@@ -124,6 +124,20 @@ dependencies:
124
124
  - - "~>"
125
125
  - !ruby/object:Gem::Version
126
126
  version: '0.2'
127
+ - !ruby/object:Gem::Dependency
128
+ name: ostruct
129
+ requirement: !ruby/object:Gem::Requirement
130
+ requirements:
131
+ - - "~>"
132
+ - !ruby/object:Gem::Version
133
+ version: '0.6'
134
+ type: :runtime
135
+ prerelease: false
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ requirements:
138
+ - - "~>"
139
+ - !ruby/object:Gem::Version
140
+ version: '0.6'
127
141
  - !ruby/object:Gem::Dependency
128
142
  name: psych
129
143
  requirement: !ruby/object:Gem::Requirement
@@ -200,14 +214,14 @@ dependencies:
200
214
  requirements:
201
215
  - - "~>"
202
216
  - !ruby/object:Gem::Version
203
- version: '5.18'
217
+ version: 5.25.4
204
218
  type: :development
205
219
  prerelease: false
206
220
  version_requirements: !ruby/object:Gem::Requirement
207
221
  requirements:
208
222
  - - "~>"
209
223
  - !ruby/object:Gem::Version
210
- version: '5.18'
224
+ version: 5.25.4
211
225
  - !ruby/object:Gem::Dependency
212
226
  name: mocha
213
227
  requirement: !ruby/object:Gem::Requirement
@@ -228,14 +242,14 @@ dependencies:
228
242
  requirements:
229
243
  - - "~>"
230
244
  - !ruby/object:Gem::Version
231
- version: 0.14.2
245
+ version: 0.15.0
232
246
  type: :development
233
247
  prerelease: false
234
248
  version_requirements: !ruby/object:Gem::Requirement
235
249
  requirements:
236
250
  - - "~>"
237
251
  - !ruby/object:Gem::Version
238
- version: 0.14.2
252
+ version: 0.15.0
239
253
  - !ruby/object:Gem::Dependency
240
254
  name: rake
241
255
  requirement: !ruby/object:Gem::Requirement
@@ -256,14 +270,14 @@ dependencies:
256
270
  requirements:
257
271
  - - "~>"
258
272
  - !ruby/object:Gem::Version
259
- version: 1.68.0
273
+ version: 1.72.0
260
274
  type: :development
261
275
  prerelease: false
262
276
  version_requirements: !ruby/object:Gem::Requirement
263
277
  requirements:
264
278
  - - "~>"
265
279
  - !ruby/object:Gem::Version
266
- version: 1.68.0
280
+ version: 1.72.0
267
281
  - !ruby/object:Gem::Dependency
268
282
  name: rubocop-minitest
269
283
  requirement: !ruby/object:Gem::Requirement
@@ -354,28 +368,28 @@ dependencies:
354
368
  requirements:
355
369
  - - ">="
356
370
  - !ruby/object:Gem::Version
357
- version: 0.14.0
371
+ version: 0.15.0
358
372
  type: :development
359
373
  prerelease: false
360
374
  version_requirements: !ruby/object:Gem::Requirement
361
375
  requirements:
362
376
  - - ">="
363
377
  - !ruby/object:Gem::Version
364
- version: 0.14.0
378
+ version: 0.15.0
365
379
  - !ruby/object:Gem::Dependency
366
380
  name: sequel
367
381
  requirement: !ruby/object:Gem::Requirement
368
382
  requirements:
369
383
  - - "~>"
370
384
  - !ruby/object:Gem::Version
371
- version: '5.63'
385
+ version: 5.88.0
372
386
  type: :development
373
387
  prerelease: false
374
388
  version_requirements: !ruby/object:Gem::Requirement
375
389
  requirements:
376
390
  - - "~>"
377
391
  - !ruby/object:Gem::Version
378
- version: '5.63'
392
+ version: 5.88.0
379
393
  description: software to fetch configuration from network devices and store them
380
394
  email:
381
395
  - saku@ytti.fi
@@ -408,6 +422,7 @@ files:
408
422
  - bin/oxidized
409
423
  - docs/Configuration.md
410
424
  - docs/Creating-Models.md
425
+ - docs/DeviceSimulation.md
411
426
  - docs/Hooks.md
412
427
  - docs/Issues.md
413
428
  - docs/Model-Notes/ADVA.md
@@ -437,33 +452,13 @@ files:
437
452
  - docs/Model-Notes/VRP-Huawei.md
438
453
  - docs/Model-Notes/Viptela.md
439
454
  - docs/Model-Notes/XGS4600-Zyxel.md
455
+ - docs/ModelUnitTests.md
440
456
  - docs/Outputs.md
441
457
  - docs/Release.md
442
458
  - docs/Ruby-API.md
443
459
  - docs/Sources.md
444
460
  - docs/Supported-OS-Types.md
445
461
  - docs/Troubleshooting.md
446
- - examples/device-simulation/README.md
447
- - examples/device-simulation/cmdsets/aoscx
448
- - examples/device-simulation/cmdsets/arubainstant
449
- - examples/device-simulation/cmdsets/asa
450
- - examples/device-simulation/cmdsets/ios
451
- - examples/device-simulation/cmdsets/nxos
452
- - examples/device-simulation/cmdsets/routeros
453
- - examples/device-simulation/cmdsets/srosmd
454
- - examples/device-simulation/device2yaml.rb
455
- - examples/device-simulation/yaml/aoscx_R0X25A-6410_FL.10.10.1100.yaml
456
- - examples/device-simulation/yaml/aoscx_R8N85A-C6000-48G-CL4_PL.10.08.1010.yaml
457
- - examples/device-simulation/yaml/arubainstant_IAP515_8.10.0.6_VWLC.yaml
458
- - examples/device-simulation/yaml/asa_5512_9.12-4-67_single-context.yaml
459
- - examples/device-simulation/yaml/asr920_16.8.1b.yaml
460
- - examples/device-simulation/yaml/garderos_R7709_003_006_068.yaml
461
- - examples/device-simulation/yaml/iosxe_C9200L-24P-4G_17.09.04a.yaml
462
- - examples/device-simulation/yaml/iosxe_C9800-L-F-K9_17.06.05.yaml
463
- - examples/device-simulation/yaml/riverbed_915.yaml
464
- - examples/device-simulation/yaml/routeros_CHR_7.10.1.yaml
465
- - examples/device-simulation/yaml/routeros_CHR_7.16.yaml
466
- - examples/device-simulation/yaml/routeros_L009UiGS_7.15.2.yaml
467
462
  - examples/podman-compose/Makefile
468
463
  - examples/podman-compose/README.md
469
464
  - examples/podman-compose/docker-compose.yml
@@ -479,6 +474,7 @@ files:
479
474
  - examples/podman-compose/oxidized-ssh/.gitignore
480
475
  - examples/podman-compose/oxidized-ssh/README.md
481
476
  - extra/auto-reload-config.runit
477
+ - extra/device2yaml.rb
482
478
  - extra/gitdiff-msteams.sh
483
479
  - extra/nagios_check_failing_nodes.rb
484
480
  - extra/oxidized-report-git-commits
@@ -582,6 +578,7 @@ files:
582
578
  - lib/oxidized/model/eltex.rb
583
579
  - lib/oxidized/model/enterasys.rb
584
580
  - lib/oxidized/model/enterasys800.rb
581
+ - lib/oxidized/model/enterprise_sonic.rb
585
582
  - lib/oxidized/model/eos.rb
586
583
  - lib/oxidized/model/f5os.rb
587
584
  - lib/oxidized/model/fabricos.rb
@@ -615,6 +612,7 @@ files:
615
612
  - lib/oxidized/model/ironware.rb
616
613
  - lib/oxidized/model/isam.rb
617
614
  - lib/oxidized/model/junos.rb
615
+ - lib/oxidized/model/kornfeldos.rb
618
616
  - lib/oxidized/model/lancom.rb
619
617
  - lib/oxidized/model/lenovonos.rb
620
618
  - lib/oxidized/model/linksyssrw.rb
@@ -1,173 +0,0 @@
1
- # Device simulation
2
- Oxidized supports [150+ devices](/docs/Supported-OS-Types.md).
3
- No developer has access to all of these devices, which makes the task of
4
- maintaining Oxidized difficult:
5
-
6
- - issues can't be resolved because the developer has no access to the device.
7
- - further developments can produce regressions.
8
-
9
- In order to address this, we can simulate the devices. An example for a
10
- simulation are the [model unit tests](/spec/model) but one could also simulate
11
- a device within a ssh server.
12
-
13
- The simulation of devices is currently focused on ssh-based devices. This may
14
- be extended to other inputs like telnet or ftp in the future.
15
-
16
- ## YAML Simulation Data
17
- The underlying data for the simulation is a [YAML](https://yaml.org/) file in
18
- which we store all relevant information about the device. The most important
19
- information is the responses to the commands used in the oxidized models.
20
-
21
- The YAML simulation files are stored under
22
- [/examples/device-simulation/yaml/](/examples/device-simulation/yaml/).
23
-
24
- ### Creating a YAML file with device2yaml.rb
25
- A device does not only output the ASCII text we can see in the console.
26
- It adds ANSI-escape code for nice colors, bold and underline, \r and so on.
27
- These are key factors in prompt issues so they must be represented in the YAML
28
- file. We use the ruby string format with interpolations like \r \e and so on.
29
- Another important point is trailing spaces at the end of lines. Some text
30
- editors automatically remove trailing spaces, so we code them with \x20.
31
-
32
- Although a YAML file could be written by hand, this is quite a tedious task to
33
- catch all the extra codes and code them into YAML. This can be
34
- automated with the ruby script
35
- [device2yaml.rb](/examples/device-simulation/device2yaml.rb).
36
-
37
- `device2yaml.rb` needs ruby and the gem
38
- [net-ssh](https://rubygems.org/gems/net-ssh/) to run. On debian, you can install
39
- them with `sudo apt install ruby-net-ssh`
40
-
41
- Run `device2yaml.rb` in the directory `/examples/device-simulation/`, the
42
- online help tells you the options.
43
- ```
44
- device-simulation$ ./device2yaml.rb
45
- Missing a host to connect to...
46
-
47
- Usage: device2yaml.rb [user@]host [options]
48
- -c, --cmdset file Mandatory: specify the commands to be run
49
- -o, --output file Specify an output YAML-file
50
- -t, --timeout value Specify the idle timeout beween commands (default: 5 seconds)
51
- -e, --exec-mode Run ssh in exec mode (without tty)
52
- -h, --help Print this help
53
- ```
54
-
55
- - `[user@]host` specifies the user and host to connect to the device. The
56
- password will be prompted interactively by the script. If you do not specify a
57
- user, it will use the user executing the script.
58
- - You must list the commands you want to run on the device in a file. Just
59
- enter one command per line. It is important that you enter exactly the commands
60
- used by the oxidized model, and no abbreviation like `sh run`. Do not forget
61
- to insert the `post_login` commands at the beginning if the model has some and
62
- also the `pre_logout`commands at the end.
63
- Predefined command sets for some models are stored in
64
- `/examples/device-simulation/cmdsets`.
65
- - `device2yaml.rb` waits an idle timeout after the last received data before
66
- sending the next command. The default is 5 seconds. If your device makes a
67
- longer pause than 5 seconds before or within a command, you will see that the
68
- output of the command is shortened or slips into the next command in the yaml
69
- file. You will have to change the idle timeout to a greater value to address
70
- this.
71
- - When run without the output argument, `device2yaml.rb` will only print the ssh
72
- output to the standard output. You must use `-o <model_HW_SW.yaml>` to store the
73
- collected data in a YAML file.
74
- - If your oxidized model uses ssh exec mode (look for `exec true` in the model),
75
- you will have to use the option `-e` to run device2yaml in ssh exec mode.
76
-
77
- Note that `device2yaml.rb` takes some time to run because of the idle
78
- timeout of (default) 5 seconds between each command. You can press the "Escape"
79
- key if you know there is no more data to come for the current command (when you
80
- see the prompt for the next command), and the script will stop waiting and
81
- directly process the next command.
82
-
83
- Here are two examples of how to run the script:
84
- ```shell
85
- ./device2yaml.rb OX-SW123.sample.domain -c cmdsets/aoscx -o yaml/aoscx_R8N85A-C6000-48G-CL4_PL.10.08.1010.yaml
86
- ./device2yaml.rb admin@r7 -c cmdsets/routeros -e -o yaml/routeros_CHR_7.10.1.yaml
87
- ```
88
-
89
- ### Publishing the YAML simulation file to oxidized
90
- Publishing the YAML simulation file of your device helps maintain oxidized.
91
- This task may take some time, and we are very grateful that you take this time
92
- for the community!
93
-
94
- You should pay attention to removing or replacing anything you don't want to
95
- share with the rest of the world, for example:
96
-
97
- - Passwords
98
- - IP Adresses
99
- - Serial numbers
100
-
101
- You can also shorten the configuration if you want - we don't need 48 times the
102
- same config for each interface, but it doesn't hurt either.
103
-
104
- Take your time, this is an important task: after you have
105
- uploaded your file on github, it may be impossible to remove it. You can use
106
- search/replace to make consistent and faster changes (change the hostname).
107
-
108
- You can leave the section `oxidized_output` unchanged, it is only used for
109
- [model unit tests](/spec/model). You will find an explanation of how to produce
110
- the `oxidized_output`-section in the README.md there.
111
-
112
- The YAML simulation file should be stored under
113
- [/examples/device-simulation/yaml/](/examples/device-simulation/yaml/. It
114
- should be named so that it can be easily recognized: model, hardware type,
115
- software version and optionally a description if you need to differentiate two
116
- YAML files:
117
-
118
- - #model_#hardware_#software.yaml
119
- - #model_#hardware_#software_#description.yaml
120
-
121
- Examples:
122
-
123
- - garderos_R7709_003_006_068.yaml
124
- - iosxe_C9200L-24P-4G_17.09.04a.yaml
125
- - asa_5512_9.12-4-67_single-context.yaml
126
-
127
- ### Interactive mode
128
- The `device2yaml.rb` script is a little dumb and needs some help, especially
129
- when having a device sending its output page by page and requiring you to press
130
- space for the next page. `device2yaml.rb` does not know how to handle this.
131
-
132
- While `device2yaml.rb` is running, you can type anything to the keyboard, it
133
- will be send to the remote device. So you can press space or 'n' to get the
134
- next page.
135
-
136
- You can also use this to enter an enable password.
137
-
138
- If you press the "Esc" key, `device2yaml.rb` will not wait for the idle timeout
139
- and will process the next command right away.
140
-
141
- ### YAML Format
142
- The yaml file has three sections:
143
- - init_prompt: describing the lines send by the device before we can send a
144
- command. It usually includes MOTD banners, and must include the first prompt.
145
- - commands: the commands the oxidized model sends to the network device and the
146
- expected output.
147
- - oxidized_output: the expected output of oxidized, so that you can compare it
148
- to the output generated by the unit test. This is optional and only used for
149
- unit tests.
150
-
151
- The outputs are multiline and use YAML block scalars (`|`), with the trailing \n
152
- removed (`-` after `|`). The outputs include the echo of the given command and
153
- the next prompt. Escape characters are coded in Ruby style (\n, \r...).
154
-
155
- Here is a shortened example of a YAML file:
156
- ```yaml
157
- ---
158
- init_prompt: |-
159
- \e[4m\rLAB-R1234_Garderos#\e[m\x20
160
- commands:
161
- show system version: |-
162
- show system version
163
- grs-gwuz-armel/003_005_068 (Garderos; 2021-04-30 16:19:35)
164
- \e[4m\rLAB-R1234_Garderos#\e[m\x20
165
- # ...
166
- exit: ""
167
- oxidized_output: |
168
- # grs-gwuz-armel/003_005_068 (Garderos; 2021-04-30 16:19:35)
169
- #\x20
170
- # ...
171
- ```
172
-
173
-
@@ -1,9 +0,0 @@
1
- no page
2
- show version
3
- show environment
4
- show module
5
- show interface transceiver
6
- show system | exclude "Up Time" | exclude "CPU" | exclude "Memory" | exclude "Pkts .x" | exclude "Lowest" | exclude "Missed"
7
- show running-config
8
- show system
9
- exit
@@ -1,5 +0,0 @@
1
- show version
2
- show activate status
3
- show aps
4
- show running-config no-encrypt
5
- exit
@@ -1,7 +0,0 @@
1
- enable
2
- terminal pager 0
3
- show mode
4
- show version
5
- show inventory
6
- more system:running-config
7
- exit
@@ -1,7 +0,0 @@
1
- terminal length 0
2
- terminal width 0
3
- show version
4
- show vtp status
5
- show inventory
6
- show running-config
7
- exit
@@ -1,5 +0,0 @@
1
- terminal length 0
2
- show version
3
- show inventory
4
- show running-config
5
- exit
@@ -1,5 +0,0 @@
1
- /system resource print
2
- /system package update print
3
- /system history print without-paging
4
- /export show-sensitive
5
- quit
@@ -1,11 +0,0 @@
1
- environment more false
2
- show system information
3
- show card state
4
- show chassis
5
- file show bootlog.txt
6
- admin show configuration debug full-context
7
- file show config.dbg
8
- admin show configuration configure | match persistent-indices post-lines 10000
9
- admin show configuration bof full-context
10
- admin show configuration configure full-context
11
- logout