format: "$metadata[$level] $message",
metadata: [:request_id]
-config :quack,
- level: :warn,
- meta: [:all],
- webhook_url: "https://hooks.slack.com/services/YOUR-KEY-HERE"
-
config :mime, :types, %{
"application/xml" => ["xml"],
"application/xrd+xml" => ["xrd+xml"],
}
]
},
- %{
- group: :quack,
- type: :group,
- label: "Quack Logger",
- description: "Quack-related settings",
- children: [
- %{
- key: :level,
- type: {:dropdown, :atom},
- description: "Log level",
- suggestions: [:debug, :info, :warn, :error]
- },
- %{
- key: :meta,
- type: {:list, :atom},
- description: "Configure which metadata you want to report on",
- suggestions: [
- :application,
- :module,
- :file,
- :function,
- :line,
- :pid,
- :crash_reason,
- :initial_call,
- :registered_name,
- :all,
- :none
- ]
- },
- %{
- key: :webhook_url,
- label: "Webhook URL",
- type: :string,
- description: "Configure the Slack incoming webhook",
- suggestions: ["https://hooks.slack.com/services/YOUR-KEY-HERE"]
- }
- ]
- },
%{
group: :pleroma,
key: :frontend_configurations,
level: :info,
ident: "pleroma",
format: "$metadata[$level] $message"
-
-config :quack,
- level: :warn,
- meta: [:all],
- webhook_url: "https://hooks.slack.com/services/YOUR-API-KEY-HERE"
```
-See the [Quack Github](https://github.com/azohra/quack) for more details
-
-
-
## Database options
### RUM indexing for full text search
```elixir
@full_key_update [
{:pleroma, :ecto_repos},
- {:quack, :meta},
{:mime, :types},
{:cors_plug, [:max_age, :methods, :expose, :headers]},
{:auto_linker, :opts},
]
```
-*Settings without explicit key must be sended in separate config object params.*
-```elixir
-config :quack,
- level: :debug,
- meta: [:all],
- ...
-```
-```json
-{
- "configs": [
- {"group": ":quack", "key": ":level", "value": ":debug"},
- {"group": ":quack", "key": ":meta", "value": [":all"]},
- ...
- ]
-}
-```
- Request:
```json
check_uploders_s3_public_endpoint(),
check_quarantined_instances_tuples(),
check_transparency_exclusions_tuples(),
- check_simple_policy_tuples()
+ check_simple_policy_tuples(),
+ check_http_adapter()
]
|> Enum.reduce(:ok, fn
:ok, :ok -> :ok
end
end
+ def check_http_adapter do
+ http_adapter = Application.get_env(:tesla, :adapter)
+ case http_adapter do
+ {Tesla.Adapter.Finch, _} ->
+ :ok
+
+ _anything_else ->
+ Logger.error("""
+ !!!CONFIG ERROR!!!
+ Your config is using a custom tesla adapter, this was standardised
+ to finch in 2022.06, and alternate adapters were removed in 2023.02.
+ Please ensure you either:
+ \n* do not have any custom value for `:tesla, :adapter`, or
+ \n* have `config :tesla, :adapter, {Tesla.Adapter.Finch, name: MyFinch}`
+ """)
+
+ :error
+ end
+ end
+
def check_old_mrf_config do
warning_preface = """
!!!DEPRECATION WARNING!!!
{logger, other} =
(Repo.all(ConfigDB) ++ deleted_settings)
|> Enum.map(&merge_with_default/1)
- |> Enum.split_with(fn {group, _, _, _} -> group in [:logger, :quack] end)
+ |> Enum.split_with(fn {group, _, _, _} -> group == :logger end)
logger
|> Enum.sort()
{group, key, value, merged}
end
- # change logger configuration in runtime, without restart
- defp configure({:quack, key, _, merged}) do
- Logger.configure_backend(Quack.Logger, [{key, merged}])
- :ok = update_env(:quack, key, merged)
- end
-
defp configure({_, :backends, _, merged}) do
# removing current backends
Enum.each(Application.get_env(:logger, :backends), &Logger.remove_backend/1)
defp only_full_update?(%ConfigDB{group: group, key: key}) do
full_key_update = [
{:pleroma, :ecto_repos},
- {:quack, :meta},
{:mime, :types},
{:cors_plug, [:max_age, :methods, :expose, :headers]},
{:swarm, :node_blacklist},
:logger,
:runtime_tools,
:comeonin,
- :quack,
:fast_sanitize,
:os_mon,
:ssl
{:telemetry, "~> 0.3"},
{:poolboy, "~> 1.5"},
{:recon, "~> 2.5"},
- {:quack, "~> 0.1.1"},
{:joken, "~> 2.0"},
{:benchee, "~> 1.0"},
{:pot, "~> 1.0"},
config :pleroma, :second_setting, key: "value2", key2: ["Activity"]
-config :quack, level: :info
-
config :pleroma, Pleroma.Repo, pool: Ecto.Adapters.SQL.Sandbox
config :postgrex, :json_library, Poison
describe "migrate_to_db/1" do
setup do
clear_config(:configurable_from_database, true)
- clear_config([:quack, :level])
end
@tag capture_log: true
config1 = ConfigDB.get_by_params(%{group: ":pleroma", key: ":first_setting"})
config2 = ConfigDB.get_by_params(%{group: ":pleroma", key: ":second_setting"})
- config3 = ConfigDB.get_by_params(%{group: ":quack", key: ":level"})
refute ConfigDB.get_by_params(%{group: ":pleroma", key: "Pleroma.Repo"})
refute ConfigDB.get_by_params(%{group: ":postgrex", key: ":json_library"})
refute ConfigDB.get_by_params(%{group: ":pleroma", key: ":database"})
assert config1.value == [key: "value", key2: [Repo]]
assert config2.value == [key: "value2", key2: ["Activity"]]
- assert config3.value == :info
end
test "config table is truncated before migration" do
test "settings are migrated to file and deleted from db", %{temp_file: temp_file} do
insert_config_record(:pleroma, :setting_first, key: "value", key2: ["Activity"])
insert_config_record(:pleroma, :setting_second, key: "value2", key2: [Repo])
- insert_config_record(:quack, :level, :info)
MixTask.run(["migrate_from_db", "--env", "temp", "-d"])
file = File.read!(temp_file)
assert file =~ "config :pleroma, :setting_first,"
assert file =~ "config :pleroma, :setting_second,"
- assert file =~ "config :quack, :level, :info"
end
test "load a settings with large values and pass to file", %{temp_file: temp_file} do
setup do
insert_config_record(:pleroma, :setting_first, key: "value", key2: ["Activity"])
insert_config_record(:pleroma, :setting_second, key: "value2", key2: [Repo])
- insert_config_record(:quack, :level, :info)
path = "test/instance_static"
file_path = Path.join(path, "temp.exported_from_db.secret.exs")
file = File.read!(file_path)
assert file =~ "config :pleroma, :setting_first,"
assert file =~ "config :pleroma, :setting_second,"
- assert file =~ "config :quack, :level, :info"
end
test "release", %{file_path: file_path} do
file = File.read!(file_path)
assert file =~ "config :pleroma, :setting_first,"
assert file =~ "config :pleroma, :setting_second,"
- assert file =~ "config :quack, :level, :info"
end
end
end) =~
"Your config is using the old setting for controlling the URL of media uploaded to your S3 bucket."
end
+
+ test "check_http_adapter/0" do
+ clear_config([:tesla, :adapter], Gun)
+
+ assert capture_log(fn ->
+ DeprecationWarnings.check_http_adapter()
+ end) =~ "Your config is using a custom tesla adapter"
+ end
end
config = Loader.read("test/fixtures/config/temp.secret.exs")
assert config[:pleroma][:first_setting][:key] == "value"
assert config[:pleroma][:first_setting][:key2] == [Pleroma.Repo]
- assert config[:quack][:level] == :info
end
test "filter_group/2" do
test "transfer config values from db to env" do
refute Application.get_env(:pleroma, :test_key)
refute Application.get_env(:idna, :test_key)
- refute Application.get_env(:quack, :test_key)
refute Application.get_env(:postgrex, :test_key)
initial = Application.get_env(:logger, :level)
insert(:config, key: :test_key, value: [live: 2, com: 3])
insert(:config, group: :idna, key: :test_key, value: [live: 15, com: 35])
- insert(:config, group: :quack, key: :test_key, value: [:test_value1, :test_value2])
insert(:config, group: :postgrex, key: :test_key, value: :value)
insert(:config, group: :logger, key: :level, value: :debug)
insert(:config, group: :pleroma, key: :instance, value: [static_dir: "static_dir_from_db"])
assert Application.get_env(:pleroma, :test_key) == [live: 2, com: 3]
assert Application.get_env(:idna, :test_key) == [live: 15, com: 35]
- assert Application.get_env(:quack, :test_key) == [:test_value1, :test_value2]
assert Application.get_env(:logger, :level) == :debug
assert Application.get_env(:postgrex, :test_key) == :value
assert Application.get_env(:pleroma, :instance)[:static_dir] == "static_dir_from_db"
on_exit(fn ->
Application.delete_env(:pleroma, :test_key)
Application.delete_env(:idna, :test_key)
- Application.delete_env(:quack, :test_key)
Application.delete_env(:postgrex, :test_key)
Application.put_env(:logger, :level, initial)
System.delete_env("RELEASE_NAME")
end)
end
- test "transfer config values for 1 group and some keys" do
- level = Application.get_env(:quack, :level)
- meta = Application.get_env(:quack, :meta)
-
- insert(:config, group: :quack, key: :level, value: :info)
- insert(:config, group: :quack, key: :meta, value: [:none])
-
- TransferTask.start_link([])
-
- assert Application.get_env(:quack, :level) == :info
- assert Application.get_env(:quack, :meta) == [:none]
- default = Pleroma.Config.Holder.default_config(:quack, :webhook_url)
- assert Application.get_env(:quack, :webhook_url) == default
-
- on_exit(fn ->
- Application.put_env(:quack, :level, level)
- Application.put_env(:quack, :meta, meta)
- end)
- end
-
test "transfer config values with full subkey update" do
clear_config(:emoji)
clear_config(:assets)
assert config == ConfigDB.get_by_params(%{group: config.group, key: config.key})
end
- test "get_all_as_keyword/0" do
- saved = insert(:config)
- insert(:config, group: ":quack", key: ":level", value: :info)
- insert(:config, group: ":quack", key: ":meta", value: [:none])
-
- insert(:config,
- group: ":quack",
- key: ":webhook_url",
- value: "https://hooks.slack.com/services/KEY/some_val"
- )
-
- config = ConfigDB.get_all_as_keyword()
-
- assert config[:pleroma] == [
- {saved.key, saved.value}
- ]
-
- assert config[:quack][:level] == :info
- assert config[:quack][:meta] == [:none]
- assert config[:quack][:webhook_url] == "https://hooks.slack.com/services/KEY/some_val"
- end
-
describe "update_or_create/1" do
test "common" do
config = insert(:config)
silence_logger_warnings(fn ->
node_configs
- |> Enum.map(&Task.async(fn -> start_slave(&1) end))
+ |> Enum.map(&Task.async(fn -> start_peer(&1) end))
|> Enum.map(&Task.await(&1, 90_000))
end)
end
result
end
- defp start_slave({node_host, override_configs}) do
+ defp start_peer({node_host, override_configs}) do
log(node_host, "booting federated VM")
- {:ok, node} = :slave.start(~c"127.0.0.1", node_name(node_host), vm_args())
+ {:ok, node} = :peer.start(%{host: ~c"127.0.0.1", name: node_name(node_host), args: vm_args()})
add_code_paths(node)
load_apps_and_transfer_configuration(node, override_configs)
ensure_apps_started(node)