qdumpfs 0.5.1 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|