defmodule Fwup do @moduledoc """ Configurable embedded Linux firmware update creator and runner """ @doc "Returns a list of `[\"/path/to/device\", byte_size]`" def get_devices do {result, 0} = System.cmd("fwup", ["--detect"]) result |> String.trim() |> String.split("\n") |> Enum.map(&String.split(&1, ",")) end @doc "Returns the path to the `fwup` executable." def exe do System.find_executable("fwup") || raise("Could not find `fwup` executable.") end @doc """ Apply a fwupdate * `device` - block device to write too. See `get_device/0`. * `task` - Can be any task in the fwup.conf. Traditionally it will be `upgrade` or `complete` * `path` - path to the firmware file * `extra_args` - extra optional args to pass to fwup. """ def apply(device, task, path, extra_args \\ []) do args = ["-a", "-d", device, "-t", task, "-i", path | extra_args] all_opts = Keyword.put_new([], :name, Fwup.Stream) |> Keyword.put(:cm, self()) |> Keyword.put(:fwup_args, args) Fwup.Stream.start_link(all_opts) end @doc """ Stream a firmware image to the device Options * `:name` - register the started GenServer under this name (defaults to Fwup.Stream) * `:fwup_env` - the OS environment to pass to fwup """ def stream(pid, args, opts \\ []) do all_opts = opts |> Keyword.put_new(:name, Fwup.Stream) |> Keyword.put(:cm, pid) |> Keyword.put(:fwup_args, args) Fwup.Stream.start_link(all_opts) end defdelegate send_chunk(pid, chunk), to: Fwup.Stream end