Packages
nerves
1.14.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/artifact/cache.ex
# SPDX-FileCopyrightText: 2018 Justin Schneck
# SPDX-FileCopyrightText: 2019 Frank Hunleth
# SPDX-FileCopyrightText: 2022 Jon Carstens
#
# SPDX-License-Identifier: Apache-2.0
#
defmodule Nerves.Artifact.Cache do
@moduledoc false
alias Nerves.Artifact
alias Nerves.Package
@checksum "CHECKSUM"
@spec get(Package.t()) :: binary() | nil
def get(pkg) do
path = path(pkg)
if valid?(pkg) do
path
else
nil
end
end
@spec put(Package.t(), binary()) :: :ok | {:error, File.posix()}
def put(pkg, path) do
ext = Artifact.ext(pkg)
dest = path(pkg)
_ = File.rm_rf(dest)
if String.ends_with?(path, ext) do
File.mkdir_p!(dest)
:ok = Nerves.Artifact.Archive.extract(path, dest)
else
Path.dirname(dest)
|> File.mkdir_p!()
File.ln_s!(path, dest)
end
Path.join(dest, @checksum)
|> File.write(Artifact.checksum(pkg))
end
@spec delete(Package.t()) :: {:ok, [binary()]} | {:error, File.posix(), binary()}
def delete(pkg) do
path(pkg)
|> File.rm_rf()
end
@spec valid?(Package.t()) :: boolean()
def valid?(pkg) do
path = checksum_path(pkg)
case read_checksum(path) do
nil ->
try_link(pkg)
checksum ->
valid_checksum?(pkg, checksum)
end
end
@spec path(Package.t()) :: binary()
def path(pkg) do
Artifact.base_dir()
|> Path.join(Artifact.name(pkg))
|> Path.expand()
end
@spec checksum_path(Package.t()) :: binary()
def checksum_path(pkg) do
path(pkg)
|> Path.join(@checksum)
end
defp read_checksum(path) do
case File.read(path) do
{:ok, checksum} ->
String.trim(checksum)
{:error, _reason} ->
nil
end
end
defp valid_checksum?(_pkg, nil), do: false
defp valid_checksum?(pkg, checksum) do
pkg
|> Artifact.checksum()
|> String.equivalent?(checksum)
end
defp try_link(pkg) do
build_path_link = Artifact.build_path_link(pkg)
checksum_path = Path.join(build_path_link, @checksum)
checksum = read_checksum(checksum_path)
if valid_checksum?(pkg, checksum) do
dest = path(pkg)
File.mkdir_p!(Artifact.base_dir())
_ = File.rm_rf!(dest)
File.ln_s!(build_path_link, dest)
true
else
false
end
end
end