diff options
Diffstat (limited to 'lib/mix/tasks')
-rw-r--r-- | lib/mix/tasks/pleroma/config.ex | 145 | ||||
-rw-r--r-- | lib/mix/tasks/pleroma/docs.ex | 2 |
2 files changed, 103 insertions, 44 deletions
diff --git a/lib/mix/tasks/pleroma/config.ex b/lib/mix/tasks/pleroma/config.ex index 590c7a914..715b72dbe 100644 --- a/lib/mix/tasks/pleroma/config.ex +++ b/lib/mix/tasks/pleroma/config.ex @@ -4,71 +4,130 @@ defmodule Mix.Tasks.Pleroma.Config do use Mix.Task + import Mix.Pleroma + + alias Pleroma.ConfigDB alias Pleroma.Repo - alias Pleroma.Web.AdminAPI.Config + @shortdoc "Manages the location of the config" @moduledoc File.read!("docs/administration/CLI_tasks/config.md") + def run(["migrate_to_db"]) do start_pleroma() + migrate_to_db() + end - if Pleroma.Config.get([:instance, :dynamic_configuration]) do - Application.get_all_env(:pleroma) - |> Enum.reject(fn {k, _v} -> k in [Pleroma.Repo, :env] end) - |> Enum.each(fn {k, v} -> - key = to_string(k) |> String.replace("Elixir.", "") + def run(["migrate_from_db" | options]) do + # TODO: add support for releases + start_pleroma() + + {opts, _} = + OptionParser.parse!(options, + strict: [env: :string, delete_from_db: :boolean], + aliases: [d: :delete_from_db] + ) - key = - if String.starts_with?(key, "Pleroma.") do - key - else - ":" <> key - end + with {:active?, true} <- + {:active?, Pleroma.Config.get([:configurable_from_database])}, + env when is_binary(env) <- opts[:env] || "prod", + config_path <- config_path(env), + {:ok, file} <- File.open(config_path, [:write, :utf8]) do + IO.write(file, config_header()) - {:ok, _} = Config.update_or_create(%{group: "pleroma", key: key, value: v}) - Mix.shell().info("#{key} is migrated.") - end) + ConfigDB + |> Repo.all() + |> Enum.each(&write_to_file_with_deletion(&1, file, opts[:delete_from_db])) - Mix.shell().info("Settings migrated.") + File.close(file) + System.cmd("mix", ["format", config_path]) else - Mix.shell().info( + {:active?, false} -> + shell_info( + "Migration is not allowed by config. You can change this behavior in instance settings." + ) + + error -> + shell_info("Error occuried while opening file. #{inspect(error)}") + end + end + + defp config_path(env) do + path = + if Pleroma.Config.get(:release) do + :config_path + |> Pleroma.Config.get() + |> Path.dirname() + else + "config" + end + + Path.join(path, "#{env}.exported_from_db.secret.exs") + end + + @spec migrate_to_db(Path.t() | nil) :: any() + def migrate_to_db(file_path \\ nil) do + if Pleroma.Config.get([:configurable_from_database]) do + user_config_file = + if Pleroma.Config.get(:release), + do: Pleroma.Config.get(:config_path), + else: "config/#{Pleroma.Config.get(:env)}.secret.exs" + + config_file = file_path || user_config_file + do_migrate_to_db(config_file) + else + shell_info( "Migration is not allowed by config. You can change this behavior in instance settings." ) end end - def run(["migrate_from_db", env, delete?]) do - start_pleroma() + 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 do_migrate_to_db(config_file) do + if File.exists?(config_file) do + {custom_config, _paths} = read_file(config_file) - delete? = if delete? == "true", do: true, else: false + custom_config + |> Keyword.keys() + |> Enum.each(&create(&1, custom_config[&1])) + else + shell_info("To migrate settings, you must define custom settings in #{config_file}.") + end + end - if Pleroma.Config.get([:instance, :dynamic_configuration]) do - config_path = "config/#{env}.exported_from_db.secret.exs" + defp create(group, settings) do + Enum.reject(settings, fn {k, _v} -> + k in [Pleroma.Repo, Pleroma.Web.Endpoint, :env, :configurable_from_database] or + (group == :phoenix and k == :serve_endpoints) + end) + |> Enum.each(fn {key, value} -> + key = inspect(key) + {:ok, _} = ConfigDB.update_or_create(%{group: inspect(group), key: key, value: value}) - {:ok, file} = File.open(config_path, [:write, :utf8]) - IO.write(file, "use Mix.Config\r\n") + shell_info("Settings for key #{key} migrated.") + end) - Repo.all(Config) - |> Enum.each(fn config -> - IO.write( - file, - "config :#{config.group}, #{config.key}, #{ - inspect(Config.from_binary(config.value), limit: :infinity) - }\r\n\r\n" - ) + shell_info("Settings for group :#{group} migrated.") + end - if delete? do - {:ok, _} = Repo.delete(config) - Mix.shell().info("#{config.key} deleted from DB.") - end - end) + defp write_to_file_with_deletion(config, file, with_deletion) do + IO.write( + file, + "config #{config.group}, #{config.key}, #{ + inspect(ConfigDB.from_binary(config.value), limit: :infinity) + }\r\n\r\n" + ) - File.close(file) - System.cmd("mix", ["format", config_path]) - else - Mix.shell().info( - "Migration is not allowed by config. You can change this behavior in instance settings." - ) + if with_deletion do + {:ok, _} = Repo.delete(config) + shell_info("#{config.key} deleted from DB.") end end end diff --git a/lib/mix/tasks/pleroma/docs.ex b/lib/mix/tasks/pleroma/docs.ex index 0d2663648..3c870f876 100644 --- a/lib/mix/tasks/pleroma/docs.ex +++ b/lib/mix/tasks/pleroma/docs.ex @@ -28,7 +28,7 @@ defmodule Mix.Tasks.Pleroma.Docs do defp do_run(implementation) do start_pleroma() - with {descriptions, _paths} <- Mix.Config.eval!("config/description.exs"), + with descriptions <- Pleroma.Config.Loader.load("config/description.exs"), {:ok, file_path} <- Pleroma.Docs.Generator.process( implementation, |