net-ssh-cli 1.7.0 → 1.8.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6dd5a361663ac8c45079e1833688679c699f0022c1aa222f5e315992b2457fa3
4
- data.tar.gz: d10d53f383ea82e100ff38ca46978fb27fbbaec1f49a8e6c4cd0e8cbca7abf9d
3
+ metadata.gz: e3557b2b202abb2f722b950d3f16d0e1c36a57716289f138d4c7f04edb453546
4
+ data.tar.gz: 8e58d5fa7d2e89021ffcb10751fff17526542d1d16314f79769f7e5f67451ea0
5
5
  SHA512:
6
- metadata.gz: 3ab1b89f32f27604f5c04ed43b262f69860884be324077acc5802b5d0b03ebb544818ea53e36a8c04077a00a47b8e320aa7ae664653fd6eddeb3f6d53f0e30b9
7
- data.tar.gz: 99bd97c5b61ea4853a3150047f8b88d6165e00a8e343b1a3ca746fd8648915555edcdc9bcbe0277568cf8d822e7622bdaa3a457604a7956bf9797d73a32eeef4
6
+ metadata.gz: 447b6ac1b58038620c3886241352e48bf5b89cbe0512a9506e08ab359378f62d3629f0007516bbcf4c360e204ea259d865d65e6396ee66d5d10c8c05275ede08
7
+ data.tar.gz: a898d86bf7d7fdde7977bd6161e1801606da032b96e3fb04ba6c55a6e104d1d2db0e8f68b12763afb63fee036c19e3c087af203563323543d4328a5fb61c487d
data/README.md CHANGED
@@ -60,6 +60,12 @@ end
60
60
  # => "echo 'bananas'\nbananas"
61
61
  cli.cmd "echo 'bananas'", rm_command: true, rm_prompt: true
62
62
  # => "bananas"
63
+ cli.cmd "echo 'bananas'", rm_command: true, rm_prompt: true, minimum_duration: 9
64
+ # => "bananas"
65
+ cli.cmd "echo 'bananas'", rm_command: true, rm_prompt: true, prompt: /\nuser@host:/m
66
+ # => "bananas"
67
+ cli.cmd "echo 'bananas'", rm_command: true, rm_prompt: true, timeout: 60
68
+ # => "bananas"
63
69
  ```
64
70
 
65
71
  Remove the command and the prompt for #cmd & #dialog by default
@@ -69,9 +75,23 @@ Remove the command and the prompt for #cmd & #dialog by default
69
75
  # => "bananas"
70
76
  ```
71
77
 
78
+ You can define a timeout for a `#cmd` in order to avoid hanging commands. The timeout gets passed into the underlying function #read_till.
79
+ This is usefull in case your prompt won't match because of an unexpected behaviour or undefined behaviour. For example some form of unexpected dialog.
80
+ The underlying implementation is using a soft timeout because `Timeout.timeout` is dangerous. In order to deal anyway with hanging low level issues, `Timeout.timeout` is used too, but with a higher value than the soft timeout.
81
+
82
+ ```ruby
83
+ cli = ssh.cli(default_prompt: /(\nuser@host):/m, read_till_timeout: 11)
84
+ cli.cmd "echo 'bananas'" # timeout is set to 11
85
+ # => "bananas"
86
+ cli.cmd "echo 'bananas'", timeout: 22 # timeout is set to 22
87
+ # => "bananas"
88
+ cli.cmd "sleep 33", timeout: 22 # timeout is set to 22
89
+ # Net::SSH::CLI::Error::CMD
90
+ ```
91
+
72
92
  ### #cmds
73
93
 
74
- It's the same as #cmd but for multiple commands.
94
+ It's the same as `#cmd` but for multiple commands.
75
95
 
76
96
  ```ruby
77
97
  cli.cmds ["echo 'bananas'", "echo 'apples'"], rm_command: true, rm_prompt: true
@@ -236,6 +256,38 @@ This works usually, but is not guaranteed to work well.
236
256
  # => "[my prompt]"
237
257
  ```
238
258
 
259
+ ### An outdated view of all available Options
260
+
261
+ Please check the file `lib/net/ssh/cli.rb` `OPTIONS` in order to get an up-to-date view of all available options, flags and arguments.
262
+
263
+ ```ruby
264
+ OPTIONS = ActiveSupport::HashWithIndifferentAccess.new(
265
+ default_prompt: /\n?^(\S+@.*)\z/, # the default prompt to search for
266
+ cmd_rm_prompt: false, # whether the prompt should be removed in the output of #cmd
267
+ cmd_rm_command: false, # whether the given command should be removed in the output of #cmd
268
+ cmd_rm_command_tail: "\n", # which format does the end of line return after a command has been submitted. Could be something like "ls\n" "ls\r\n" or "ls \n" (extra spaces)
269
+ run_impact: false, # whether to run #impact commands. This might align with testing|development|production. example #impact("reboot")
270
+ read_till_timeout: nil, # timeout for #read_till to find the match
271
+ read_till_hard_timeout: nil, # hard timeout for #read_till to find the match using Timeout.timeout(hard_timeout) {}. Might creates unpredicted sideffects
272
+ read_till_hard_timeout_factor: 1.2, # hard timeout factor in case read_till_hard_timeout is true
273
+ named_prompts: ActiveSupport::HashWithIndifferentAccess.new, # you can used named prompts for #with_prompt {}
274
+ before_cmd_procs: ActiveSupport::HashWithIndifferentAccess.new, # procs to call before #cmd
275
+ after_cmd_procs: ActiveSupport::HashWithIndifferentAccess.new, # procs to call after #cmd
276
+ before_on_stdout_procs: ActiveSupport::HashWithIndifferentAccess.new, # procs to call before data arrives from the underlying connection
277
+ after_on_stdout_procs: ActiveSupport::HashWithIndifferentAccess.new, # procs to call after data arrives from the underlying connection
278
+ before_on_stdin_procs: ActiveSupport::HashWithIndifferentAccess.new, # procs to call before data is sent to the underlying channel
279
+ after_on_stdin_procs: ActiveSupport::HashWithIndifferentAccess.new, # procs to call after data is sent to the underlying channel
280
+ before_open_channel_procs: ActiveSupport::HashWithIndifferentAccess.new, # procs to call before opening a channel
281
+ after_open_channel_procs: ActiveSupport::HashWithIndifferentAccess.new, # procs to call after opening a channel, for example you could call #detect_prompt or #read_till
282
+ open_channel_timeout: nil, # timeout to open the channel
283
+ net_ssh_options: ActiveSupport::HashWithIndifferentAccess.new, # a wrapper for options to pass to Net::SSH.start in case net_ssh is undefined
284
+ process_time: 0.00001, # how long #process is processing net_ssh#process or sleeping (waiting for something)
285
+ background_processing: false, # default false, whether the process method maps to the underlying net_ssh#process or the net_ssh#process happens in a separate loop
286
+ on_stdout_processing: 100, # whether to optimize the on_stdout performance by calling #process #optimize_on_stdout-times in case more data arrives
287
+ sleep_procs: ActiveSupport::HashWithIndifferentAccess.new, # procs to call instead of Kernel.sleep(), perfect for async hooks
288
+ )
289
+ ```
290
+
239
291
  ## Development
240
292
 
241
293
  After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
data/lib/net/ssh/cli.rb CHANGED
@@ -40,10 +40,11 @@ module Net
40
40
  attr_accessor :channel, :stdout, :net_ssh, :logger, :new_data, :process_count
41
41
 
42
42
  OPTIONS = ActiveSupport::HashWithIndifferentAccess.new(
43
- default_prompt: /\n?^(\S+@.*)\z/, # the default prompt to search for
43
+ default_prompt: /\n?^(\S+@.*)\z/, # the default prompt to search for. It is recommended to use \z to ensure you don't match the prompt too early.
44
44
  cmd_rm_prompt: false, # whether the prompt should be removed in the output of #cmd
45
45
  cmd_rm_command: false, # whether the given command should be removed in the output of #cmd
46
46
  cmd_rm_command_tail: "\n", # which format does the end of line return after a command has been submitted. Could be something like "ls\n" "ls\r\n" or "ls \n" (extra spaces)
47
+ cmd_minimum_duration: 0, # how long do you want to wait/sleep after sending the command. After this waiting time, the output will be processed and the prompt will be searched.
47
48
  run_impact: false, # whether to run #impact commands. This might align with testing|development|production. example #impact("reboot")
48
49
  read_till_timeout: nil, # timeout for #read_till to find the match
49
50
  read_till_hard_timeout: nil, # hard timeout for #read_till to find the match using Timeout.timeout(hard_timeout) {}. Might creates unpredicted sideffects
@@ -253,9 +254,9 @@ module Net
253
254
  # 2. continues to process the ssh connection until the prompt is found in the stdout
254
255
  # 3. prepares the output using your callbacks
255
256
  # 4. returns the output of your command
256
- # Hint: 'read' first on purpuse as a feature. once you cmd you ignore what happend before. otherwise use read|write directly.
257
+ # Hint: 'read' first on purpose as a feature. once you cmd you ignore what happend before. otherwise use read|write directly.
257
258
  # this should avoid many horrible state issues where the prompt is not the last prompt
258
- def cmd(command, pre_read: true, rm_prompt: cmd_rm_prompt, rm_command: cmd_rm_command, prompt: current_prompt, **opts)
259
+ def cmd(command, pre_read: true, rm_prompt: cmd_rm_prompt, rm_command: cmd_rm_command, prompt: current_prompt, minimum_duration: cmd_minimum_duration, **opts)
259
260
  opts = opts.clone.merge(pre_read: pre_read, rm_prompt: rm_prompt, rm_command: rm_command, prompt: prompt)
260
261
  if pre_read
261
262
  pre_read_data = read
@@ -263,6 +264,7 @@ module Net
263
264
  end
264
265
  before_cmd_procs.each { |_name, a_proc| instance_eval(&a_proc) }
265
266
  write_n command
267
+ sleep(minimum_duration)
266
268
  output = read_till(**opts)
267
269
  rm_prompt!(output, **opts)
268
270
  rm_command!(output, command, **opts)
@@ -3,7 +3,7 @@
3
3
  module Net
4
4
  module SSH
5
5
  module CLI
6
- VERSION = '1.7.0'
6
+ VERSION = '1.8.0'
7
7
  end
8
8
  end
9
9
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: net-ssh-cli
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.7.0
4
+ version: 1.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Fabian Stillhart
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-02-01 00:00:00.000000000 Z
11
+ date: 2021-04-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -125,7 +125,7 @@ homepage: https://github.com/swisscom/net-ssh-cli
125
125
  licenses:
126
126
  - MIT
127
127
  metadata: {}
128
- post_install_message:
128
+ post_install_message:
129
129
  rdoc_options: []
130
130
  require_paths:
131
131
  - lib
@@ -140,8 +140,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
140
140
  - !ruby/object:Gem::Version
141
141
  version: '0'
142
142
  requirements: []
143
- rubygems_version: 3.2.3
144
- signing_key:
143
+ rubygems_version: 3.2.15
144
+ signing_key:
145
145
  specification_version: 4
146
146
  summary: 'Net::SSH::CLI: A library to handle CLI Sessions'
147
147
  test_files: []