add task for refreshing token every 30 mins
This commit is contained in:
parent
3811d32013
commit
fe53427c9e
61
lib/farmbot/bootstrap/auth_task.ex
Normal file
61
lib/farmbot/bootstrap/auth_task.ex
Normal 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
|
|
@ -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, []),
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue