diff options
Diffstat (limited to 'lib/mix/tasks')
-rw-r--r-- | lib/mix/tasks/pleroma/config.ex | 281 | ||||
-rw-r--r-- | lib/mix/tasks/pleroma/docs.ex | 2 |
2 files changed, 111 insertions, 172 deletions
diff --git a/lib/mix/tasks/pleroma/config.ex b/lib/mix/tasks/pleroma/config.ex index 22502a522..41b287163 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 @@ -97,17 +99,11 @@ defmodule Mix.Tasks.Pleroma.Config do end) end - def run(["reset", "--force"]) do + def run(["reset" | opts]) do check_configdb(fn -> start_pleroma() - truncatedb() - shell_info("The ConfigDB settings have been removed from the database.") - end) - end - def run(["reset"]) do - check_configdb(fn -> - start_pleroma() + {opts, []} = OptionParser.parse!(opts, strict: [force: :boolean]) shell_info("The following settings will be permanently removed:") @@ -118,8 +114,8 @@ 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() + if opts[:force] or shell_prompt("Are you sure you want to continue?", "n") in ~w(Yn Y y) do + Pleroma.Config.Versioning.reset() shell_info("The ConfigDB settings have been removed from the database.") else @@ -128,55 +124,65 @@ defmodule Mix.Tasks.Pleroma.Config do end) end - def run(["delete", "--force", group, key]) do - start_pleroma() - - group = maybe_atomize(group) - key = maybe_atomize(key) + def run(["delete", group]), do: delete(group, force: false) + def run(["delete", "--force", group]), do: delete(group, force: true) - with true <- key_exists?(group, key) do - shell_info("The following settings will be removed from ConfigDB:\n") + def run(["delete", group, key]), do: delete(group, key, force: false) + def run(["delete", "--force", group, key]), do: delete(group, key, force: true) - group - |> ConfigDB.get_by_group_and_key(key) - |> dump() + def run(["rollback" | options]) do + check_configdb(fn -> + start_pleroma() + {opts, _} = OptionParser.parse!(options, strict: [steps: :integer], aliases: [s: :steps]) - delete_key(group, key) - else - _ -> - shell_error("No settings in ConfigDB for #{inspect(group)}, #{inspect(key)}. Aborting.") - end + do_rollback(opts) + end) end - def run(["delete", "--force", group]) do + defp delete(group, opts) do start_pleroma() 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, &dump/1) + + if opts[:force] or shell_prompt("Are you sure you want to continue?", "n") in ~w(Yn Y y) do + 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(["delete", group, key]) do + defp delete(group, key, opts) do start_pleroma() 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) + if opts[:force] or shell_prompt("Are you sure you want to continue?", "n") in ~w(Yn Y y) do + Pleroma.Config.Versioning.new_version(%{ + group: config.group, + key: config.key, + delete: true + }) else shell_error("No changes made.") end @@ -186,40 +192,36 @@ defmodule Mix.Tasks.Pleroma.Config do end end - def run(["delete", group]) do - start_pleroma() + defp do_rollback(opts) do + steps = opts[:steps] || 1 - group = maybe_atomize(group) + case Pleroma.Config.Versioning.rollback(steps) do + {:ok, _} -> + shell_info("Success rollback") - with true <- group_exists?(group) do - shell_info("The following settings will be removed from ConfigDB:\n") - dump_group(group) + {:error, :no_current_version} -> + shell_error("No version to rollback") - if shell_prompt("Are you sure you want to continue?", "n") in ~w(Yn Y y) do - delete_group(group) - else - shell_error("No changes made.") - end - else - _ -> shell_error("No settings in ConfigDB for #{inspect(group)}. Aborting.") + {: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 +229,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 @@ -296,48 +274,47 @@ defmodule Mix.Tasks.Pleroma.Config do end defp write_config(file, path, opts) do - IO.write(file, config_header()) - - ConfigDB - |> Repo.all() - |> Enum.each(&write_and_delete(&1, file, opts[:delete])) + IO.write(file, Pleroma.Config.Loader.config_header()) - :ok = File.close(file) - System.cmd("mix", ["format", path]) - 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 - - defp write_and_delete(config, file, delete?) do - config - |> write(file) - |> delete(delete?) - 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(config, file) do - value = inspect(config.value, limit: :infinity) + if opts[:delete] do + shell_info(msg) - IO.write(file, "config #{inspect(config.group)}, #{inspect(config.key)}, #{value}\r\n\r\n") + change = + config + |> Map.take([:group, :key]) + |> Map.put(:delete, true) - config - end + [change | acc] + else + acc + end + end) - defp delete(config, true) do - {:ok, _} = Repo.delete(config) + if Keyword.get(opts, :delete, false) and changes != [] do + Pleroma.Config.Versioning.new_version(changes) + end - shell_info( - "config #{inspect(config.group)}, #{inspect(config.key)} was deleted from the ConfigDB." - ) + :ok = File.close(file) + System.cmd("mix", ["format", path]) end - defp delete(_config, _), do: :ok - defp dump(%ConfigDB{} = config) do value = inspect(config.value, limit: :infinity) @@ -346,31 +323,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) @@ -387,23 +345,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, |