dotfiles/app/lib/prymn/agents.ex
Nikos Papadakis 8bf9261583
upgrade phoenix
Now with the new liveview async API!
2023-11-20 00:27:36 +02:00

70 lines
1.8 KiB
Elixir

defmodule Prymn.Agents do
@moduledoc ~S"""
Prymn Agents are programs that manage a remote client machine. Prymn backend
communicates with them using GRPC calls. GRPC connections are started using
the Prymn.Agents.ConnectionSupervisor and are book-kept using the
Prymn.Agents.Registry.
"""
alias Prymn.Agents.Connection
alias Prymn.Agents.Health
def start_connection(host_address) do
spec = {Connection, host_address}
case DynamicSupervisor.start_child(Prymn.Agents.ConnectionSupervisor, spec) do
{:ok, _pid} -> :ok
{:error, {:already_started, _pid}} -> :ok
{:error, error} -> {:error, error}
end
end
@doc """
Subscribe to the host's Health using Phoenix.PubSub Broadcasted messages are
the Health struct:
%Prymn.Agents.Health{}
"""
def subscribe_to_health(host_address) do
:ok = Health.subscribe(host_address)
end
@doc """
Return the last known health status of the Agent, or `nil` if it doesn't
exist.
"""
def get_health(host_address) do
Health.lookup(host_address)
end
@doc """
Get the system's information (CPU, Memory usage, etc.).
"""
def get_sys_info(host_address) do
case lookup_connection(host_address) do
nil -> nil
pid -> Connection.get_sys_info(pid)
end
end
@doc """
Perform a system update.
## Asynchronous call
Messages are sent to the caller in the form of the struct:
%PrymnProto.Prymn.SysUpdateResponse{}
"""
def sys_update(host_address, dry_run) when is_boolean(dry_run) do
lookup_connection(host_address)
|> Connection.sys_update(dry_run)
end
defp lookup_connection(host_address) when is_binary(host_address) do
case Registry.lookup(Prymn.Agents.Registry, host_address) do
[{pid, _}] -> pid
[] -> nil
end
end
end