diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/cli.rb | 77 | ||||
-rw-r--r-- | lib/mastodon/search_cli.rb | 22 | ||||
-rw-r--r-- | lib/mastodon/version.rb | 6 |
3 files changed, 102 insertions, 3 deletions
diff --git a/lib/cli.rb b/lib/cli.rb index 59f0f3076..b56c6e76f 100644 --- a/lib/cli.rb +++ b/lib/cli.rb @@ -5,6 +5,7 @@ require_relative 'mastodon/media_cli' require_relative 'mastodon/emoji_cli' require_relative 'mastodon/accounts_cli' require_relative 'mastodon/feeds_cli' +require_relative 'mastodon/search_cli' require_relative 'mastodon/settings_cli' require_relative 'mastodon/statuses_cli' require_relative 'mastodon/domains_cli' @@ -28,6 +29,9 @@ module Mastodon desc 'feeds SUBCOMMAND ...ARGS', 'Manage feeds' subcommand 'feeds', Mastodon::FeedsCLI + desc 'search SUBCOMMAND ...ARGS', 'Manage the search engine' + subcommand 'search', Mastodon::SearchCLI + desc 'settings SUBCOMMAND ...ARGS', 'Manage dynamic settings' subcommand 'settings', Mastodon::SettingsCLI @@ -37,6 +41,79 @@ module Mastodon desc 'domains SUBCOMMAND ...ARGS', 'Manage account domains' subcommand 'domains', Mastodon::DomainsCLI + option :dry_run, type: :boolean + desc 'self-destruct', 'Erase the server from the federation' + long_desc <<~LONG_DESC + Erase the server from the federation by broadcasting account delete + activities to all known other servers. This allows a "clean exit" from + running a Mastodon server, as it leaves next to no cache behind on + other servers. + + This command is always interactive and requires confirmation twice. + + No local data is actually deleted, because emptying the + database or removing files is much faster through other, external + means, such as e.g. deleting the entire VPS. However, because other + servers will delete data about local users, but no local data will be + updated (such as e.g. followers), there will be a state mismatch + that will lead to glitches and issues if you then continue to run and use + the server. + + So either you know exactly what you are doing, or you are starting + from a blank slate afterwards by manually clearing out all the local + data! + LONG_DESC + def self_destruct + require 'tty-prompt' + + prompt = TTY::Prompt.new + + exit(1) unless prompt.ask('Type in the domain of the server to confirm:', required: true) == Rails.configuration.x.local_domain + + prompt.warn('This operation WILL NOT be reversible. It can also take a long time.') + prompt.warn('While the data won\'t be erased locally, the server will be in a BROKEN STATE afterwards.') + prompt.warn('A running Sidekiq process is required. Do not shut it down until queues clear.') + + exit(1) if prompt.no?('Are you sure you want to proceed?') + + inboxes = Account.inboxes + processed = 0 + dry_run = options[:dry_run] ? ' (DRY RUN)' : '' + + if inboxes.empty? + prompt.ok('It seems like your server has not federated with anything') + prompt.ok('You can shut it down and delete it any time') + return + end + + prompt.warn('Do NOT interrupt this process...') + + Account.local.without_suspended.find_each do |account| + payload = ActiveModelSerializers::SerializableResource.new( + account, + serializer: ActivityPub::DeleteActorSerializer, + adapter: ActivityPub::Adapter + ).as_json + + json = Oj.dump(ActivityPub::LinkedDataSignature.new(payload).sign!(account)) + + unless options[:dry_run] + ActivityPub::DeliveryWorker.push_bulk(inboxes) do |inbox_url| + [json, account.id, inbox_url] + end + + account.update_column(:suspended, true) + end + + processed += 1 + end + + prompt.ok("Queued #{inboxes.size * processed} items into Sidekiq for #{processed} accounts#{dry_run}") + prompt.ok('Wait until Sidekiq processes all items, then you can shut everything down and delete the data') + rescue TTY::Reader::InputInterrupt + exit(1) + end + map %w(--version -v) => :version desc 'version', 'Show version' diff --git a/lib/mastodon/search_cli.rb b/lib/mastodon/search_cli.rb new file mode 100644 index 000000000..42ad93f1e --- /dev/null +++ b/lib/mastodon/search_cli.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true + +require_relative '../../config/boot' +require_relative '../../config/environment' +require_relative 'cli_helper' + +module Mastodon + class SearchCLI < Thor + desc 'deploy', 'Create or update an ElasticSearch index and populate it' + long_desc <<~LONG_DESC + If ElasticSearch is empty, this command will create the necessary indices + and then import data from the database into those indices. + + This command will also upgrade indices if the underlying schema has been + changed since the last run. + LONG_DESC + def deploy + processed = Chewy::RakeHelper.upgrade + Chewy::RakeHelper.sync(except: processed) + end + end +end diff --git a/lib/mastodon/version.rb b/lib/mastodon/version.rb index b35dd0561..c728b3ab2 100644 --- a/lib/mastodon/version.rb +++ b/lib/mastodon/version.rb @@ -9,11 +9,11 @@ module Mastodon end def minor - 7 + 8 end def patch - 4 + 0 end def pre @@ -21,7 +21,7 @@ module Mastodon end def flags - '' + 'rc1' end def to_a |