Packages
nerves_hub_link
2.6.0
2.12.0
2.11.1
2.11.0
retired
2.10.2
2.10.1
2.10.0
2.9.0
2.9.0-rc.3
2.9.0-rc.2
2.9.0-rc.1
2.8.1
2.8.0
2.7.3
2.7.2
2.7.0
retired
2.6.0
2.5.2
2.5.1
2.5.0
2.4.0
2.3.0
2.2.1
2.2.0
2.1.1
2.1.0
2.0.0
1.4.1
1.4.0
1.3.0
1.2.0
1.1.0
1.0.1
1.0.0
0.13.1
0.13.0
0.12.1
0.12.0
0.11.0
0.10.2
0.10.1
retired
0.10.0
retired
0.10.0-rc.0
0.9.4
0.9.3
0.9.2
0.9.1
0.9.0
0.8.2
0.8.1
0.8.0
0.7.6
Manage your Nerves fleet by connecting it to NervesHub
Current section
Files
Jump to
Current section
Files
lib/nerves_hub_link/script.ex
defmodule NervesHubLink.Script do
use GenServer
@doc """
Run a script from NervesHub and capture its output
"""
def capture(text, ref) do
_ = GenServer.start_link(__MODULE__, {self(), text, ref})
:ok
end
@impl GenServer
def init({pid, text, ref}) do
state = %{pid: pid, text: text, ref: ref}
{:ok, state, {:continue, :capture}}
end
@impl GenServer
def handle_continue(:capture, state) do
# Inspired from ExUnit.CaptureIO
# https://github.com/elixir-lang/elixir/blob/main/lib/ex_unit/lib/ex_unit/capture_io.ex
{:ok, string_io} = StringIO.open("")
Process.group_leader(self(), string_io)
{result, output} =
try do
Code.eval_string(state.text)
catch
kind, reason ->
{:ok, {_input, output}} = StringIO.close(string_io)
result = Exception.format_banner(kind, reason, __STACKTRACE__)
output = output <> "\n" <> result
{nil, output}
else
{result, _binding} ->
{:ok, {_input, output}} = StringIO.close(string_io)
{result, output}
end
send(state.pid, {"scripts/run", state.ref, output, result})
{:stop, :normal, state}
end
end