Merge remote-tracking branch 'remotes/origin/develop' into 2168-media-preview-proxy
[akkoma] / lib / pleroma / web / media_proxy / invalidations / script.ex
index f458845a03be506fd92d984a7462b778b751df45..6be782132aad42f00b7f1e6c999adaef8733a64c 100644 (file)
@@ -1,10 +1,41 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
 defmodule Pleroma.Web.MediaProxy.Invalidation.Script do
+  @moduledoc false
+
   @behaviour Pleroma.Web.MediaProxy.Invalidation
 
+  require Logger
+
   @impl Pleroma.Web.MediaProxy.Invalidation
-  def purge(urls, %{script_path: script_path} = options) do
-    script_args = List.wrap(Map.get(options, :script_args, []))
-    System.cmd(Path.expand(script_path), [urls] ++ script_args)
-    {:ok, "success"}
+  def purge(urls, %{script_path: script_path} = _options) do
+    args =
+      urls
+      |> List.wrap()
+      |> Enum.uniq()
+      |> Enum.join(" ")
+
+    path = Path.expand(script_path)
+
+    Logger.debug("Running cache purge: #{inspect(urls)}, #{path}")
+
+    case do_purge(path, [args]) do
+      {result, exit_status} when exit_status > 0 ->
+        Logger.error("Error while cache purge: #{inspect(result)}")
+        {:error, inspect(result)}
+
+      _ ->
+        {:ok, "success"}
+    end
+  end
+
+  def purge(_, _), do: {:error, "not found script path"}
+
+  defp do_purge(path, args) do
+    System.cmd(path, args)
+  rescue
+    error -> {inspect(error), 1}
   end
 end