2019-12-09 04:23:07 -07:00
|
|
|
# Pleroma: A lightweight social networking server
|
2021-01-12 23:49:20 -07:00
|
|
|
# Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>
|
2019-12-09 04:23:07 -07:00
|
|
|
# SPDX-License-Identifier: AGPL-3.0-only
|
|
|
|
|
|
|
|
defmodule Pleroma.Utils do
|
2020-11-13 05:13:14 -07:00
|
|
|
@posix_error_codes ~w(
|
|
|
|
eacces eagain ebadf ebadmsg ebusy edeadlk edeadlock edquot eexist efault
|
|
|
|
efbig eftype eintr einval eio eisdir eloop emfile emlink emultihop
|
|
|
|
enametoolong enfile enobufs enodev enolck enolink enoent enomem enospc
|
|
|
|
enosr enostr enosys enotblk enotdir enotsup enxio eopnotsupp eoverflow
|
|
|
|
eperm epipe erange erofs espipe esrch estale etxtbsy exdev
|
|
|
|
)a
|
|
|
|
|
2021-04-22 09:11:08 -06:00
|
|
|
@repo_timeout Pleroma.Config.get([Pleroma.Repo, :timeout], 15_000)
|
|
|
|
|
2019-12-09 04:23:07 -07:00
|
|
|
def compile_dir(dir) when is_binary(dir) do
|
2022-07-24 10:42:43 -06:00
|
|
|
dir
|
|
|
|
|> elixir_files()
|
|
|
|
|> Kernel.ParallelCompiler.compile()
|
|
|
|
end
|
|
|
|
|
|
|
|
defp elixir_files(dir) when is_binary(dir) do
|
2019-12-09 04:23:07 -07:00
|
|
|
dir
|
|
|
|
|> File.ls!()
|
|
|
|
|> Enum.map(&Path.join(dir, &1))
|
2022-07-24 10:42:43 -06:00
|
|
|
|> Enum.flat_map(fn path ->
|
|
|
|
if File.dir?(path) do
|
|
|
|
elixir_files(path)
|
|
|
|
else
|
|
|
|
[path]
|
|
|
|
end
|
|
|
|
end)
|
|
|
|
|> Enum.filter(fn path -> String.ends_with?(path, ".ex") end)
|
2019-12-09 04:23:07 -07:00
|
|
|
end
|
2020-07-11 06:48:45 -06:00
|
|
|
|
|
|
|
@doc """
|
|
|
|
POSIX-compliant check if command is available in the system
|
|
|
|
|
|
|
|
## Examples
|
|
|
|
iex> command_available?("git")
|
|
|
|
true
|
|
|
|
iex> command_available?("wrongcmd")
|
|
|
|
false
|
|
|
|
|
|
|
|
"""
|
|
|
|
@spec command_available?(String.t()) :: boolean()
|
|
|
|
def command_available?(command) do
|
2021-01-14 15:58:18 -07:00
|
|
|
case :os.find_executable(String.to_charlist(command)) do
|
|
|
|
false -> false
|
|
|
|
_ -> true
|
|
|
|
end
|
2020-07-11 06:48:45 -06:00
|
|
|
end
|
2020-08-22 01:42:02 -06:00
|
|
|
|
|
|
|
@doc "creates the uniq temporary directory"
|
|
|
|
@spec tmp_dir(String.t()) :: {:ok, String.t()} | {:error, :file.posix()}
|
|
|
|
def tmp_dir(prefix \\ "") do
|
2020-08-24 00:47:25 -06:00
|
|
|
sub_dir =
|
|
|
|
[
|
|
|
|
prefix,
|
|
|
|
Timex.to_unix(Timex.now()),
|
|
|
|
:os.getpid(),
|
|
|
|
String.downcase(Integer.to_string(:rand.uniform(0x100000000), 36))
|
|
|
|
]
|
|
|
|
|> Enum.join("-")
|
2020-08-22 01:42:02 -06:00
|
|
|
|
2020-08-24 00:47:25 -06:00
|
|
|
tmp_dir = Path.join(System.tmp_dir!(), sub_dir)
|
2020-08-22 01:42:02 -06:00
|
|
|
|
|
|
|
case File.mkdir(tmp_dir) do
|
|
|
|
:ok -> {:ok, tmp_dir}
|
|
|
|
error -> error
|
|
|
|
end
|
|
|
|
end
|
2020-11-13 05:13:14 -07:00
|
|
|
|
|
|
|
@spec posix_error_message(atom()) :: binary()
|
|
|
|
def posix_error_message(code) when code in @posix_error_codes do
|
|
|
|
error_message = Gettext.dgettext(Pleroma.Web.Gettext, "posix_errors", "#{code}")
|
|
|
|
"(POSIX error: #{error_message})"
|
|
|
|
end
|
|
|
|
|
|
|
|
def posix_error_message(_), do: ""
|
2021-04-20 10:10:39 -06:00
|
|
|
|
2021-04-22 09:11:08 -06:00
|
|
|
@doc """
|
|
|
|
Returns [timeout: integer] suitable for passing as an option to Repo functions.
|
|
|
|
|
|
|
|
This function detects if the execution was triggered from IEx shell, Mix task, or
|
|
|
|
./bin/pleroma_ctl and sets the timeout to :infinity, else returns the default timeout value.
|
|
|
|
"""
|
|
|
|
@spec query_timeout() :: [timeout: integer]
|
2021-04-20 10:10:39 -06:00
|
|
|
def query_timeout do
|
|
|
|
{parent, _, _, _} = Process.info(self(), :current_stacktrace) |> elem(1) |> Enum.fetch!(2)
|
|
|
|
|
|
|
|
cond do
|
|
|
|
parent |> to_string |> String.starts_with?("Elixir.Mix.Task") -> [timeout: :infinity]
|
2021-04-20 11:00:02 -06:00
|
|
|
parent == :erl_eval -> [timeout: :infinity]
|
2021-04-22 09:11:08 -06:00
|
|
|
true -> [timeout: @repo_timeout]
|
2021-04-20 10:10:39 -06:00
|
|
|
end
|
|
|
|
end
|
2019-12-09 04:23:07 -07:00
|
|
|
end
|