Packages
nerves
0.8.1
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/package/providers/http.ex
defmodule Nerves.Package.Providers.HTTP do
@moduledoc """
Downloads an artifact from a remote http location.
"""
@behaviour Nerves.Package.Provider
alias Nerves.Package.Artifact
require Logger
@doc """
Download the artifact from an http location
"""
def artifact(pkg, toolchain, _opts) do
artifact = "#{Artifact.name(pkg, toolchain)}.#{Artifact.ext(pkg)}"
urls = pkg.config[:artifact_url]
dest = Artifact.dir(pkg, toolchain)
get(artifact, urls)
|> unpack(artifact, dest)
end
def artifact(pkg, _toolchain) do
Logger.debug "#{__MODULE__}: artifact: #{inspect pkg}"
end
def clean(_pkg) do
:ok
end
defp get(artifact, urls) do
cache_file = cache_file(artifact)
if File.exists?(cache_file) do
{:ok, cache_file}
else
download(artifact, urls)
end
end
defp download(artifact, [location | locations]) do
shell_info "Downloading Artifact #{artifact}", """
From Location:
#{location}
"""
{:ok, pid} = Nerves.Utils.HTTPClient.start_link()
location =
location
|> URI.encode
|> String.replace("+", "%2B")
result = Nerves.Utils.HTTPClient.get(pid, location)
Nerves.Utils.HTTPClient.stop(pid)
result(result, artifact, locations)
end
defp download(_artifact, _) do
shell_info "No Available Locations"
{:error, :nocache}
end
defp result({:ok, body}, artifact, _) do
shell_info "Artifact #{artifact} Downloaded"
file = cache_file(artifact)
File.mkdir_p(Nerves.Env.download_dir())
File.write(file, body)
{:ok, file}
end
defp result(_, _, []) do
shell_info "No Available Locations"
{:error, :nocache}
end
defp result(_, artifact, locations) do
shell_info "Switching Location"
download(artifact, locations)
end
defp unpack({:error, _} = error, _, _), do: error
defp unpack({:ok, file}, artifact, destination) do
shell_info "Unpacking #{artifact}", """
To Destination:
#{destination}
"""
File.mkdir_p!(destination)
{_, status} = System.cmd("tar", ["xf", file, "--strip-components=1", "-C", destination])
case status do
0 -> :ok
_ -> :error
end
end
defp shell_info(header, text \\ "") do
Mix.Nerves.IO.shell_info(header, text, __MODULE__)
end
defp cache_file(artifact) do
Nerves.Env.download_dir()
|> Path.join(artifact)
|> Path.expand
end
end