add task for refreshing token every 30 mins

This commit is contained in:
connor rigby 2017-11-01 09:03:06 -07:00
parent 3811d32013
commit fe53427c9e
3 changed files with 67 additions and 5 deletions

View file

@ -0,0 +1,61 @@
defmodule Farmbot.Bootstrap.AuthTask do
@moduledoc "Background worker that refreshes a token every 30 minutes."
use GenServer
require Logger
alias Farmbot.System.ConfigStorage
# 30 minutes.
@refresh_time 1.8e+6 |> round()
@doc false
def start_link() do
GenServer.start_link(__MODULE__, [], [name: __MODULE__])
end
def init([]) do
timer = Process.send_after(self(), :refresh, @refresh_time)
{:ok, timer, :hibernate}
end
def handle_info(:refresh, old_timer) do
auth_task = Application.get_env(:farmbot, :behaviour)[:authorization]
{email, pass, server} = {fetch_email(), fetch_pass(), fetch_server()}
Logger.info("refreshing token: #{auth_task} - #{email} - #{server}")
case auth_task.authorize(email, pass, server) do
{:ok, token} ->
Logger.info("Successful authorization: #{auth_task} - #{email} - #{server}")
ConfigStorage.update_config_value(:bool, "settings", "first_boot", false)
ConfigStorage.update_config_value(:string, "authorization", "token", token)
ConfigStorage.update_config_value(:string, "authorization", "last_shutdown_reason", nil)
restart_transports()
refresh_timer(self())
{:error, reason} ->
Logger.error("Token failed to reauthorize: #{auth_task} - #{email} - #{server} #{inspect reason}")
{:stop, reason, old_timer}
end
end
defp restart_transports do
:ok = Supervisor.terminate_child(Farmbot.BotState.Supervisor, Farmbot.BotState.Transport.Supervisor)
end
defp refresh_timer(pid) do
timer = Process.send_after(pid, :refresh, @refresh_time)
{:noreply, timer, :hibernate}
end
defp fetch_email do
ConfigStorage.get_config_value(:string, "authorization", "email") ||
raise "No email provided."
end
defp fetch_pass do
ConfigStorage.get_config_value(:string, "authorization", "password") ||
raise "No password provided."
end
defp fetch_server do
ConfigStorage.get_config_value(:string, "authorization", "server") ||
raise "No server provided."
end
end

View file

@ -121,6 +121,7 @@ defmodule Farmbot.Bootstrap.Supervisor do
ConfigStorage.update_config_value(:string, "authorization", "last_shutdown_reason", nil)
children = [
worker(Farmbot.Bootstrap.AuthTask, []),
supervisor(Farmbot.BotState.Supervisor, []),
supervisor(Farmbot.HTTP.Supervisor, []),
supervisor(Farmbot.Repo.Supervisor, []),

View file

@ -49,7 +49,7 @@ defmodule Farmbot.BotState.Transport.GenMQTT.Client do
def on_connect(state) do
GenMQTT.subscribe(self(), [{bot_topic(state.device), 0}])
GenMQTT.subscribe(self(), [{sync_topic(state.device), 0}])
Logger.info("Connected!")
Logger.info("Connected to real time services.")
if state.cache do
GenMQTT.publish(self(), status_topic(state.device), state.cache, 0, false)
@ -96,8 +96,8 @@ defmodule Farmbot.BotState.Transport.GenMQTT.Client do
end
defp frontend_topic(bot), do: "bot/#{bot}/from_device"
defp bot_topic(bot), do: "bot/#{bot}/from_clients"
defp sync_topic(bot), do: "bot/#{bot}/sync/#"
defp status_topic(bot), do: "bot/#{bot}/status"
defp log_topic(bot), do: "bot/#{bot}/logs"
defp bot_topic(bot), do: "bot/#{bot}/from_clients"
defp sync_topic(bot), do: "bot/#{bot}/sync/#"
defp status_topic(bot), do: "bot/#{bot}/status"
defp log_topic(bot), do: "bot/#{bot}/logs"
end