diff options
Diffstat (limited to 'lib/mix/tasks')
| -rw-r--r-- | lib/mix/tasks/pleroma/config.ex | 155 | ||||
| -rw-r--r-- | lib/mix/tasks/pleroma/docs.ex | 2 | 
2 files changed, 115 insertions, 42 deletions
| diff --git a/lib/mix/tasks/pleroma/config.ex b/lib/mix/tasks/pleroma/config.ex index 590c7a914..861832451 100644 --- a/lib/mix/tasks/pleroma/config.ex +++ b/lib/mix/tasks/pleroma/config.ex @@ -4,71 +4,144 @@  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 + +  def run(["migrate_from_db" | options]) do +    start_pleroma() + +    {opts, _} = +      OptionParser.parse!(options, +        strict: [env: :string, delete: :boolean], +        aliases: [d: :delete] +      ) -    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.", "") +    migrate_from_db(opts) +  end -        key = -          if String.starts_with?(key, "Pleroma.") do -            key +  @spec migrate_to_db(Path.t() | nil) :: any() +  def migrate_to_db(file_path \\ nil) do +    if Pleroma.Config.get([:configurable_from_database]) do +      config_file = +        if file_path do +          file_path +        else +          if Pleroma.Config.get(:release) do +            Pleroma.Config.get(:config_path)            else -            ":" <> key +            "config/#{Pleroma.Config.get(:env)}.secret.exs"            end +        end -        {:ok, _} = Config.update_or_create(%{group: "pleroma", key: key, value: v}) -        Mix.shell().info("#{key} is migrated.") -      end) - -      Mix.shell().info("Settings migrated.") +      do_migrate_to_db(config_file)      else -      Mix.shell().info( -        "Migration is not allowed by config. You can change this behavior in instance settings." -      ) +      migration_error()      end    end -  def run(["migrate_from_db", env, delete?]) do -    start_pleroma() +  defp do_migrate_to_db(config_file) do +    if File.exists?(config_file) do +      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 -    delete? = if delete? == "true", do: true, else: false +  defp create(group, settings) do +    group +    |> Pleroma.Config.Loader.filter_group(settings) +    |> Enum.each(fn {key, value} -> +      key = inspect(key) +      {:ok, _} = ConfigDB.update_or_create(%{group: inspect(group), key: key, value: value}) -    if Pleroma.Config.get([:instance, :dynamic_configuration]) do -      config_path = "config/#{env}.exported_from_db.secret.exs" +      shell_info("Settings for key #{key} migrated.") +    end) -      {:ok, file} = File.open(config_path, [:write, :utf8]) -      IO.write(file, "use Mix.Config\r\n") +    shell_info("Settings for group :#{group} 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" -        ) +  defp migrate_from_db(opts) do +    if Pleroma.Config.get([:configurable_from_database]) do +      env = opts[:env] || "prod" -        if delete? do -          {:ok, _} = Repo.delete(config) -          Mix.shell().info("#{config.key} deleted from DB.") +      config_path = +        if Pleroma.Config.get(:release) do +          :config_path +          |> Pleroma.Config.get() +          |> Path.dirname() +        else +          "config"          end -      end) +        |> Path.join("#{env}.exported_from_db.secret.exs") + +      file = File.open!(config_path, [:write, :utf8]) + +      IO.write(file, config_header()) -      File.close(file) +      ConfigDB +      |> Repo.all() +      |> Enum.each(&write_and_delete(&1, file, opts[:delete])) + +      :ok = 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." -      ) +      migration_error()      end    end + +  defp migration_error do +    shell_error( +      "Migration is not allowed in config. You can change this behavior by setting `configurable_from_database` to true." +    ) +  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 + +  defp write(config, file) do +    value = +      config.value +      |> ConfigDB.from_binary() +      |> inspect(limit: :infinity) + +    IO.write(file, "config #{config.group}, #{config.key}, #{value}\r\n\r\n") + +    config +  end + +  defp delete(config, true) do +    {:ok, _} = Repo.delete(config) +    shell_info("#{config.key} deleted from DB.") +  end + +  defp delete(_config, _), do: :ok  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, | 
