Make things less racey

pull/626/head
Connor Rigby 2018-08-15 13:14:51 -07:00
parent 61a81b2b66
commit c7ce8278a1
No known key found for this signature in database
GPG Key ID: 9B7C52AA37F36C18
2 changed files with 33 additions and 22 deletions

View File

@ -3,7 +3,6 @@ defmodule Farmbot.Target.Network.Manager do
use Farmbot.Logger
alias Farmbot.System.ConfigStorage
import ConfigStorage, only: [get_config_value: 3]
alias Nerves.Network
alias Farmbot.Target.Network.Ntp
import Farmbot.Target.Network, only: [test_dns: 0]
@ -36,7 +35,6 @@ defmodule Farmbot.Target.Network.Manager do
end
Logger.success(3, "Interface #{interface} is up.")
settings = Enum.map(opts, fn({key, value}) ->
case key do
:key_mgmt -> {key, String.to_atom(value)}
@ -44,7 +42,7 @@ defmodule Farmbot.Target.Network.Manager do
end
end)
Nerves.Network.IFSupervisor.setup(interface, settings)
{:ok, _} = Elixir.Registry.register(Nerves.NetworkInterface, interface, [])
{:ok, _} = Elixir.Registry.register(Nerves.Udhcpc, interface, [])
{:ok, _} = Elixir.Registry.register(Nerves.WpaSupplicant, interface, [])
@ -84,7 +82,7 @@ defmodule Farmbot.Target.Network.Manager do
delay_timer = (ConfigStorage.get_config_value(:float, "settings", "network_not_found_timer") || 1) * 60_000
timer = Process.send_after(self(), :network_not_found_timer, round(delay_timer))
Logger.error 1, "Wireless Network not found. Will reset if not connected in #{delay_timer} minute(s)"
{:noreply, %{state | not_found_timer: timer, connected: false}}
{:noreply, %{state | ip_address: nil, not_found_timer: timer, connected: false}}
end
def handle_info({Nerves.WpaSupplicant, :"CTRL-EVENT-CONNECTED", _}, state) do
@ -97,7 +95,7 @@ defmodule Farmbot.Target.Network.Manager do
# stored in minutes
nnft = get_config_value(:float, "settings", "network_not_found_timer") || 1
delay_timer = (nnft) * 60_000
# timer = Process.send_after(self(), :network_not_found_timer, round(delay_timer))
timer = Process.send_after(self(), :network_not_found_timer, round(delay_timer))
Logger.error 1, "Wireless Network not found. Will reset if not connected in #{nnft} minute(s)"
if state.connected do
# TODO(Connor) - 2018-08-15 There is a bug in Nerves.Network
@ -106,8 +104,7 @@ defmodule Farmbot.Target.Network.Manager do
Process.sleep(5000)
Nerves.Network.setup(state.interface, state.opts)
end
# {:noreply, %{state | not_found_timer: timer, connected: false}}
{:noreply, %{state | not_found_timer: nil, connected: false}}
{:noreply, %{state | ip_address: nil, not_found_timer: timer, connected: false}}
end
def handle_info({Nerves.WpaSupplicant, info, infoa}, state) do
@ -167,24 +164,38 @@ defmodule Farmbot.Target.Network.Manager do
{:noreply, %{state | ntp_timer: new_timer}}
end
def handle_info(:dns_timer, %{connected: true} = state) do
case test_dns() do
{:ok, {:hostent, _host_name, _aliases, :inet, 4, _}} ->
# Farmbot is still connected. NBD
{:noreply, %{state | dns_timer: restart_dns_timer(nil, 45_000)}}
{:error, err} ->
Farmbot.System.Registry.dispatch(:network, :dns_down)
Logger.warn 3, "Farmbot was disconnected from the internet: #{inspect err}"
{:noreply, %{state | connected: false, dns_timer: restart_dns_timer(nil, 20_000)}}
end
end
def handle_info(:dns_timer, %{ip_address: nil} = state) do
Farmbot.System.Registry.dispatch(:network, :dns_down)
Logger.warn 3, "Farmbot still disconnected from the internet"
{:noreply, %{state | connected: false, dns_timer: restart_dns_timer(nil, 20_000)}}
end
def handle_info(:dns_timer, state) do
case test_dns() do
{:ok, {:hostent, _host_name, aliases, :inet, 4, _}} ->
# If we weren't previously connected, send a log.
if state.connected do
# Farmbot is still connected. NBD
{:noreply, %{state | dns_timer: restart_dns_timer(nil, 45_000)}}
else
Logger.success 3, "Farmbot was reconnected to the internet: #{inspect aliases}"
new_state = %{state |
connected: true,
not_found_timer: cancel_timer(state.not_found_timer),
dns_timer: restart_dns_timer(nil, 45_000),
ntp_timer: restart_ntp_timer(state.ntp_timer, 1000)
}
Farmbot.System.Registry.dispatch(:network, :dns_up)
{:noreply, new_state}
end
Logger.success 3, "Farmbot was reconnected to the internet: #{inspect aliases}"
new_state = %{state |
connected: true,
not_found_timer: cancel_timer(state.not_found_timer),
dns_timer: restart_dns_timer(nil, 45_000),
ntp_timer: restart_ntp_timer(state.ntp_timer, 1000)
}
Farmbot.System.Registry.dispatch(:network, :dns_up)
{:noreply, new_state}
{:error, err} ->
Farmbot.System.Registry.dispatch(:network, :dns_down)

View File

@ -119,7 +119,7 @@ defmodule Farmbot.Target.Network do
end
def test_dns(hostname) do
IO.puts "testing dns: #{hostname}"
# IO.puts "testing dns: #{hostname}"
case :inet.parse_ipv4_address(hostname) do
{:ok, addr} -> {:ok, {:hostent, hostname, [], :inet, 4, [addr]}}
_ -> :inet_res.gethostbyname(hostname)