70 lines
1.8 KiB
Elixir
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
|