techinform 1.3.2 → 1.4.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/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
|