# `Hyper.Cfg.Tools`
[🔗](https://github.com/harmont-dev/hyper/blob/main/lib/hyper/cfg/tools.ex#L1)

Paths to every external binary Hyper runs, read from the `[tools]` table.

The privileged tools (`firecracker`, `jailer`, `dmsetup`, `losetup`,
`blockdev`) are read **only** from `/etc/hyper/config.toml` — the file the
setuid helper also parses, so node and helper can never disagree on a
root-impacting path. The node-only tools (`skopeo`, `mke2fs`, `umoci`,
`suidhelper`) run unprivileged, so `/etc/hyper/config.exs` may override them
(e.g. a path from a secrets manager), then `config.toml`, then the default.

# `firecracker`

```elixir
@spec firecracker() :: Path.t()
```

Firecracker binary. Required — raises if `[tools] firecracker` is unset.

# `firecracker_configured`

```elixir
@spec firecracker_configured() :: {:ok, Path.t()} | :error
```

Non-raising `firecracker/0`.

# `jailer`

```elixir
@spec jailer() :: Path.t()
```

Jailer binary. Required — raises if `[tools] jailer` is unset.

# `jailer_configured`

```elixir
@spec jailer_configured() :: {:ok, Path.t()} | :error
```

Non-raising `jailer/0`.

# `mke2fs`

```elixir
@spec mke2fs() :: String.t()
```

mke2fs binary (node tool). config.exs > config.toml > `mke2fs` on PATH.

# `skopeo`

```elixir
@spec skopeo() :: String.t()
```

skopeo binary (node tool). config.exs > config.toml > `skopeo` on PATH.

# `suidhelper`

```elixir
@spec suidhelper() :: String.t()
```

setuid device helper (node tool). config.exs > config.toml > install default.

# `umoci`

```elixir
@spec umoci() :: String.t() | nil
```

umoci binary (node tool), or `nil` to let Hyper download a pinned release.

---

*Consult [api-reference.md](api-reference.md) for complete listing*
