X-Git-Url: http://git.squeep.com/?a=blobdiff_plain;f=lib%2Fpleroma%2Fconfig%2Ftransfer_task.ex;h=9b571d5d9b06f77b5fbca91f20b12e299c476000;hb=e69986169095796f2845c4f859234d96f91bf9ff;hp=3214c9951281dd9ceea9847cc879900075e0f4cf;hpb=ec969eec5149c5fe2a3e676ea07384b4597487f1;p=akkoma diff --git a/lib/pleroma/config/transfer_task.ex b/lib/pleroma/config/transfer_task.ex index 3214c9951..9b571d5d9 100644 --- a/lib/pleroma/config/transfer_task.ex +++ b/lib/pleroma/config/transfer_task.ex @@ -4,56 +4,92 @@ defmodule Pleroma.Config.TransferTask do use Task - alias Pleroma.Web.AdminAPI.Config + + alias Pleroma.ConfigDB + alias Pleroma.Repo + + require Logger def start_link(_) do load_and_update_env() - if Pleroma.Config.get(:env) == :test, do: Ecto.Adapters.SQL.Sandbox.checkin(Pleroma.Repo) + if Pleroma.Config.get(:env) == :test, do: Ecto.Adapters.SQL.Sandbox.checkin(Repo) :ignore end def load_and_update_env do - if Pleroma.Config.get([:instance, :dynamic_configuration]) and - Ecto.Adapters.SQL.table_exists?(Pleroma.Repo, "config") do - for_restart = - Pleroma.Repo.all(Config) - |> Enum.map(&update_env(&1)) - + with true <- Pleroma.Config.get(:configurable_from_database), + true <- Ecto.Adapters.SQL.table_exists?(Repo, "config"), + started_applications <- Application.started_applications() do # We need to restart applications for loaded settings take effect - for_restart - |> Enum.reject(&(&1 in [:pleroma, :ok])) - |> Enum.each(fn app -> - Application.stop(app) - :ok = Application.start(app) - end) + ConfigDB + |> Repo.all() + |> Enum.map(&update_env(&1)) + |> Enum.uniq() + # TODO: some problem with prometheus after restart! + |> Enum.reject(&(&1 in [:pleroma, nil, :prometheus])) + |> Enum.each(&restart(started_applications, &1)) end end defp update_env(setting) do try do - key = - if String.starts_with?(setting.key, "Pleroma.") do - "Elixir." <> setting.key - else - String.trim_leading(setting.key, ":") - end + key = ConfigDB.from_string(setting.key) + group = ConfigDB.from_string(setting.group) + value = ConfigDB.from_binary(setting.value) - group = String.to_existing_atom(setting.group) + if group != :phoenix and key != :serve_endpoints do + default = Pleroma.Config.Holder.config(group, key) - Application.put_env( - group, - String.to_existing_atom(key), - Config.from_binary(setting.value) - ) + merged_value = + if can_be_merged?(default, value) do + ConfigDB.deep_merge(group, key, default, value) + else + value + end - group + :ok = Application.put_env(group, key, merged_value) + + if group != :logger do + group + else + # change logger configuration in runtime, without restart + if Keyword.keyword?(merged_value) and + key not in [:compile_time_application, :backends, :compile_time_purge_matching] do + Logger.configure_backend(key, merged_value) + else + Logger.configure([{key, merged_value}]) + end + + nil + end + end rescue e -> - require Logger - Logger.warn( - "updating env causes error, key: #{inspect(setting.key)}, error: #{inspect(e)}" + "updating env causes error, group: #{inspect(setting.group)}, key: #{ + inspect(setting.key) + }, value: #{inspect(ConfigDB.from_binary(setting.value))}, error: #{inspect(e)}" ) + + nil + end + end + + defp restart(started_applications, app) do + with {^app, _, _} <- List.keyfind(started_applications, app, 0), + :ok <- Application.stop(app) do + :ok = Application.start(app) + else + nil -> Logger.warn("#{app} is not started.") + error -> Logger.warn(inspect(error)) end end + + defp can_be_merged?(val1, val2) when is_map(val1) and is_map(val2), do: true + + defp can_be_merged?(val1, val2) when is_list(val1) and is_list(val2) do + Keyword.keyword?(val1) and Keyword.keyword?(val2) + end + + defp can_be_merged?(_val1, _val2), do: false end