aboutsummaryrefslogtreecommitdiff
path: root/lib/pleroma/application/environment.ex
diff options
context:
space:
mode:
Diffstat (limited to 'lib/pleroma/application/environment.ex')
-rw-r--r--lib/pleroma/application/environment.ex105
1 files changed, 105 insertions, 0 deletions
diff --git a/lib/pleroma/application/environment.ex b/lib/pleroma/application/environment.ex
new file mode 100644
index 000000000..72f2a5e6f
--- /dev/null
+++ b/lib/pleroma/application/environment.ex
@@ -0,0 +1,105 @@
+# # Pleroma: A lightweight social networking server
+# # Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>
+# # SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Application.Environment do
+ @moduledoc """
+ Overwrites environment config with settings from config file or database.
+ """
+
+ require Logger
+
+ @doc """
+ Method is called on pleroma start.
+ Config dependent parts don't require restart, because are not started yet.
+ But started apps need restart.
+ """
+ @spec load_from_db_and_update() :: :ok
+ def load_from_db_and_update do
+ Pleroma.ConfigDB.all()
+ |> update(restart_apps: true)
+ end
+
+ @spec update(Path.t()) :: :ok
+ def update(config_path) when is_binary(config_path) do
+ config_path
+ |> Pleroma.Config.Loader.read!()
+ |> Application.put_all_env()
+ end
+
+ @spec update([Pleroma.ConfigDB.t()], keyword()) :: :ok
+ def update(changes, opts \\ []) when is_list(changes) do
+ if Pleroma.Config.get(:configurable_from_database) do
+ defaults = Pleroma.Config.Holder.default_config()
+
+ changes
+ |> filter_logger()
+ |> prepare_logger_changes(defaults)
+ |> Enum.each(&configure_logger/1)
+
+ changes
+ |> Pleroma.ConfigDB.merge_changes_with_defaults(defaults)
+ |> Enum.each(&update_env(&1))
+
+ if opts[:restart_apps] do
+ # restart only apps on pleroma start
+ changes
+ |> Enum.filter(fn %{group: group} ->
+ group not in [:logger, :quack, :pleroma, :prometheus, :postgrex]
+ end)
+ |> Pleroma.Application.ConfigDependentDeps.save_config_paths_for_restart()
+
+ Pleroma.Application.ConfigDependentDeps.restart_dependencies()
+ else
+ Pleroma.Application.ConfigDependentDeps.save_config_paths_for_restart(changes)
+ end
+ end
+
+ :ok
+ end
+
+ defp filter_logger(changes) do
+ Enum.filter(changes, fn %{group: group} -> group in [:logger, :quack] end)
+ end
+
+ defp prepare_logger_changes(changes, defaults) do
+ Enum.map(changes, fn %{group: group} = change ->
+ {change, Pleroma.ConfigDB.merge_change_value_with_default(change, defaults[group])}
+ end)
+ end
+
+ defp configure_logger({%{group: :quack}, merged_value}) do
+ Logger.configure_backend(Quack.Logger, merged_value)
+ end
+
+ defp configure_logger({%{group: :logger} = change, merged_value}) do
+ if change.value[:backends] do
+ Enum.each(Application.get_env(:logger, :backends), &Logger.remove_backend/1)
+
+ Enum.each(merged_value[:backends], &Logger.add_backend/1)
+ end
+
+ if change.value[:console] do
+ console = merged_value[:console]
+ console = put_in(console[:format], console[:format] <> "\n")
+
+ Logger.configure_backend(:console, console)
+ end
+
+ if change.value[:ex_syslogger] do
+ Logger.configure_backend({ExSyslogger, :ex_syslogger}, merged_value[:ex_syslogger])
+ end
+
+ Logger.configure(merged_value)
+ end
+
+ defp update_env(%{group: group, key: key, value: nil}), do: Application.delete_env(group, key)
+
+ defp update_env(%{group: group, value: config} = change) do
+ if group in Pleroma.ConfigDB.groups_without_keys() do
+ Application.put_all_env([{group, config}])
+ else
+ Application.put_env(group, change.key, config)
+ end
+ end
+end