99 lines
2.5 KiB
Ruby
Raw Normal View History

2016-09-24 13:52:43 +02:00
module Hbc
class CLI
2017-05-20 19:08:03 +02:00
class Cleanup < AbstractCommand
2016-09-24 13:52:43 +02:00
OUTDATED_DAYS = 10
OUTDATED_TIMESTAMP = Time.now - (60 * 60 * 24 * OUTDATED_DAYS)
def self.help
"cleans up cached downloads and tracker symlinks"
end
2016-08-18 22:11:42 +03:00
2016-09-24 13:52:43 +02:00
def self.needs_init?
true
end
2016-08-18 22:11:42 +03:00
2016-09-24 13:52:43 +02:00
attr_reader :cache_location, :outdated_only
2017-05-19 20:27:25 +02:00
def initialize(*args, cache_location: Hbc.cache, outdated_only: CLI.outdated?)
@args = args
2016-09-24 13:52:43 +02:00
@cache_location = Pathname.new(cache_location)
@outdated_only = outdated_only
end
2016-08-23 01:43:03 +02:00
2017-05-19 20:27:25 +02:00
def run
remove_cache_files(*@args)
2016-09-24 13:52:43 +02:00
end
2016-08-18 22:11:42 +03:00
2016-09-24 13:52:43 +02:00
def cache_files
return [] unless cache_location.exist?
cache_location.children
.map(&method(:Pathname))
.reject(&method(:outdated?))
end
2016-08-18 22:11:42 +03:00
2016-09-24 13:52:43 +02:00
def outdated?(file)
outdated_only && file && file.stat.mtime > OUTDATED_TIMESTAMP
end
2016-08-18 22:11:42 +03:00
2016-09-24 13:52:43 +02:00
def incomplete?(file)
file.extname == ".incomplete"
end
2016-08-18 22:11:42 +03:00
2016-09-24 13:52:43 +02:00
def cache_incompletes
cache_files.select(&method(:incomplete?))
end
2016-08-18 22:11:42 +03:00
2016-09-24 13:52:43 +02:00
def cache_completes
cache_files.reject(&method(:incomplete?))
end
2016-08-18 22:11:42 +03:00
2016-09-24 13:52:43 +02:00
def disk_cleanup_size
2017-03-07 18:02:31 +01:00
cache_files.map(&:disk_usage).inject(:+)
2016-09-24 13:52:43 +02:00
end
2016-08-23 01:43:03 +02:00
2016-09-24 13:52:43 +02:00
def remove_cache_files(*tokens)
message = "Removing cached downloads"
message.concat " for #{tokens.join(", ")}" unless tokens.empty?
message.concat " older than #{OUTDATED_DAYS} days old" if outdated_only
ohai message
2016-08-23 01:43:03 +02:00
2016-09-24 13:52:43 +02:00
deletable_cache_files = if tokens.empty?
cache_files
else
start_withs = tokens.map { |token| "#{token}--" }
2016-10-23 14:44:14 +02:00
cache_files.select do |path|
path.basename.to_s.start_with?(*start_withs)
2016-10-23 14:44:14 +02:00
end
end
2016-08-18 22:11:42 +03:00
2016-09-24 13:52:43 +02:00
delete_paths(deletable_cache_files)
2016-08-18 22:11:42 +03:00
end
2016-09-24 13:52:43 +02:00
def delete_paths(paths)
cleanup_size = 0
processed_files = 0
paths.each do |item|
next unless item.exist?
processed_files += 1
if Utils.file_locked?(item)
puts "skipping: #{item} is locked"
next
end
puts item
item_size = File.size?(item)
cleanup_size += item_size unless item_size.nil?
item.unlink
end
if processed_files.zero?
puts "Nothing to do"
else
disk_space = disk_usage_readable(cleanup_size)
ohai "This operation has freed approximately #{disk_space} of disk space."
end
end
2016-08-18 22:11:42 +03:00
end
end
end