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_accounts
This commit is contained in:
		
							parent
							
								
									7e6214b869
								
							
						
					
					
						commit
						cafe27fb29
					
				
					 1 changed files with 73 additions and 0 deletions
				
			
		| 
						 | 
					@ -1,5 +1,8 @@
 | 
				
			||||||
# frozen_string_literal: true
 | 
					# frozen_string_literal: true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					require 'optparse'
 | 
				
			||||||
 | 
					require 'colorize'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace :mastodon do
 | 
					namespace :mastodon do
 | 
				
			||||||
  desc 'Execute daily tasks (deprecated)'
 | 
					  desc 'Execute daily tasks (deprecated)'
 | 
				
			||||||
  task :daily do
 | 
					  task :daily do
 | 
				
			||||||
| 
						 | 
					@ -338,5 +341,75 @@ namespace :mastodon do
 | 
				
			||||||
      PreviewCard.where(embed_url: '', type: :photo).delete_all
 | 
					      PreviewCard.where(embed_url: '', type: :photo).delete_all
 | 
				
			||||||
      LinkCrawlWorker.push_bulk status_ids
 | 
					      LinkCrawlWorker.push_bulk status_ids
 | 
				
			||||||
    end
 | 
					    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
 | 
				
			||||||
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
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		
		Reference in a new issue