Packages
nerves
1.7.8
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/mix/tasks/firmware.unpack.ex
defmodule Mix.Tasks.Firmware.Unpack do
use Mix.Task
import Mix.Nerves.Utils
alias Mix.Nerves.Preflight
@shortdoc "Unpack a firmware bundle for inspection"
@moduledoc """
Unpack the firmware so that its contents can be inspected locally.
## Usage
mix firmware.unpack [output directory]
If not supplied, the output directory will be based off the OTP application
name.
## Examples
```
# Create a firmware bundle. It will be under the _build directory
mix firmware
# Unpack it
mix firmware.unpack firmware_contents
# Inspect it
ls firmware_contents
```
"""
@impl true
def run([output_path]) do
Preflight.check!()
debug_info("Nerves Firmware Unpack")
config = Mix.Project.config()
otp_app = config[:app]
target = mix_target()
images_path =
(config[:images_path] || Path.join([Mix.Project.build_path(), "nerves", "images"]))
|> Path.expand()
_ = check_nerves_system_is_set!()
_ = check_nerves_toolchain_is_set!()
fw = "#{images_path}/#{otp_app}.fw"
unless File.exists?(fw) do
Mix.raise("Firmware for target #{target} not found at #{fw} run `mix firmware` to build")
end
unpack(fw, output_path)
end
def run([]) do
config = Mix.Project.config()
otp_app = config[:app]
target = mix_target()
file = "#{otp_app}-#{target}"
run([file])
end
def run(_args) do
Mix.raise("""
mix firmware.unpack [output path]
See mix help firmware.unpack for more info
""")
Mix.Task.run("help", ["firmware.unpack"])
end
defp unpack(fw, output_path) do
abs_output_path = Path.expand(output_path)
rootfs_output_path = Path.join(abs_output_path, "rootfs")
rootfs_image = Path.join([abs_output_path, "data", "rootfs.img"])
Mix.shell().info("Unpacking to #{output_path}...")
_ = File.rm_rf!(abs_output_path)
File.mkdir_p!(abs_output_path)
{_, 0} = shell("unzip", [fw, "-d", abs_output_path])
{_, 0} = shell("unsquashfs", ["-d", rootfs_output_path, rootfs_image])
:ok
end
end