added example cache purge script
authorMaksim Pechnikov <parallel588@gmail.com>
Sat, 16 May 2020 12:16:33 +0000 (15:16 +0300)
committerMaksim Pechnikov <parallel588@gmail.com>
Sun, 17 May 2020 02:56:20 +0000 (05:56 +0300)
config/config.exs
installation/nginx-cache-purge.example [new file with mode: 0755]
lib/pleroma/web/media_proxy/invalidations/http.ex [new file with mode: 0644]
lib/pleroma/web/media_proxy/invalidations/nginx.ex [deleted file]
lib/pleroma/web/media_proxy/invalidations/script.ex

index 5394c7c7a94267f6fff9d18848a2205af1e6e2a2..882d25069de11f2832532d3dc68f4115618e3ba6 100644 (file)
@@ -382,7 +382,7 @@ config :pleroma, :media_proxy,
     enabled: false,
     provider: Pleroma.Web.MediaProxy.Invalidation.Script,
     options: %{
-      script_path: ""
+      script_path: "./installation/nginx-cache-purge.example"
     }
   ],
   proxy_opts: [
diff --git a/installation/nginx-cache-purge.example b/installation/nginx-cache-purge.example
new file mode 100755 (executable)
index 0000000..12dfa73
--- /dev/null
@@ -0,0 +1,39 @@
+#!/bin/bash
+
+# A simple Bash script to delete an media from the Nginx cache.
+
+SCRIPTNAME=${0##*/}
+
+# NGINX cache directory 
+CACHE_DIRECTORY="/tmp/pleroma-media-cache"
+
+function get_cache_files() {
+    local max_parallel=${3-16}
+    find $2 -maxdepth 1 -type d | xargs -P $max_parallel -n 1 grep -ERl "^KEY:.*$1" | sort -u
+}
+
+function purge_item() {
+  local cache_files
+  cache_files=$(get_cache_files "$1" "$2")
+
+  if [ -n "$cache_files" ]; then
+    for i in $cache_files; do
+      [ -f $i ] || continue
+      echo "Deleting $i from $2."
+      rm $i
+    done
+  else
+    echo "$1 is not cached."
+  fi  
+}
+
+function purge() {
+  for url in "$@"
+  do
+    echo "$SCRIPTNAME delete $url from cache ($CACHE_DIRECTORY)"
+    purge_item $url $CACHE_DIRECTORY
+  done
+
+}
+
+purge $1 
diff --git a/lib/pleroma/web/media_proxy/invalidations/http.ex b/lib/pleroma/web/media_proxy/invalidations/http.ex
new file mode 100644 (file)
index 0000000..40c624e
--- /dev/null
@@ -0,0 +1,16 @@
+defmodule Pleroma.Web.MediaProxy.Invalidation.Http do
+  @behaviour Pleroma.Web.MediaProxy.Invalidation
+
+  @impl Pleroma.Web.MediaProxy.Invalidation
+  def purge(urls, opts) do
+    method = Map.get(opts, :http_method, :purge)
+    headers = Map.get(opts, :http_headers, [])
+    options = Map.get(opts, :http_options, [])
+
+    Enum.each(urls, fn url ->
+      Pleroma.HTTP.request(method, url, "", headers, options)
+    end)
+
+    {:ok, "success"}
+  end
+end
diff --git a/lib/pleroma/web/media_proxy/invalidations/nginx.ex b/lib/pleroma/web/media_proxy/invalidations/nginx.ex
deleted file mode 100644 (file)
index 5bfdd50..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-defmodule Pleroma.Web.MediaProxy.Invalidation.Nginx do
-  @behaviour Pleroma.Web.MediaProxy.Invalidation
-
-  @impl Pleroma.Web.MediaProxy.Invalidation
-  def purge(urls, _opts) do
-    Enum.each(urls, fn url ->
-      Pleroma.HTTP.request(:purge, url, "", [], [])
-    end)
-
-    {:ok, "success"}
-  end
-end
index f458845a03be506fd92d984a7462b778b751df45..94c79511ac59a437a0f59fe4a30061ec8388c541 100644 (file)
@@ -2,9 +2,14 @@ defmodule Pleroma.Web.MediaProxy.Invalidation.Script do
   @behaviour Pleroma.Web.MediaProxy.Invalidation
 
   @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)
+  def purge(urls, %{script_path: script_path} = _options) do
+    args =
+      urls
+      |> List.wrap()
+      |> Enum.uniq()
+      |> Enum.join(" ")
+
+    System.cmd(Path.expand(script_path), [args])
     {:ok, "success"}
   end
 end