vpsadmin-client 3.0.0.master.20240728.pre.0.dc5474cc → 3.0.0.master.202211181.pre.0.ac358990

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
  SHA256:
3
- metadata.gz: d4026c63fa0871d4eed11bba4a6ebdea8663af7779f63cdf2057af32934b41c4
4
- data.tar.gz: 36e4bbff971201e8ea36b887e3bb1e9102edfee78aeeb9c9183c7c35c01ec1f6
3
+ metadata.gz: 9014c08e0f38faa0c2ef3ff240d919521ff77609f7c638c3497fdf730d76a2d9
4
+ data.tar.gz: 4639e16cc11b5b4a81ebd787e6dedf15ec6da46177920de95e442ff8bc13ad86
5
5
  SHA512:
6
- metadata.gz: 7538cc9db1cd0238951d7417d85cfaf23b1c00d95f7fda6edc937308fe471389fa75c7813c995fa0087a710af7e476905171ccfc4027d245384df305e2b882fe
7
- data.tar.gz: dd97bc1054145663273e427e043e8c3d470a13277a1893710fa4894d525fd944359f98f32502a06b0d7b4f6397d5d03eff4cc84c68f1d691e693d14262d7b549
6
+ metadata.gz: 63cec139647a45f1b78e31189634c3f876d5531efd3abb9ab535146cb2d34d3e13cb27f9d9a1cdf0fe8c7031cd4bee87774f1d1f1387fa349f21dce5d1a87792
7
+ data.tar.gz: 5431b10cbef22f09b69e7a4968bf3b0959dae30df08e2e3f24363ca5513931bec674b98fd203a77b326abffe4f87e4377638473031db122fef50d86fa0ad4e40
data/Gemfile CHANGED
@@ -1,7 +1,3 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
3
  gemspec
4
-
5
- group :development do
6
- gem 'rake'
7
- end
data/Rakefile CHANGED
@@ -1 +1,2 @@
1
1
  require 'bundler/gem_tasks'
2
+
@@ -1,61 +1,55 @@
1
1
  class Terminal
2
- class Size; VERSION = '0.0.6'.freeze end
2
+ class Size; VERSION = '0.0.6' end
3
3
  class << self
4
4
  def size
5
5
  size_via_low_level_ioctl or size_via_stty or nil
6
6
  end
7
-
8
- def size!
9
- size or _height_width_hash_from 25, 80
10
- end
7
+ def size!; size or _height_width_hash_from 25, 80 end
11
8
 
12
9
  # These are experimental
13
- def resize(direction, magnitude)
10
+ def resize direction, magnitude
14
11
  tmux 'resize-pane', "-#{direction}", magnitude
15
12
  end
16
13
 
17
14
  def tmux *cmd
18
- system 'tmux', *cmd.map(&:to_s)
15
+ system 'tmux', *(cmd.map &:to_s)
19
16
  end
20
17
 
21
- IOCTL_INPUT_BUF = "\x00" * 8
18
+ IOCTL_INPUT_BUF = "\x00"*8
22
19
  def size_via_low_level_ioctl
23
20
  # Thanks to runpaint for the general approach to this
24
21
  return unless $stdin.respond_to? :ioctl
25
-
26
22
  code = tiocgwinsz_value_for RUBY_PLATFORM
27
23
  return unless code
28
-
29
24
  buf = IOCTL_INPUT_BUF.dup
30
- return if $stdout.ioctl(code, buf) != 0
31
- return if buf == IOCTL_INPUT_BUF
32
-
25
+ return unless $stdout.ioctl(code, buf).zero?
26
+ return if IOCTL_INPUT_BUF == buf
33
27
  got = buf.unpack('S4')[0..1]
34
- _height_width_hash_from(*got)
35
- rescue StandardError
28
+ _height_width_hash_from *got
29
+ rescue
36
30
  nil
37
31
  end
38
32
 
39
- def tiocgwinsz_value_for(platform)
33
+ def tiocgwinsz_value_for platform
40
34
  # This is as reported by <sys/ioctl.h>
41
35
  # Hard-coding because it seems like overkll to acutally involve C for this.
42
36
  {
43
37
  /linux/ => 0x5413,
44
- /darwin/ => 0x40087468 # thanks to brandon@brandon.io for the lookup!
45
- }.find { |k, _v| platform[k] }
38
+ /darwin/ => 0x40087468, # thanks to brandon@brandon.io for the lookup!
39
+ }.find{|k,v| platform[k]}
46
40
  end
47
41
 
48
42
  def size_via_stty
49
- ints = `stty size`.scan(/\d+/).map(&:to_i)
50
- _height_width_hash_from(*ints)
51
- rescue StandardError
43
+ ints = `stty size`.scan(/\d+/).map &:to_i
44
+ _height_width_hash_from *ints
45
+ rescue
52
46
  nil
53
47
  end
54
48
 
55
49
  private
56
-
57
50
  def _height_width_hash_from *dimensions
58
- { height: dimensions[0], width: dimensions[1] }
51
+ { :height => dimensions[0], :width => dimensions[1] }
59
52
  end
53
+
60
54
  end
61
55
  end
@@ -21,7 +21,7 @@ module VpsAdmin::CLI::Commands
21
21
  attempts: 10,
22
22
  checksum: true,
23
23
  delete_after: true,
24
- sudo: true
24
+ sudo: true,
25
25
  }
26
26
 
27
27
  opts.on('-p', '--pretend', 'Print what would the program do') do
@@ -93,14 +93,14 @@ module VpsAdmin::CLI::Commands
93
93
 
94
94
  ds_id = read_dataset_id(fs)
95
95
 
96
- ds = if ds_id
97
- @api.dataset.show(ds_id)
98
- else
99
- dataset_chooser
100
- end
96
+ if ds_id
97
+ ds = @api.dataset.show(ds_id)
98
+ else
99
+ ds = dataset_chooser
100
+ end
101
101
 
102
102
  elsif args.size != 2
103
- warn 'Provide DATASET_ID and FILESYSTEM arguments'
103
+ warn "Provide DATASET_ID and FILESYSTEM arguments"
104
104
  exit(false)
105
105
 
106
106
  else
@@ -144,15 +144,15 @@ module VpsAdmin::CLI::Commands
144
144
  # This is the first run within this history id, no local snapshots are
145
145
  # present
146
146
  if !latest_local_snapshot && @opts[:init_snapshots]
147
- remote_state[ds.current_history_id] =
147
+ remote_state[ds.current_history_id] = \
148
148
  remote_state[ds.current_history_id].last(@opts[:init_snapshots])
149
149
  end
150
150
 
151
151
  remote_state[ds.current_history_id].each do |snap|
152
152
  found = false
153
153
 
154
- local_state.each_value do |local_snapshots|
155
- found = local_snapshots.detect { |s| s.name == snap.name }
154
+ local_state.values.each do |snapshots|
155
+ found = snapshots.detect { |s| s.name == snap.name }
156
156
  break if found
157
157
  end
158
158
 
@@ -170,33 +170,33 @@ module VpsAdmin::CLI::Commands
170
170
  if for_transfer.empty?
171
171
  if found_latest
172
172
  exit_msg(
173
- 'Nothing to transfer: all snapshots with history id ' \
173
+ "Nothing to transfer: all snapshots with history id "+
174
174
  "#{ds.current_history_id} are already present locally",
175
175
  error: @opts[:no_snapshots_error]
176
176
  )
177
177
 
178
178
  else
179
- exit_msg(<<~END
180
- Unable to transfer: the common snapshot has not been found
179
+ exit_msg(<<END
180
+ Unable to transfer: the common snapshot has not been found
181
181
 
182
- This can happen when the latest local snapshot was deleted from the server,
183
- i.e. you have not backed up this dataset for quite some time.
182
+ This can happen when the latest local snapshot was deleted from the server,
183
+ i.e. you have not backed up this dataset for quite some time.
184
184
 
185
- You can either rename or destroy the whole current history id:
185
+ You can either rename or destroy the whole current history id:
186
186
 
187
- zfs rename #{fs}/#{ds.current_history_id} #{fs}/#{ds.current_history_id}.old
187
+ zfs rename #{fs}/#{ds.current_history_id} #{fs}/#{ds.current_history_id}.old
188
188
 
189
- or
189
+ or
190
190
 
191
- zfs list -r -t all #{fs}/#{ds.current_history_id}
192
- zfs destroy -r #{fs}/#{ds.current_history_id}
191
+ zfs list -r -t all #{fs}/#{ds.current_history_id}
192
+ zfs destroy -r #{fs}/#{ds.current_history_id}
193
193
 
194
- which will destroy all snapshots with this history id.
194
+ which will destroy all snapshots with this history id.
195
195
 
196
- You can also destroy the local backup completely or backup to another dataset
197
- and start anew.
198
- END
199
- )
196
+ You can also destroy the local backup completely or backup to another dataset
197
+ and start anew.
198
+ END
199
+ )
200
200
  end
201
201
  end
202
202
 
@@ -226,7 +226,9 @@ module VpsAdmin::CLI::Commands
226
226
  if shared_name
227
227
  shared = remote_state[ds.current_history_id].detect { |s| s.name == shared_name }
228
228
 
229
- for_transfer.insert(0, shared) if shared && !for_transfer.detect { |s| s.id == shared.id }
229
+ if shared && !for_transfer.detect { |s| s.id == shared.id }
230
+ for_transfer.insert(0, shared)
231
+ end
230
232
  end
231
233
 
232
234
  write_dataset_id!(ds, fs) unless written_dataset_id?
@@ -236,12 +238,13 @@ module VpsAdmin::CLI::Commands
236
238
  end
237
239
 
238
240
  protected
239
-
240
241
  def transfer(local_state, snapshots, hist_id, fs)
241
242
  ds = "#{fs}/#{hist_id}"
242
243
  no_local_snapshots = local_state[hist_id].nil? || local_state[hist_id].empty?
243
244
 
244
- zfs(:create, nil, ds) if local_state[hist_id].nil?
245
+ if local_state[hist_id].nil?
246
+ zfs(:create, nil, ds)
247
+ end
245
248
 
246
249
  if no_local_snapshots
247
250
  msg "Performing a full receive of @#{snapshots.first.name} to #{ds}"
@@ -252,59 +255,60 @@ module VpsAdmin::CLI::Commands
252
255
  else
253
256
  run_piped(zfs_cmd(:recv, '-F', ds)) do
254
257
  SnapshotSend.new({}, @api).do_exec({
255
- snapshot: snapshots.first.id,
256
- send_mail: false,
257
- delete_after: @opts[:delete_after],
258
- max_rate: @opts[:max_rate],
259
- checksum: @opts[:checksum],
260
- quiet: @opts[:quiet]
261
- })
258
+ snapshot: snapshots.first.id,
259
+ send_mail: false,
260
+ delete_after: @opts[:delete_after],
261
+ max_rate: @opts[:max_rate],
262
+ checksum: @opts[:checksum],
263
+ quiet: @opts[:quiet],
264
+ })
262
265
  end || exit_msg('Receive failed')
263
266
  end
264
267
  end
265
268
 
266
- return unless !no_local_snapshots || snapshots.size > 1
269
+ if !no_local_snapshots || snapshots.size > 1
270
+ msg "Performing an incremental receive of "+
271
+ "@#{snapshots.first.name} - @#{snapshots.last.name} to #{ds}"
267
272
 
268
- msg 'Performing an incremental receive of ' \
269
- "@#{snapshots.first.name} - @#{snapshots.last.name} to #{ds}"
270
-
271
- if @opts[:safe]
272
- safe_download(ds, snapshots.last, snapshots.first)
273
+ if @opts[:safe]
274
+ safe_download(ds, snapshots.last, snapshots.first)
273
275
 
274
- else
275
- run_piped(zfs_cmd(:recv, '-F', ds)) do
276
- SnapshotSend.new({}, @api).do_exec({
277
- snapshot: snapshots.last.id,
278
- from_snapshot: snapshots.first.id,
279
- send_mail: false,
280
- delete_after: @opts[:delete_after],
281
- max_rate: @opts[:max_rate],
282
- checksum: @opts[:checksum],
283
- quiet: @opts[:quiet]
284
- })
285
- end || exit_msg('Receive failed')
276
+ else
277
+ run_piped(zfs_cmd(:recv, '-F', ds)) do
278
+ SnapshotSend.new({}, @api).do_exec({
279
+ snapshot: snapshots.last.id,
280
+ from_snapshot: snapshots.first.id,
281
+ send_mail: false,
282
+ delete_after: @opts[:delete_after],
283
+ max_rate: @opts[:max_rate],
284
+ checksum: @opts[:checksum],
285
+ quiet: @opts[:quiet],
286
+ })
287
+ end || exit_msg('Receive failed')
288
+ end
286
289
  end
287
290
  end
288
291
 
289
292
  def safe_download(ds, snapshot, from_snapshot = nil)
290
293
  part, full = snapshot_tmp_file(snapshot, from_snapshot)
291
294
 
292
- unless File.exist?(full)
295
+ if !File.exists?(full)
293
296
  attempts = 0
294
297
 
295
298
  begin
296
299
  SnapshotDownload.new({}, @api).do_exec({
297
- snapshot: snapshot.id,
298
- from_snapshot: from_snapshot && from_snapshot.id,
299
- format: from_snapshot ? :incremental_stream : :stream,
300
- file: part,
301
- max_rate: @opts[:max_rate],
302
- checksum: @opts[:checksum],
303
- quiet: @opts[:quiet],
304
- resume: true,
305
- delete_after: @opts[:delete_after],
306
- send_mail: false
307
- })
300
+ snapshot: snapshot.id,
301
+ from_snapshot: from_snapshot && from_snapshot.id,
302
+ format: from_snapshot ? :incremental_stream : :stream,
303
+ file: part,
304
+ max_rate: @opts[:max_rate],
305
+ checksum: @opts[:checksum],
306
+ quiet: @opts[:quiet],
307
+ resume: true,
308
+ delete_after: @opts[:delete_after],
309
+ send_mail: false,
310
+ })
311
+
308
312
  rescue Errno::ECONNREFUSED,
309
313
  Errno::ETIMEDOUT,
310
314
  Errno::EHOSTUNREACH,
@@ -314,11 +318,11 @@ module VpsAdmin::CLI::Commands
314
318
  attempts += 1
315
319
 
316
320
  if attempts >= @opts[:attempts]
317
- warn 'Run out of attempts'
321
+ warn "Run out of attempts"
318
322
  exit(false)
319
323
 
320
324
  else
321
- warn 'Retry in 60 seconds'
325
+ warn "Retry in 60 seconds"
322
326
  sleep(60)
323
327
  retry
324
328
  end
@@ -335,15 +339,15 @@ module VpsAdmin::CLI::Commands
335
339
  end
336
340
 
337
341
  def rotate(fs, pretend: false)
338
- msg 'Rotating snapshots'
339
- local_state = pretend || parse_tree(fs)
342
+ msg "Rotating snapshots"
343
+ local_state = pretend ? pretend : parse_tree(fs)
340
344
 
341
345
  # Order snapshots by date of creation
342
346
  snapshots = local_state.values.flatten.sort do |a, b|
343
347
  a.creation <=> b.creation
344
348
  end
345
349
 
346
- cnt = local_state.values.inject(0) { |sum, local_snapshots| sum + local_snapshots.count }
350
+ cnt = local_state.values.inject(0) { |sum, snapshots| sum + snapshots.count }
347
351
  deleted = 0
348
352
  oldest = Time.now.to_i - (@opts[:max_age] * 60 * 60 * 24)
349
353
 
@@ -359,16 +363,16 @@ module VpsAdmin::CLI::Commands
359
363
  local_state[s.hist_id].delete(s)
360
364
 
361
365
  msg "Destroying #{ds}@#{s.name}"
362
- zfs(:destroy, nil, "#{ds}@#{s.name}", pretend:)
366
+ zfs(:destroy, nil, "#{ds}@#{s.name}", pretend: pretend)
363
367
  end
364
368
 
365
- local_state.each do |hist_id, local_snapshots|
366
- next unless local_snapshots.empty?
369
+ local_state.each do |hist_id, snapshots|
370
+ next unless snapshots.empty?
367
371
 
368
372
  ds = "#{fs}/#{hist_id}"
369
373
 
370
374
  msg "Destroying #{ds}"
371
- zfs(:destroy, nil, ds, pretend:)
375
+ zfs(:destroy, nil, ds, pretend: pretend)
372
376
  end
373
377
  end
374
378
 
@@ -378,15 +382,15 @@ module VpsAdmin::CLI::Commands
378
382
  # This is intentionally done by two zfs commands, because -d2 would include
379
383
  # nested subdatasets, which should not be there, but the user might create
380
384
  # them and it could confuse the program.
381
- zfs(:list, '-r -d1 -tfilesystem -H -oname', fs).split("\n")[1..].each do |name|
385
+ zfs(:list, '-r -d1 -tfilesystem -H -oname', fs).split("\n")[1..-1].each do |name|
382
386
  last_name = name.split('/').last
383
387
  ret[last_name.to_i] = [] if dataset?(last_name)
384
388
  end
385
389
 
386
390
  zfs(
387
- :get,
388
- '-Hrp -d2 -tsnapshot -oname,property,value name,creation',
389
- fs
391
+ :get,
392
+ '-Hrp -d2 -tsnapshot -oname,property,value name,creation',
393
+ fs
390
394
  ).split("\n").each do |line|
391
395
  name, property, value = line.split
392
396
  ds, snap_name = name.split('@')
@@ -395,7 +399,7 @@ module VpsAdmin::CLI::Commands
395
399
 
396
400
  hist_id = ds_name.to_i
397
401
 
398
- if (snap = ret[hist_id].detect { |s| s.name == snap_name })
402
+ if snap = ret[hist_id].detect { |s| s.name == snap_name }
399
403
  snap.send("#{property}=", value)
400
404
 
401
405
  else
@@ -414,15 +418,14 @@ module VpsAdmin::CLI::Commands
414
418
  def read_dataset_id(fs)
415
419
  ds_id = zfs(:get, '-H -ovalue cz.vpsfree.vpsadmin:dataset_id', fs).strip
416
420
  return nil if ds_id == '-'
417
-
418
421
  @dataset_id = ds_id.to_i
419
422
  end
420
423
 
421
424
  def check_dataset_id!(ds, fs)
422
- return unless @dataset_id && @dataset_id != ds.id
423
-
424
- warn "Dataset '#{fs}' is used to backup remote dataset with id '#{@dataset_id}', not '#{ds.id}'"
425
- exit(false)
425
+ if @dataset_id && @dataset_id != ds.id
426
+ warn "Dataset '#{fs}' is used to backup remote dataset with id '#{@dataset_id}', not '#{ds.id}'"
427
+ exit(false)
428
+ end
426
429
  end
427
430
 
428
431
  def written_dataset_id?
@@ -441,13 +444,13 @@ module VpsAdmin::CLI::Commands
441
444
 
442
445
  pids << Process.fork do
443
446
  r.close
444
- $stdout.reopen(w)
447
+ STDOUT.reopen(w)
445
448
  block.call
446
449
  end
447
450
 
448
451
  pids << Process.fork do
449
452
  w.close
450
- $stdin.reopen(r)
453
+ STDIN.reopen(r)
451
454
  Process.exec(cmd2)
452
455
  end
453
456
 
@@ -497,12 +500,11 @@ module VpsAdmin::CLI::Commands
497
500
  ds_map = {}
498
501
 
499
502
  @api.dataset.index(user: user.id).each do |ds|
500
- if (vps = vps_map[ds.id])
503
+ if vps = vps_map[ds.id]
501
504
  puts "(#{i}) VPS ##{vps.id}"
502
505
 
503
506
  else
504
507
  next if vps_only
505
-
506
508
  puts "(#{i}) Dataset #{ds.name}"
507
509
  end
508
510
 
@@ -511,10 +513,10 @@ module VpsAdmin::CLI::Commands
511
513
  end
512
514
 
513
515
  loop do
514
- $stdout.write('Pick a dataset to backup: ')
515
- $stdout.flush
516
+ STDOUT.write('Pick a dataset to backup: ')
517
+ STDOUT.flush
516
518
 
517
- i = $stdin.readline.strip.to_i
519
+ i = STDIN.readline.strip.to_i
518
520
  next if i <= 0 || ds_map[i].nil?
519
521
 
520
522
  return ds_map[i]
@@ -522,12 +524,12 @@ module VpsAdmin::CLI::Commands
522
524
  end
523
525
 
524
526
  def snapshot_tmp_file(s, from_s = nil)
525
- base = if from_s
526
- ".snapshot_#{from_s.id}-#{s.id}.inc.dat.gz"
527
+ if from_s
528
+ base = ".snapshot_#{from_s.id}-#{s.id}.inc.dat.gz"
527
529
 
528
- else
529
- ".snapshot_#{s.id}.dat.gz"
530
- end
530
+ else
531
+ base = ".snapshot_#{s.id}.dat.gz"
532
+ end
531
533
 
532
534
  ["#{base}.part", base]
533
535
  end
@@ -22,7 +22,7 @@ module VpsAdmin::CLI::Commands
22
22
  super([@api.vps.show(args[0].to_i).dataset_id, args[1]])
23
23
 
24
24
  else
25
- super
25
+ super(args)
26
26
  end
27
27
  end
28
28
  end
@@ -7,15 +7,15 @@ module VpsAdmin::CLI::Commands
7
7
  end
8
8
 
9
9
  protected
10
-
11
10
  def find_or_create_dl(opts, do_create = true)
12
11
  @api.snapshot_download.index(snapshot: opts[:snapshot]).each do |r|
13
- next unless opts[:from_snapshot] == (r.from_snapshot && r.from_snapshot_id)
14
- if r.format != opts[:format].to_s
15
- raise "SnapshotDownload id=#{r.id} is in unusable format '#{r.format}' (needs '#{opts[:format]}')"
16
- end
12
+ if opts[:from_snapshot] == (r.from_snapshot && r.from_snapshot_id)
13
+ if r.format != opts[:format].to_s
14
+ fail "SnapshotDownload id=#{r.id} is in unusable format '#{r.format}' (needs '#{opts[:format]}')"
15
+ end
17
16
 
18
- return [r, false]
17
+ return [r, false]
18
+ end
19
19
  end
20
20
 
21
21
  if do_create