Skip to content

Commit 3313bbc

Browse files
committed
Add support for setting fwup environment variables
1 parent 9f095c8 commit 3313bbc

File tree

4 files changed

+44
-7
lines changed

4 files changed

+44
-7
lines changed

lib/nerves_hub_link_common/fwup_config.ex

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ defmodule NervesHubLinkCommon.FwupConfig do
77

88
defstruct fwup_public_keys: [],
99
fwup_devpath: "/dev/mmcblk0",
10+
fwup_env: [],
1011
fwup_task: "upgrade",
1112
handle_fwup_message: nil,
1213
update_available: nil
@@ -35,6 +36,7 @@ defmodule NervesHubLinkCommon.FwupConfig do
3536
fwup_public_keys: [String.t()],
3637
fwup_devpath: Path.t(),
3738
fwup_task: String.t(),
39+
fwup_env: [{String.t(), String.t()}],
3840
handle_fwup_message: handle_fwup_message_fun,
3941
update_available: update_available_fun
4042
}
@@ -45,6 +47,7 @@ defmodule NervesHubLinkCommon.FwupConfig do
4547
args
4648
|> validate_fwup_public_keys!()
4749
|> validate_fwup_devpath!()
50+
|> validate_fwup_env!()
4851
|> validate_handle_fwup_message!()
4952
|> validate_update_available!()
5053
end
@@ -74,4 +77,10 @@ defmodule NervesHubLinkCommon.FwupConfig do
7477

7578
defp validate_update_available!(%__MODULE__{}),
7679
do: raise(ArgumentError, message: "update_available function signature incorrect")
80+
81+
defp validate_fwup_env!(%__MODULE__{fwup_env: list} = args) when is_list(list),
82+
do: args
83+
84+
defp validate_fwup_env!(%__MODULE__{}),
85+
do: raise(ArgumentError, message: "invalid arg: fwup_env")
7786
end

lib/nerves_hub_link_common/update_manager.ex

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,10 @@ defmodule NervesHubLinkCommon.UpdateManager do
201201
pid = self()
202202
fun = &send(pid, {:download, &1})
203203
{:ok, download} = Downloader.start_download(update_info.firmware_url, fun)
204-
{:ok, fwup} = Fwup.stream(pid, fwup_args(state.fwup_config))
204+
205+
{:ok, fwup} =
206+
Fwup.stream(pid, fwup_args(state.fwup_config), fwup_env: state.fwup_config.fwup_env)
207+
205208
Logger.info("[NervesHubLink] Downloading firmware: #{update_info.firmware_url}")
206209

207210
%State{

test/nerves_hub_link_common/update_manager_test.exs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,31 @@ defmodule NervesHubLinkCommon.UpdateManagerTest do
7070
assert_received :rescheduled
7171
refute_received {:fwup, _}
7272

73+
assert_receive {:fwup, {:progress, 0}}, 250
74+
assert_receive {:fwup, {:progress, 100}}
75+
assert_receive {:fwup, {:ok, 0, ""}}
76+
end
77+
78+
test "apply with fwup environment", %{update_payload: update_payload, devpath: devpath} do
79+
test_pid = self()
80+
fwup_fun = &send(test_pid, {:fwup, &1})
81+
update_available_fun = fn _ -> :apply end
82+
83+
fwup_config = %FwupConfig{
84+
fwup_devpath: devpath,
85+
fwup_task: "secret_upgrade",
86+
fwup_env: [
87+
{"SUPER_SECRET", "1234567890123456789012345678901234567890123456789012345678901234"}
88+
],
89+
handle_fwup_message: fwup_fun,
90+
update_available: update_available_fun
91+
}
92+
93+
# If setting SUPER_SECRET in the environment doesn't happen, then test fails
94+
# due to fwup getting a bad aes key.
95+
{:ok, manager} = UpdateManager.start_link(fwup_config)
96+
assert UpdateManager.apply_update(manager, update_payload) == {:updating, 0}
97+
7398
assert_receive {:fwup, {:progress, 0}}
7499
assert_receive {:fwup, {:progress, 100}}
75100
assert_receive {:fwup, {:ok, 0, ""}}

test/support/fixtures.ex

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -142,16 +142,16 @@ defmodule Fwup.TestSupport.Fixtures do
142142
meta-architecture = "#{meta_params.architecture}"
143143
meta-author = "#{meta_params.author}"
144144
145-
file-resource #{Ecto.UUID.generate()}.txt {
146-
contents = "Hello, world!"
147-
}
148-
149-
task complete {
150-
145+
file-resource hello.txt {
146+
contents = "Hello, world!"
151147
}
152148
153149
task upgrade {
150+
on-resource hello.txt { raw_write(0) }
151+
}
154152
153+
task secret_upgrade {
154+
on-resource hello.txt { raw_write(0, "cipher=aes-cbc-plain", "secret=\\${SUPER_SECRET}") }
155155
}
156156
"""
157157
end

0 commit comments

Comments
 (0)