Move checks to application startup
authorRoman Chvanikov <chvanikoff@pm.me>
Wed, 5 Aug 2020 16:38:55 +0000 (19:38 +0300)
committerRoman Chvanikov <chvanikoff@pm.me>
Wed, 5 Aug 2020 16:38:55 +0000 (19:38 +0300)
lib/pleroma/application.ex
lib/pleroma/upload/filter/exiftool.ex
lib/pleroma/upload/filter/mogrifun.ex
lib/pleroma/upload/filter/mogrify.ex

index 0ffb55358f26d49e68a06d8b67fff010f59f6a2c..c0b5db9f16affbe235595194f114a5b315ceb443 100644 (file)
@@ -47,6 +47,7 @@ defmodule Pleroma.Application do
     Pleroma.ApplicationRequirements.verify!()
     setup_instrumenters()
     load_custom_modules()
+    check_system_commands()
     Pleroma.Docs.JSON.compile()
 
     adapter = Application.get_env(:tesla, :adapter)
@@ -249,4 +250,21 @@ defmodule Pleroma.Application do
   end
 
   defp http_children(_, _), do: []
+
+  defp check_system_commands do
+    filters = Config.get([Pleroma.Upload, :filters])
+
+    check_filter = fn filter, command_required ->
+      with true <- filter in filters,
+           false <- Pleroma.Utils.command_available?(command_required) do
+        Logger.error(
+          "#{filter} is specified in list of Pleroma.Upload filters, but the #{command_required} command is not found"
+        )
+      end
+    end
+
+    check_filter.(Pleroma.Upload.Filters.Exiftool, "exiftool")
+    check_filter.(Pleroma.Upload.Filters.Mogrify, "mogrify")
+    check_filter.(Pleroma.Upload.Filters.Mogrifun, "mogrify")
+  end
 end
index e1b976c980494ee112d75d5d0947b225ede1f4b5..ea8798fe39ef4d15549843b42aa963ec6ce219cf 100644 (file)
@@ -9,12 +9,16 @@ defmodule Pleroma.Upload.Filter.Exiftool do
   """
   @behaviour Pleroma.Upload.Filter
 
+  @spec filter(Pleroma.Upload.t()) :: :ok | {:error, String.t()}
   def filter(%Pleroma.Upload{tempfile: file, content_type: "image" <> _}) do
-    if Pleroma.Utils.command_available?("exiftool") do
-      System.cmd("exiftool", ["-overwrite_original", "-gps:all=", file], parallelism: true)
-      :ok
-    else
-      {:error, "exiftool command not found"}
+    try do
+      case System.cmd("exiftool", ["-overwrite_original", "-gps:all=", file], parallelism: true) do
+        {_response, 0} -> :ok
+        {error, 1} -> {:error, error}
+      end
+    rescue
+      _e in ErlangError ->
+        {:error, "exiftool command not found"}
     end
   end
 
index 8f362333d3867617faa82efd320b52f03c0d49a8..a8503ac2422bb9d68d84a4b282b79699434cc72e 100644 (file)
@@ -34,12 +34,14 @@ defmodule Pleroma.Upload.Filter.Mogrifun do
     [{"fill", "yellow"}, {"tint", "40"}]
   ]
 
+  @spec filter(Pleroma.Upload.t()) :: :ok | {:error, String.t()}
   def filter(%Pleroma.Upload{tempfile: file, content_type: "image" <> _}) do
-    if Pleroma.Utils.command_available?("mogrify") do
+    try do
       Filter.Mogrify.do_filter(file, [Enum.random(@filters)])
       :ok
-    else
-      {:error, "mogrify command not found"}
+    rescue
+      _e in ErlangError ->
+        {:error, "mogrify command not found"}
     end
   end
 
index 4bd0c2eb449b3c05804d69b916e8199945336495..7a45add5a2cda00662d43bd17d31b67e90797655 100644 (file)
@@ -8,14 +8,14 @@ defmodule Pleroma.Upload.Filter.Mogrify do
   @type conversion :: action :: String.t() | {action :: String.t(), opts :: String.t()}
   @type conversions :: conversion() | [conversion()]
 
+  @spec filter(Pleroma.Upload.t()) :: :ok | {:error, String.t()}
   def filter(%Pleroma.Upload{tempfile: file, content_type: "image" <> _}) do
-    if Pleroma.Utils.command_available?("mogrify") do
-      filters = Pleroma.Config.get!([__MODULE__, :args])
-
-      do_filter(file, filters)
+    try do
+      do_filter(file, Pleroma.Config.get!([__MODULE__, :args]))
       :ok
-    else
-      {:error, "mogrify command not found"}
+    rescue
+      _e in ErlangError ->
+        {:error, "mogrify command not found"}
     end
   end