diff options
Diffstat (limited to 'lib/mix')
-rw-r--r-- | lib/mix/pleroma.ex | 54 | ||||
-rw-r--r-- | lib/mix/tasks/pleroma/config.ex | 266 | ||||
-rw-r--r-- | lib/mix/tasks/pleroma/docs.ex | 2 | ||||
-rw-r--r-- | lib/mix/tasks/pleroma/instance.ex | 11 |
4 files changed, 150 insertions, 183 deletions
diff --git a/lib/mix/pleroma.ex b/lib/mix/pleroma.ex index 2b6c7d6bb..aa5c56d9a 100644 --- a/lib/mix/pleroma.ex +++ b/lib/mix/pleroma.ex @@ -4,7 +4,6 @@ defmodule Mix.Pleroma do @apps [ - :restarter, :ecto, :ecto_sql, :postgrex, @@ -16,12 +15,15 @@ defmodule Mix.Pleroma do :fast_html, :oban ] + @cachex_children ["object", "user", "scrubber", "web_resp"] + @doc "Common functions to be reused in mix tasks" + @spec start_pleroma() :: {:ok, pid()} def start_pleroma do Pleroma.Config.Holder.save_default() - Pleroma.Config.Oban.warn() Pleroma.Application.limiters_setup() + Pleroma.Config.DeprecationWarnings.check_oban_config() Application.put_env(:phoenix, :serve_endpoints, false, persistent: true) unless System.get_env("DEBUG") do @@ -47,37 +49,28 @@ defmodule Mix.Pleroma do plugins: [] ] - children = - [ - Pleroma.Repo, - Pleroma.Emoji, - {Pleroma.Config.TransferTask, false}, - Pleroma.Web.Endpoint, - {Oban, oban_config}, - {Majic.Pool, - [name: Pleroma.MajicPool, pool_size: Pleroma.Config.get([:majic_pool, :size], 2)]} - ] ++ - http_children(adapter) + children = [ + Pleroma.Application.ConfigDependentDeps, + Pleroma.Repo, + Pleroma.Emoji, + Supervisor.child_spec({Task, &Pleroma.Application.Environment.load_from_db_and_update/0}, + id: :update_env + ), + {Oban, oban_config}, + {Majic.Pool, + [name: Pleroma.MajicPool, pool_size: Pleroma.Config.get([:majic_pool, :size], 2)]}, + Pleroma.Web.Endpoint + ] + + children = [Pleroma.Application.StartUpDependencies.adapter_module() | children] - cachex_children = Enum.map(@cachex_children, &Pleroma.Application.build_cachex(&1, [])) + cachex_children = + Enum.map(@cachex_children, &Pleroma.Application.StartUpDependencies.cachex_spec({&1, []})) Supervisor.start_link(children ++ cachex_children, strategy: :one_for_one, name: Pleroma.Supervisor ) - - if Pleroma.Config.get(:env) not in [:test, :benchmark] do - pleroma_rebooted?() - end - end - - defp pleroma_rebooted? do - if Restarter.Pleroma.rebooted?() do - :ok - else - Process.sleep(10) - pleroma_rebooted?() - end end def load_pleroma do @@ -129,11 +122,4 @@ defmodule Mix.Pleroma do def escape_sh_path(path) do ~S(') <> String.replace(path, ~S('), ~S(\')) <> ~S(') end - - defp http_children(Tesla.Adapter.Gun) do - Pleroma.Gun.ConnectionPool.children() ++ - [{Task, &Pleroma.HTTP.AdapterHelper.Gun.limiter_setup/0}] - end - - defp http_children(_), do: [] end diff --git a/lib/mix/tasks/pleroma/config.ex b/lib/mix/tasks/pleroma/config.ex index 1962154b9..97a81f64e 100644 --- a/lib/mix/tasks/pleroma/config.ex +++ b/lib/mix/tasks/pleroma/config.ex @@ -14,10 +14,13 @@ defmodule Mix.Tasks.Pleroma.Config do @shortdoc "Manages the location of the config" @moduledoc File.read!("docs/administration/CLI_tasks/config.md") - def run(["migrate_to_db"]) do + def run(["migrate_to_db" | options]) do check_configdb(fn -> start_pleroma() - migrate_to_db() + + {opts, _} = OptionParser.parse!(options, strict: [config: :string]) + + migrate_to_db(opts) end) end @@ -39,15 +42,13 @@ defmodule Mix.Tasks.Pleroma.Config do check_configdb(fn -> start_pleroma() - header = config_header() - settings = ConfigDB |> Repo.all() |> Enum.sort() unless settings == [] do - shell_info("#{header}") + shell_info("#{Pleroma.Config.Loader.config_header()}") Enum.each(settings, &dump(&1)) else @@ -73,9 +74,10 @@ defmodule Mix.Tasks.Pleroma.Config do check_configdb(fn -> start_pleroma() - group = maybe_atomize(group) - - dump_group(group) + group + |> maybe_atomize() + |> ConfigDB.get_all_by_group() + |> Enum.each(&dump/1) end) end @@ -100,7 +102,7 @@ defmodule Mix.Tasks.Pleroma.Config do def run(["reset", "--force"]) do check_configdb(fn -> start_pleroma() - truncatedb() + Pleroma.Config.Versioning.reset() shell_info("The ConfigDB settings have been removed from the database.") end) end @@ -119,7 +121,7 @@ defmodule Mix.Tasks.Pleroma.Config do shell_error("\nTHIS CANNOT BE UNDONE!") if shell_prompt("Are you sure you want to continue?", "n") in ~w(Yn Y y) do - truncatedb() + Pleroma.Config.Versioning.reset() shell_info("The ConfigDB settings have been removed from the database.") else @@ -134,14 +136,12 @@ defmodule Mix.Tasks.Pleroma.Config do group = maybe_atomize(group) key = maybe_atomize(key) - with true <- key_exists?(group, key) do + with %ConfigDB{} = config <- ConfigDB.get_by_group_and_key(group, key) do shell_info("The following settings will be removed from ConfigDB:\n") - group - |> ConfigDB.get_by_group_and_key(key) - |> dump() + dump(config) - delete_key(group, key) + Pleroma.Config.Versioning.new_version(%{group: config.group, key: config.key, delete: true}) else _ -> shell_error("No settings in ConfigDB for #{inspect(group)}, #{inspect(key)}. Aborting.") @@ -153,12 +153,22 @@ defmodule Mix.Tasks.Pleroma.Config do group = maybe_atomize(group) - with true <- group_exists?(group) do + configs = ConfigDB.get_all_by_group(group) + + if configs != [] do shell_info("The following settings will be removed from ConfigDB:\n") - dump_group(group) - delete_group(group) + + Enum.each(configs, fn config -> + dump(config) + + Pleroma.Config.Versioning.new_version(%{ + group: config.group, + key: config.key, + delete: true + }) + end) else - _ -> shell_error("No settings in ConfigDB for #{inspect(group)}. Aborting.") + shell_error("No settings in ConfigDB for #{inspect(group)}. Aborting.") end end @@ -168,15 +178,17 @@ defmodule Mix.Tasks.Pleroma.Config do group = maybe_atomize(group) key = maybe_atomize(key) - with true <- key_exists?(group, key) do + with %ConfigDB{} = config <- ConfigDB.get_by_group_and_key(group, key) do shell_info("The following settings will be removed from ConfigDB:\n") - group - |> ConfigDB.get_by_group_and_key(key) - |> dump() + dump(config) if shell_prompt("Are you sure you want to continue?", "n") in ~w(Yn Y y) do - delete_key(group, key) + Pleroma.Config.Versioning.new_version(%{ + group: config.group, + key: config.key, + delete: true + }) else shell_error("No changes made.") end @@ -191,35 +203,67 @@ defmodule Mix.Tasks.Pleroma.Config do group = maybe_atomize(group) - with true <- group_exists?(group) do + configs = ConfigDB.get_all_by_group(group) + + if configs != [] do shell_info("The following settings will be removed from ConfigDB:\n") - dump_group(group) + Enum.each(configs, &dump/1) if shell_prompt("Are you sure you want to continue?", "n") in ~w(Yn Y y) do - delete_group(group) + Enum.each(configs, fn config -> + Pleroma.Config.Versioning.new_version(%{ + group: config.group, + key: config.key, + delete: true + }) + end) else shell_error("No changes made.") end else - _ -> shell_error("No settings in ConfigDB for #{inspect(group)}. Aborting.") + shell_error("No settings in ConfigDB for #{inspect(group)}. Aborting.") + end + end + + def run(["rollback" | options]) do + check_configdb(fn -> + start_pleroma() + {opts, _} = OptionParser.parse!(options, strict: [steps: :integer], aliases: [s: :steps]) + + do_rollback(opts) + end) + end + + defp do_rollback(opts) do + steps = opts[:steps] || 1 + + case Pleroma.Config.Versioning.rollback(steps) do + {:ok, _} -> + shell_info("Success rollback") + + {:error, :no_current_version} -> + shell_error("No version to rollback") + + {:error, :rollback_not_possible} -> + shell_error("Rollback not possible. Incorrect steps value.") + + {:error, _, _, _} -> + shell_error("Problem with backup. Rollback not possible.") + + error -> + shell_error("error occuried: #{inspect(error)}") end end - @spec migrate_to_db(Path.t() | nil) :: any() - def migrate_to_db(file_path \\ nil) do + defp migrate_to_db(opts) do with :ok <- Pleroma.Config.DeprecationWarnings.warn() do - config_file = - if file_path do - file_path - else - if Pleroma.Config.get(:release) do - Pleroma.Config.get(:config_path) - else - "config/#{Pleroma.Config.get(:env)}.secret.exs" - end - end + config_file = opts[:config] || Pleroma.Application.config_path() - do_migrate_to_db(config_file) + if File.exists?(config_file) do + do_migrate_to_db(config_file) + else + shell_info("To migrate settings, you must define custom settings in #{config_file}.") + end else _ -> shell_error("Migration is not allowed until all deprecation warnings have been resolved.") @@ -227,33 +271,9 @@ defmodule Mix.Tasks.Pleroma.Config do end defp do_migrate_to_db(config_file) do - if File.exists?(config_file) do - shell_info("Migrating settings from file: #{Path.expand(config_file)}") - truncatedb() - - custom_config = - config_file - |> read_file() - |> elem(0) - - custom_config - |> Keyword.keys() - |> Enum.each(&create(&1, custom_config)) - else - shell_info("To migrate settings, you must define custom settings in #{config_file}.") - end - end - - defp create(group, settings) do - group - |> Pleroma.Config.Loader.filter_group(settings) - |> Enum.each(fn {key, value} -> - {:ok, _} = ConfigDB.update_or_create(%{group: group, key: key, value: value}) - - shell_info("Settings for key #{key} migrated.") - end) - - shell_info("Settings for group #{inspect(group)} migrated.") + shell_info("Migrating settings from file: #{Path.expand(config_file)}") + {:ok, _} = Pleroma.Config.Versioning.migrate(config_file) + shell_info("Settings migrated.") end defp migrate_from_db(opts) do @@ -270,53 +290,51 @@ defmodule Mix.Tasks.Pleroma.Config do |> Path.join("#{env}.exported_from_db.secret.exs") file = File.open!(config_path, [:write, :utf8]) + IO.write(file, Pleroma.Config.Loader.config_header()) - IO.write(file, config_header()) - - ConfigDB - |> Repo.all() - |> Enum.each(&write_and_delete(&1, file, opts[:delete])) - - :ok = File.close(file) - System.cmd("mix", ["format", config_path]) - - shell_info( - "Database configuration settings have been exported to config/#{env}.exported_from_db.secret.exs" - ) - end - - if Code.ensure_loaded?(Config.Reader) do - defp config_header, do: "import Config\r\n\r\n" - defp read_file(config_file), do: Config.Reader.read_imports!(config_file) - else - defp config_header, do: "use Mix.Config\r\n\r\n" - defp read_file(config_file), do: Mix.Config.eval!(config_file) - end + changes = + ConfigDB + |> Repo.all() + |> Enum.reduce([], fn %{group: group} = config, acc -> + group_str = inspect(group) + value = inspect(config.value, limit: :infinity) + + msg = + if group in ConfigDB.groups_without_keys() do + IO.write(file, "config #{group_str}, #{value}\r\n\r\n") + "config #{group_str} was deleted." + else + key_str = inspect(config.key) + IO.write(file, "config #{group_str}, #{key_str}, #{value}\r\n\r\n") + "config #{group_str}, #{key_str} was deleted." + end - defp write_and_delete(config, file, delete?) do - config - |> write(file) - |> delete(delete?) - end + if opts[:delete] do + shell_info(msg) - defp write(config, file) do - value = inspect(config.value, limit: :infinity) + change = + config + |> Map.take([:group, :key]) + |> Map.put(:delete, true) - IO.write(file, "config #{inspect(config.group)}, #{inspect(config.key)}, #{value}\r\n\r\n") + [change | acc] + else + acc + end + end) - config - end + if opts[:delete] and changes != [] do + Pleroma.Config.Versioning.new_version(changes) + end - defp delete(config, true) do - {:ok, _} = Repo.delete(config) + :ok = File.close(file) + System.cmd("mix", ["format", config_path]) shell_info( - "config #{inspect(config.group)}, #{inspect(config.key)} was deleted from the ConfigDB." + "Database configuration settings have been exported to config/#{env}.exported_from_db.secret.exs" ) end - defp delete(_config, _), do: :ok - defp dump(%ConfigDB{} = config) do value = inspect(config.value, limit: :infinity) @@ -325,31 +343,12 @@ defmodule Mix.Tasks.Pleroma.Config do defp dump(_), do: :noop - defp dump_group(group) when is_atom(group) do - group - |> ConfigDB.get_all_by_group() - |> Enum.each(&dump/1) - end - - defp group_exists?(group) do - group - |> ConfigDB.get_all_by_group() - |> Enum.any?() - end - - defp key_exists?(group, key) do - group - |> ConfigDB.get_by_group_and_key(key) - |> is_nil - |> Kernel.!() - end - defp maybe_atomize(arg) when is_atom(arg), do: arg defp maybe_atomize(":" <> arg), do: maybe_atomize(arg) defp maybe_atomize(arg) when is_binary(arg) do - if ConfigDB.module_name?(arg) do + if Pleroma.Config.Converter.module_name?(arg) do String.to_existing_atom("Elixir." <> arg) else String.to_atom(arg) @@ -366,23 +365,4 @@ defmodule Mix.Tasks.Pleroma.Config do ) end end - - defp delete_key(group, key) do - check_configdb(fn -> - ConfigDB.delete(%{group: group, key: key}) - end) - end - - defp delete_group(group) do - check_configdb(fn -> - group - |> ConfigDB.get_all_by_group() - |> Enum.each(&ConfigDB.delete/1) - end) - end - - defp truncatedb do - Ecto.Adapters.SQL.query!(Repo, "TRUNCATE config;") - Ecto.Adapters.SQL.query!(Repo, "ALTER SEQUENCE config_id_seq RESTART;") - end end diff --git a/lib/mix/tasks/pleroma/docs.ex b/lib/mix/tasks/pleroma/docs.ex index 45cca1c74..e0e9834f4 100644 --- a/lib/mix/tasks/pleroma/docs.ex +++ b/lib/mix/tasks/pleroma/docs.ex @@ -32,7 +32,7 @@ defmodule Mix.Tasks.Pleroma.Docs do defp do_run(implementation) do start_pleroma() - with descriptions <- Pleroma.Config.Loader.read("config/description.exs"), + with descriptions <- Pleroma.Config.Loader.read!("config/description.exs"), {:ok, file_path} <- Pleroma.Docs.Generator.process( implementation, diff --git a/lib/mix/tasks/pleroma/instance.ex b/lib/mix/tasks/pleroma/instance.ex index da27a99d0..cb6216474 100644 --- a/lib/mix/tasks/pleroma/instance.ex +++ b/lib/mix/tasks/pleroma/instance.ex @@ -86,9 +86,9 @@ defmodule Mix.Tasks.Pleroma.Instance do get_option( options, :indexable, - "Do you want search engines to index your site? (y/n)", - "y" - ) === "y" + "Do you want to deny Search Engine bots from crawling the site? (y/n)", + "n" + ) === "n" db_configurable? = get_option( @@ -275,7 +275,8 @@ defmodule Mix.Tasks.Pleroma.Instance do end end - defp write_robots_txt(static_dir, indexable, template_dir) do + @spec write_robots_txt(Path.t(), boolean(), Path.t()) :: :ok | no_return() + def write_robots_txt(static_dir, indexable, template_dir) do robots_txt = EEx.eval_file( template_dir <> "/robots_txt.eex", @@ -289,7 +290,7 @@ defmodule Mix.Tasks.Pleroma.Instance do shell_info("Backing up existing robots.txt to #{robots_txt_path}.bak") end - File.write(robots_txt_path, robots_txt) + :ok = File.write(robots_txt_path, robots_txt) shell_info("Writing #{robots_txt_path}.") end |