0bc4c4029a30a155a61712eee3f94e43cbca1f18
[akkoma] / lib / pleroma / config / transfer_task.ex
1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
3 # SPDX-License-Identifier: AGPL-3.0-only
4
5 defmodule Pleroma.Config.TransferTask do
6 use Task
7
8 require Logger
9
10 alias Pleroma.Repo
11 alias Pleroma.Web.AdminAPI.Config
12
13 def start_link(_) do
14 load_and_update_env()
15 if Pleroma.Config.get(:env) == :test, do: Ecto.Adapters.SQL.Sandbox.checkin(Repo)
16 :ignore
17 end
18
19 def load_and_update_env do
20 with true <- Pleroma.Config.get([:instance, :dynamic_configuration]),
21 true <- Ecto.Adapters.SQL.table_exists?(Repo, "config"),
22 started_applications <- Application.started_applications() do
23 # We need to restart applications for loaded settings take effect
24 Config
25 |> Repo.all()
26 |> Enum.map(&update_env(&1))
27 |> Enum.uniq()
28 # TODO: some problem with prometheus after restart!
29 |> Enum.reject(&(&1 in [:pleroma, nil, :prometheus]))
30 |> Enum.each(&restart(started_applications, &1))
31 end
32 end
33
34 defp update_env(setting) do
35 try do
36 key = Config.from_string(setting.key)
37 group = Config.from_string(setting.group)
38 value = Config.from_binary(setting.value)
39
40 :ok = Application.put_env(group, key, value)
41
42 group
43 rescue
44 e ->
45 Logger.warn(
46 "updating env causes error, key: #{inspect(setting.key)}, error: #{inspect(e)}"
47 )
48
49 nil
50 end
51 end
52
53 defp restart(started_applications, app) do
54 with {^app, _, _} <- List.keyfind(started_applications, app, 0),
55 :ok <- Application.stop(app) do
56 :ok = Application.start(app)
57 else
58 nil -> Logger.warn("#{app} is not started.")
59 error -> Logger.warn(inspect(error))
60 end
61 end
62 end