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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f187fd82d7128b0595866009e8bad5e738b19de1cf444135e3277500ca1234d1
4
- data.tar.gz: 8f32da705e93d97e1dee77f333d1407d9bb2adae77be2169101d4ddb81951624
3
+ metadata.gz: 617bad8f7da2970e52597896b96ed96a14c138024fa5e4df81e80603d7c8cd3e
4
+ data.tar.gz: b624229f38a639b5b1dbf47b0a292487c1f6d38a2703da9e22060a0ee9b16a5b
5
5
  SHA512:
6
- metadata.gz: ecf874371250f17dc854a57c0d9cf5f3c48f802d0e1f38c764d2b95080517b89c96d050b2e49ba67ec39b5c5a25e118d3668e3487b9522ef4cfaa1ddb675fb73
7
- data.tar.gz: cea4da064fe4eed7c7993d62f900530441d906a1929630307ad443ec0ae2fd286073ea1fee9d0b03ed78e9b779b79509c00f92d5c549defd0462f6f2db86a2b0
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 compress: true, encrypt: nil
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', dry_run = true)
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
- # Process each backup type
113
- Dir["#{Techinform::BACKUPS_PREFIX}/#{prefix}/*"].each do |type|
114
- puts "Type: #{type}"
115
- # Get all backup name
116
- Dir["#{type}/*"].each do |name|
117
- puts "Name: #{name}"
118
- # Get all files
119
- result = {} # true - delete file, false - do not delete
120
- Dir["#{name}/*"].sort.each do |file|
121
- datetime = get_datetime_from_filename(file)
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
- unless dry_run
144
- return unless HighLine.new.agree "Delete #{result.select{|file, delete| delete}.keys.size} files - Are you sure? (yes/no)"
145
- # Actually delete files
146
- result.select{|file, delete| delete}.keys.each do |file|
147
- puts `rm #{file}`
148
- end
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
 
@@ -1,3 +1,3 @@
1
1
  module Techinform
2
- VERSION = "1.3.2"
2
+ VERSION = "1.4.0"
3
3
  end
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.clean_files(prefix, !options[:delete])
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.3.2
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-09 00:00:00.000000000 Z
11
+ date: 2019-06-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor