expectacle 0.0.4 → 0.0.5

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: '029ac71fb1381c439677ac4c36009c7056be529b'
4
- data.tar.gz: 23298b873bd9b727806fe09e3dcd8b20d598b5e8
3
+ metadata.gz: a27f91b34aba3a57cd043c6114aab2f7156ab77b
4
+ data.tar.gz: 8b10c0d7612d062d73a60bd1cfb5831f1d47cf7f
5
5
  SHA512:
6
- metadata.gz: 11536ed5527986defcccf7b3017f4683ecde6a04c09271676403788a37226090c295d07576f3ed656f7e39a3965575b270dddf3d0a5b871ccd50e54120b70578
7
- data.tar.gz: 4202028b4045286aa6a97521d8939adf8eb6c470178af86fc6b5b38908b8517bff1a3286846eb9fbb60b7f5bd19cfb426c88c5a598c07a204412c4d474acb01f
6
+ metadata.gz: e50f612f54dd268b7c1a029f9ee154ed93ac00e309ad837b958f9ab3443b526704cbbd8eac15cd5cc4d94db978a7cf6520f1349b7e1d7178877fcfb742029ff4
7
+ data.tar.gz: 3204c24a65f8af707e13c14744cf442c94b8fddc9212308d82bf5f7e201d5fe9ae122180c0eba4458b20ba8043b5238471d7695ea6d332e7b9eb3172bf32b9b6
data/.rubocop.yml CHANGED
@@ -4,6 +4,10 @@ Metrics/LineLength:
4
4
  Exclude:
5
5
  - 'spec/**/*_spec.rb'
6
6
 
7
+ Metrics/BlockLength:
8
+ Exclude:
9
+ - 'spec/**/*_spec.rb'
10
+
7
11
  Style/BlockComments:
8
12
  Exclude:
9
13
  - 'spec/spec_helper.rb'
data/.rubocop_todo.yml CHANGED
@@ -10,18 +10,13 @@
10
10
  Metrics/AbcSize:
11
11
  Max: 18
12
12
 
13
- # Offense count: 2
14
- # Configuration parameters: CountComments.
15
- Metrics/ClassLength:
16
- Max: 140
17
-
18
13
  # Offense count: 1
19
14
  # Configuration parameters: CountComments.
20
15
  Metrics/MethodLength:
21
- Max: 12
16
+ Max: 15
22
17
 
23
18
  # Offense count: 1
24
19
  # Configuration parameters: AllowedVariables.
25
20
  Style/GlobalVars:
26
21
  Exclude:
27
- - 'lib/expectacle/thrower_base.rb'
22
+ - 'lib/expectacle/thrower_base.rb' # $expect_verbose
data/Gemfile CHANGED
@@ -10,9 +10,9 @@ group :test do
10
10
  end
11
11
 
12
12
  group :development do
13
- gem 'yard'
14
- gem 'redcarpet'
15
13
  gem 'github-markup'
14
+ gem 'redcarpet'
15
+ gem 'yard'
16
16
  end
17
17
 
18
18
  gem 'rubocop'
data/README.md CHANGED
@@ -211,10 +211,10 @@ For example, if you want to save configuration of a Cisco device to tftp server:
211
211
  - "copy run tftp://<%= @host_param[:tftp_server] %>/<%= @host_param[:hostname] %>.confg"
212
212
  ```
213
213
 
214
- ## SSH Options
214
+ ## Default SSH Options
215
215
 
216
- When use `ssh` (OpenSSH) command to spawn device, the user can set options for the command via `#{base_dir}/ssh_opts.yml`.
217
- With options as list in [ssh_opts.yml](./vendor/ssh_opts.yml),
216
+ When use `ssh` (OpenSSH) command to spawn device, the user can set options for the command via `#{base_dir}/opts/ssh_opts.yml`.
217
+ With options as list in [ssh_opts.yml](./vendor/opts/ssh_opts.yml),
218
218
  ```
219
219
  - '-o StrictHostKeyChecking=no'
220
220
  - '-o KexAlgorithms=+diffie-hellman-group1-sha1'
@@ -228,6 +228,30 @@ Host *
228
228
  Ciphers +aes128-cbc,3des-cbc,aes192-cbc,aes256-cbc
229
229
  ```
230
230
 
231
+ ## Use Local Serial Console
232
+
233
+ Expectacle can handle `cu` (call up another system) command to operate via device local serial port.
234
+
235
+ If you use Ubuntu, install `cu` at first.
236
+ ```
237
+ sudo apt install cu
238
+ ```
239
+
240
+ Set parameter `:protocol` to `cu`, and write `cu` command options as `:cu_opts`. Usually, one serial port correspond to one device. So host parameter `:cu_opts` is used as options to connect a host via serial port. For example:
241
+ ```
242
+ - :hostname : 'l2sw1'
243
+ :type : 'c3750g'
244
+ :protocol : 'cu'
245
+ :cu_opts : '-l /dev/ttyUSB0 -s 9600'
246
+ ```
247
+ File `#{base_dir}/opts/cu_opts.yml` has default options for `cu` command.
248
+
249
+ At last, execute by `run_command` with `sudo`. Because it requires superuser permission to handle local device.
250
+ ```
251
+ sudo -E bundle exec run_command -r -h l2switch.yml -c cisco_show_version.yml
252
+ ```
253
+ **Notice** : Without `sudo -E` (`--preserve-env`) option, it do not preserve environment variables such as username/password and others you defined.
254
+
231
255
  ## TODO
232
256
 
233
257
  ### Sub prompt operation (interactive command)
data/Rakefile CHANGED
@@ -1,12 +1,12 @@
1
1
  require 'bundler/gem_tasks'
2
- task default: [:spec, :rubocop]
2
+ task default: %i[spec rubocop]
3
3
 
4
4
  begin
5
5
  require 'rspec/core/rake_task'
6
6
  RSpec::Core::RakeTask.new
7
7
  rescue LoadError
8
8
  task :spec do
9
- $stderr.puts 'RSpec is disabled'
9
+ warn 'RSpec is disabled'
10
10
  end
11
11
  end
12
12
 
@@ -15,7 +15,7 @@ begin
15
15
  RuboCop::RakeTask.new
16
16
  rescue LoadError
17
17
  task :rubocop do
18
- $stderr.puts 'RuboCop is disabled'
18
+ warn 'RuboCop is disabled'
19
19
  end
20
20
  end
21
21
 
@@ -27,6 +27,6 @@ begin
27
27
  end
28
28
  rescue LoadError
29
29
  task :yard do
30
- $stderr.puts 'YARD is disabled'
30
+ warn 'YARD is disabled'
31
31
  end
32
32
  end
data/expectacle.gemspec CHANGED
@@ -1,5 +1,4 @@
1
- # coding: utf-8
2
- lib = File.expand_path('../lib', __FILE__)
1
+ lib = File.expand_path('lib', __dir__)
3
2
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
3
  require 'expectacle/version'
5
4
 
@@ -1,8 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'expectacle/thrower_base'
3
+ require 'expectacle/thrower_preview'
4
+ require 'expectacle/thrower_utils'
4
5
 
5
6
  module Expectacle
7
+ # Maximum number to retly authentication
8
+ MAX_AUTH_COUNT = 10
9
+
6
10
  # Thrower logic(command list operation)
7
11
  class Thrower < ThrowerBase
8
12
  # Run(exec) commands for all hosts.
@@ -11,35 +15,29 @@ module Expectacle
11
15
  def run_command_for_all_hosts(hosts, commands)
12
16
  hosts.each do |each|
13
17
  @commands = commands.dup # Notice: @commands will be decremented.
18
+ @commands_len = @commands.length
19
+ @auth_count = 0
14
20
  @host_param = each
15
21
  run_command_for_host
16
22
  end
17
23
  end
18
24
 
19
- # Preview all parameters for all hosts.
20
- # @param [Array<Hash>] hosts Host parameters (read from host list file).
21
- # @param [Array<String>] commands Commands (read from command list file).
22
- def preview_parameter(hosts, commands)
23
- @commands = commands
24
- hosts.each do |each|
25
- @host_param = each
26
- preview_command_for_host
27
- end
28
- end
29
-
30
25
  private
31
26
 
32
27
  def run_command_for_host
33
28
  ready_to_open_host_session do |spawn_cmd|
34
29
  open_interactive_process(spawn_cmd) do
30
+ before_run_command
35
31
  run_command
36
32
  end
37
33
  end
38
34
  end
39
35
 
40
- def preview_command_for_host
41
- ready_to_open_host_session do |spawn_cmd|
42
- print YAML.dump(whole_previewed_parameters(spawn_cmd))
36
+ def before_run_command
37
+ return unless @local_serial
38
+ # for `cu` command
39
+ @reader.expect(/^Connected\./, 1) do
40
+ write_and_logging 'Send enter to connect serial', "\r\n", true
43
41
  end
44
42
  end
45
43
 
@@ -50,36 +48,11 @@ module Expectacle
50
48
  end
51
49
  end
52
50
 
53
- def previewed_host_param
54
- host_param = @host_param.dup
55
- enable_mode = @enable_mode
56
- @enable_mode = false
57
- host_param[:username] = embed_user_name
58
- host_param[:password] = embed_password
59
- @enable_mode = true
60
- host_param[:enable] = embed_password
61
- @enable_mode = enable_mode
62
- host_param
63
- end
64
-
65
- def previewed_commands
66
- @commands.map { |cmd| embed_command(cmd) }
67
- end
68
-
69
- def whole_previewed_parameters(spawn_cmd)
70
- {
71
- spawn_cmd: spawn_cmd,
72
- prompt: @prompt,
73
- host: previewed_host_param,
74
- commands: previewed_commands
75
- }
76
- end
77
-
78
51
  def exec_rest_commands
79
52
  if !@commands.empty?
80
53
  yield
81
54
  else
82
- write_and_logging 'Send break: ', 'exit'
55
+ close_session
83
56
  end
84
57
  end
85
58
 
@@ -118,6 +91,7 @@ module Expectacle
118
91
  end
119
92
 
120
93
  def exec_each_prompt(prompt)
94
+ check_auth_count
121
95
  case prompt
122
96
  when /#{@prompt[:password]}/, /#{@prompt[:enable_password]}/
123
97
  write_and_logging 'Send password', embed_password, true
@@ -2,16 +2,12 @@
2
2
 
3
3
  require 'pty'
4
4
  require 'expect'
5
- require 'yaml'
6
- require 'erb'
7
- require 'logger'
8
- require 'syslog/logger'
5
+ require 'expectacle/thrower_base_io'
6
+ require 'expectacle/thrower_base_params'
9
7
 
10
8
  module Expectacle
11
9
  # Basic state setup/management
12
10
  class ThrowerBase
13
- # @return [Logger] Logger instance.
14
- attr_accessor :logger
15
11
  # @return [String] Base directory path to find params/hosts/commands file.
16
12
  attr_reader :base_dir
17
13
 
@@ -58,31 +54,17 @@ module Expectacle
58
54
  File.join @base_dir, 'commands'
59
55
  end
60
56
 
61
- private
62
-
63
- def default_io_logger(logger_io, progname)
64
- logger = Logger.new(logger_io)
65
- logger.progname = progname
66
- logger.datetime_format = '%Y-%m-%d %H:%M:%D %Z'
67
- logger
57
+ # Path to span command options file directory.
58
+ # @return [String]
59
+ def opts_dir
60
+ File.join @base_dir, 'opts'
68
61
  end
69
62
 
70
- def setup_default_logger(logger)
71
- progname = 'Expectacle'
72
- @logger = if logger == :syslog
73
- Syslog::Logger.new(progname)
74
- else
75
- default_io_logger(logger, progname)
76
- end
77
- @logger.level = Logger::INFO
78
- @logger.formatter = proc do |severity, datetime, pname, msg|
79
- "#{datetime} #{pname} [#{severity}] #{msg}\n"
80
- end
81
- end
63
+ private
82
64
 
83
65
  def ready_to_open_host_session
84
- # prompt regexp of device
85
- load_prompt_file
66
+ @local_serial = false # default for host
67
+ load_prompt_file # prompt regexp of device
86
68
  spawn_cmd = make_spawn_command
87
69
  if @prompt && spawn_cmd
88
70
  yield spawn_cmd
@@ -92,7 +74,7 @@ module Expectacle
92
74
  end
93
75
 
94
76
  def do_on_interactive_process
95
- until @reader.eof?
77
+ until @reader.closed? || @reader.eof?
96
78
  @reader.expect(expect_regexp, @timeout) do |match|
97
79
  yield match
98
80
  end
@@ -111,93 +93,6 @@ module Expectacle
111
93
  @writer.sync = true
112
94
  yield
113
95
  end
114
- @logger.info "End spawn: #{@host_param[:hostname]}"
115
- end
116
-
117
- def ssh_command
118
- opts = load_ssh_opts_file
119
- ['ssh', opts, "-l #{embed_user_name}", embed_ipaddr].join(' ')
120
- end
121
-
122
- def make_spawn_command
123
- case @host_param[:protocol]
124
- when /^telnet$/i
125
- ['telnet', embed_ipaddr].join(' ')
126
- when /^ssh$/i
127
- ssh_command
128
- else
129
- @logger.error "Unknown protocol #{@host_param[:protocol]}"
130
- nil
131
- end
132
- end
133
-
134
- def load_yaml_file(file_type, file_name)
135
- YAML.load_file file_name
136
- rescue StandardError => error
137
- @logger.error "Cannot load #{file_type}: #{file_name}"
138
- raise error
139
- end
140
-
141
- def load_prompt_file
142
- prompt_file = "#{prompts_dir}/#{@host_param[:type]}_prompt.yml"
143
- @prompt = load_yaml_file('prompt file', prompt_file)
144
- end
145
-
146
- def load_ssh_opts_file
147
- ssh_opts_file = "#{@base_dir}/ssh_opts.yml"
148
- @ssh_opts = load_yaml_file('ssh opts file', ssh_opts_file)
149
- end
150
-
151
- def expect_regexp
152
- /
153
- ( #{@prompt[:password]} | #{@prompt[:enable_password]}
154
- | #{@prompt[:username]}
155
- | #{@prompt[:command1]} | #{@prompt[:command2]}
156
- | #{@prompt[:sub1]} | #{@prompt[:sub2]}
157
- | #{@prompt[:yn]}
158
- )\s*$
159
- /x
160
- end
161
-
162
- def write_and_logging(message, command, secret = false)
163
- logging_message = secret ? message : message + command
164
- @logger.info logging_message
165
- @writer.puts command
166
- end
167
-
168
- def check_embed_envvar(command)
169
- return unless command =~ /<%=\s*ENV\[[\'\"]?(.+)[\'\"]\]?\s*%>/
170
- envvar_name = Regexp.last_match(1)
171
- if !ENV.key?(envvar_name)
172
- @logger.error "Variable name: #{envvar_name} is not found in ENV"
173
- elsif ENV[envvar_name] =~ /^\s*$/
174
- @logger.warn "Env var: #{envvar_name} exists, but null string"
175
- end
176
- end
177
-
178
- def embed_password
179
- @host_param[:enable] = '_NOT_DEFINED_' unless @host_param.key?(:enable)
180
- base_str = @enable_mode ? @host_param[:enable] : @host_param[:password]
181
- check_embed_envvar(base_str)
182
- passwd_erb = ERB.new(base_str)
183
- passwd_erb.result(binding)
184
- end
185
-
186
- def embed_command(command)
187
- command_erb = ERB.new(command)
188
- command_erb.result(binding)
189
- end
190
-
191
- def embed_user_name
192
- check_embed_envvar(@host_param[:username])
193
- uname_erb = ERB.new(@host_param[:username])
194
- uname_erb.result(binding)
195
- end
196
-
197
- def embed_ipaddr
198
- check_embed_envvar(@host_param[:ipaddr])
199
- ipaddr_erb = ERB.new(@host_param[:ipaddr])
200
- ipaddr_erb.result(binding)
201
96
  end
202
97
  end
203
98
  end
@@ -0,0 +1,68 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'yaml'
4
+ require 'logger'
5
+ require 'syslog/logger'
6
+
7
+ module Expectacle
8
+ # Basic state setup/management
9
+ class ThrowerBase
10
+ # @return [Logger] Logger instance.
11
+ attr_accessor :logger
12
+
13
+ private
14
+
15
+ def write_and_logging(message, command, secret = false)
16
+ logging_message = secret ? message : message + command
17
+ @logger.info logging_message
18
+ if @writer.closed?
19
+ @logger.error "Try to write #{command}, but writer closed"
20
+ @commands.clear
21
+ else
22
+ @writer.puts command
23
+ end
24
+ end
25
+
26
+ def default_io_logger(logger_io, progname)
27
+ logger = Logger.new(logger_io)
28
+ logger.progname = progname
29
+ logger.datetime_format = '%Y-%m-%d %H:%M:%D %Z'
30
+ logger
31
+ end
32
+
33
+ def setup_default_logger(logger)
34
+ progname = 'Expectacle'
35
+ @logger = if logger == :syslog
36
+ Syslog::Logger.new(progname)
37
+ else
38
+ default_io_logger(logger, progname)
39
+ end
40
+ @logger.level = Logger::INFO
41
+ @logger.formatter = proc do |severity, datetime, pname, msg|
42
+ "#{datetime} #{pname} [#{severity}] #{msg}\n"
43
+ end
44
+ end
45
+
46
+ def load_yaml_file(file_type, file_name)
47
+ YAML.load_file file_name
48
+ rescue StandardError => error
49
+ @logger.error "Cannot load #{file_type}: #{file_name}"
50
+ raise error
51
+ end
52
+
53
+ def load_prompt_file
54
+ prompt_file = "#{prompts_dir}/#{@host_param[:type]}_prompt.yml"
55
+ @prompt = load_yaml_file('prompt file', prompt_file)
56
+ end
57
+
58
+ def load_spawn_command_opts_file
59
+ opts_file = "#{opts_dir}/#{@host_param[:protocol]}_opts.yml"
60
+ if File.exist?(opts_file)
61
+ load_yaml_file("#{@host_param[:protocol]} opts file", opts_file)
62
+ else
63
+ @logger.warn "Opts file #{opts_file} not found."
64
+ []
65
+ end
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,80 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'erb'
4
+
5
+ module Expectacle
6
+ # Basic state setup/management
7
+ class ThrowerBase
8
+ private
9
+
10
+ def ssh_command
11
+ opts = load_spawn_command_opts_file
12
+ ['ssh', opts, "-l #{embed_user_name}", embed_ipaddr].join(' ')
13
+ end
14
+
15
+ def cu_command
16
+ @local_serial = true
17
+ opts = load_spawn_command_opts_file
18
+ ['cu', @host_param[:cu_opts], opts].join(' ')
19
+ end
20
+
21
+ def expect_regexp
22
+ /
23
+ ( #{@prompt[:password]} | #{@prompt[:enable_password]}
24
+ | #{@prompt[:username]}
25
+ | #{@prompt[:command1]} | #{@prompt[:command2]}
26
+ | #{@prompt[:sub1]} | #{@prompt[:sub2]}
27
+ | #{@prompt[:yn]}
28
+ )\s*$
29
+ /x
30
+ end
31
+
32
+ def make_spawn_command
33
+ case @host_param[:protocol]
34
+ when /^telnet$/i
35
+ ['telnet', embed_ipaddr].join(' ')
36
+ when /^ssh$/i
37
+ ssh_command
38
+ when /^cu$/i
39
+ cu_command
40
+ else
41
+ @logger.error "Unknown protocol #{@host_param[:protocol]}"
42
+ nil
43
+ end
44
+ end
45
+
46
+ def check_embed_envvar(command)
47
+ return unless command =~ /<%=\s*ENV\[[\'\"]?(.+)[\'\"]\]?\s*%>/
48
+ envvar_name = Regexp.last_match(1)
49
+ if !ENV.key?(envvar_name)
50
+ @logger.error "Variable name: #{envvar_name} is not found in ENV"
51
+ elsif ENV[envvar_name] =~ /^\s*$/
52
+ @logger.warn "Env var: #{envvar_name} exists, but null string"
53
+ end
54
+ end
55
+
56
+ def embed_var(param)
57
+ check_embed_envvar(param)
58
+ erb = ERB.new(param)
59
+ erb.result(binding)
60
+ end
61
+
62
+ def embed_password
63
+ @host_param[:enable] = '_NOT_DEFINED_' unless @host_param.key?(:enable)
64
+ base_str = @enable_mode ? @host_param[:enable] : @host_param[:password]
65
+ embed_var(base_str)
66
+ end
67
+
68
+ def embed_command(command)
69
+ embed_var(command)
70
+ end
71
+
72
+ def embed_user_name
73
+ embed_var(@host_param[:username])
74
+ end
75
+
76
+ def embed_ipaddr
77
+ embed_var(@host_param[:ipaddr])
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'expectacle/thrower_base'
4
+
5
+ module Expectacle
6
+ # Thrower logic(command list operation)
7
+ class Thrower < ThrowerBase
8
+ # Preview all parameters for all hosts.
9
+ # @param [Array<Hash>] hosts Host parameters (read from host list file).
10
+ # @param [Array<String>] commands Commands (read from command list file).
11
+ def preview_parameter(hosts, commands)
12
+ print YAML.dump(previewed_data(hosts, commands))
13
+ end
14
+
15
+ # Preview all parameters for all hosts (for testing)
16
+ # @param [Array<Hash>] hosts Host parameters (read from host list file).
17
+ # @param [Array<String>] commands Commands (read from command list file).
18
+ def previewed_data(hosts, commands)
19
+ @commands = commands
20
+ hosts.map do |each|
21
+ @host_param = each
22
+ preview_command_for_host
23
+ end
24
+ end
25
+
26
+ private
27
+
28
+ def preview_command_for_host
29
+ ready_to_open_host_session do |spawn_cmd|
30
+ whole_previewed_parameters(spawn_cmd)
31
+ end
32
+ end
33
+
34
+ def previewed_host_param
35
+ host_param = @host_param.dup
36
+ enable_mode = @enable_mode
37
+ @enable_mode = false
38
+ host_param[:username] = embed_user_name
39
+ host_param[:password] = embed_password
40
+ host_param[:ipaddr] = embed_ipaddr
41
+ @enable_mode = true
42
+ host_param[:enable] = embed_password
43
+ @enable_mode = enable_mode
44
+ host_param
45
+ end
46
+
47
+ def previewed_commands
48
+ @commands.map { |cmd| embed_command(cmd) }
49
+ end
50
+
51
+ def whole_previewed_parameters(spawn_cmd)
52
+ {
53
+ spawn_cmd: spawn_cmd,
54
+ prompt: @prompt,
55
+ host: previewed_host_param,
56
+ commands: previewed_commands
57
+ }
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'expectacle/thrower_base_io'
4
+
5
+ module Expectacle
6
+ # Thrower logic(command list operation)
7
+ class Thrower < ThrowerBase
8
+ private
9
+
10
+ def check_auth_count
11
+ if @commands.length == @commands_len
12
+ @auth_count += 1
13
+ else
14
+ @auth_count = 0
15
+ @commands_len = @commands.length
16
+ end
17
+ return unless @auth_count > MAX_AUTH_COUNT
18
+ @logger.error "Close: Too many auth retries (#{@auth_count} times)"
19
+ @commands = []
20
+ close_session
21
+ end
22
+
23
+ def clear_auth_count
24
+ @auth_count = 0
25
+ end
26
+
27
+ def close_session
28
+ write_and_logging 'Send break: ', 'exit'
29
+ return unless @local_serial
30
+ @logger.info 'Close IO for spawn command'
31
+ @reader.close
32
+ @writer.close
33
+ end
34
+ end
35
+ end
@@ -1,4 +1,4 @@
1
1
  module Expectacle
2
2
  # Gem version
3
- VERSION = '0.0.4'.freeze
3
+ VERSION = '0.0.5'.freeze
4
4
  end
@@ -0,0 +1,4 @@
1
+ - 'term len 0'
2
+ - 'conf term'
3
+ - 'do show version | include IOS'
4
+ - 'exit'
@@ -1,16 +1,17 @@
1
1
  - :hostname : 'l2sw1'
2
2
  :type : 'c3750g'
3
- :ipaddr : '192.168.20.150'
4
- :protocol : 'ssh'
3
+ :ipaddr : '192.168.255.1'
4
+ :protocol : 'cu'
5
+ :cu_opts : '-l /dev/ttyUSB0 -s 9600'
5
6
  :username : "<%= ENV['L2SW_USER'] %>"
6
7
  :password : "<%= ENV['L2SW_PASS'] %>"
7
8
  :enable : "<%= ENV['L2SW_PASS'] %>"
8
- :tftp_server: '192.168.20.170'
9
+ :tftp_server: '192.168.2.16'
9
10
  - :hostname : 'l2sw2'
10
11
  :type : 'c3750g'
11
- :ipaddr : '192.168.20.151'
12
+ :ipaddr : '192.168.255.2'
12
13
  :protocol : 'ssh'
13
14
  :username : "<%= ENV['L2SW_USER'] %>"
14
15
  :password : "<%= ENV['L2SW_PASS'] %>"
15
16
  :enable : "<%= ENV['L2SW_PASS'] %>"
16
- :tftp_server: '192.168.20.170'
17
+ :tftp_server: '192.168.2.16'
@@ -0,0 +1,2 @@
1
+ - '--parity=none'
2
+ # - '--debug all'
File without changes
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: expectacle
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - stereocat
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-05-07 00:00:00.000000000 Z
11
+ date: 2018-05-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -49,19 +49,25 @@ files:
49
49
  - lib/expectacle.rb
50
50
  - lib/expectacle/thrower.rb
51
51
  - lib/expectacle/thrower_base.rb
52
+ - lib/expectacle/thrower_base_io.rb
53
+ - lib/expectacle/thrower_base_params.rb
54
+ - lib/expectacle/thrower_preview.rb
55
+ - lib/expectacle/thrower_utils.rb
52
56
  - lib/expectacle/version.rb
53
57
  - vendor/commands/cisco_save_config_tftp.yml
54
58
  - vendor/commands/cisco_show_arp.yml
59
+ - vendor/commands/cisco_show_version.yml
55
60
  - vendor/commands/pica8_ovs_info.yml
56
61
  - vendor/commands/ssg_get_arp.yml
57
62
  - vendor/commands/ssg_save_config_tftp.yml
58
63
  - vendor/hosts/fw.yml
59
64
  - vendor/hosts/l2switch.yml
60
65
  - vendor/hosts/ofswitch.yml
66
+ - vendor/opts/cu_opts.yml
67
+ - vendor/opts/ssh_opts.yml
61
68
  - vendor/prompts/c3750g_prompt.yml
62
69
  - vendor/prompts/pica8_prompt.yml
63
70
  - vendor/prompts/ssg_prompt.yml
64
- - vendor/ssh_opts.yml
65
71
  homepage: https://github.com/stereocat/expectacle
66
72
  licenses:
67
73
  - MIT