qdumpfs 0.5.1 → 0.6.0
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 +4 -4
- data/Gemfile.lock +1 -1
- data/lib/qdumpfs.rb +86 -15
- data/lib/qdumpfs/option.rb +17 -1
- data/lib/qdumpfs/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 606cd6d5f9de57b340a1ac41d5e621d2f947cff5e1fce3a9ec510be72e0f0d4d
|
4
|
+
data.tar.gz: 073da696b6e73cd8059a246fbe18b51f09050f100bb9f7a454954921d4e5d228
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 34c7c309574b3cbd00175b0e327d1df5687fa2acb84fcb3d29ff5d77adeaacfddc5f91a28de702d0aaa06e0b694ea722d00d43ed50d7b7f74d80d2f754b1027c
|
7
|
+
data.tar.gz: f5702a62c4b9ab44364df7c697c5d503ddccce6b946f2e7702de6783521aa05afa358df218686a90934a80af64906105068bb5cd0a77aa8fcacf597e56541436
|
data/Gemfile.lock
CHANGED
data/lib/qdumpfs.rb
CHANGED
@@ -34,11 +34,17 @@ module Qdumpfs
|
|
34
34
|
}
|
35
35
|
opt.on('-s SIZE', '--exclude-by-size=SIZE', 'exclude files larger than SIZE') {|v| opts[:es] = v }
|
36
36
|
opt.on('-w GLOB', '--exclude-by-glob=GLOB', 'exclude files matching GLOB') {|v| opts[:ep] = v }
|
37
|
-
commands = ['backup', 'sync', 'list', 'expire', 'verify']
|
37
|
+
commands = ['backup', 'sync', 'list', 'expire', 'verify', 'delete']
|
38
38
|
opt.on('-c COMMAND', '--command=COMMAND', commands, commands.join('|')) {|v| opts[:c] = v}
|
39
39
|
opt.on('-l HOURS', '--limit=HOURS', 'limit hours') {|v| opts[:limit] = v}
|
40
40
|
opt.on('-k KEEPARG', '--keep=KEEPARG', 'ex: --keep 100Y12M12W30D (100years, 12months, 12weeks, 30days, default)') {|v| opts[:keep] = v}
|
41
41
|
opt.on('--logdir LOGDIR', 'logdir') {|v| opts[:logdir] = v}
|
42
|
+
opt.on('--delete-from YYYYMMDD', 'delete backup from YYYY/MM/DD') {|v|
|
43
|
+
opts[:delete_from] = Date.parse(v)
|
44
|
+
}
|
45
|
+
opt.on('--delete-to YYYYMMDD', 'delete backup to YYYY/MM/DD') {|v|
|
46
|
+
opts[:delete_to] = Date.parse(v)
|
47
|
+
}
|
42
48
|
opt.parse!(argv)
|
43
49
|
option = Option.new(opts, ARGV)
|
44
50
|
if opts[:v]
|
@@ -52,6 +58,8 @@ module Qdumpfs
|
|
52
58
|
command = Command.new(option)
|
53
59
|
command.run
|
54
60
|
rescue => e
|
61
|
+
# p e.message
|
62
|
+
# p e.backtrace
|
55
63
|
puts opt.help
|
56
64
|
exit
|
57
65
|
end
|
@@ -69,13 +77,15 @@ module Qdumpfs
|
|
69
77
|
elsif @opt.cmd == 'list'
|
70
78
|
list
|
71
79
|
elsif @opt.cmd == 'expire'
|
72
|
-
expire
|
80
|
+
delete('expire')
|
73
81
|
elsif @opt.cmd == 'verify'
|
74
82
|
verify
|
83
|
+
elsif @opt.cmd == 'delete'
|
84
|
+
delete('delete')
|
75
85
|
# elsif @opt.cmd == 'test'
|
76
86
|
# test
|
77
|
-
|
78
|
-
raise RuntimeError, "unknown command: #{cmd}"
|
87
|
+
else
|
88
|
+
raise RuntimeError, "unknown command: #{@opt.cmd}"
|
79
89
|
end
|
80
90
|
end
|
81
91
|
|
@@ -439,40 +449,45 @@ module Qdumpfs
|
|
439
449
|
file.close
|
440
450
|
end
|
441
451
|
|
442
|
-
def
|
452
|
+
def delete(cmd)
|
443
453
|
@opt.validate_directories(1)
|
444
454
|
|
445
455
|
start_time = Time.now
|
446
456
|
limit_time = start_time + (@opt.limit_sec)
|
447
|
-
log("#####
|
457
|
+
log("##### #{cmd} start #{fmt(start_time)} => limit_time=#{fmt(limit_time)} #####")
|
448
458
|
|
449
459
|
@opt.dirs.each do |target_dir|
|
450
460
|
|
451
461
|
target_start = Time.now
|
452
|
-
|
462
|
+
delete_target_dir(cmd, target_dir)
|
453
463
|
target_end = Time.now
|
454
464
|
|
455
465
|
# 次回expireにかかる時間を最終expire時間の半分と予想
|
456
466
|
next_expire = (target_end - target_start) / 2
|
457
467
|
|
458
468
|
cur_time = Time.now
|
459
|
-
|
469
|
+
in_limit = (cur_time + next_expire) < limit_time
|
460
470
|
|
461
471
|
log("## cur_time=#{fmt(cur_time)} + next_expire=#{next_expire} < limit_time=#{fmt(limit_time)} in_limit=#{in_limit} ## ")
|
462
472
|
unless in_limit
|
463
473
|
break
|
464
474
|
end
|
465
475
|
end
|
466
|
-
|
467
|
-
log("##### expire end #####")
|
476
|
+
log("##### #{cmd} end #####")
|
468
477
|
end
|
469
|
-
|
470
|
-
def
|
478
|
+
|
479
|
+
def delete_target_dir(cmd, target_dir)
|
471
480
|
target_dir = to_unix_path(target_dir)
|
472
481
|
puts "<<<<< Target dir: #{target_dir} >>>>>"
|
473
482
|
|
474
483
|
snapshots = BackupDir.scan_backup_dirs(target_dir)
|
475
|
-
|
484
|
+
if cmd == 'expire'
|
485
|
+
@opt.detect_expire_dirs(snapshots)
|
486
|
+
elsif cmd == 'delete'
|
487
|
+
@opt.detect_delete_dirs(snapshots, @opt.delete_from, @opt.delete_to)
|
488
|
+
else
|
489
|
+
raise RuntimeError, "unknown command: #{cmd}"
|
490
|
+
end
|
476
491
|
|
477
492
|
# p @opt.keep_year
|
478
493
|
# p @opt.keep_month
|
@@ -527,8 +542,64 @@ module Qdumpfs
|
|
527
542
|
puts "Keep dirs:"
|
528
543
|
snapshots.each do |snapshot|
|
529
544
|
puts snapshot.path if snapshot.keep
|
530
|
-
end
|
531
|
-
|
545
|
+
end
|
532
546
|
end
|
547
|
+
|
548
|
+
# def delete
|
549
|
+
# @opt.validate_directories(1)
|
550
|
+
|
551
|
+
# start_time = Time.now
|
552
|
+
# limit_time = start_time + (@opt.limit_sec)
|
553
|
+
# log("##### delete start #{fmt(start_time)} => limit_time=#{fmt(limit_time)} #####")
|
554
|
+
# @opt.dirs.each do |target_dir|
|
555
|
+
# target_start = Time.now
|
556
|
+
# delete_target_dir(target_dir)
|
557
|
+
# target_end = Time.now
|
558
|
+
|
559
|
+
# # 次回expireにかかる時間を最終expire時間の半分と予想
|
560
|
+
# next_expire = (target_end - target_start) / 2
|
561
|
+
|
562
|
+
# cur_time = Time.now
|
563
|
+
# in_imit = (cur_time + next_expire) < limit_time
|
564
|
+
|
565
|
+
# log("## cur_time=#{fmt(cur_time)} + next_expire=#{next_expire} < limit_time=#{fmt(limit_time)} in_limit=#{in_limit} ## ")
|
566
|
+
# unless in_limit
|
567
|
+
# break
|
568
|
+
# end
|
569
|
+
# end
|
570
|
+
# log("##### delete end #####")
|
571
|
+
# end
|
572
|
+
|
573
|
+
# def delete_target_dir(target_dir)
|
574
|
+
# target_dir = to_unix_path(target_dir)
|
575
|
+
# puts "<<<<< Target dir: #{target_dir} >>>>>"
|
576
|
+
|
577
|
+
# snapshots = BackupDir.scan_backup_dirs(target_dir)
|
578
|
+
# @opt.detect_delete_dirs(snapshots)
|
579
|
+
|
580
|
+
# snapshots.each do |snapshot|
|
581
|
+
# next if snapshot.keep
|
582
|
+
# t_start = Time.now
|
583
|
+
# print "Deleting #{snapshot.path} ..."
|
584
|
+
|
585
|
+
# unless @opt.dry_run
|
586
|
+
# if windows?
|
587
|
+
# # Windowsの場合
|
588
|
+
# win_backup_path = to_win_path(snapshot.path)
|
589
|
+
# system("rmdir /S /Q #{win_backup_path}")
|
590
|
+
# else
|
591
|
+
# # Linux/macOSの場合
|
592
|
+
# system("rm -rf #{snapshot.path}")
|
593
|
+
# end
|
594
|
+
# end
|
595
|
+
# end
|
596
|
+
|
597
|
+
# t_end = Time.now
|
598
|
+
# diff = (t_end - t_start).to_i
|
599
|
+
# diff_hours = diff / 3600
|
600
|
+
# puts " done[#{diff} seconds = #{diff_hours} hours]."
|
601
|
+
# end
|
602
|
+
|
533
603
|
end
|
604
|
+
|
534
605
|
end
|
data/lib/qdumpfs/option.rb
CHANGED
@@ -139,12 +139,15 @@ module Qdumpfs
|
|
139
139
|
@keep_month = $1.to_i if keep =~ /(\d+)M/
|
140
140
|
@keep_week = $1.to_i if keep =~ /(\d+)W/
|
141
141
|
@keep_day = $1.to_i if keep =~ /(\d+)D/
|
142
|
+
@delete_from = @opts[:delete_from]
|
143
|
+
@delete_to = @opts[:delete_to]
|
142
144
|
@today = Date.today
|
143
145
|
end
|
144
146
|
attr_reader :dirs, :src, :dst, :cmd
|
145
147
|
attr_reader :keep_year, :keep_month, :keep_week, :keep_day
|
146
148
|
attr_reader :logdir, :logpath, :verifypath
|
147
149
|
attr_reader :logger, :matcher, :reporter, :interval_proc
|
150
|
+
attr_reader :delete_from, :delete_to
|
148
151
|
|
149
152
|
def report(type, filename)
|
150
153
|
if @opts[:v]
|
@@ -206,12 +209,25 @@ module Qdumpfs
|
|
206
209
|
end
|
207
210
|
end
|
208
211
|
|
209
|
-
def
|
212
|
+
def detect_expire_dirs(backup_dirs)
|
210
213
|
detect_year_keep_dirs(backup_dirs)
|
211
214
|
detect_month_keep_dirs(backup_dirs)
|
212
215
|
detect_week_keep_dirs(backup_dirs)
|
213
216
|
detect_day_keep_dirs(backup_dirs)
|
214
217
|
end
|
218
|
+
|
219
|
+
def detect_delete_dirs(backup_dirs, delete_from, delete_to)
|
220
|
+
backup_dirs.each do |backup_dir|
|
221
|
+
backup_dir.keep = true
|
222
|
+
if delete_from && backup_dir.date >= delete_from && delete_to && backup_dir.date <= delete_to
|
223
|
+
backup_dir.keep = false
|
224
|
+
elsif delete_from && backup_dir.date >= delete_from
|
225
|
+
backup_dir.keep = false
|
226
|
+
elsif delete_to && backup_dir.date <= delete_to
|
227
|
+
backup_dir.keep = false
|
228
|
+
end
|
229
|
+
end
|
230
|
+
end
|
215
231
|
|
216
232
|
def open_verifyfile
|
217
233
|
if FileTest.file?(@verifypath)
|
data/lib/qdumpfs/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: qdumpfs
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- src
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-11-
|
11
|
+
date: 2020-11-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|