57 lines
1.4 KiB
Elixir
57 lines
1.4 KiB
Elixir
defmodule BackendWeb.ClusterStatusChannel do
|
|
@moduledoc """
|
|
Channel for cluster status information
|
|
"""
|
|
use BackendWeb, :channel
|
|
require Logger
|
|
|
|
@impl true
|
|
def join("cluster_status", _params, socket) do
|
|
Logger.info("Client joined clusterstatus channel")
|
|
:net_kernel.monitor_nodes(true)
|
|
{:ok, %{status: "connected"}, socket}
|
|
end
|
|
|
|
@impl true
|
|
def handle_in("get_nodes", _payload, socket) do
|
|
send_node_list(socket)
|
|
{:noreply, socket}
|
|
end
|
|
|
|
@impl true
|
|
def handle_in("kill_node", %{"node" => node_to_kill}, socket) do
|
|
Logger.warning("Client requested to kill node: #{node_to_kill}")
|
|
Backend.Cluster.kill_node(node_to_kill)
|
|
{:noreply, socket}
|
|
end
|
|
|
|
@impl true
|
|
def handle_in(_event, _payload, socket) do
|
|
{:noreply, socket}
|
|
end
|
|
|
|
@impl true
|
|
def handle_info({:nodeup, node_name}, socket) do
|
|
Logger.info("Node up: #{node_name}, broadcasting updated node list")
|
|
send_node_list(socket)
|
|
{:noreply, socket}
|
|
end
|
|
|
|
@impl true
|
|
def handle_info({:nodedown, node_name}, socket) do
|
|
Logger.info("Node down: #{node_name}, broadcasting updated node list")
|
|
send_node_list(socket)
|
|
{:noreply, socket}
|
|
end
|
|
|
|
defp send_node_list(socket) do
|
|
game_pid = Backend.GameRunner.get_pid()
|
|
|
|
push(socket, "node_list", %{
|
|
other_nodes: Node.list(),
|
|
connected_node: node(),
|
|
game_node: node(game_pid)
|
|
})
|
|
end
|
|
end
|