techinform 1.3.2 → 1.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/backup/backup.rb +83 -39
- data/lib/techinform/version.rb +1 -1
- data/lib/techinform.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: 617bad8f7da2970e52597896b96ed96a14c138024fa5e4df81e80603d7c8cd3e
|
4
|
+
data.tar.gz: b624229f38a639b5b1dbf47b0a292487c1f6d38a2703da9e22060a0ee9b16a5b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0ab59696b7cab4f857ebae00a442f09c67860306a7f9406c8a1a51b4d6c1f08e34f518dbc161eea78b369696f363b13acb2190deea1be9efcba5f7ce12b35711
|
7
|
+
data.tar.gz: 2846c545b9e08e6c7765b3969aeb8626658d57b98d00fbf6050aeb2c1c47693428046d6cf88d3f971da8df32f4c0a830ca5080f92af38914ce7d398463d4a4f1
|
data/lib/backup/backup.rb
CHANGED
@@ -3,11 +3,13 @@ require_relative '../techinform/defaults'
|
|
3
3
|
require 'highline'
|
4
4
|
|
5
5
|
class Backup
|
6
|
+
attr_reader :dry_run
|
6
7
|
DATE_FORMAT = '%Y-%m-%d-%H-%M'
|
7
8
|
|
8
|
-
def initialize
|
9
|
+
def initialize(compress: true, encrypt: nil, dry_run: true)
|
9
10
|
@compress = compress
|
10
11
|
@encrypt = encrypt.nil? ? !ENV['GPGKEY'].nil? : encrypt
|
12
|
+
@dry_run = dry_run
|
11
13
|
raise "GPGKEY environment variable should be specified for encryption" if encrypt? && ENV['GPGKEY'].nil?
|
12
14
|
ensure_path
|
13
15
|
end
|
@@ -78,7 +80,6 @@ class Backup
|
|
78
80
|
end
|
79
81
|
|
80
82
|
def get_datetime_from_filename filename
|
81
|
-
puts 'Filename: ' + filename.split('.').first.split('-')[2..6].join('-')
|
82
83
|
DateTime.strptime(filename.split('.').first.split('-')[2..6].join('-'), DATE_FORMAT)
|
83
84
|
end
|
84
85
|
|
@@ -105,51 +106,94 @@ class Backup
|
|
105
106
|
File.size(filepath) > minimum_backup_size
|
106
107
|
end
|
107
108
|
|
108
|
-
def clean_files(prefix = 'local'
|
109
|
+
def clean_files(prefix = 'local')
|
109
110
|
puts(dry_run ? 'Performing dry run' : '!!!! Cleaning backups !!!!')
|
111
|
+
if prefix =~ /^\//
|
112
|
+
process_clean_files(prefix)
|
113
|
+
else
|
114
|
+
# Process each backup type
|
115
|
+
Dir["#{Techinform::BACKUPS_PREFIX}/#{prefix}/*"].each do |type|
|
116
|
+
puts "Type: #{type}"
|
117
|
+
# Get all backup name
|
118
|
+
Dir["#{type}/*"].each do |path|
|
119
|
+
process_clean_files(path)
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
def process_clean_files(path)
|
126
|
+
puts "Process files in path #{path}"
|
127
|
+
# Get all files
|
128
|
+
mark_files = mark_file_to_delete(path)
|
129
|
+
mark_files.each do |file, delete|
|
130
|
+
puts "#{file} #{"*" if delete}"
|
131
|
+
end
|
132
|
+
show_statistics(mark_files)
|
133
|
+
unless dry_run
|
134
|
+
return unless HighLine.new.agree "Delete #{mark_files.select{|file, delete| delete}.keys.size} files - Are you sure? (yes/no)"
|
135
|
+
# Actually delete files
|
136
|
+
mark_files.select{|file, delete| delete}.keys.each do |file|
|
137
|
+
puts `rm #{file}`
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
def show_statistics(mark_files)
|
143
|
+
files_to_delete, files_to_store, size_to_delete, size_to_store = 0, 0, 0, 0
|
144
|
+
mark_files.each do |file, is_delete|
|
145
|
+
if is_delete
|
146
|
+
files_to_delete += 1
|
147
|
+
size_to_delete += File.size(file)
|
148
|
+
else
|
149
|
+
files_to_store += 1
|
150
|
+
size_to_store += File.size(file)
|
151
|
+
end
|
152
|
+
end
|
153
|
+
puts "\u{1f480} Files to delete - #{files_to_delete}, files size - #{human_filesize(size_to_delete)} \u{1f480}"
|
154
|
+
puts "Files to store - #{files_to_store}, files size - #{human_filesize(size_to_store)}"
|
155
|
+
end
|
156
|
+
|
157
|
+
# Mark files to delete
|
158
|
+
# { 'filenpath' => true, 'filepath2' => false }
|
159
|
+
# true - delete file, false - do not delete
|
160
|
+
def mark_file_to_delete(path)
|
161
|
+
result = {}
|
110
162
|
months_taken = []
|
111
163
|
days_taken = []
|
112
|
-
#
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
day_id = datetime.strftime('%Y-%m-%d')
|
123
|
-
month_id = datetime.strftime('%Y-%m')
|
124
|
-
if datetime < (DateTime.now << 2) # 2 month ago
|
125
|
-
if datetime.day == 1 && !(months_taken.include? month_id)
|
126
|
-
result[file] = false
|
127
|
-
months_taken << month_id
|
128
|
-
else
|
129
|
-
result[file] = true
|
130
|
-
end
|
131
|
-
elsif datetime < DateTime.now - 14 # 2 weeks ago
|
132
|
-
if [1, 7, 14, 21].include?(datetime.day) && !(days_taken.include?(day_id))
|
133
|
-
result[file] = false
|
134
|
-
days_taken << day_id
|
135
|
-
else
|
136
|
-
result[file] = true
|
137
|
-
end
|
138
|
-
end
|
139
|
-
end
|
140
|
-
result.each do |file, delete|
|
141
|
-
puts "#{file} #{"*" if delete}"
|
164
|
+
Dir["#{path}/*"].sort.each do |file|
|
165
|
+
datetime = get_datetime_from_filename(file)
|
166
|
+
day_id = datetime.strftime('%Y-%m-%d')
|
167
|
+
month_id = datetime.strftime('%Y-%m')
|
168
|
+
if datetime < (DateTime.now << 2) # 2 month ago
|
169
|
+
if datetime.day == 1 && !(months_taken.include? month_id)
|
170
|
+
result[file] = false
|
171
|
+
months_taken << month_id
|
172
|
+
else
|
173
|
+
result[file] = true
|
142
174
|
end
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
175
|
+
elsif datetime < DateTime.now - 14 # 2 weeks ago
|
176
|
+
if [1, 7, 14, 21].include?(datetime.day) && !(days_taken.include?(day_id))
|
177
|
+
result[file] = false
|
178
|
+
days_taken << day_id
|
179
|
+
else
|
180
|
+
result[file] = true
|
149
181
|
end
|
182
|
+
else
|
183
|
+
result[file] = false
|
150
184
|
end
|
151
185
|
end
|
186
|
+
return result
|
187
|
+
end
|
152
188
|
|
189
|
+
def human_filesize(size)
|
190
|
+
{
|
191
|
+
' B' => 1024,
|
192
|
+
' KB' => 1024 * 1024,
|
193
|
+
' MB' => 1024 * 1024 * 1024,
|
194
|
+
' GB' => 1024 * 1024 * 1024 * 1024,
|
195
|
+
' TB' => 1024 * 1024 * 1024 * 1024 * 1024
|
196
|
+
}.each_pair { |e, s| return "#{(size.to_f / (s / 1024)).round(2)}#{e}" if size < s }
|
153
197
|
end
|
154
198
|
end
|
155
199
|
|
data/lib/techinform/version.rb
CHANGED
data/lib/techinform.rb
CHANGED
@@ -43,7 +43,7 @@ module Techinform
|
|
43
43
|
desc "clean [prefix]", 'Clean old backup files (default prefix: local)'
|
44
44
|
option :delete, type: :boolean, desc: 'Actually delete files'
|
45
45
|
def clean(prefix = 'local')
|
46
|
-
puts Backup.new
|
46
|
+
puts Backup.new(dry_run: !options[:delete]).clean_files(prefix)
|
47
47
|
end
|
48
48
|
end
|
49
49
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: techinform
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alexey Chernikov
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-06-
|
11
|
+
date: 2019-06-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: thor
|