defmodule ToweropsWeb.DeviceLive.Index do @moduledoc false use ToweropsWeb, :live_view alias Towerops.Devices alias Towerops.Sites alias Towerops.Snmp alias Towerops.Workers.DiscoveryWorker @impl true def mount(_params, _session, socket) do organization = socket.assigns.current_organization device = Devices.list_organization_devices(organization.id) sites = Sites.list_organization_sites(organization.id) {:ok, socket |> assign(:page_title, "Devices") |> assign(:device, device) |> assign(:has_sites, sites != [])} end @impl true def handle_params(params, _url, socket) do tab = Map.get(params, "tab", "existing") {:noreply, apply_action(socket, socket.assigns.live_action, params, tab)} end defp apply_action(socket, :index, _params, tab) do organization = socket.assigns.current_organization case tab do "discovered" -> discovered = Snmp.list_discovered_devices_for_organization(organization.id) socket |> assign(:active_tab, "discovered") |> assign(:discovered_devices, discovered) _ -> socket |> assign(:active_tab, "existing") |> assign(:discovered_devices, []) end end @impl true def handle_event("force_rediscover_all", _params, socket) do devices = socket.assigns.device snmp_devices = Enum.filter(devices, & &1.snmp_enabled) if Enum.empty?(snmp_devices) do {:noreply, put_flash(socket, :error, "No SNMP-enabled devices found")} else Enum.each(snmp_devices, fn device -> enqueue_discovery(device.id) end) count = length(snmp_devices) {:noreply, put_flash(socket, :info, "Discovery started for #{count} device#{if count == 1, do: "", else: "s"}")} end end def handle_event("add_discovered_device", params, socket) do identifier = Jason.decode!(params["identifier"]) discovered = Enum.find(socket.assigns.discovered_devices, &(&1.identifier == identifier)) prefill_params = %{ "name" => discovered.hostname || "", "ip_address" => List.first(discovered.ip_addresses) || "", "snmp_enabled" => "true" } {:noreply, push_navigate(socket, to: ~p"/devices/new?#{prefill_params}")} end defp enqueue_discovery(device_id) do if Application.get_env(:towerops, :env) == :test do _ = Task.start(fn -> Snmp.discover_device(Devices.get_device!(device_id)) end) else DiscoveryWorker.enqueue(device_id) end end # Device type icon helpers defp device_type_icon(:router), do: "hero-signal" defp device_type_icon(:switch), do: "hero-squares-2x2" defp device_type_icon(:wireless), do: "hero-wifi" defp device_type_icon(:server), do: "hero-server" defp device_type_icon(:workstation), do: "hero-computer-desktop" defp device_type_icon(_), do: "hero-question-mark-circle" defp device_type_label(type) do type |> to_string() |> String.capitalize() end end