defmodule NervesBackdoor.Discovery do
use GenServer
def start_link(_opts \\ []) do
port = NervesBackdoor.port()
GenServer.start_link(__MODULE__, port)
end
@impl true
def init(port) do
{:ok, socket} = :gen_udp.open(port, active: true,
mode: :binary, reuseaddr: true, ip: {0, 0, 0, 0})
{:ok, {socket, port}}
end
@impl true
def terminate(_reason, _state = {socket, _port}) do
:ok = :gen_udp.close(socket)
end
@impl true
def handle_info({:udp, socket, ip, port, data}, state) do
name = NervesBackdoor.name()
message = Jason.decode!(data)
case message do
%{"action"=> "id", "name"=> ^name} ->
version = NervesBackdoor.version()
ifname = NervesBackdoor.ifname()
macaddr = NervesBackdoor.mac()
hostname = NervesBackdoor.hostname()
data = %{
name: name,
version: version,
hostname: hostname,
ifname: ifname,
macaddr: macaddr
}
message = Map.put(message, :data, data)
:ok = :gen_udp.send(socket, ip, port, Jason.encode!(message))
%{"action"=> "blink", "name"=> ^name} ->
NervesBackdoor.blink()
:ok = :gen_udp.send(socket, ip, port, Jason.encode!(message))
end
{:noreply, state}
end
end