diff options
author | lain <lain@soykaf.club> | 2020-05-22 18:32:27 +0000 |
---|---|---|
committer | lain <lain@soykaf.club> | 2020-05-22 18:32:27 +0000 |
commit | 124812282fd908467c9272aa5ab0d163bec7e4b3 (patch) | |
tree | 14b75871553bcf517bd0de6bbfeea4b88df5664d | |
parent | 72189d227f01f7b6e69a947776238931b500c3ed (diff) | |
download | pleroma-124812282fd908467c9272aa5ab0d163bec7e4b3.tar.gz |
Revert "Merge branch 'issue/1509' into 'develop'"revert-6dd1575c
This reverts merge request !2539
-rw-r--r-- | config/config.exs | 4 | ||||
-rw-r--r-- | docs/configuration/cheatsheet.md | 34 | ||||
-rwxr-xr-x | installation/nginx-cache-purge.sh.example | 40 | ||||
-rw-r--r-- | lib/pleroma/object.ex | 34 | ||||
-rw-r--r-- | lib/pleroma/web/media_proxy/invalidation.ex | 26 | ||||
-rw-r--r-- | lib/pleroma/web/media_proxy/invalidations/http.ex | 40 | ||||
-rw-r--r-- | lib/pleroma/web/media_proxy/invalidations/script.ex | 41 | ||||
-rw-r--r-- | lib/pleroma/workers/attachments_cleanup_worker.ex | 49 | ||||
-rw-r--r-- | test/web/media_proxy/invalidations/http_test.exs | 35 | ||||
-rw-r--r-- | test/web/media_proxy/invalidations/script_test.exs | 20 |
10 files changed, 30 insertions, 293 deletions
diff --git a/config/config.exs b/config/config.exs index 7385fb6c3..0e09a387b 100644 --- a/config/config.exs +++ b/config/config.exs @@ -391,10 +391,6 @@ config :pleroma, :rich_media, config :pleroma, :media_proxy, enabled: false, - invalidation: [ - enabled: false, - provider: Pleroma.Web.MediaProxy.Invalidation.Script - ], proxy_opts: [ redirect_on_failure: false, max_body_length: 25 * 1_048_576, diff --git a/docs/configuration/cheatsheet.md b/docs/configuration/cheatsheet.md index 505acb293..f86bb4fbb 100644 --- a/docs/configuration/cheatsheet.md +++ b/docs/configuration/cheatsheet.md @@ -254,40 +254,6 @@ This section describe PWA manifest instance-specific values. Currently this opti * `base_url`: The base URL to access a user-uploaded file. Useful when you want to proxy the media files via another host/CDN fronts. * `proxy_opts`: All options defined in `Pleroma.ReverseProxy` documentation, defaults to `[max_body_length: (25*1_048_576)]`. * `whitelist`: List of domains to bypass the mediaproxy -* `invalidation`: options for remove media from cache after delete object: - * `enabled`: Enables purge cache - * `provider`: Which one of the [purge cache strategy](#purge-cache-strategy) to use. - -### Purge cache strategy - -#### Pleroma.Web.MediaProxy.Invalidation.Script - -This strategy allow perform external bash script to purge cache. -Urls of attachments pass to script as arguments. - -* `script_path`: path to external script. - -Example: -```elixir -config :pleroma, Pleroma.Web.MediaProxy.Invalidation.Script, - script_path: "./installation/nginx-cache-purge.example" -``` - -#### Pleroma.Web.MediaProxy.Invalidation.Http - -This strategy allow perform custom http request to purge cache. - -* `method`: http method. default is `purge` -* `headers`: http headers. default is empty -* `options`: request options. default is empty - -Example: -```elixir -config :pleroma, Pleroma.Web.MediaProxy.Invalidation.Http, - method: :purge, - headers: [], - options: [] -``` ## Link previews diff --git a/installation/nginx-cache-purge.sh.example b/installation/nginx-cache-purge.sh.example deleted file mode 100755 index b2915321c..000000000 --- a/installation/nginx-cache-purge.sh.example +++ /dev/null @@ -1,40 +0,0 @@ -#!/bin/sh - -# A simple shell script to delete a media from the Nginx cache. - -SCRIPTNAME=${0##*/} - -# NGINX cache directory -CACHE_DIRECTORY="/tmp/pleroma-media-cache" - -## Return the files where the items are cached. -## $1 - the filename, can be a pattern . -## $2 - the cache directory. -## $3 - (optional) the number of parallel processes to run for grep. -get_cache_files() { - local max_parallel=${3-16} - find $2 -maxdepth 2 -type d | xargs -P $max_parallel -n 1 grep -E Rl "^KEY:.*$1" | sort -u -} - -## Removes an item from the given cache zone. -## $1 - the filename, can be a pattern . -## $2 - the cache directory. -purge_item() { - for f in $(get_cache_files $1 $2); do - echo "found file: $f" - [ -f $f ] || continue - echo "Deleting $f from $2." - rm $f - done -} # purge_item - -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/object.ex b/lib/pleroma/object.ex index 546c4ea01..ab16bf2db 100644 --- a/lib/pleroma/object.ex +++ b/lib/pleroma/object.ex @@ -9,13 +9,11 @@ defmodule Pleroma.Object do import Ecto.Changeset alias Pleroma.Activity - alias Pleroma.Config alias Pleroma.Object alias Pleroma.Object.Fetcher alias Pleroma.ObjectTombstone alias Pleroma.Repo alias Pleroma.User - alias Pleroma.Workers.AttachmentsCleanupWorker require Logger @@ -190,37 +188,27 @@ defmodule Pleroma.Object do def delete(%Object{data: %{"id" => id}} = object) do with {:ok, _obj} = swap_object_with_tombstone(object), deleted_activity = Activity.delete_all_by_object_ap_id(id), - {:ok, _} <- invalid_object_cache(object) do - cleanup_attachments( - Config.get([:instance, :cleanup_attachments]), - %{"object" => object} - ) + {:ok, true} <- Cachex.del(:object_cache, "object:#{id}"), + {:ok, _} <- Cachex.del(:web_resp_cache, URI.parse(id).path) do + with true <- Pleroma.Config.get([:instance, :cleanup_attachments]) do + {:ok, _} = + Pleroma.Workers.AttachmentsCleanupWorker.enqueue("cleanup_attachments", %{ + "object" => object + }) + end {:ok, object, deleted_activity} end end - @spec cleanup_attachments(boolean(), %{required(:object) => map()}) :: - {:ok, Oban.Job.t() | nil} - def cleanup_attachments(true, %{"object" => _} = params) do - AttachmentsCleanupWorker.enqueue("cleanup_attachments", params) - end - - def cleanup_attachments(_, _), do: {:ok, nil} - - def prune(%Object{data: %{"id" => _id}} = object) do + def prune(%Object{data: %{"id" => id}} = object) do with {:ok, object} <- Repo.delete(object), - {:ok, _} <- invalid_object_cache(object) do + {:ok, true} <- Cachex.del(:object_cache, "object:#{id}"), + {:ok, _} <- Cachex.del(:web_resp_cache, URI.parse(id).path) do {:ok, object} end end - def invalid_object_cache(%Object{data: %{"id" => id}}) do - with {:ok, true} <- Cachex.del(:object_cache, "object:#{id}") do - Cachex.del(:web_resp_cache, URI.parse(id).path) - end - end - def set_cache(%Object{data: %{"id" => ap_id}} = object) do Cachex.put(:object_cache, "object:#{ap_id}", object) {:ok, object} diff --git a/lib/pleroma/web/media_proxy/invalidation.ex b/lib/pleroma/web/media_proxy/invalidation.ex deleted file mode 100644 index c037ff13e..000000000 --- a/lib/pleroma/web/media_proxy/invalidation.ex +++ /dev/null @@ -1,26 +0,0 @@ -# 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 do - @moduledoc false - - @callback purge(list(String.t()), map()) :: {:ok, String.t()} | {:error, String.t()} - - alias Pleroma.Config - - @spec purge(list(String.t())) :: {:ok, String.t()} | {:error, String.t()} - def purge(urls) do - [:media_proxy, :invalidation, :enabled] - |> Config.get() - |> do_purge(urls) - end - - defp do_purge(true, urls) do - provider = Config.get([:media_proxy, :invalidation, :provider]) - options = Config.get(provider) - provider.purge(urls, options) - end - - defp do_purge(_, _), do: :ok -end diff --git a/lib/pleroma/web/media_proxy/invalidations/http.ex b/lib/pleroma/web/media_proxy/invalidations/http.ex deleted file mode 100644 index 07248df6e..000000000 --- a/lib/pleroma/web/media_proxy/invalidations/http.ex +++ /dev/null @@ -1,40 +0,0 @@ -# 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.Http do - @moduledoc false - @behaviour Pleroma.Web.MediaProxy.Invalidation - - require Logger - - @impl Pleroma.Web.MediaProxy.Invalidation - def purge(urls, opts) do - method = Map.get(opts, :method, :purge) - headers = Map.get(opts, :headers, []) - options = Map.get(opts, :options, []) - - Logger.debug("Running cache purge: #{inspect(urls)}") - - Enum.each(urls, fn url -> - with {:error, error} <- do_purge(method, url, headers, options) do - Logger.error("Error while cache purge: url - #{url}, error: #{inspect(error)}") - end - end) - - {:ok, "success"} - end - - defp do_purge(method, url, headers, options) do - case Pleroma.HTTP.request(method, url, "", headers, options) do - {:ok, %{status: status} = env} when 400 <= status and status < 500 -> - {:error, env} - - {:error, error} = error -> - error - - _ -> - {:ok, "success"} - end - end -end diff --git a/lib/pleroma/web/media_proxy/invalidations/script.ex b/lib/pleroma/web/media_proxy/invalidations/script.ex deleted file mode 100644 index 6be782132..000000000 --- a/lib/pleroma/web/media_proxy/invalidations/script.ex +++ /dev/null @@ -1,41 +0,0 @@ -# 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 - 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 diff --git a/lib/pleroma/workers/attachments_cleanup_worker.ex b/lib/pleroma/workers/attachments_cleanup_worker.ex index 49352db2a..3c5820a86 100644 --- a/lib/pleroma/workers/attachments_cleanup_worker.ex +++ b/lib/pleroma/workers/attachments_cleanup_worker.ex @@ -27,20 +27,8 @@ defmodule Pleroma.Workers.AttachmentsCleanupWorker do uploader = Pleroma.Config.get([Pleroma.Upload, :uploader]) - prefix = - case Pleroma.Config.get([Pleroma.Upload, :base_url]) do - nil -> "media" - _ -> "" - end - - base_url = - String.trim_trailing( - Pleroma.Config.get([Pleroma.Upload, :base_url], Pleroma.Web.base_url()), - "/" - ) - # find all objects for copies of the attachments, name and actor doesn't matter here - object_ids_and_hrefs = + delete_ids = from(o in Object, where: fragment( @@ -79,28 +67,29 @@ defmodule Pleroma.Workers.AttachmentsCleanupWorker do |> Enum.map(fn {href, %{id: id, count: count}} -> # only delete files that have single instance with 1 <- count do - href - |> String.trim_leading("#{base_url}/#{prefix}") - |> uploader.delete_file() + prefix = + case Pleroma.Config.get([Pleroma.Upload, :base_url]) do + nil -> "media" + _ -> "" + end - {id, href} - else - _ -> {id, nil} - end - end) + base_url = + String.trim_trailing( + Pleroma.Config.get([Pleroma.Upload, :base_url], Pleroma.Web.base_url()), + "/" + ) - object_ids = Enum.map(object_ids_and_hrefs, fn {id, _} -> id end) + file_path = String.trim_leading(href, "#{base_url}/#{prefix}") - from(o in Object, where: o.id in ^object_ids) - |> Repo.delete_all() + uploader.delete_file(file_path) + end - object_ids_and_hrefs - |> Enum.filter(fn {_, href} -> not is_nil(href) end) - |> Enum.map(&elem(&1, 1)) - |> Pleroma.Web.MediaProxy.Invalidation.purge() + id + end) - {:ok, :success} + from(o in Object, where: o.id in ^delete_ids) + |> Repo.delete_all() end - def perform(%{"op" => "cleanup_attachments", "object" => _object}, _job), do: {:ok, :skip} + def perform(%{"op" => "cleanup_attachments", "object" => _object}, _job), do: :ok end diff --git a/test/web/media_proxy/invalidations/http_test.exs b/test/web/media_proxy/invalidations/http_test.exs deleted file mode 100644 index 8a3b4141c..000000000 --- a/test/web/media_proxy/invalidations/http_test.exs +++ /dev/null @@ -1,35 +0,0 @@ -defmodule Pleroma.Web.MediaProxy.Invalidation.HttpTest do - use ExUnit.Case - alias Pleroma.Web.MediaProxy.Invalidation - - import ExUnit.CaptureLog - import Tesla.Mock - - test "logs hasn't error message when request is valid" do - mock(fn - %{method: :purge, url: "http://example.com/media/example.jpg"} -> - %Tesla.Env{status: 200} - end) - - refute capture_log(fn -> - assert Invalidation.Http.purge( - ["http://example.com/media/example.jpg"], - %{} - ) == {:ok, "success"} - end) =~ "Error while cache purge" - end - - test "it write error message in logs when request invalid" do - mock(fn - %{method: :purge, url: "http://example.com/media/example1.jpg"} -> - %Tesla.Env{status: 404} - end) - - assert capture_log(fn -> - assert Invalidation.Http.purge( - ["http://example.com/media/example1.jpg"], - %{} - ) == {:ok, "success"} - end) =~ "Error while cache purge: url - http://example.com/media/example1.jpg" - end -end diff --git a/test/web/media_proxy/invalidations/script_test.exs b/test/web/media_proxy/invalidations/script_test.exs deleted file mode 100644 index 1358963ab..000000000 --- a/test/web/media_proxy/invalidations/script_test.exs +++ /dev/null @@ -1,20 +0,0 @@ -defmodule Pleroma.Web.MediaProxy.Invalidation.ScriptTest do - use ExUnit.Case - alias Pleroma.Web.MediaProxy.Invalidation - - import ExUnit.CaptureLog - - test "it logger error when script not found" do - assert capture_log(fn -> - assert Invalidation.Script.purge( - ["http://example.com/media/example.jpg"], - %{script_path: "./example"} - ) == {:error, "\"%ErlangError{original: :enoent}\""} - end) =~ "Error while cache purge: \"%ErlangError{original: :enoent}\"" - - assert Invalidation.Script.purge( - ["http://example.com/media/example.jpg"], - %{} - ) == {:error, "not found script path"} - end -end |