Packages
nerves
1.9.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/mix/tasks/firmware.unpack.ex
defmodule Mix.Tasks.Firmware.Unpack do
@shortdoc "Unpack a firmware bundle for inspection"
@moduledoc """
Unpack the firmware so that its contents can be inspected locally.
## Usage
mix firmware.unpack [--output output directory] [--fw path to firmware]
## Command line options
* `--fw` - (Optional) The path to the .fw file for unpacking.
Defaults to `Nerves.Env.firmware_path/1`
* `--output` - (Optional) The output directory for the unpacked firmware.
Defaults to the name of the firmware bundle with the extension replaced
with `.unpacked`.
## Examples
```
# Create a firmware bundle. It will be under the _build directory
mix firmware
# Unpack the built firmware
mix firmware.unpack --output firmware_contents
# Unpack a specified fw file
mix firmware.unpack --fw hello_nerves.fw
# Inspect it
ls hello_nerves.unpacked/
```
"""
use Mix.Task
import Mix.Nerves.Utils
alias Mix.Nerves.Preflight
@switches [output: :string, fw: :string]
@aliases [o: :output, f: :fw]
@impl Mix.Task
def run(args) do
Preflight.check!()
debug_info("Nerves Firmware Unpack")
config = Mix.Project.config()
{opts, _, _} = OptionParser.parse(args, strict: @switches, aliases: @aliases)
fw = opts[:fw] || Nerves.Env.firmware_path(config)
output = opts[:output] || "#{Path.rootname(Path.basename(fw))}.unpacked"
_ = check_nerves_system_is_set!()
_ = check_nerves_toolchain_is_set!()
unless File.exists?(fw) do
Mix.raise("""
Firmware not found.
Please supply a valid firmware path with `--fw` or run `mix firmware`
""")
end
unpack(fw, output)
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, "-no-xattrs", rootfs_image])
:ok
end
end