diff options
Diffstat (limited to 'lib/mix')
| -rw-r--r-- | lib/mix/tasks/benchmark.ex | 25 | ||||
| -rw-r--r-- | lib/mix/tasks/pleroma/database.ex | 75 | ||||
| -rw-r--r-- | lib/mix/tasks/pleroma/emoji.ex | 26 | ||||
| -rw-r--r-- | lib/mix/tasks/pleroma/user.ex | 27 | 
4 files changed, 138 insertions, 15 deletions
| diff --git a/lib/mix/tasks/benchmark.ex b/lib/mix/tasks/benchmark.ex new file mode 100644 index 000000000..0fbb4dbb1 --- /dev/null +++ b/lib/mix/tasks/benchmark.ex @@ -0,0 +1,25 @@ +defmodule Mix.Tasks.Pleroma.Benchmark do +  use Mix.Task +  alias Mix.Tasks.Pleroma.Common + +  def run(["search"]) do +    Common.start_pleroma() + +    Benchee.run(%{ +      "search" => fn -> +        Pleroma.Web.MastodonAPI.MastodonAPIController.status_search(nil, "cofe") +      end +    }) +  end + +  def run(["tag"]) do +    Common.start_pleroma() + +    Benchee.run(%{ +      "tag" => fn -> +        %{"type" => "Create", "tag" => "cofe"} +        |> Pleroma.Web.ActivityPub.ActivityPub.fetch_public_activities() +      end +    }) +  end +end diff --git a/lib/mix/tasks/pleroma/database.ex b/lib/mix/tasks/pleroma/database.ex index ab9a3a7ff..4d480ac3f 100644 --- a/lib/mix/tasks/pleroma/database.ex +++ b/lib/mix/tasks/pleroma/database.ex @@ -4,6 +4,10 @@  defmodule Mix.Tasks.Pleroma.Database do    alias Mix.Tasks.Pleroma.Common +  alias Pleroma.Conversation +  alias Pleroma.Object +  alias Pleroma.Repo +  alias Pleroma.User    require Logger    use Mix.Task @@ -19,6 +23,18 @@ defmodule Mix.Tasks.Pleroma.Database do      Options:      - `--vacuum` - run `VACUUM FULL` after the embedded objects are replaced with their references + +  ## Prune old objects from the database + +      mix pleroma.database prune_objects + +  ## Create a conversation for all existing DMs. Can be safely re-run. + +      mix pleroma.database bump_all_conversations + +  ## Remove duplicated items from following and update followers count for all users + +      mix pleroma.database update_users_following_followers_counts    """    def run(["remove_embedded_objects" | args]) do      {options, [], []} = @@ -32,7 +48,7 @@ defmodule Mix.Tasks.Pleroma.Database do      Common.start_pleroma()      Logger.info("Removing embedded objects") -    Pleroma.Repo.query!( +    Repo.query!(        "update activities set data = jsonb_set(data, '{object}'::text[], data->'object'->'id') where data->'object'->>'id' is not null;",        [],        timeout: :infinity @@ -41,7 +57,62 @@ defmodule Mix.Tasks.Pleroma.Database do      if Keyword.get(options, :vacuum) do        Logger.info("Runnning VACUUM FULL") -      Pleroma.Repo.query!( +      Repo.query!( +        "vacuum full;", +        [], +        timeout: :infinity +      ) +    end +  end + +  def run(["bump_all_conversations"]) do +    Common.start_pleroma() +    Conversation.bump_for_all_activities() +  end + +  def run(["update_users_following_followers_counts"]) do +    Common.start_pleroma() + +    users = Repo.all(User) +    Enum.each(users, &User.remove_duplicated_following/1) +    Enum.each(users, &User.update_follower_count/1) +  end + +  def run(["prune_objects" | args]) do +    import Ecto.Query + +    {options, [], []} = +      OptionParser.parse( +        args, +        strict: [ +          vacuum: :boolean +        ] +      ) + +    Common.start_pleroma() + +    deadline = Pleroma.Config.get([:instance, :remote_post_retention_days]) + +    Logger.info("Pruning objects older than #{deadline} days") + +    time_deadline = +      NaiveDateTime.utc_now() +      |> NaiveDateTime.add(-(deadline * 86_400)) + +    public = "https://www.w3.org/ns/activitystreams#Public" + +    from(o in Object, +      where: fragment("?->'to' \\? ? OR ?->'cc' \\? ?", o.data, ^public, o.data, ^public), +      where: o.inserted_at < ^time_deadline, +      where: +        fragment("split_part(?->>'actor', '/', 3) != ?", o.data, ^Pleroma.Web.Endpoint.host()) +    ) +    |> Repo.delete_all(timeout: :infinity) + +    if Keyword.get(options, :vacuum) do +      Logger.info("Runnning VACUUM FULL") + +      Repo.query!(          "vacuum full;",          [],          timeout: :infinity diff --git a/lib/mix/tasks/pleroma/emoji.ex b/lib/mix/tasks/pleroma/emoji.ex index cced73226..d2ddf450a 100644 --- a/lib/mix/tasks/pleroma/emoji.ex +++ b/lib/mix/tasks/pleroma/emoji.ex @@ -109,7 +109,7 @@ defmodule Mix.Tasks.Pleroma.Emoji do            ])          ) -        binary_archive = Tesla.get!(src_url).body +        binary_archive = Tesla.get!(client(), src_url).body          archive_sha = :crypto.hash(:sha256, binary_archive) |> Base.encode16()          sha_status_text = ["SHA256 of ", :bright, pack_name, :normal, " source file is ", :bright] @@ -137,7 +137,7 @@ defmodule Mix.Tasks.Pleroma.Emoji do            ])          ) -        files = Tesla.get!(files_url).body |> Poison.decode!() +        files = Tesla.get!(client(), files_url).body |> Jason.decode!()          IO.puts(IO.ANSI.format(["Unpacking ", :bright, pack_name])) @@ -213,7 +213,7 @@ defmodule Mix.Tasks.Pleroma.Emoji do      IO.puts("Downloading the pack and generating SHA256") -    binary_archive = Tesla.get!(src).body +    binary_archive = Tesla.get!(client(), src).body      archive_sha = :crypto.hash(:sha256, binary_archive) |> Base.encode16()      IO.puts("SHA256 is #{archive_sha}") @@ -239,7 +239,7 @@ defmodule Mix.Tasks.Pleroma.Emoji do      emoji_map = Pleroma.Emoji.make_shortcode_to_file_map(tmp_pack_dir, exts) -    File.write!(files_name, Poison.encode!(emoji_map, pretty: true)) +    File.write!(files_name, Jason.encode!(emoji_map, pretty: true))      IO.puts(""" @@ -248,11 +248,11 @@ defmodule Mix.Tasks.Pleroma.Emoji do      """)      if File.exists?("index.json") do -      existing_data = File.read!("index.json") |> Poison.decode!() +      existing_data = File.read!("index.json") |> Jason.decode!()        File.write!(          "index.json", -        Poison.encode!( +        Jason.encode!(            Map.merge(              existing_data,              pack_json @@ -263,16 +263,16 @@ defmodule Mix.Tasks.Pleroma.Emoji do        IO.puts("index.json file has been update with the #{name} pack")      else -      File.write!("index.json", Poison.encode!(pack_json, pretty: true)) +      File.write!("index.json", Jason.encode!(pack_json, pretty: true))        IO.puts("index.json has been created with the #{name} pack")      end    end    defp fetch_manifest(from) do -    Poison.decode!( +    Jason.decode!(        if String.starts_with?(from, "http") do -        Tesla.get!(from).body +        Tesla.get!(client(), from).body        else          File.read!(from)        end @@ -290,4 +290,12 @@ defmodule Mix.Tasks.Pleroma.Emoji do        ]      )    end + +  defp client do +    middleware = [ +      {Tesla.Middleware.FollowRedirects, [max_redirects: 3]} +    ] + +    Tesla.client(middleware) +  end  end diff --git a/lib/mix/tasks/pleroma/user.ex b/lib/mix/tasks/pleroma/user.ex index b396ff0de..25fc40ea7 100644 --- a/lib/mix/tasks/pleroma/user.ex +++ b/lib/mix/tasks/pleroma/user.ex @@ -77,6 +77,10 @@ defmodule Mix.Tasks.Pleroma.User do    ## Delete tags from a user.        mix pleroma.user untag NICKNAME TAGS + +  ## Toggle confirmation of the user's account. + +      mix pleroma.user toggle_confirmed NICKNAME    """    def run(["new", nickname, email | rest]) do      {options, [], []} = @@ -126,7 +130,7 @@ defmodule Mix.Tasks.Pleroma.User do      proceed? = assume_yes? or Mix.shell().yes?("Continue?") -    unless not proceed? do +    if proceed? do        Common.start_pleroma()        params = %{ @@ -138,7 +142,7 @@ defmodule Mix.Tasks.Pleroma.User do          bio: bio        } -      changeset = User.register_changeset(%User{}, params, confirmed: true) +      changeset = User.register_changeset(%User{}, params, need_confirmation: false)        {:ok, _user} = User.register(changeset)        Mix.shell().info("User #{nickname} created") @@ -163,7 +167,7 @@ defmodule Mix.Tasks.Pleroma.User do      Common.start_pleroma()      with %User{local: true} = user <- User.get_cached_by_nickname(nickname) do -      User.delete(user) +      User.perform(:delete, user)        Mix.shell().info("User #{nickname} deleted.")      else        _ -> @@ -380,7 +384,7 @@ defmodule Mix.Tasks.Pleroma.User do      Common.start_pleroma()      with %User{local: true} = user <- User.get_cached_by_nickname(nickname) do -      User.delete_user_activities(user) +      {:ok, _} = User.delete_user_activities(user)        Mix.shell().info("User #{nickname} statuses deleted.")      else        _ -> @@ -388,6 +392,21 @@ defmodule Mix.Tasks.Pleroma.User do      end    end +  def run(["toggle_confirmed", nickname]) do +    Common.start_pleroma() + +    with %User{} = user <- User.get_cached_by_nickname(nickname) do +      {:ok, user} = User.toggle_confirmation(user) + +      message = if user.info.confirmation_pending, do: "needs", else: "doesn't need" + +      Mix.shell().info("#{nickname} #{message} confirmation.") +    else +      _ -> +        Mix.shell().error("No local user #{nickname}") +    end +  end +    defp set_moderator(user, value) do      info_cng = User.Info.admin_api_update(user.info, %{is_moderator: value}) | 
