diff --git a/.gitignore b/.gitignore index 22b920f..ad6d93a 100644 --- a/.gitignore +++ b/.gitignore @@ -24,3 +24,12 @@ tailscale-*.tar # Temporary files, for example, from tests. /tmp/ + +# LSP, Editors and OS +.DS_Store +.elixir_ls/ +.elixir-tools/ +.lexical/ +.vscode/ +.zed/ +.idea/ diff --git a/lib/tailscale.ex b/lib/tailscale.ex index 39b164e..fd27d11 100644 --- a/lib/tailscale.ex +++ b/lib/tailscale.ex @@ -5,4 +5,8 @@ defmodule Tailscale do def status do Tailscale.Local.Status.get!() end + + def topology do + GenServer.call(Tailscale.Cluster, :cluster_topology) + end end diff --git a/lib/tailscale/change_server.ex b/lib/tailscale/change_server.ex index 7679f53..23471e1 100644 --- a/lib/tailscale/change_server.ex +++ b/lib/tailscale/change_server.ex @@ -23,7 +23,7 @@ defmodule Tailscale.ChangeServer do end def handle_continue(:refresh, %{refresh_interval: refresh_interval} = state) do - Logger.debug("Refreshing Tailscale Status") + Logger.info("Refreshing Tailscale Status") old_status = state.status_map new_status = Tailscale.Status.get!() diff --git a/lib/tailscale/cluster.ex b/lib/tailscale/cluster.ex index d8d4ed3..f33231d 100644 --- a/lib/tailscale/cluster.ex +++ b/lib/tailscale/cluster.ex @@ -12,7 +12,7 @@ defmodule Tailscale.Cluster do def init(opts) do tags = opts[:tags] - match = opts[:match_tags] || :all + match = opts[:match_tags] || :any if opts[:start_distribution] != false do start_distribution(Tailscale.ChangeServer.get_status().self) @@ -116,11 +116,17 @@ defmodule Tailscale.Cluster do def handle_info(:ensure_connected, state) do Process.send_after(self(), :ensure_connected, @ensure_interval) - {:noreply, ensure_connected(state)} + state = ensure_connected(state) + Logger.info("Tailscale Status: #{inspect(state.cluster_topology)}") + {:noreply, state} + end + + def handle_call(:cluster_topology, state) do + {:reply, state.cluster_topology, state} end def terminate(reason, _state) do - Logger.debug("Tailscale.Cluster is terminating: #{inspect(reason)}.") + Logger.info("Tailscale.Cluster is terminating: #{inspect(reason)}.") Node.stop() end @@ -141,6 +147,7 @@ defmodule Tailscale.Cluster do _ -> case Node.start(self.node, :longnames) do {:ok, _pid} -> + Logger.info("[Tailscale] Started Erlang distribution: `#{self.node}`.") :ok {:error, _} -> @@ -153,7 +160,7 @@ defmodule Tailscale.Cluster do Tailscale.ChangeServer.get_status() |> Map.get(:peers) |> Enum.filter(&check_if_peer_matches_tags(&1, state)) - |> Enum.filter(fn peer -> peer.online == true end) + |> Enum.filter(fn peer -> peer.online? == true end) |> Enum.map(fn peer -> case Node.connect(peer.node) do true -> {peer.id, peer} @@ -171,7 +178,7 @@ defmodule Tailscale.Cluster do if state.disconnect_self_handler != nil do state.disconnect_self_handler.(reason) else - Logger.debug("Restarting Application: #{msg}") + Logger.info("Restarting Application: #{msg}") System.stop(1) end @@ -182,6 +189,7 @@ defmodule Tailscale.Cluster do state = case Node.connect(peer.node) do true -> + Logger.info("Connected to node: #{peer.node}") update_in(state.cluster_topology, fn topology -> Map.put(topology, peer.id, peer) end) false -> @@ -195,6 +203,7 @@ defmodule Tailscale.Cluster do state = case Node.disconnect(peer.node) do true -> + Logger.info("Disconnected from node: #{peer.node}") update_in(state.cluster_topology, fn topology -> Map.delete(topology, peer.id) end) false -> diff --git a/lib/tailscale/supervisor.ex b/lib/tailscale/supervisor.ex index 9da81b6..6d39c67 100644 --- a/lib/tailscale/supervisor.ex +++ b/lib/tailscale/supervisor.ex @@ -7,23 +7,29 @@ defmodule Tailscale.Supervisor do @impl true def init(opts) do + tags = cond do + opts[:tag] != nil and is_binary(opts[:tag]) -> [opts[:tag]] + opts[:tags] != nil and is_list(opts[:tags]) -> opts[:tags] + true -> ["beam"] + end + change_server = {Tailscale.ChangeServer, [refresh_interval: opts[:refresh_interval] || 30_000]} cluster = {Tailscale.Cluster, [ - tags: opts[:tags], - match_tags: opts[:match_tags] || :all, + tags: tags, + match_tags: opts[:match_tags], disconnect_self_handler: opts[:disconnect_self_handler], start_distribution: opts[:start_distribution] || true ]} children = - if opts[:start_cluster] == true do - [change_server, cluster] - else + if opts[:start_cluster] == false do [change_server] + else + [change_server, cluster] end Supervisor.init(children, strategy: :rest_for_one)