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 | ||||
| 
 | ||||
| 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 a new issue