Add rake task to check and purge accounts that are missing in origin (#6085)
* Add rake task to check and purge accounts that are missing in origin * Add progress bar and --force options to mastodon:maintenance:purge_removed_accountsgh/stable
parent
7e6214b869
commit
cafe27fb29
|
@ -1,5 +1,8 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require 'optparse'
|
||||
require 'colorize'
|
||||
|
||||
namespace :mastodon do
|
||||
desc 'Execute daily tasks (deprecated)'
|
||||
task :daily do
|
||||
|
@ -338,5 +341,75 @@ namespace :mastodon do
|
|||
PreviewCard.where(embed_url: '', type: :photo).delete_all
|
||||
LinkCrawlWorker.push_bulk status_ids
|
||||
end
|
||||
|
||||
desc 'Check every known remote account and delete those that no longer exist in origin'
|
||||
task purge_removed_accounts: :environment do
|
||||
prepare_for_options!
|
||||
|
||||
options = {}
|
||||
|
||||
OptionParser.new do |opts|
|
||||
opts.banner = 'Usage: rails mastodon:maintenance:purge_removed_accounts [options]'
|
||||
|
||||
opts.on('-f', '--force', 'Remove all encountered accounts without asking for confirmation') do
|
||||
options[:force] = true
|
||||
end
|
||||
|
||||
opts.on('-h', '--help', 'Display this message') do
|
||||
puts opts
|
||||
exit
|
||||
end
|
||||
end.parse!
|
||||
|
||||
disable_log_stdout!
|
||||
|
||||
total = Account.remote.where(protocol: :activitypub).count
|
||||
progress_bar = ProgressBar.create(total: total, format: '%c/%C |%w>%i| %e')
|
||||
|
||||
Account.remote.where(protocol: :activitypub).partitioned.find_each do |account|
|
||||
progress_bar.increment
|
||||
|
||||
begin
|
||||
res = Request.new(:head, account.uri).perform
|
||||
rescue StandardError
|
||||
# This could happen due to network timeout, DNS timeout, wrong SSL cert, etc,
|
||||
# which should probably not lead to perceiving the account as deleted, so
|
||||
# just skip till next time
|
||||
next
|
||||
end
|
||||
|
||||
if [404, 410].include?(res.code)
|
||||
if options[:force]
|
||||
account.destroy
|
||||
else
|
||||
progress_bar.pause
|
||||
progress_bar.clear
|
||||
print "\nIt seems like #{account.acct} no longer exists. Purge the account from the database? [Y/n]: ".colorize(:yellow)
|
||||
confirm = STDIN.gets.chomp
|
||||
puts ''
|
||||
progress_bar.resume
|
||||
|
||||
if confirm.casecmp('n').zero?
|
||||
next
|
||||
else
|
||||
account.destroy
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def disable_log_stdout!
|
||||
dev_null = Logger.new('/dev/null')
|
||||
|
||||
Rails.logger = dev_null
|
||||
ActiveRecord::Base.logger = dev_null
|
||||
HttpLog.configuration.logger = dev_null
|
||||
Paperclip.options[:log] = false
|
||||
end
|
||||
|
||||
def prepare_for_options!
|
||||
2.times { ARGV.shift }
|
||||
end
|
||||
|
|
Reference in New Issue