aboutsummaryrefslogtreecommitdiff
path: root/lib/mix
diff options
context:
space:
mode:
Diffstat (limited to 'lib/mix')
-rw-r--r--lib/mix/pleroma.ex54
-rw-r--r--lib/mix/tasks/pleroma/config.ex266
-rw-r--r--lib/mix/tasks/pleroma/docs.ex2
-rw-r--r--lib/mix/tasks/pleroma/instance.ex11
4 files changed, 150 insertions, 183 deletions
diff --git a/lib/mix/pleroma.ex b/lib/mix/pleroma.ex
index 2b6c7d6bb..aa5c56d9a 100644
--- a/lib/mix/pleroma.ex
+++ b/lib/mix/pleroma.ex
@@ -4,7 +4,6 @@
defmodule Mix.Pleroma do
@apps [
- :restarter,
:ecto,
:ecto_sql,
:postgrex,
@@ -16,12 +15,15 @@ defmodule Mix.Pleroma do
:fast_html,
:oban
]
+
@cachex_children ["object", "user", "scrubber", "web_resp"]
+
@doc "Common functions to be reused in mix tasks"
+ @spec start_pleroma() :: {:ok, pid()}
def start_pleroma do
Pleroma.Config.Holder.save_default()
- Pleroma.Config.Oban.warn()
Pleroma.Application.limiters_setup()
+ Pleroma.Config.DeprecationWarnings.check_oban_config()
Application.put_env(:phoenix, :serve_endpoints, false, persistent: true)
unless System.get_env("DEBUG") do
@@ -47,37 +49,28 @@ defmodule Mix.Pleroma do
plugins: []
]
- children =
- [
- Pleroma.Repo,
- Pleroma.Emoji,
- {Pleroma.Config.TransferTask, false},
- Pleroma.Web.Endpoint,
- {Oban, oban_config},
- {Majic.Pool,
- [name: Pleroma.MajicPool, pool_size: Pleroma.Config.get([:majic_pool, :size], 2)]}
- ] ++
- http_children(adapter)
+ children = [
+ Pleroma.Application.ConfigDependentDeps,
+ Pleroma.Repo,
+ Pleroma.Emoji,
+ Supervisor.child_spec({Task, &Pleroma.Application.Environment.load_from_db_and_update/0},
+ id: :update_env
+ ),
+ {Oban, oban_config},
+ {Majic.Pool,
+ [name: Pleroma.MajicPool, pool_size: Pleroma.Config.get([:majic_pool, :size], 2)]},
+ Pleroma.Web.Endpoint
+ ]
+
+ children = [Pleroma.Application.StartUpDependencies.adapter_module() | children]
- cachex_children = Enum.map(@cachex_children, &Pleroma.Application.build_cachex(&1, []))
+ cachex_children =
+ Enum.map(@cachex_children, &Pleroma.Application.StartUpDependencies.cachex_spec({&1, []}))
Supervisor.start_link(children ++ cachex_children,
strategy: :one_for_one,
name: Pleroma.Supervisor
)
-
- if Pleroma.Config.get(:env) not in [:test, :benchmark] do
- pleroma_rebooted?()
- end
- end
-
- defp pleroma_rebooted? do
- if Restarter.Pleroma.rebooted?() do
- :ok
- else
- Process.sleep(10)
- pleroma_rebooted?()
- end
end
def load_pleroma do
@@ -129,11 +122,4 @@ defmodule Mix.Pleroma do
def escape_sh_path(path) do
~S(') <> String.replace(path, ~S('), ~S(\')) <> ~S(')
end
-
- defp http_children(Tesla.Adapter.Gun) do
- Pleroma.Gun.ConnectionPool.children() ++
- [{Task, &Pleroma.HTTP.AdapterHelper.Gun.limiter_setup/0}]
- end
-
- defp http_children(_), do: []
end
diff --git a/lib/mix/tasks/pleroma/config.ex b/lib/mix/tasks/pleroma/config.ex
index 1962154b9..97a81f64e 100644
--- a/lib/mix/tasks/pleroma/config.ex
+++ b/lib/mix/tasks/pleroma/config.ex
@@ -14,10 +14,13 @@ defmodule Mix.Tasks.Pleroma.Config do
@shortdoc "Manages the location of the config"
@moduledoc File.read!("docs/administration/CLI_tasks/config.md")
- def run(["migrate_to_db"]) do
+ def run(["migrate_to_db" | options]) do
check_configdb(fn ->
start_pleroma()
- migrate_to_db()
+
+ {opts, _} = OptionParser.parse!(options, strict: [config: :string])
+
+ migrate_to_db(opts)
end)
end
@@ -39,15 +42,13 @@ defmodule Mix.Tasks.Pleroma.Config do
check_configdb(fn ->
start_pleroma()
- header = config_header()
-
settings =
ConfigDB
|> Repo.all()
|> Enum.sort()
unless settings == [] do
- shell_info("#{header}")
+ shell_info("#{Pleroma.Config.Loader.config_header()}")
Enum.each(settings, &dump(&1))
else
@@ -73,9 +74,10 @@ defmodule Mix.Tasks.Pleroma.Config do
check_configdb(fn ->
start_pleroma()
- group = maybe_atomize(group)
-
- dump_group(group)
+ group
+ |> maybe_atomize()
+ |> ConfigDB.get_all_by_group()
+ |> Enum.each(&dump/1)
end)
end
@@ -100,7 +102,7 @@ defmodule Mix.Tasks.Pleroma.Config do
def run(["reset", "--force"]) do
check_configdb(fn ->
start_pleroma()
- truncatedb()
+ Pleroma.Config.Versioning.reset()
shell_info("The ConfigDB settings have been removed from the database.")
end)
end
@@ -119,7 +121,7 @@ defmodule Mix.Tasks.Pleroma.Config do
shell_error("\nTHIS CANNOT BE UNDONE!")
if shell_prompt("Are you sure you want to continue?", "n") in ~w(Yn Y y) do
- truncatedb()
+ Pleroma.Config.Versioning.reset()
shell_info("The ConfigDB settings have been removed from the database.")
else
@@ -134,14 +136,12 @@ defmodule Mix.Tasks.Pleroma.Config do
group = maybe_atomize(group)
key = maybe_atomize(key)
- with true <- key_exists?(group, key) do
+ with %ConfigDB{} = config <- ConfigDB.get_by_group_and_key(group, key) do
shell_info("The following settings will be removed from ConfigDB:\n")
- group
- |> ConfigDB.get_by_group_and_key(key)
- |> dump()
+ dump(config)
- delete_key(group, key)
+ Pleroma.Config.Versioning.new_version(%{group: config.group, key: config.key, delete: true})
else
_ ->
shell_error("No settings in ConfigDB for #{inspect(group)}, #{inspect(key)}. Aborting.")
@@ -153,12 +153,22 @@ defmodule Mix.Tasks.Pleroma.Config do
group = maybe_atomize(group)
- with true <- group_exists?(group) do
+ configs = ConfigDB.get_all_by_group(group)
+
+ if configs != [] do
shell_info("The following settings will be removed from ConfigDB:\n")
- dump_group(group)
- delete_group(group)
+
+ Enum.each(configs, fn config ->
+ dump(config)
+
+ Pleroma.Config.Versioning.new_version(%{
+ group: config.group,
+ key: config.key,
+ delete: true
+ })
+ end)
else
- _ -> shell_error("No settings in ConfigDB for #{inspect(group)}. Aborting.")
+ shell_error("No settings in ConfigDB for #{inspect(group)}. Aborting.")
end
end
@@ -168,15 +178,17 @@ defmodule Mix.Tasks.Pleroma.Config do
group = maybe_atomize(group)
key = maybe_atomize(key)
- with true <- key_exists?(group, key) do
+ with %ConfigDB{} = config <- ConfigDB.get_by_group_and_key(group, key) do
shell_info("The following settings will be removed from ConfigDB:\n")
- group
- |> ConfigDB.get_by_group_and_key(key)
- |> dump()
+ dump(config)
if shell_prompt("Are you sure you want to continue?", "n") in ~w(Yn Y y) do
- delete_key(group, key)
+ Pleroma.Config.Versioning.new_version(%{
+ group: config.group,
+ key: config.key,
+ delete: true
+ })
else
shell_error("No changes made.")
end
@@ -191,35 +203,67 @@ defmodule Mix.Tasks.Pleroma.Config do
group = maybe_atomize(group)
- with true <- group_exists?(group) do
+ configs = ConfigDB.get_all_by_group(group)
+
+ if configs != [] do
shell_info("The following settings will be removed from ConfigDB:\n")
- dump_group(group)
+ Enum.each(configs, &dump/1)
if shell_prompt("Are you sure you want to continue?", "n") in ~w(Yn Y y) do
- delete_group(group)
+ Enum.each(configs, fn config ->
+ Pleroma.Config.Versioning.new_version(%{
+ group: config.group,
+ key: config.key,
+ delete: true
+ })
+ end)
else
shell_error("No changes made.")
end
else
- _ -> shell_error("No settings in ConfigDB for #{inspect(group)}. Aborting.")
+ shell_error("No settings in ConfigDB for #{inspect(group)}. Aborting.")
+ end
+ end
+
+ def run(["rollback" | options]) do
+ check_configdb(fn ->
+ start_pleroma()
+ {opts, _} = OptionParser.parse!(options, strict: [steps: :integer], aliases: [s: :steps])
+
+ do_rollback(opts)
+ end)
+ end
+
+ defp do_rollback(opts) do
+ steps = opts[:steps] || 1
+
+ case Pleroma.Config.Versioning.rollback(steps) do
+ {:ok, _} ->
+ shell_info("Success rollback")
+
+ {:error, :no_current_version} ->
+ shell_error("No version to rollback")
+
+ {:error, :rollback_not_possible} ->
+ shell_error("Rollback not possible. Incorrect steps value.")
+
+ {:error, _, _, _} ->
+ shell_error("Problem with backup. Rollback not possible.")
+
+ error ->
+ shell_error("error occuried: #{inspect(error)}")
end
end
- @spec migrate_to_db(Path.t() | nil) :: any()
- def migrate_to_db(file_path \\ nil) do
+ defp migrate_to_db(opts) do
with :ok <- Pleroma.Config.DeprecationWarnings.warn() do
- config_file =
- if file_path do
- file_path
- else
- if Pleroma.Config.get(:release) do
- Pleroma.Config.get(:config_path)
- else
- "config/#{Pleroma.Config.get(:env)}.secret.exs"
- end
- end
+ config_file = opts[:config] || Pleroma.Application.config_path()
- do_migrate_to_db(config_file)
+ if File.exists?(config_file) do
+ do_migrate_to_db(config_file)
+ else
+ shell_info("To migrate settings, you must define custom settings in #{config_file}.")
+ end
else
_ ->
shell_error("Migration is not allowed until all deprecation warnings have been resolved.")
@@ -227,33 +271,9 @@ defmodule Mix.Tasks.Pleroma.Config do
end
defp do_migrate_to_db(config_file) do
- if File.exists?(config_file) do
- shell_info("Migrating settings from file: #{Path.expand(config_file)}")
- truncatedb()
-
- 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
-
- defp create(group, settings) do
- group
- |> Pleroma.Config.Loader.filter_group(settings)
- |> Enum.each(fn {key, value} ->
- {:ok, _} = ConfigDB.update_or_create(%{group: group, key: key, value: value})
-
- shell_info("Settings for key #{key} migrated.")
- end)
-
- shell_info("Settings for group #{inspect(group)} migrated.")
+ shell_info("Migrating settings from file: #{Path.expand(config_file)}")
+ {:ok, _} = Pleroma.Config.Versioning.migrate(config_file)
+ shell_info("Settings migrated.")
end
defp migrate_from_db(opts) do
@@ -270,53 +290,51 @@ defmodule Mix.Tasks.Pleroma.Config do
|> Path.join("#{env}.exported_from_db.secret.exs")
file = File.open!(config_path, [:write, :utf8])
+ IO.write(file, Pleroma.Config.Loader.config_header())
- IO.write(file, config_header())
-
- ConfigDB
- |> Repo.all()
- |> Enum.each(&write_and_delete(&1, file, opts[:delete]))
-
- :ok = File.close(file)
- System.cmd("mix", ["format", config_path])
-
- shell_info(
- "Database configuration settings have been exported to config/#{env}.exported_from_db.secret.exs"
- )
- 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
+ changes =
+ ConfigDB
+ |> Repo.all()
+ |> Enum.reduce([], fn %{group: group} = config, acc ->
+ group_str = inspect(group)
+ value = inspect(config.value, limit: :infinity)
+
+ msg =
+ if group in ConfigDB.groups_without_keys() do
+ IO.write(file, "config #{group_str}, #{value}\r\n\r\n")
+ "config #{group_str} was deleted."
+ else
+ key_str = inspect(config.key)
+ IO.write(file, "config #{group_str}, #{key_str}, #{value}\r\n\r\n")
+ "config #{group_str}, #{key_str} was deleted."
+ end
- defp write_and_delete(config, file, delete?) do
- config
- |> write(file)
- |> delete(delete?)
- end
+ if opts[:delete] do
+ shell_info(msg)
- defp write(config, file) do
- value = inspect(config.value, limit: :infinity)
+ change =
+ config
+ |> Map.take([:group, :key])
+ |> Map.put(:delete, true)
- IO.write(file, "config #{inspect(config.group)}, #{inspect(config.key)}, #{value}\r\n\r\n")
+ [change | acc]
+ else
+ acc
+ end
+ end)
- config
- end
+ if opts[:delete] and changes != [] do
+ Pleroma.Config.Versioning.new_version(changes)
+ end
- defp delete(config, true) do
- {:ok, _} = Repo.delete(config)
+ :ok = File.close(file)
+ System.cmd("mix", ["format", config_path])
shell_info(
- "config #{inspect(config.group)}, #{inspect(config.key)} was deleted from the ConfigDB."
+ "Database configuration settings have been exported to config/#{env}.exported_from_db.secret.exs"
)
end
- defp delete(_config, _), do: :ok
-
defp dump(%ConfigDB{} = config) do
value = inspect(config.value, limit: :infinity)
@@ -325,31 +343,12 @@ defmodule Mix.Tasks.Pleroma.Config do
defp dump(_), do: :noop
- defp dump_group(group) when is_atom(group) do
- group
- |> ConfigDB.get_all_by_group()
- |> Enum.each(&dump/1)
- end
-
- defp group_exists?(group) do
- group
- |> ConfigDB.get_all_by_group()
- |> Enum.any?()
- end
-
- defp key_exists?(group, key) do
- group
- |> ConfigDB.get_by_group_and_key(key)
- |> is_nil
- |> Kernel.!()
- end
-
defp maybe_atomize(arg) when is_atom(arg), do: arg
defp maybe_atomize(":" <> arg), do: maybe_atomize(arg)
defp maybe_atomize(arg) when is_binary(arg) do
- if ConfigDB.module_name?(arg) do
+ if Pleroma.Config.Converter.module_name?(arg) do
String.to_existing_atom("Elixir." <> arg)
else
String.to_atom(arg)
@@ -366,23 +365,4 @@ defmodule Mix.Tasks.Pleroma.Config do
)
end
end
-
- defp delete_key(group, key) do
- check_configdb(fn ->
- ConfigDB.delete(%{group: group, key: key})
- end)
- end
-
- defp delete_group(group) do
- check_configdb(fn ->
- group
- |> ConfigDB.get_all_by_group()
- |> Enum.each(&ConfigDB.delete/1)
- end)
- end
-
- defp truncatedb do
- Ecto.Adapters.SQL.query!(Repo, "TRUNCATE config;")
- Ecto.Adapters.SQL.query!(Repo, "ALTER SEQUENCE config_id_seq RESTART;")
- end
end
diff --git a/lib/mix/tasks/pleroma/docs.ex b/lib/mix/tasks/pleroma/docs.ex
index 45cca1c74..e0e9834f4 100644
--- a/lib/mix/tasks/pleroma/docs.ex
+++ b/lib/mix/tasks/pleroma/docs.ex
@@ -32,7 +32,7 @@ defmodule Mix.Tasks.Pleroma.Docs do
defp do_run(implementation) do
start_pleroma()
- with descriptions <- Pleroma.Config.Loader.read("config/description.exs"),
+ with descriptions <- Pleroma.Config.Loader.read!("config/description.exs"),
{:ok, file_path} <-
Pleroma.Docs.Generator.process(
implementation,
diff --git a/lib/mix/tasks/pleroma/instance.ex b/lib/mix/tasks/pleroma/instance.ex
index da27a99d0..cb6216474 100644
--- a/lib/mix/tasks/pleroma/instance.ex
+++ b/lib/mix/tasks/pleroma/instance.ex
@@ -86,9 +86,9 @@ defmodule Mix.Tasks.Pleroma.Instance do
get_option(
options,
:indexable,
- "Do you want search engines to index your site? (y/n)",
- "y"
- ) === "y"
+ "Do you want to deny Search Engine bots from crawling the site? (y/n)",
+ "n"
+ ) === "n"
db_configurable? =
get_option(
@@ -275,7 +275,8 @@ defmodule Mix.Tasks.Pleroma.Instance do
end
end
- defp write_robots_txt(static_dir, indexable, template_dir) do
+ @spec write_robots_txt(Path.t(), boolean(), Path.t()) :: :ok | no_return()
+ def write_robots_txt(static_dir, indexable, template_dir) do
robots_txt =
EEx.eval_file(
template_dir <> "/robots_txt.eex",
@@ -289,7 +290,7 @@ defmodule Mix.Tasks.Pleroma.Instance do
shell_info("Backing up existing robots.txt to #{robots_txt_path}.bak")
end
- File.write(robots_txt_path, robots_txt)
+ :ok = File.write(robots_txt_path, robots_txt)
shell_info("Writing #{robots_txt_path}.")
end