otp_version refactor

This commit is contained in:
Alexander Strizhakov 2020-03-03 12:19:29 +03:00
parent 3ecdead31a
commit 4c8569d403
No known key found for this signature in database
GPG key ID: 022896A53AEF1381
5 changed files with 60 additions and 87 deletions

View file

@ -66,16 +66,23 @@ def start(_type, _args) do
Pleroma.Gopher.Server Pleroma.Gopher.Server
] ]
case Pleroma.OTPVersion.check_version() do if adapter() == Tesla.Adapter.Gun do
:ok -> :ok case Pleroma.OTPVersion.check() do
{:error, version} -> raise " :ok ->
!!!OTP VERSION WARNING!!! :ok
You are using gun adapter with OTP version #{version}, which doesn't support correct handling of unordered certificates chains.
" {:error, version} ->
:undefined -> raise " raise "
!!!OTP VERSION WARNING!!! !!!OTP VERSION WARNING!!!
To support correct handling of unordered certificates chains - OTP version must be > 22.2. You are using gun adapter with OTP version #{version}, which doesn't support correct handling of unordered certificates chains.
" "
:undefined ->
raise "
!!!OTP VERSION WARNING!!!
To support correct handling of unordered certificates chains - OTP version must be > 22.2.
"
end
end end
# See http://elixir-lang.org/docs/stable/elixir/Supervisor.html # See http://elixir-lang.org/docs/stable/elixir/Supervisor.html
@ -202,11 +209,7 @@ defp http_pools_children(:test) do
[hackney_pool, Pleroma.Pool.Supervisor] [hackney_pool, Pleroma.Pool.Supervisor]
end end
defp http_pools_children(_) do defp http_pools_children(_), do: http_pools(adapter())
:tesla
|> Application.get_env(:adapter)
|> http_pools()
end
defp http_pools(Tesla.Adapter.Hackney) do defp http_pools(Tesla.Adapter.Hackney) do
pools = [:federation, :media] pools = [:federation, :media]
@ -227,4 +230,6 @@ defp http_pools(Tesla.Adapter.Hackney) do
defp http_pools(Tesla.Adapter.Gun), do: [Pleroma.Pool.Supervisor] defp http_pools(Tesla.Adapter.Gun), do: [Pleroma.Pool.Supervisor]
defp http_pools(_), do: [] defp http_pools(_), do: []
defp adapter, do: Application.get_env(:tesla, :adapter)
end end

View file

@ -1,63 +1,53 @@
# Pleroma: A lightweight social networking server
# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
# SPDX-License-Identifier: AGPL-3.0-only
defmodule Pleroma.OTPVersion do defmodule Pleroma.OTPVersion do
@type check_status() :: :undefined | {:error, String.t()} | :ok @type check_status() :: :ok | :undefined | {:error, String.t()}
require Logger @spec check() :: check_status()
def check do
@spec check_version() :: check_status()
def check_version do
# OTP Version https://erlang.org/doc/system_principles/versions.html#otp-version # OTP Version https://erlang.org/doc/system_principles/versions.html#otp-version
paths = [ [
Path.join(:code.root_dir(), "OTP_VERSION"), Path.join(:code.root_dir(), "OTP_VERSION"),
Path.join([:code.root_dir(), "releases", :erlang.system_info(:otp_release), "OTP_VERSION"]) Path.join([:code.root_dir(), "releases", :erlang.system_info(:otp_release), "OTP_VERSION"])
] ]
|> get_version_from_files()
:tesla |> do_check()
|> Application.get_env(:adapter)
|> get_and_check_version(paths)
end end
@spec get_and_check_version(module(), [Path.t()]) :: check_status() @spec check([Path.t()]) :: check_status()
def get_and_check_version(Tesla.Adapter.Gun, paths) do def check(paths) do
paths paths
|> check_files() |> get_version_from_files()
|> check_version() |> do_check()
end end
def get_and_check_version(_, _), do: :ok defp get_version_from_files([]), do: nil
defp check_files([]), do: nil defp get_version_from_files([path | paths]) do
defp check_files([path | paths]) do
if File.exists?(path) do if File.exists?(path) do
File.read!(path) File.read!(path)
else else
check_files(paths) get_version_from_files(paths)
end end
end end
defp check_version(nil), do: :undefined defp do_check(nil), do: :undefined
defp check_version(version) do defp do_check(version) do
try do version = String.replace(version, ~r/\r|\n|\s/, "")
version = String.replace(version, ~r/\r|\n|\s/, "")
formatted = [major, minor] =
version version
|> String.split(".") |> String.split(".")
|> Enum.map(&String.to_integer/1) |> Enum.map(&String.to_integer/1)
|> Enum.take(2) |> Enum.take(2)
with [major, minor] when length(formatted) == 2 <- formatted, if (major == 22 and minor >= 2) or major > 22 do
true <- (major == 22 and minor >= 2) or major > 22 do :ok
:ok else
else {:error, version}
false -> {:error, version}
_ -> :undefined
end
rescue
_ -> :undefined
catch
_ -> :undefined
end end
end end
end end

View file

@ -1 +0,0 @@
22

View file

@ -1 +0,0 @@
undefined

View file

@ -1,58 +1,38 @@
# Pleroma: A lightweight social networking server
# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
# SPDX-License-Identifier: AGPL-3.0-only
defmodule Pleroma.OTPVersionTest do defmodule Pleroma.OTPVersionTest do
use ExUnit.Case, async: true use ExUnit.Case, async: true
alias Pleroma.OTPVersion alias Pleroma.OTPVersion
describe "get_and_check_version/2" do describe "check/1" do
test "22.4" do test "22.4" do
assert OTPVersion.get_and_check_version(Tesla.Adapter.Gun, [ assert OTPVersion.check(["test/fixtures/warnings/otp_version/22.4"]) == :ok
"test/fixtures/warnings/otp_version/22.4"
]) == :ok
end end
test "22.1" do test "22.1" do
assert OTPVersion.get_and_check_version(Tesla.Adapter.Gun, [ assert OTPVersion.check(["test/fixtures/warnings/otp_version/22.1"]) == {:error, "22.1"}
"test/fixtures/warnings/otp_version/22.1"
]) == {:error, "22.1"}
end end
test "21.1" do test "21.1" do
assert OTPVersion.get_and_check_version(Tesla.Adapter.Gun, [ assert OTPVersion.check(["test/fixtures/warnings/otp_version/21.1"]) == {:error, "21.1"}
"test/fixtures/warnings/otp_version/21.1"
]) == {:error, "21.1"}
end end
test "23.0" do test "23.0" do
assert OTPVersion.get_and_check_version(Tesla.Adapter.Gun, [ assert OTPVersion.check(["test/fixtures/warnings/otp_version/23.0"]) == :ok
"test/fixtures/warnings/otp_version/23.0"
]) == :ok
end
test "undefined" do
assert OTPVersion.get_and_check_version(Tesla.Adapter.Gun, [
"test/fixtures/warnings/otp_version/undefined"
]) == :undefined
end
test "not parsable" do
assert OTPVersion.get_and_check_version(Tesla.Adapter.Gun, [
"test/fixtures/warnings/otp_version/error"
]) == :undefined
end end
test "with non existance file" do test "with non existance file" do
assert OTPVersion.get_and_check_version(Tesla.Adapter.Gun, [ assert OTPVersion.check([
"test/fixtures/warnings/otp_version/non-exising", "test/fixtures/warnings/otp_version/non-exising",
"test/fixtures/warnings/otp_version/22.4" "test/fixtures/warnings/otp_version/22.4"
]) == :ok ]) == :ok
end end
test "empty paths" do test "empty paths" do
assert OTPVersion.get_and_check_version(Tesla.Adapter.Gun, []) == :undefined assert OTPVersion.check([]) == :undefined
end
test "another adapter" do
assert OTPVersion.get_and_check_version(Tesla.Adapter.Hackney, []) == :ok
end end
end end
end end