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 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