defmodule Mix.Tasks.Dala.Observer do @moduledoc """ Start the Dala Observer web interface for remote node monitoring. Similar to `:observer.start()` but runs as a web interface and supports monitoring remote nodes via RPC. """ use Mix.Task @default_port 4000 @impl Mix.Task def run(args) do {opts, _, _} = OptionParser.parse(args, switches: [port: :integer, node: :string, name: :string, cookie: :string], aliases: [p: :port, n: :node] ) port = Keyword.get(opts, :port, @default_port) target_node = Keyword.get(opts, :node, nil) node_name = Keyword.get(opts, :name, nil) cookie = Keyword.get(opts, :cookie, :erlang.get_cookie()) if node_name do {:ok, _} = Node.start(:"#{node_name}", :shortnames) end if cookie do Node.set_cookie(cookie |> to_string() |> String.to_atom()) end if target_node do target = target_node |> to_string() |> String.to_atom() case Node.connect(target) do true -> Mix.shell().info("Connected to #{target}") false -> Mix.shell().error("Failed to connect to #{target}") end end Mix.shell().info("Starting Dala Observer on http://localhost:#{port}/observer") if target_node do Mix.shell().info("Initially observing: #{target_node}") end Application.put_env(:dala_dev, DalaDev.Server.Endpoint, http: [port: port], server: true, secret_key_base: "observe_key_base_#{:crypto.strong_rand_bytes(16) |> Base.encode64()}" ) {:ok, _} = Application.ensure_all_started(:phoenix) {:ok, _} = Application.ensure_all_started(:phoenix_live_view) {:ok, _} = Application.ensure_all_started(:bandit) DalaDev.Server.Endpoint.start_link() :timer.sleep(:infinity) end end