Skip to content

Commit 3fca087

Browse files
Add support for generating new projects with nerves_init_gadget
1 parent 5eb2bda commit 3fca087

File tree

4 files changed

+67
-4
lines changed

4 files changed

+67
-4
lines changed

lib/mix/tasks/nerves/new.ex

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ defmodule Mix.Tasks.Nerves.New do
88
@shoehorn_vsn "0.4"
99
@bootstrap_vsn "1.0"
1010
@runtime_vsn "0.6"
11+
@init_gadget_vsn "0.4"
1112

1213
@requirement Mix.Project.config()[:elixir]
1314
@shortdoc "Creates a new Nerves application"
@@ -68,6 +69,9 @@ defmodule Mix.Tasks.Nerves.New do
6869
A `--cookie` options can be given to set the Erlang distribution
6970
cookie in `vm.args`. This defaults to a randomly generated string.
7071
72+
Generate a project preloaded with `nerves_init_gadget` support by passing
73+
`--init-gadget`.
74+
7175
## Examples
7276
7377
mix nerves.new blinky
@@ -76,6 +80,9 @@ defmodule Mix.Tasks.Nerves.New do
7680
7781
mix nerves.new blinky --module Blinky
7882
83+
Generate a project configured to use `nerves_init_gadget`
84+
85+
mix nerves.new blinky --init-gadget
7986
8087
Generate a project that only supports Raspberry Pi 3
8188
@@ -86,7 +93,13 @@ defmodule Mix.Tasks.Nerves.New do
8693
mix nerves.new blinky --target rpi3 --target rpi0
8794
"""
8895

89-
@switches [app: :string, module: :string, target: :keep, cookie: :string]
96+
@switches [
97+
app: :string,
98+
module: :string,
99+
target: :keep,
100+
cookie: :string,
101+
init_gadget: :boolean
102+
]
90103

91104
def run([version]) when version in ~w(-v --version) do
92105
Mix.shell().info("Nerves v#{@bootstrap_vsn}")
@@ -129,6 +142,7 @@ defmodule Mix.Tasks.Nerves.New do
129142

130143
nerves_path = nerves_path(path, Keyword.get(opts, :dev, false))
131144
in_umbrella? = in_umbrella?(path)
145+
init_gadget? = opts[:init_gadget] || false
132146

133147
targets = Keyword.get_values(opts, :target)
134148

@@ -156,6 +170,8 @@ defmodule Mix.Tasks.Nerves.New do
156170
elixir_req: @requirement,
157171
nerves_dep: nerves_dep(nerves_path),
158172
in_umbrella: in_umbrella?,
173+
init_gadget?: init_gadget?,
174+
init_gadget_vsn: @init_gadget_vsn,
159175
targets: targets,
160176
cookie: cookie
161177
]

templates/new/config/config.exs

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,38 @@ config :nerves, :firmware, rootfs_overlay: "rootfs_overlay"
1313
# docs for separating out critical OTP applications such as those
1414
# involved with firmware updates.
1515
config :shoehorn,
16-
init: [:nerves_runtime],
17-
app: Mix.Project.config()[:app]
16+
init: [:nerves_runtime<%= if init_gadget? do %>, :nerves_init_gadget<% end %>],
17+
app: Mix.Project.config()[:app]<%= if init_gadget? do %>
18+
19+
# Authorize the device to receive firmware using your public key.
20+
# See https://hexdocs.pm/nerves_firmware_ssh/readme.html for more information
21+
# on configuring nerves_firmware_ssh.
22+
23+
key = Path.join(System.user_home!, ".ssh/id_rsa.pub")
24+
unless File.exists?(key), do:
25+
Mix.raise("No SSH Keys found. Please generate an ssh key")
26+
27+
config :nerves_firmware_ssh,
28+
authorized_keys: [
29+
File.read!(key)
30+
]
31+
32+
# Use Ringlogger as the logger backend and remove :console.
33+
# See https://hexdocs.pm/ring_logger/readme.html for more information on
34+
# configuring ring_logger.
35+
36+
config :logger, backends: [RingLogger]
37+
38+
# Configure nerves_init_gadget.
39+
# See https://hexdocs.pm/nerves_init_gadget/readme.html for more information.
40+
41+
config :nerves_init_gadget,
42+
ifname: "usb0",
43+
address_method: :linklocal,
44+
mdns_domain: "nerves.local",
45+
node_name: nil,
46+
node_host: :mdns_domain,
47+
ssh_console_port: 22<% end %>
1848

1949
# Import target specific config. This must remain at the bottom
2050
# of this file so it overrides the configuration defined above.

templates/new/mix.exs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,8 @@ defmodule <%= app_module %>.MixProject do
5151

5252
defp deps(target) do
5353
[
54-
{:nerves_runtime, "~> <%= runtime_vsn %>"}
54+
{:nerves_runtime, "~> <%= runtime_vsn %>"}<%= if init_gadget? do %>,
55+
{:nerves_init_gadget, "~> <%= init_gadget_vsn %>"}<% end %>
5556
] ++ system(target)
5657
end
5758

test/nerves_new_test.exs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,4 +100,20 @@ defmodule Nerves.NewTest do
100100
end)
101101
end)
102102
end
103+
104+
test "new project init gadget", context do
105+
in_tmp(context.test, fn ->
106+
Mix.Tasks.Nerves.New.run([@app_name, "--init-gadget"])
107+
108+
assert_file("#{@app_name}/mix.exs", fn file ->
109+
assert file =~ ~r"nerves_init_gadget"
110+
end)
111+
112+
assert_file("#{@app_name}/config/config.exs", fn file ->
113+
assert file =~ ~r"nerves_init_gadget"
114+
assert file =~ ~r"nerves_firmware_ssh"
115+
assert file =~ ~r"RingLogger"
116+
end)
117+
end)
118+
end
103119
end

0 commit comments

Comments
 (0)