Frontend: enable CLI task
This commit is contained in:
parent
a9106e4f13
commit
9a768429a3
@ -3,13 +3,15 @@
|
||||
=== "OTP"
|
||||
|
||||
```sh
|
||||
./bin/pleroma_ctl frontend install <frontend> [--ref <ref>] [--file <file>] [--build-url <build-url>] [--path <path>] [--build-dir <build-dir>]
|
||||
./bin/pleroma_ctl frontend install <frontend> [--ref <ref>] [--file <file>] [--build-url <build-url>] [--path <path>] [--build-dir <build-dir>] [--primary] [--admin]
|
||||
./bin/pleroma_ctl frontend enable <frontend> [--ref <ref>] [--file <file>] [--build-url <build-url>] [--path <path>] [--build-dir <build-dir>] [--primary] [--admin]
|
||||
```
|
||||
|
||||
=== "From Source"
|
||||
|
||||
```sh
|
||||
mix pleroma.frontend install <frontend> [--ref <ref>] [--file <file>] [--build-url <build-url>] [--path <path>] [--build-dir <build-dir>]
|
||||
mix pleroma.frontend install <frontend> [--ref <ref>] [--file <file>] [--build-url <build-url>] [--path <path>] [--build-dir <build-dir>] [--primary] [--admin]
|
||||
mix pleroma.frontend enable <frontend> [--ref <ref>] [--file <file>] [--build-url <build-url>] [--path <path>] [--build-dir <build-dir>] [--primary] [--admin]
|
||||
```
|
||||
|
||||
Frontend can be installed either from local zip file, or automatically downloaded from the web.
|
||||
@ -94,3 +96,18 @@ The installation process is the same, but you will have to give all the needed o
|
||||
|
||||
If you don't have a zip file but just want to install a frontend from a local path, you can simply copy the files over a folder of this template: `${instance_static}/frontends/${name}/${ref}`.
|
||||
|
||||
## Enabling a frontend
|
||||
|
||||
Once installed, a frontend can be enabled with the `enable` command:
|
||||
|
||||
=== "OTP"
|
||||
|
||||
```sh
|
||||
./bin/pleroma_ctl frontend enable gensokyo --primary
|
||||
```
|
||||
|
||||
=== "From Source"
|
||||
|
||||
```sh
|
||||
mix pleroma.frontend enable gensokyo --primary
|
||||
```
|
||||
|
@ -32,13 +32,68 @@ defmodule Mix.Tasks.Pleroma.Frontend do
|
||||
]
|
||||
)
|
||||
|
||||
options
|
||||
|> Keyword.put(:name, name)
|
||||
|> opts_to_frontend()
|
||||
|> Frontend.install()
|
||||
shell_info("Installing frontend #{name}...")
|
||||
|
||||
with %Frontend{} = fe <-
|
||||
options
|
||||
|> Keyword.put(:name, name)
|
||||
|> opts_to_frontend()
|
||||
|> Frontend.install() do
|
||||
shell_info("Frontend #{fe.name} installed")
|
||||
else
|
||||
error ->
|
||||
shell_error("Failed to install frontend")
|
||||
exit(inspect(error))
|
||||
end
|
||||
end
|
||||
|
||||
def run(["enable", name | args]) do
|
||||
start_pleroma()
|
||||
|
||||
{options, [], []} =
|
||||
OptionParser.parse(
|
||||
args,
|
||||
strict: [
|
||||
ref: :string,
|
||||
build_url: :string,
|
||||
build_dir: :string,
|
||||
file: :string,
|
||||
admin: :boolean,
|
||||
primary: :boolean
|
||||
]
|
||||
)
|
||||
|
||||
frontend_type = get_frontend_type(options)
|
||||
|
||||
shell_info("Enabling frontend #{name}...")
|
||||
|
||||
with %Frontend{} = fe <-
|
||||
options
|
||||
|> Keyword.put(:name, name)
|
||||
|> opts_to_frontend()
|
||||
|> Frontend.enable(frontend_type) do
|
||||
shell_info("Frontend #{fe.name} enabled")
|
||||
else
|
||||
error ->
|
||||
shell_error("Failed to enable frontend")
|
||||
exit(inspect(error))
|
||||
end
|
||||
end
|
||||
|
||||
defp opts_to_frontend(opts) do
|
||||
struct(Frontend, opts)
|
||||
end
|
||||
|
||||
defp get_frontend_type(opts) do
|
||||
case Enum.into(opts, %{}) do
|
||||
%{admin: true, primary: true} ->
|
||||
raise "Invalid command. Only one frontend type may be selected."
|
||||
|
||||
%{admin: true} ->
|
||||
:admin
|
||||
|
||||
_ ->
|
||||
:primary
|
||||
end
|
||||
end
|
||||
end
|
||||
|
@ -4,11 +4,13 @@
|
||||
|
||||
defmodule Pleroma.Frontend do
|
||||
alias Pleroma.Config
|
||||
alias Pleroma.ConfigDB
|
||||
alias Pleroma.Frontend
|
||||
|
||||
require Logger
|
||||
|
||||
@unknown_name "unknown"
|
||||
@frontend_types [:admin, :primary]
|
||||
|
||||
defstruct [:name, :ref, :git, :build_url, :build_dir, :file, :"custom-http-headers"]
|
||||
|
||||
@ -40,6 +42,7 @@ defmodule Pleroma.Frontend do
|
||||
:ok <- install_frontend(frontend, tmp_dir, dest) do
|
||||
File.rm_rf!(tmp_dir)
|
||||
Logger.info("Frontend #{label} installed to #{dest}")
|
||||
frontend
|
||||
else
|
||||
{:download_or_unzip, _} ->
|
||||
Logger.info("Could not download or unzip the frontend")
|
||||
@ -51,6 +54,41 @@ defmodule Pleroma.Frontend do
|
||||
end
|
||||
end
|
||||
|
||||
def enable(%Frontend{} = frontend, frontend_type) when frontend_type in @frontend_types do
|
||||
with {:config_db, true} <- {:config_db, Config.get(:configurable_from_database)} do
|
||||
frontend
|
||||
|> maybe_put_name()
|
||||
|> hydrate()
|
||||
|> validate!()
|
||||
|> do_enable(frontend_type)
|
||||
else
|
||||
{:config_db, _} ->
|
||||
map = to_map(frontend)
|
||||
|
||||
raise """
|
||||
Can't enable frontend; database configuration is disabled.
|
||||
Enable the frontend by manually adding this line to your config:
|
||||
|
||||
config :pleroma, :frontends, #{to_string(frontend_type)}: #{inspect(map)}
|
||||
|
||||
Alternatively, enable database configuration:
|
||||
|
||||
config :pleroma, configurable_from_database: true
|
||||
"""
|
||||
end
|
||||
end
|
||||
|
||||
def do_enable(%Frontend{name: name} = frontend, frontend_type) do
|
||||
value = Keyword.put([], frontend_type, to_map(frontend))
|
||||
params = %{group: :pleroma, key: :frontends, value: value}
|
||||
|
||||
with {:ok, _} <- ConfigDB.update_or_create(params),
|
||||
:ok <- Config.TransferTask.load_and_update_env([], false) do
|
||||
Logger.info("Frontend #{name} successfully enabled")
|
||||
frontend
|
||||
end
|
||||
end
|
||||
|
||||
def dir do
|
||||
Config.get!([:instance, :static_dir])
|
||||
|> Path.join("frontends")
|
||||
|
@ -82,4 +82,29 @@ defmodule Mix.Tasks.Pleroma.FrontendTest do
|
||||
|
||||
assert File.exists?(Path.join([@dir, "frontends", "unknown", "baka", "test.txt"]))
|
||||
end
|
||||
|
||||
describe "enable" do
|
||||
setup do
|
||||
clear_config(:configurable_from_database, true)
|
||||
end
|
||||
|
||||
test "enabling a primary frontend" do
|
||||
capture_io(fn -> Frontend.run(["enable", "soapbox-fe"]) end)
|
||||
|
||||
primary = Pleroma.Config.get([:frontends, :primary])
|
||||
assert primary["name"] == "soapbox-fe"
|
||||
end
|
||||
|
||||
test "enabling an admin frontend" do
|
||||
capture_io(fn -> Frontend.run(["enable", "soapbox-fe", "--admin"]) end)
|
||||
|
||||
primary = Pleroma.Config.get([:frontends, :admin])
|
||||
assert primary["name"] == "soapbox-fe"
|
||||
end
|
||||
|
||||
test "raise if configurable_from_database is disabled" do
|
||||
clear_config(:configurable_from_database, false)
|
||||
assert_raise(RuntimeError, fn -> Frontend.run(["enable", "soapbox-fe"]) end)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
@ -133,4 +133,30 @@ defmodule Pleroma.FrontendTest do
|
||||
|
||||
assert Frontend.get_named_frontend("pleroma") == frontend
|
||||
end
|
||||
|
||||
describe "enable/2" do
|
||||
setup do
|
||||
clear_config(:configurable_from_database, true)
|
||||
end
|
||||
|
||||
test "enables a primary frontend" do
|
||||
frontend = %Frontend{name: "soapbox", ref: "v1.2.3"}
|
||||
map = Frontend.to_map(frontend)
|
||||
|
||||
clear_config([:frontends, :available], %{"soapbox" => map})
|
||||
Frontend.enable(frontend, :primary)
|
||||
|
||||
assert Pleroma.Config.get([:frontends, :primary]) == map
|
||||
end
|
||||
|
||||
test "enables an admin frontend" do
|
||||
frontend = %Frontend{name: "admin-fe", ref: "develop"}
|
||||
map = Frontend.to_map(frontend)
|
||||
|
||||
clear_config([:frontends, :available], %{"admin-fe" => map})
|
||||
Frontend.enable(frontend, :admin)
|
||||
|
||||
assert Pleroma.Config.get([:frontends, :admin]) == map
|
||||
end
|
||||
end
|
||||
end
|
||||
|
Loading…
Reference in New Issue
Block a user