Allow ignoring of some factory resets.

This commit is contained in:
Connor Rigby 2017-12-12 17:02:34 -08:00
parent 7c541c103b
commit 9c6f5aa1fc
3 changed files with 50 additions and 43 deletions

View file

@ -18,19 +18,13 @@ defmodule Farmbot.CeleryScript.AST.Node.ConfigUpdate do
case lookup_os_config(key, value) do
{:ok, {:string, "settings", val}} when val in ["farmduino", "arduino"] ->
Farmbot.System.ConfigStorage.update_config_value(:string, "settings", key, val)
if Application.get_env(:farmbot, :behaviour)[:firmware_handler] == Farmbot.Firmware.UartHandler do
Logger.warn 1, "Updating #{val} firmware."
old_env = Application.get_env(:farmbot, :behaviour)
new_env = Keyword.put(old_env, :firmware_handler, Farmbot.Firmware.StubHandler)
Application.put_env(:farmbot, :behaviour, new_env)
GenServer.stop(Farmbot.Firmware, :shutdown)
Farmbot.Firmware.UartHandler.Update.maybe_update_firmware(val)
Application.put_env(:farmbot, :behaviour, old_env)
GenServer.stop(Farmbot.Firmware, :shutdown)
end
do_reduce_os(rest, env)
hack_file = Path.join(Application.get_env(:farmbot, :data_path), "firmware_flash")
File.write!(hack_file, val)
Farmbot.BotState.set_sync_status(:maintenance)
Logger.warn 1, "Rebooting to flash firmware."
Farmbot.System.reboot("Flash arduino fw.")
# Stop enumeration here.
{:ok, env}
{:ok, {type, group, value}} ->
Farmbot.System.ConfigStorage.update_config_value(type, group, key, value)
Logger.success 3, "Updating: #{inspect key}: #{value}"

View file

@ -86,6 +86,7 @@ defmodule Farmbot.Firmware.UartHandler do
# If in dev environment, it is expected that this be done at compile time.
# If in target environment, this should be done by `Farmbot.Firmware.AutoDetector`.
tty = Application.get_env(:farmbot, :uart_handler)[:tty] || raise "Please configure uart handler!"
maybe_flash_fw(tty)
storage_dispatch = Farmbot.System.ConfigStorage.Dispatcher
case open_tty(tty) do
{:ok, nerves} ->
@ -97,6 +98,17 @@ defmodule Farmbot.Firmware.UartHandler do
end
end
defp maybe_flash_fw(_tty) do
hack_file = Path.join(Application.get_env(:farmbot, :data_path), "firmware_flash")
case File.read(hack_file) do
{:ok, value} when value in ["arduino", "farmduino"] ->
Farmbot.System.ConfigStorage.update_config_value(:string, "settings", "firmware_hardware", value)
Farmbot.Firmware.UartHandler.Update.maybe_update_firmware(value)
File.rm!(hack_file)
_ -> :ok
end
end
def handle_events(events, _, state) do
state = Enum.reduce(events, state, fn(event, state_acc) ->
handle_config(event, state_acc)

View file

@ -47,9 +47,14 @@ defmodule Farmbot.System do
defp do_reset(reason) do
formatted = format_reason(reason)
Ecto.drop()
write_file(formatted)
@system_tasks.factory_reset(formatted)
case formatted do
nil -> reboot("Escape factory reset: #{inspect reason}")
{:ignore, reason} -> reboot(reason)
_ ->
Ecto.drop()
write_file(formatted)
@system_tasks.factory_reset(formatted)
end
end
@doc "Reboot."
@ -84,31 +89,27 @@ defmodule Farmbot.System do
@doc "Format an error for human consumption."
def format_reason(reason) do
raise "deleteme"
rescue
_ ->
[_ | [_ | stack]] = System.stacktrace()
stack = Enum.map(stack, fn er -> "\t#{inspect(er)}" end) |> Enum.join(",\r\n <p>")
formated = do_format_reason(reason)
footer = """
<hr>
<p>
<p>
<p> <strong> environment: </strong> #{@env}
<p> <strong> source_ref: </strong> #{@ref}
<p> <strong> target: </strong> #{@target}
<p>
<p>
Stacktrace:
<p> [#{stack}]
<hr>
"""
if formated do
formated <> footer
else
nil
end
[_ | [_ | stack]] = System.stacktrace()
stack = Enum.map(stack, fn er -> "\t#{inspect(er)}" end) |> Enum.join(",\r\n <p>")
formated = do_format_reason(reason)
footer = """
<hr>
<p>
<p>
<p> <strong> environment: </strong> #{@env}
<p> <strong> source_ref: </strong> #{@ref}
<p> <strong> target: </strong> #{@target}
<p>
<p>
Stacktrace:
<p> [#{stack}]
<hr>
"""
case formated do
nil -> nil
{:ignore, reason} -> {:ignore, reason}
formatted when is_binary(formatted) -> formated <> footer
end
end
# This mess of pattern matches cleans up erlang startup errors. It's very
@ -160,10 +161,10 @@ defmodule Farmbot.System do
end
defp do_format_reason({:badarg, [{:ets, :lookup_element, _, _} | _]}) do
"""
{:ignore, """
Bad Ecto call. This usually is a result of an over the air update and can
likely be ignored.
"""
"""}
end
defp do_format_reason(reason), do: do_format_reason({:error, reason})