2016-11-15 17:56:29 +02:00
# frozen_string_literal: true
2016-09-10 17:21:17 +03:00
namespace :mastodon do
2017-04-16 13:53:58 +03:00
desc 'Execute daily tasks'
task :daily do
2017-04-25 17:44:48 +03:00
%w(
mastodon : feeds : clear
mastodon : media : clear
mastodon : users : clear
mastodon : push : refresh
) . each do | task |
2017-04-25 21:35:20 +03:00
puts " Starting #{ task } at #{ Time . now . utc } "
2017-04-25 17:44:48 +03:00
Rake :: Task [ task ] . invoke
end
2017-04-25 21:35:20 +03:00
puts " Completed daily tasks at #{ Time . now . utc } "
2017-04-16 13:53:58 +03:00
end
desc 'Turn a user into an admin, identified by the USERNAME environment variable'
2017-02-13 21:41:48 +02:00
task make_admin : :environment do
include RoutingHelper
2017-05-09 00:08:55 +03:00
account_username = ENV . fetch ( 'USERNAME' )
user = User . joins ( :account ) . where ( accounts : { username : account_username } )
2017-02-13 21:41:48 +02:00
2017-05-09 00:08:55 +03:00
if user . present?
user . update ( admin : true )
puts " Congrats! #{ account_username } is now an admin. \\ o/ \n Navigate to #{ edit_admin_settings_url } to get started "
else
puts " User could not be found; please make sure an Account with the ` #{ account_username } ` username exists. "
end
2017-02-13 21:41:48 +02:00
end
2017-04-09 02:09:46 +03:00
desc 'Manually confirms a user with associated user email address stored in USER_EMAIL environment variable.'
task confirm_email : :environment do
email = ENV . fetch ( 'USER_EMAIL' )
2017-04-16 13:53:58 +03:00
user = User . find_by ( email : email )
2017-04-11 01:13:08 +03:00
if user
user . update ( confirmed_at : Time . now . utc )
2017-04-16 13:53:58 +03:00
puts " #{ email } confirmed "
2017-04-11 01:13:08 +03:00
else
2017-04-16 13:53:58 +03:00
abort " #{ email } not found "
2017-04-11 01:13:08 +03:00
end
2017-04-09 02:09:46 +03:00
end
2016-09-10 17:21:17 +03:00
namespace :media do
desc 'Removes media attachments that have not been assigned to any status for longer than a day'
task clear : :environment do
2016-10-22 20:38:47 +03:00
MediaAttachment . where ( status_id : nil ) . where ( 'created_at < ?' , 1 . day . ago ) . find_each ( & :destroy )
2016-09-10 17:21:17 +03:00
end
2017-01-12 05:19:04 +02:00
desc 'Remove media attachments attributed to silenced accounts'
task remove_silenced : :environment do
MediaAttachment . where ( account : Account . silenced ) . find_each ( & :destroy )
end
2017-04-16 13:53:58 +03:00
desc 'Remove cached remote media attachments that are older than a week'
task remove_remote : :environment do
MediaAttachment . where . not ( remote_url : '' ) . where ( 'created_at < ?' , 1 . week . ago ) . find_each do | media |
media . file . destroy
2017-04-29 03:44:03 +03:00
media . type = :unknown
media . save
2017-04-16 13:53:58 +03:00
end
end
2017-04-29 03:44:03 +03:00
desc 'Set unknown attachment type for remote-only attachments'
task set_unknown : :environment do
Rails . logger . debug 'Setting unknown attachment type for remote-only attachments...'
MediaAttachment . where ( file_file_name : nil ) . where . not ( type : :unknown ) . in_batches . update_all ( type : :unknown )
Rails . logger . debug 'Done!'
end
2016-09-10 17:21:17 +03:00
end
namespace :push do
desc 'Unsubscribes from PuSH updates of feeds nobody follows locally'
task clear : :environment do
2016-10-18 13:23:38 +03:00
Account . remote . without_followers . where . not ( subscription_expires_at : nil ) . find_each do | a |
2016-09-20 02:10:51 +03:00
Rails . logger . debug " PuSH unsubscribing from #{ a . acct } "
2016-12-02 15:14:49 +02:00
UnsubscribeService . new . call ( a )
2016-09-20 01:39:03 +03:00
end
end
desc 'Re-subscribes to soon expiring PuSH subscriptions'
task refresh : :environment do
2017-05-05 03:23:01 +03:00
# No-op
# This task is now executed via sidekiq-scheduler
2016-09-10 17:21:17 +03:00
end
end
namespace :feeds do
2016-11-24 19:17:58 +02:00
desc 'Clear timelines of inactive users'
2016-09-10 17:21:17 +03:00
task clear : :environment do
2017-03-04 00:45:48 +02:00
User . confirmed . where ( 'current_sign_in_at < ?' , 14 . days . ago ) . find_each do | user |
2016-11-24 19:17:58 +02:00
Redis . current . del ( FeedManager . instance . key ( :home , user . account_id ) )
end
end
2017-04-16 13:53:58 +03:00
desc 'Clears all timelines'
2016-11-24 19:17:58 +02:00
task clear_all : :environment do
2016-11-15 17:56:29 +02:00
Redis . current . keys ( 'feed:*' ) . each { | key | Redis . current . del ( key ) }
2016-09-10 17:21:17 +03:00
end
end
2017-03-04 00:45:48 +02:00
namespace :emails do
desc 'Send out digest e-mails'
task digest : :environment do
User . confirmed . joins ( :account ) . where ( accounts : { silenced : false , suspended : false } ) . where ( 'current_sign_in_at < ?' , 20 . days . ago ) . find_each do | user |
DigestMailerWorker . perform_async ( user . id )
end
end
end
2017-03-31 14:01:00 +03:00
2017-04-11 23:51:17 +03:00
namespace :users do
2017-04-15 22:55:28 +03:00
desc 'Clear out unconfirmed users'
2017-04-11 23:51:17 +03:00
task clear : :environment do
2017-04-15 22:55:28 +03:00
# Users that never confirmed e-mail never signed in, means they
# only have a user record and an avatar record, with no files uploaded
User . where ( 'confirmed_at is NULL AND confirmation_sent_at <= ?' , 2 . days . ago ) . find_in_batches do | batch |
Account . where ( id : batch . map ( & :account_id ) ) . delete_all
2017-04-16 22:02:54 +03:00
User . where ( id : batch . map ( & :id ) ) . delete_all
2017-04-15 22:55:28 +03:00
end
2017-04-11 23:51:17 +03:00
end
2017-04-18 02:21:55 +03:00
desc 'List all admin users'
task admins : :environment do
puts 'Admin user emails:'
puts User . admins . map ( & :email ) . join ( " \n " )
end
2017-04-11 23:51:17 +03:00
end
2017-04-15 14:17:07 +03:00
namespace :settings do
desc 'Open registrations on this instance'
task open_registrations : :environment do
setting = Setting . where ( var : 'open_registrations' ) . first
setting . value = true
setting . save
end
desc 'Close registrations on this instance'
task close_registrations : :environment do
setting = Setting . where ( var : 'open_registrations' ) . first
setting . value = false
setting . save
end
end
2017-03-31 14:01:00 +03:00
namespace :maintenance do
desc 'Update counter caches'
task update_counter_caches : :environment do
Rails . logger . debug 'Updating counter caches for accounts...'
Account . unscoped . select ( 'id' ) . find_in_batches do | batch |
Account . where ( id : batch . map ( & :id ) ) . update_all ( 'statuses_count = (select count(*) from statuses where account_id = accounts.id), followers_count = (select count(*) from follows where target_account_id = accounts.id), following_count = (select count(*) from follows where account_id = accounts.id)' )
end
Rails . logger . debug 'Updating counter caches for statuses...'
Status . unscoped . select ( 'id' ) . find_in_batches do | batch |
Status . where ( id : batch . map ( & :id ) ) . update_all ( 'favourites_count = (select count(*) from favourites where favourites.status_id = statuses.id), reblogs_count = (select count(*) from statuses as reblogs where reblogs.reblog_of_id = statuses.id)' )
end
Rails . logger . debug 'Done!'
end
2017-04-11 01:38:58 +03:00
desc 'Generate static versions of GIF avatars/headers'
task add_static_avatars : :environment do
Rails . logger . debug 'Generating static avatars/headers for GIF ones...'
Account . unscoped . where ( avatar_content_type : 'image/gif' ) . or ( Account . unscoped . where ( header_content_type : 'image/gif' ) ) . find_each do | account |
2017-04-16 13:53:58 +03:00
begin
2017-04-17 20:58:54 +03:00
account . avatar . reprocess! if account . avatar_content_type == 'image/gif' && ! account . avatar . exists? ( :static )
account . header . reprocess! if account . header_content_type == 'image/gif' && ! account . header . exists? ( :static )
2017-04-16 13:53:58 +03:00
rescue StandardError = > e
Rails . logger . error " Error while generating static avatars/headers for account #{ account . id } : #{ e } "
next
end
2017-04-11 01:38:58 +03:00
end
Rails . logger . debug 'Done!'
end
2017-03-31 14:01:00 +03:00
end
2016-09-10 17:21:17 +03:00
end