Mix tasks: improve uploads.ex moduledoc
[akkoma] / lib / mix / tasks / pleroma / instance.ex
index 8c728625ab0a0436e36695dfdaf005ac3b546949..c6632270783ad84ee14b933fabb657b93240ad22 100644 (file)
@@ -1,14 +1,15 @@
 defmodule Mix.Tasks.Pleroma.Instance do
   use Mix.Task
   alias Pleroma.{Repo, User}
+  alias Mix.Tasks.Pleroma.Common
 
   @shortdoc "Manages Pleroma instance"
   @moduledoc """
   Manages Pleroma instance.
 
-  ## Generate a new instance.
+  ## Generate a new instance config.
 
-    mix pleroma.instance new [OPTION...]
+    mix pleroma.instance gen [OPTION...]
 
   If any options are left unspecified, you will be prompted interactively
 
@@ -26,7 +27,7 @@ defmodule Mix.Tasks.Pleroma.Instance do
   - `--dbpass DBPASS` - the password to use for the database connection
   """
 
-  def run(["new" | rest]) do
+  def run(["gen" | rest]) do
     {options, [], []} =
       OptionParser.parse(
         rest,
@@ -59,51 +60,46 @@ defmodule Mix.Tasks.Pleroma.Instance do
 
     unless not proceed? do
       domain =
-        Keyword.get(options, :domain) ||
-          Mix.shell().prompt("What domain will your instance use? (e.g. pleroma.soykaf.com)")
-          |> String.trim()
+        Common.get_option(
+          options,
+          :domain,
+          "What domain will your instance use? (e.g pleroma.soykaf.com)"
+        )
 
       name =
-        Keyword.get(options, :name) ||
-          Mix.shell().prompt("What is the name of your instance? (e.g. Pleroma/Soykaf)")
-          |> String.trim()
+        Common.get_option(
+          options,
+          :name,
+          "What is the name of your instance? (e.g. Pleroma/Soykaf)"
+        )
 
-      email =
-        Keyword.get(options, :admin_email) ||
-          Mix.shell().prompt("What is your admin email address?")
-          |> String.trim()
+      email = Common.get_option(options, :admin_email, "What is your admin email address?")
 
       dbhost =
-        Keyword.get(options, :dbhost) ||
-          case Mix.shell().prompt("What is the hostname of your database? [localhost]") do
-            "\n" -> "localhost"
-            dbhost -> dbhost |> String.trim()
-          end
+        Common.get_option(options, :dbhost, "What is the hostname of your database?", "localhost")
 
       dbname =
-        Keyword.get(options, :dbname) ||
-          case Mix.shell().prompt("What is the name of your database? [pleroma_dev]") do
-            "\n" -> "pleroma_dev"
-            dbname -> dbname |> String.trim()
-          end
+        Common.get_option(options, :dbname, "What is the name of your database?", "pleroma_dev")
 
       dbuser =
-        Keyword.get(options, :dbuser) ||
-          case Mix.shell().prompt("What is the user used to connect to your database? [pleroma]") do
-            "\n" -> "pleroma"
-            dbuser -> dbuser |> String.trim()
-          end
+        Common.get_option(
+          options,
+          :dbuser,
+          "What is the user used to connect to your database?",
+          "pleroma"
+        )
 
       dbpass =
-        Keyword.get(options, :dbpass) ||
-          case Mix.shell().prompt(
-                 "What is the password used to connect to your database? [autogenerated]"
-               ) do
-            "\n" -> :crypto.strong_rand_bytes(64) |> Base.encode64() |> binary_part(0, 64)
-            dbpass -> dbpass |> String.trim()
-          end
+        Common.get_option(
+          options,
+          :dbpass,
+          "What is the password used to connect to your database?",
+          :crypto.strong_rand_bytes(64) |> Base.encode64() |> binary_part(0, 64),
+          "autogenerated"
+        )
 
       secret = :crypto.strong_rand_bytes(64) |> Base.encode64() |> binary_part(0, 64)
+      {web_push_public_key, web_push_private_key} = :crypto.generate_key(:ecdh, :prime256v1)
 
       result_config =
         EEx.eval_file(
@@ -116,7 +112,9 @@ defmodule Mix.Tasks.Pleroma.Instance do
           dbuser: dbuser,
           dbpass: dbpass,
           version: Pleroma.Mixfile.project() |> Keyword.get(:version),
-          secret: secret
+          secret: secret,
+          web_push_public_key: Base.url_encode64(web_push_public_key, padding: false),
+          web_push_private_key: Base.url_encode64(web_push_private_key, padding: false)
         )
 
       result_psql =
@@ -140,12 +138,12 @@ defmodule Mix.Tasks.Pleroma.Instance do
           """
           To get started:
           1. Verify the contents of the generated files.
-          2. Run `sudo -u postgres psql -f #{escape_sh_path(psql_path)}`.
+          2. Run `sudo -u postgres psql -f #{Common.escape_sh_path(psql_path)}`.
           """ <>
           if config_path in ["config/dev.secret.exs", "config/prod.secret.exs"] do
             ""
           else
-            "3. Run `mv #{escape_sh_path(config_path)} 'config/prod.secret.exs'`."
+            "3. Run `mv #{Common.escape_sh_path(config_path)} 'config/prod.secret.exs'`."
           end
       )
     else
@@ -156,8 +154,4 @@ defmodule Mix.Tasks.Pleroma.Instance do
       )
     end
   end
-
-  defp escape_sh_path(path) do
-    ~S(') <> String.replace(path, ~S('), ~S(\')) <> ~S(')
-  end
 end