Packages
nerves
1.14.0
1.15.0
1.14.3
1.14.2
1.14.1
1.14.0
1.13.2
1.13.1
1.13.0
1.12.0
1.11.3
1.11.2
1.11.1
1.11.0
1.10.5
1.10.4
1.10.3
1.10.2
1.10.1
1.10.0
1.9.3
1.9.2
retired
1.9.1
1.9.0
1.8.0
1.7.17
1.7.16
1.7.15
1.7.14
retired
1.7.13
1.7.12
1.7.11
1.7.10
1.7.9
1.7.8
1.7.7
1.7.6
1.7.5
1.7.4
1.7.3
1.7.2
retired
1.7.1
retired
1.7.0
retired
1.6.7
1.6.6
1.6.5
1.6.4
1.6.3
1.6.2
1.6.1
1.6.0
1.5.5
1.5.4
1.5.3
1.5.2
1.5.1
1.5.0
1.4.5
1.4.4
1.4.3
1.4.2
1.4.1
1.4.0
1.3.4
1.3.3
1.3.2
1.3.1
1.3.0
1.2.1
1.2.0
1.1.1
1.1.0
1.0.1
1.0.0
1.0.0-rc.2
1.0.0-rc.1
1.0.0-rc.0
0.11.0
0.10.1
0.10.0
0.9.4
0.9.3
0.9.2
0.9.1
0.9.0
0.8.3
0.8.2
0.8.1
0.8.0
0.7.5
0.7.4
0.7.3
0.7.2
0.7.1
0.7.0
0.6.1
0.6.0
0.5.2
0.5.1
0.5.0
0.4.8
0.4.7
0.4.6
0.4.5
0.4.4
0.4.3
0.4.2
0.4.1
0.4.0
0.4.0-rc.0
0.3.4
0.3.3
0.3.2
0.3.1
0.3.0
0.2.0
Craft and deploy bulletproof embedded software
Current section
Files
Jump to
Current section
Files
lib/nerves/artifact/resolver.ex
# SPDX-FileCopyrightText: 2018 Justin Schneck
# SPDX-FileCopyrightText: 2020 Frank Hunleth
# SPDX-FileCopyrightText: 2022 Jon Carstens
#
# SPDX-License-Identifier: Apache-2.0
#
defmodule Nerves.Artifact.Resolver do
@moduledoc false
@doc """
Build a plan for downloading a package
This function should not make any HTTP requests.
Return `nil` if the implementing module can't handle the site spec.
"""
@callback plan(tuple(), version :: String.t(), artifact_filename :: String.t()) ::
{module(), map()} | nil
@doc """
Download the package based on a previously returned plan
This function should download to the specified path.
"""
@callback get(map(), Path.t()) :: :ok | {:error, term()}
@spec get(list(), pkg :: Nerves.Package.t()) :: {:ok, path :: Path.t()} | {:error, term}
def get([], _pkg) do
{:error, :no_result}
end
def get(resolvers, pkg) do
do_get(resolvers, pkg)
end
defp do_get(_, _, _raise \\ nil)
defp do_get([], _pkg, nil), do: {:error, :no_result}
defp do_get([], _pkg, reason), do: Mix.raise(reason)
defp do_get([{resolver, resolver_opts} | resolvers], pkg, raise_reason) do
file = Nerves.Artifact.download_path(pkg)
File.mkdir_p!(Nerves.Env.download_dir())
case resolver.get(resolver_opts, file) do
:ok ->
validate_and_continue(file, resolvers, pkg)
{:error, reason} ->
handle_error(reason, resolvers, pkg, raise_reason)
end
end
defp validate_and_continue(file, resolvers, pkg) do
case Nerves.Artifact.Archive.validate(file) do
:ok ->
{:ok, file}
{:error, reason} ->
Nerves.Utils.Shell.warn(" Invalid or corrupt file")
_ = File.rm(file)
raise_reason = """
Nerves encountered errors while validating artifact download.
#{format_raise_reason(reason)}
"""
do_get(resolvers, pkg, raise_reason)
end
end
defp handle_error(reason, resolvers, pkg, raise_reason) do
Nerves.Utils.Shell.warn(" #{reason}")
do_get(resolvers, pkg, raise_reason)
end
defp format_raise_reason(reason) do
if is_binary(reason), do: reason, else: inspect(reason)
end
end