Packages
nerves
0.4.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/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.Utils.Shell
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)}"
url = pkg.config[:artifact_url]
dest = Artifact.dir(pkg, toolchain)
download(artifact, url)
|> unpack(artifact, dest)
end
def artifact(pkg, _toolchain) do
Logger.debug "#{__MODULE__}: artifact: #{inspect pkg}"
end
# def shell(_pkg, _opts) do
# :ok
# end
#
# def clean(_pkg, _opts) do
# :ok
# end
defp download(artifact, [location | locations]) do
shell_info """
Downloading Artifact:
#{artifact}
From Location:
#{location}
"""
location
|> URI.encode
|> String.replace("+", "%2B")
|> Mix.Utils.read_path()
|> result(artifact, locations)
end
defp result({:ok, body}, name, _) do
shell_info "Artifact #{name} Downloaded"
{:ok, body}
end
defp result(_, _, []) do
shell_info "No Available Locations"
{:error, :nocache}
end
defp result(_, name, locations) do
shell_info "Switching Location"
download(name, locations)
end
defp unpack({:error, _} = error, _, _), do: error
defp unpack({:ok, tar}, artifact, destination) do
shell_info "Unpacking #{artifact}"
tmp_path = Path.join(destination, ".tmp")
File.mkdir_p!(tmp_path)
tar_file = Path.join(tmp_path, artifact)
File.write(tar_file, tar)
System.cmd("tar", ["xf", artifact], cd: tmp_path)
source =
File.ls!(tmp_path)
|> Enum.map(& Path.join(tmp_path, &1))
|> Enum.find(&File.dir?/1)
File.rm!(tar_file)
File.cp_r(source, destination)
File.rm_rf!(tmp_path)
:ok
end
defp shell_info(text) do
Shell.info(text, "Nerves.Package.Providers.HTTP")
end
end