1.4 KiB · text History 9c0fc16
defmodule LambentExWeb.DevicesLive.Interfaces do
  use LambentExWeb, :live_view

  alias LambentEx.Scan.NMAP

  @pubsub_name LambentEx.PubSub

  @impl true
  def mount(_params, _session, socket) do
    Phoenix.PubSub.subscribe(@pubsub_name, "scan-ifaces")

    {:ok,
     socket
     |> assign(:interfaces, NMAP.interfaces())
     |> assign(:nonew, true)}
  end

  @impl true
  def handle_params(params, _url, socket) do
    {:noreply, apply_action(socket, socket.assigns.live_action, params)}
  end

  defp apply_action(socket, :index, _params) do
    socket
    |> assign(:page_link, "Devices")
    |> assign(:page_title, "Scanned Interfaces")
    |> assign(:source, nil)
  end

  @impl true
  def handle_info({:interfaces, interfaces}, socket) do
    {:noreply, socket |> assign(:interfaces, interfaces)}
  end

  @impl true
  def handle_info(_msg, socket), do: {:noreply, socket}

  # the sweep runs on every interface that is not filtered out by prefix; this
  # is for the ones that are left but still not worth scanning
  @impl true
  def handle_event("toggle_iface", %{"name" => name}, socket) do
    enabled =
      socket.assigns.interfaces
      |> Enum.find(%{}, fn iface -> iface.name == name end)
      |> Map.get(:enabled, true)

    NMAP.set_enabled(name, !enabled)
    {:noreply, socket}
  end

  defp swept(interfaces), do: Enum.count(interfaces, & &1.enabled)
end