Adjusted MediaProxyControllerTest to gracefully fail on missing dependencies. Install...
authorIvan Tashkinov <ivantashkinov@gmail.com>
Sat, 26 Sep 2020 16:32:16 +0000 (19:32 +0300)
committerIvan Tashkinov <ivantashkinov@gmail.com>
Sat, 26 Sep 2020 16:32:16 +0000 (19:32 +0300)
Added ffmpeg/imagemagick checks to launch checks (if media preview proxy is enabled). Added documentation on installing optional media / graphics packages (imagemagick, ffmpeg, exiftool).

14 files changed:
docs/installation/alpine_linux_en.md
docs/installation/arch_linux_en.md
docs/installation/debian_based_en.md
docs/installation/debian_based_jp.md
docs/installation/freebsd_en.md
docs/installation/gentoo_en.md
docs/installation/netbsd_en.md
docs/installation/openbsd_en.md
docs/installation/openbsd_fi.md
docs/installation/optional/media_graphics_packages.md [new file with mode: 0644]
docs/installation/otp_en.md
lib/pleroma/application.ex
lib/pleroma/helpers/media_helper.ex
test/web/media_proxy/media_proxy_controller_test.exs

index 0b9f5cdae60be1bf451f30ccfe8ae69e4b0d9766..d89c7f46f332c89f355e1999903670e536796269 100644 (file)
@@ -13,8 +13,6 @@ It assumes that you have administrative rights, either as root or a user with [s
 * `erlang-parsetools`
 * `erlang-xmerl`
 * `git`
-* `ffmpeg`
-* `ImageMagick`
 * Development Tools
 * `cmake`
 
@@ -22,6 +20,9 @@ It assumes that you have administrative rights, either as root or a user with [s
 
 * `nginx` (preferred, example configs for other reverse proxies can be found in the repo)
 * `certbot` (or any other ACME client for Let’s Encrypt certificates)
+* `ImageMagick`
+* `ffmpeg`
+* `exiftool`
 
 ### Prepare the system
 
@@ -31,7 +32,6 @@ It assumes that you have administrative rights, either as root or a user with [s
 awk 'NR==2' /etc/apk/repositories | sed 's/main/community/' | tee -a /etc/apk/repositories
 ```
 
-
 * Then update the system, if not already done:
 
 ```shell
@@ -59,12 +59,6 @@ sudo apk add erlang erlang-runtime-tools erlang-xmerl elixir
 sudo apk add erlang-eldap
 ```
 
-### Install ffmpeg and ImageMagick
-
-```shell
-sudo apk add ffmpeg imagemagick
-```
-
 ### Install PostgreSQL
 
 * Install Postgresql server:
@@ -85,6 +79,12 @@ sudo /etc/init.d/postgresql start
 sudo rc-update add postgresql
 ```
 
+### Install media / graphics packages (optional, see [`docs/installation/optional/media_graphics_packages.md`](docs/installation/optional/media_graphics_packages.md))
+
+```shell
+sudo apk add ffmpeg imagemagick exiftool
+```
+
 ### Install PleromaBE
 
 * Add a new system user for the Pleroma service:
index 38bb824323b252f4252264e416c785c39cc8121e..724b4660a4aa3af09fe6ebe64d1a587605b9f519 100644 (file)
@@ -10,13 +10,14 @@ This guide will assume that you have administrative rights, either as root or a
 * `git`
 * `base-devel`
 * `cmake`
-* `ffmpeg`
-* `ImageMagick`
 
 #### Optional packages used in this guide
 
 * `nginx` (preferred, example configs for other reverse proxies can be found in the repo)
 * `certbot` (or any other ACME client for Let’s Encrypt certificates)
+* `ImageMagick`
+* `ffmpeg`
+* `exiftool`
 
 ### Prepare the system
 
@@ -29,7 +30,7 @@ sudo pacman -Syu
 * Install some of the above mentioned programs:
 
 ```shell
-sudo pacman -S git base-devel elixir cmake ffmpeg imagemagick
+sudo pacman -S git base-devel elixir cmake
 ```
 
 ### Install PostgreSQL
@@ -54,6 +55,12 @@ sudo -iu postgres initdb -D /var/lib/postgres/data
 sudo systemctl enable --now postgresql.service
 ```
 
+### Install media / graphics packages (optional, see [`docs/installation/optional/media_graphics_packages.md`](docs/installation/optional/media_graphics_packages.md))
+
+```shell
+sudo pacman -S ffmpeg imagemagick perl-image-exiftool
+```
+
 ### Install PleromaBE
 
 * Add a new system user for the Pleroma service:
index 30ee64c0105e0b116c53eed5068239e65cff9cf1..eac499a295ade15096e24f42e2ffffeaed59bef8 100644 (file)
@@ -13,13 +13,14 @@ This guide will assume you are on Debian Stretch. This guide should also work wi
 * `git`
 * `build-essential`
 * `cmake`
-* `ffmpeg`
-* `ImageMagick`
 
 #### Optional packages used in this guide
 
 * `nginx` (preferred, example configs for other reverse proxies can be found in the repo)
 * `certbot` (or any other ACME client for Let’s Encrypt certificates)
+* `ImageMagick`
+* `ffmpeg`
+* `exiftool`
 
 ### Prepare the system
 
@@ -33,7 +34,7 @@ sudo apt full-upgrade
 * Install some of the above mentioned programs:
 
 ```shell
-sudo apt install git build-essential postgresql postgresql-contrib cmake ffmpeg imagemagick
+sudo apt install git build-essential postgresql postgresql-contrib cmake
 ```
 
 ### Install Elixir and Erlang
@@ -52,6 +53,12 @@ sudo apt update
 sudo apt install elixir erlang-dev erlang-nox
 ```
 
+### Optional packages: [`docs/installation/optional/media_graphics_packages.md`](docs/installation/optional/media_graphics_packages.md)
+
+```shell
+sudo apt install imagemagick ffmpeg libimage-exiftool-perl
+```
+
 ### Install PleromaBE
 
 * Add a new system user for the Pleroma service:
index 219f40525983a5013cb5c625f333e95bc1293833..764afbe1a4497940d69158ca2f7978e64a7c57ea 100644 (file)
 - `git`
 - `build-essential`
 - `cmake`
-- `ffmpeg`
-- `ImageMagick`
 
 #### このガイドで利用している追加パッケージ
 
 - `nginx` (おすすめです。他のリバースプロキシを使う場合は、参考となる設定をこのリポジトリから探してください)
 - `certbot` (または何らかのLet's Encrypt向けACMEクライアント)
+- `ImageMagick`
+- `ffmpeg`
+- `exiftool`
 
 ### システムを準備する
 
@@ -38,7 +39,6 @@ sudo apt full-upgrade
 sudo apt install git build-essential postgresql postgresql-contrib cmake ffmpeg imagemagick
 ```
 
-
 ### ElixirとErlangをインストールします
 
 * Erlangのリポジトリをダウンロードおよびインストールします。
@@ -53,6 +53,12 @@ sudo apt update
 sudo apt install elixir erlang-dev erlang-nox
 ```
 
+### オプションパッケージ: [`docs/installation/optional/media_graphics_packages.md`](docs/installation/optional/media_graphics_packages.md)
+
+```shell
+sudo apt install imagemagick ffmpeg libimage-exiftool-perl
+```
+
 ### Pleroma BE (バックエンド) をインストールします
 
 *  Pleroma用に新しいユーザーを作ります。
index 01b410a46e1918ec41a91d11d84c2e65cb731177..fdcb06c53caf9848fd9c8d3d742956c796c056fd 100644 (file)
@@ -7,7 +7,7 @@ This document was written for FreeBSD 12.1, but should be work on future release
 This assumes the target system has `pkg(8)`.
 
 ```
-# pkg install elixir postgresql12-server postgresql12-client postgresql12-contrib git-lite sudo nginx gmake acme.sh cmake ffmpeg imagemagick
+# pkg install elixir postgresql12-server postgresql12-client postgresql12-contrib git-lite sudo nginx gmake acme.sh cmake
 ```
 
 Copy the rc.d scripts to the right directory:
@@ -26,6 +26,12 @@ Setup the required services to automatically start at boot, using `sysrc(8)`.
 # service postgresql start
 ```
 
+### Install media / graphics packages (optional, see [`docs/installation/optional/media_graphics_packages.md`](docs/installation/optional/media_graphics_packages.md))
+
+```shell
+# pkg install imagemagick ffmpeg p5-Image-ExifTool
+```
+
 ## Configuring Pleroma
 
 Create a user for Pleroma:
index 9a8b54ece39bf0917c0d19b2513b5a0ca1c7f2ec..638fc4e47cdb941bd4a453a72f38f8f7a1b1d244 100644 (file)
@@ -29,14 +29,15 @@ Gentoo quite pointedly does not come with a cron daemon installed, and as such i
 * `dev-lang/elixir`
 * `dev-vcs/git`
 * `dev-util/cmake`
-* `media-video/ffmpeg`
-* `media-gfx/imagemagick`
 
 #### Optional ebuilds used in this guide
 
 * `www-servers/nginx` (preferred, example configs for other reverse proxies can be found in the repo)
 * `app-crypt/certbot` (or any other ACME client for Let’s Encrypt certificates)
 * `app-crypt/certbot-nginx` (nginx certbot plugin that allows use of the all-powerful `--nginx` flag on certbot)
+* `media-gfx/imagemagick`
+* `media-video/ffmpeg`
+* `media-libs/exiftool`
 
 ### Prepare the system
 
@@ -49,7 +50,7 @@ Gentoo quite pointedly does not come with a cron daemon installed, and as such i
 * Emerge all required the required and suggested software in one go:
 
 ```shell
- # emerge --ask dev-db/postgresql dev-lang/elixir dev-vcs/git www-servers/nginx app-crypt/certbot app-crypt/certbot-nginx dev-util/cmake media-video/ffmpeg media-gfx/imagemagick
+ # emerge --ask dev-db/postgresql dev-lang/elixir dev-vcs/git www-servers/nginx app-crypt/certbot app-crypt/certbot-nginx dev-util/cmake
 ```
 
 If you would not like to install the optional packages, remove them from this line. 
@@ -89,6 +90,12 @@ If you do not plan to make any modifications to your Pleroma instance, cloning d
 
 Not only does this make it much easier to deploy changes you make, as you can commit and pull from upstream and all that good stuff from the comfort of your local machine then simply `git pull` on your instance server when you're ready to deploy, it also ensures you are compliant with the Affero General Public Licence that Pleroma is licenced under, which stipulates that all network services provided with modified AGPL code must publish their changes on a publicly available internet service and for free. It also makes it much easier to ask for help from and provide help to your fellow Pleroma admins if your public repo always reflects what you are running because it is part of your deployment procedure.
 
+### Install media / graphics packages (optional, see [`docs/installation/optional/media_graphics_packages.md`](docs/installation/optional/media_graphics_packages.md))
+
+```shell
+# emerge --ask media-video/ffmpeg media-gfx/imagemagick media-libs/exiftool
+```
+
 ### Install PleromaBE
 
 * Add a new system user for the Pleroma service and set up default directories:
index 8cf2e4682a59035027736a47355ace862eba1d9d..d5fa04fdf83d2e6660eb03d178772c14e3096825 100644 (file)
@@ -44,6 +44,10 @@ pgsql=YES
 
 First, run `# /etc/rc.d/pgsql start`. Then, `$ sudo -Hu pgsql -g pgsql createdb`.
 
+### Install media / graphics packages (optional, see [`docs/installation/optional/media_graphics_packages.md`](docs/installation/optional/media_graphics_packages.md))
+
+`# pkgin install ImageMagick ffmpeg4 p5-Image-ExifTool`
+
 ## Configuring Pleroma
 
 Create a user for Pleroma:
index 277e5ec43e9be20059ad1bdb7bd7028f7e54427c..8092ac3792c747c30752ac736303d5ee9a1bd196 100644 (file)
@@ -25,6 +25,19 @@ pkg_add elixir gmake git postgresql-server postgresql-contrib cmake ffmpeg Image
 
 Pleroma requires a reverse proxy, OpenBSD has relayd in base (and is used in this guide) and packages/ports are available for nginx (www/nginx) and apache (www/apache-httpd). Independently of the reverse proxy, [acme-client(1)](https://man.openbsd.org/acme-client) can be used to get a certificate from Let's Encrypt.
 
+#### Optional software
+
+Per [`docs/installation/optional/media_graphics_packages.md`](docs/installation/optional/media_graphics_packages.md):
+  * ImageMagick
+  * ffmpeg
+  * exiftool
+
+To install the above:
+
+```
+pkg_add ImageMagick ffmpeg p5-Image-ExifTool
+```
+
 #### Creating the pleroma user
 Pleroma will be run by a dedicated user, \_pleroma. Before creating it, insert the following lines in login.conf:
 ```
index 2cb03e73e9fdfb098e256ee8fadc267831e93e89..01cf34ab4ce6bd2ae92696fb0717e296c94c6cb3 100644 (file)
@@ -18,6 +18,17 @@ Asenna tarvittava ohjelmisto:
 
 `# pkg_add git elixir gmake postgresql-server-10.3 postgresql-contrib-10.3 cmake ffmpeg ImageMagick`
 
+#### Optional software
+
+[`docs/installation/optional/media_graphics_packages.md`](docs/installation/optional/media_graphics_packages.md):
+  * ImageMagick
+  * ffmpeg
+  * exiftool
+
+Asenna tarvittava ohjelmisto:
+
+`# pkg_add ImageMagick ffmpeg p5-Image-ExifTool`
+
 Luo postgresql-tietokanta:
 
 `# su - _postgresql`
diff --git a/docs/installation/optional/media_graphics_packages.md b/docs/installation/optional/media_graphics_packages.md
new file mode 100644 (file)
index 0000000..cb3d711
--- /dev/null
@@ -0,0 +1,32 @@
+# Optional software packages needed for specific functionality
+
+For specific Pleroma functionality (which is disabled by default) some or all of the below packages are required:
+  * `ImageMagic`
+  * `ffmpeg`
+  * `exiftool`
+  
+Please refer to documentation in `docs/installation` on how to install them on specific OS.
+  
+Note: the packages are not required with the current default settings of Pleroma.
+
+## `ImageMagick`
+
+`ImageMagick` is a set of tools to create, edit, compose, or convert bitmap images.
+
+It is required for the following Pleroma features:
+  * `Pleroma.Upload.Filters.Mogrify`, `Pleroma.Upload.Filters.Mogrifun` upload filters (related config: `Plaroma.Upload/filters` in `config/config.exs`)
+  * Media preview proxy for still images (related config: `media_preview_proxy/enabled` in `config/config.exs`)
+  
+## `ffmpeg`
+
+`ffmpeg` is software to record, convert and stream audio and video.
+
+It is required for the following Pleroma features:
+  * Media preview proxy for videos (related config: `media_preview_proxy/enabled` in `config/config.exs`)
+
+## `exiftool`
+
+`exiftool` is media files metadata reader/writer.
+
+It is required for the following Pleroma features:
+  * `Pleroma.Upload.Filters.Exiftool` upload filter (related config: `Plaroma.Upload/filters` in `config/config.exs`)
index 8fdf6b5b572c09b3537380325c555b420a40013b..f6b05c88761050df7270078ce49d34244ea89ca2 100644 (file)
@@ -27,19 +27,36 @@ Other than things bundled in the OTP release Pleroma depends on:
 * PostgreSQL (also utilizes extensions in postgresql-contrib)
 * nginx (could be swapped with another reverse proxy but this guide covers only it)
 * certbot (for Let's Encrypt certificates, could be swapped with another ACME client, but this guide covers only it)
-* ffmpeg (needed for media preview proxy)
-* ImageMagick (needed for media preview proxy)
 
 === "Alpine"
     ```
     echo "http://nl.alpinelinux.org/alpine/latest-stable/community" >> /etc/apk/repositories
     apk update
-    apk add curl unzip ncurses postgresql postgresql-contrib nginx certbot ffmpeg imagemagick
+    apk add curl unzip ncurses postgresql postgresql-contrib nginx certbot
     ```
 
 === "Debian/Ubuntu"
     ```
-    apt install curl unzip libncurses5 postgresql postgresql-contrib nginx certbot ffmpeg imagemagick
+    apt install curl unzip libncurses5 postgresql postgresql-contrib nginx certbot
+    ```
+
+### Installing optional packages
+
+Per [`docs/installation/optional/media_graphics_packages.md`](docs/installation/optional/media_graphics_packages.md):
+  * ImageMagick
+  * ffmpeg
+  * exiftool
+
+=== "Alpine"
+    ```
+    echo "http://nl.alpinelinux.org/alpine/latest-stable/community" >> /etc/apk/repositories
+    apk update
+    apk add imagemagick ffmpeg exiftool
+    ```
+
+=== "Debian/Ubuntu"
+    ```
+    apt install imagemagick ffmpeg libimage-exiftool-perl
     ```
 
 ## Setup
index 00ec79a2a68a6bda886e9e1f4b18084a73078174..d7d8e423e5e72df01b757277da5c170080d1de68 100644 (file)
@@ -268,7 +268,8 @@ defmodule Pleroma.Application do
       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"
+          "#{filter} is specified in list of Pleroma.Upload filters, but the " <>
+            "#{command_required} command is not found"
         )
       end
     end
@@ -276,5 +277,20 @@ defmodule Pleroma.Application do
     check_filter.(Pleroma.Upload.Filters.Exiftool, "exiftool")
     check_filter.(Pleroma.Upload.Filters.Mogrify, "mogrify")
     check_filter.(Pleroma.Upload.Filters.Mogrifun, "mogrify")
+
+    with true <- Config.get([:media_preview_proxy, :enabled]),
+         missing_graphics_tools = Pleroma.Helpers.MediaHelper.missing_dependencies(),
+         [] <- missing_graphics_tools do
+      :noop
+    else
+      false ->
+        :noop
+
+      missing_graphics_tools ->
+        Logger.error(
+          "The following dependencies required by Media preview proxy " <>
+            "(which is currently enabled) are not installed: #{inspect(missing_graphics_tools)}"
+        )
+    end
   end
 end
index b6f35a24bb62109920358c4d1d6e99eb8ccf1771..6b799173ed0defd9a503be989db13c3f6424ef1f 100644 (file)
@@ -9,6 +9,18 @@ defmodule Pleroma.Helpers.MediaHelper do
 
   alias Pleroma.HTTP
 
+  require Logger
+
+  def missing_dependencies do
+    Enum.reduce([imagemagick: "convert", ffmpeg: "ffmpeg"], [], fn {sym, executable}, acc ->
+      if Pleroma.Utils.command_available?(executable) do
+        acc
+      else
+        [sym | acc]
+      end
+    end)
+  end
+
   def image_resize(url, options) do
     with executable when is_binary(executable) <- System.find_executable("convert"),
          {:ok, args} <- prepare_image_resize_args(options),
index 33e6873f79d85620ea0a6b76c172c71f7aff0895..e9b58482289684453536488c45cfdaf438dfe8dd 100644 (file)
@@ -81,6 +81,15 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyControllerTest do
   end
 
   describe "Media Preview Proxy" do
+    def assert_dependencies_installed do
+      missing_dependencies = Pleroma.Helpers.MediaHelper.missing_dependencies()
+
+      assert missing_dependencies == [],
+             "Error: missing dependencies (please refer to `docs/installation`): #{
+               inspect(missing_dependencies)
+             }"
+    end
+
     setup do
       clear_config([:media_proxy, :enabled], true)
       clear_config([:media_preview_proxy, :enabled], true)
@@ -184,6 +193,8 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyControllerTest do
       url: url,
       media_proxy_url: media_proxy_url
     } do
+      assert_dependencies_installed()
+
       # Setting a high :min_content_length to ensure this scenario is not affected by its logic
       clear_config([:media_preview_proxy, :min_content_length], 1_000_000_000)
 
@@ -270,6 +281,8 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyControllerTest do
       url: url,
       media_proxy_url: media_proxy_url
     } do
+      assert_dependencies_installed()
+
       Tesla.Mock.mock(fn
         %{method: "head", url: ^media_proxy_url} ->
           %Tesla.Env{status: 200, body: "", headers: [{"content-type", "image/png"}]}
@@ -290,6 +303,8 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyControllerTest do
       url: url,
       media_proxy_url: media_proxy_url
     } do
+      assert_dependencies_installed()
+
       Tesla.Mock.mock(fn
         %{method: "head", url: ^media_proxy_url} ->
           %Tesla.Env{status: 200, body: "", headers: [{"content-type", "image/jpeg"}]}