{@device.name}

{@device.ip_address}

<.button navigate={~p"/devices/#{@device.id}/edit"}> <.icon name="hero-pencil" class="h-4 w-4" /> Edit
<%= case @active_tab do %> <% "overview" -> %>

Device Information

<%= if @snmp_device do %>
System Name
{@snmp_device.sys_name || @device.name}
Resolved IP
{@device.ip_address}
Hardware
{@snmp_device.model || "N/A"}
Operating System
{if @snmp_device.manufacturer && @snmp_device.firmware_version do "#{@snmp_device.manufacturer} #{@snmp_device.firmware_version}" else @snmp_device.sys_descr || "N/A" end}
Object ID
{@snmp_device.sys_object_id || "N/A"}
Contact
{@snmp_device.sys_contact || "N/A"}
Location
{@snmp_device.sys_location || "N/A"}
Uptime
{format_uptime(@snmp_device.sys_uptime)}
<% else %>
Name
{@device.name}
IP Address
{@device.ip_address}
<% end %>
Device Added
{format_device_age(@device.inserted_at)}
Last Discovered
{if @device.last_discovery_at do format_device_age(@device.last_discovery_at) else "Never" end}
<%= if @traffic_chart_data do %>
<.link navigate={~p"/devices/#{@device.id}/graph/traffic"} class="block px-4 py-3 border-b border-gray-200 dark:border-white/10 hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors" >

Overall Traffic

<.icon name="hero-arrow-right" class="h-4 w-4 text-gray-400" />
<% end %> <%= if @latency_chart_data do %>
<.link navigate={~p"/devices/#{@device.id}/graph/latency"} class="block px-4 py-3 border-b border-gray-200 dark:border-white/10 hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors" >

ICMP Latency

<.icon name="hero-arrow-right" class="h-4 w-4 text-gray-400" />
<% end %>
<%= if @processor_chart_data || (@processors && length(@processors) > 0) do %> <% processor_count = if @processors, do: length(@processors), else: 0 avg_load = if processor_count > 0 do loads = @processors |> Enum.map(& &1.load_percent) |> Enum.reject(&is_nil/1) if length(loads) > 0, do: Enum.sum(loads) / length(loads), else: nil else nil end %>
<.link navigate={~p"/devices/#{@device.id}/graph/processors"} class="block px-4 py-3 border-b border-gray-200 dark:border-white/10 hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors" >

<%= if processor_count > 0 do %> {processor_count} {if processor_count == 1, do: "Processor", else: "Processors"} <% else %> Processors <% end %>

<.icon name="hero-arrow-right" class="h-4 w-4 text-gray-400" />
<%= if @processor_chart_data do %>
<% end %> <%= if avg_load do %>
Average Load
= 50 && avg_load < 80 && "bg-yellow-500", avg_load >= 80 && "bg-red-500" ]} style={"width: #{min(avg_load, 100)}%"} >
{Float.round(avg_load, 0)}%
<% end %>
<% end %> <%= if @memory_chart_data do %>
<.link navigate={~p"/devices/#{@device.id}/graph/memory"} class="block px-4 py-3 border-b border-gray-200 dark:border-white/10 hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors" >

Memory Usage

<.icon name="hero-arrow-right" class="h-4 w-4 text-gray-400" />
<% end %> <%= if @storage_sensors && length(@storage_sensors) > 0 do %>

Storage Usage

<%= for sensor <- @storage_sensors do %>
<.link navigate={ ~p"/devices/#{@device.id}/graph/storage?sensor_id=#{sensor.id}" } class="hover:text-blue-600 dark:hover:text-blue-400 hover:underline" > {sensor.sensor_descr}
<%= if sensor.latest_reading do %> {format_sensor_value( sensor.latest_reading.value, sensor.sensor_divisor )} {sensor.sensor_unit} <% else %> N/A <% end %>
<% end %>
<% end %> <%= if @storage && length(@storage) > 0 do %>

Storage Volumes ({length(@storage)})

<%= for storage <- @storage do %> <% usage_percent = if storage.total_bytes && storage.total_bytes > 0 do Float.round(storage.used_bytes / storage.total_bytes * 100, 1) else 0.0 end %> <.link navigate={ ~p"/devices/#{@device.id}/graph/storage_volume?storage_id=#{storage.id}" } class="block hover:bg-gray-50 dark:hover:bg-gray-700/50 -mx-2 px-2 py-1 rounded transition-colors" >
{storage.description || "Storage #{storage.storage_index}"} {format_bytes(storage.used_bytes)} / {format_bytes(storage.total_bytes)}
= 70 && usage_percent < 90 && "bg-yellow-500", usage_percent >= 90 && "bg-red-500" ]} style={"width: #{min(usage_percent, 100)}%"} >
{usage_percent}%
{String.replace(storage.storage_type || "other", "_", " ") |> String.capitalize()}
<% end %>
<% end %> <%= if @temperature_sensors && length(@temperature_sensors) > 0 do %>

Temperature

<%= for sensor <- @temperature_sensors do %>
<.link navigate={ ~p"/devices/#{@device.id}/graph/temperature?sensor_id=#{sensor.id}" } class="hover:text-blue-600 dark:hover:text-blue-400 hover:underline" > {sensor.sensor_descr}
<%= if sensor.latest_reading do %> {format_sensor_value( sensor.latest_reading.value, sensor.sensor_divisor )} {sensor.sensor_unit} <% else %> N/A <% end %>
<% end %>
<% end %> <%= if @voltage_sensors && length(@voltage_sensors) > 0 do %>

Voltage

<%= for sensor <- @voltage_sensors do %>
<.link navigate={ ~p"/devices/#{@device.id}/graph/voltage?sensor_id=#{sensor.id}" } class="hover:text-blue-600 dark:hover:text-blue-400 hover:underline" > {sensor.sensor_descr}
<%= if sensor.latest_reading do %> {format_sensor_value( sensor.latest_reading.value, sensor.sensor_divisor )} {sensor.sensor_unit} <% else %> N/A <% end %>
<% end %>
<% end %> <%= if @grouped_transceivers && length(@grouped_transceivers) > 0 do %>

Transceivers

<%= for {_transceiver_name, sensors} <- @grouped_transceivers do %> <%= for sensor <- sensors do %>
<.link navigate={ ~p"/devices/#{@device.id}/graph/dbm?sensor_id=#{sensor.id}" } class="hover:text-blue-600 dark:hover:text-blue-400 hover:underline" > {sensor.sensor_descr}
<%= if sensor.latest_reading do %> {format_sensor_value( sensor.latest_reading.value, sensor.sensor_divisor )} {sensor.sensor_unit} <% else %> N/A <% end %>
<% end %> <% end %>
<% end %> <%= if @count_sensors && length(@count_sensors) > 0 do %>

Counters

<%= for sensor <- @count_sensors do %>
<.link navigate={ ~p"/devices/#{@device.id}/graph/count?sensor_id=#{sensor.id}" } class="hover:text-blue-600 dark:hover:text-blue-400 hover:underline" > {sensor.sensor_descr}
<%= if sensor.latest_reading do %> {trunc(sensor.latest_reading.value)} <% else %> N/A <% end %>
<% end %>
<% end %>
<% "ports" -> %> <%= if @snmp_interfaces && length(@snmp_interfaces) > 0 do %>
<%= for {category, interfaces} <- @interfaces_by_type do %>

{category} Interfaces ({length(interfaces)})

<%= for interface <- interfaces do %> <% end %>
# Name Status Speed MAC
{interface.if_index} <.link navigate={ ~p"/devices/#{@device.id}/graph/traffic?interface_id=#{interface.id}" } class="hover:text-blue-600 dark:hover:text-blue-400" >
{interface.if_name || interface.if_descr}
<%= if interface.if_alias do %>
{interface.if_alias}
<% end %>
{String.upcase(interface.if_oper_status || "unknown")} {format_speed(interface.if_speed)} {interface.if_phys_address || "-"}
<% end %>
<% else %>

No interfaces discovered

<% end %> <% "neighbors" -> %> <%= if @neighbors && length(@neighbors) > 0 do %>

Discovered Neighbors

<%= for neighbor <- @neighbors do %> <% end %>
Protocol Local Port Remote Device Remote Port IP Address Platform Capabilities Last Seen
{neighbor.protocol} <.link navigate={ ~p"/devices/#{@device.id}/graph/traffic?interface_id=#{neighbor.interface.id}" } class="text-blue-600 hover:text-blue-800 dark:text-blue-400 dark:hover:text-blue-300" > {neighbor.interface.if_name || neighbor.interface.if_descr} <%= if neighbor.matched_device do %> <.link navigate={~p"/devices/#{neighbor.matched_device.id}"} class="font-medium text-blue-600 hover:text-blue-800 dark:text-blue-400 dark:hover:text-blue-300" > {neighbor.matched_device.name} <% else %>
<%= if neighbor.remote_system_name do %> {neighbor.remote_system_name |> String.split("/") |> List.first()} <% else %> Unknown <% end %>
<% end %>
{neighbor.remote_port_id || "-"}
<%= if !neighbor.matched_device && neighbor.remote_chassis_id do %>
{neighbor.remote_chassis_id}
<% end %>
{neighbor.remote_address || "-"} {neighbor.remote_platform || "-"} <%= if neighbor.remote_capabilities && length(neighbor.remote_capabilities) > 0 do %> {Enum.join(neighbor.remote_capabilities, ", ")} <% else %> - <% end %> {time_ago(neighbor.last_discovered_at)}
<% else %>
<.icon name="hero-server-stack" class="mx-auto h-12 w-12 text-gray-400" />

No neighbors discovered

This device doesn't have any LLDP or CDP neighbors, or neighbor discovery hasn't run yet.

<% end %> <% "arp" -> %> <%= if @arp_entries && length(@arp_entries) > 0 do %>

ARP Table ({length(@arp_entries)} entries)

<%= for arp <- @arp_entries do %> <% end %>
IP Address MAC Address Interface Type Last Seen
{arp.ip_address} {arp.mac_address} <%= if arp.interface do %> <.link navigate={ ~p"/devices/#{@device.id}/graph/traffic?interface_id=#{arp.interface.id}" } class="text-blue-600 hover:text-blue-800 dark:text-blue-400 dark:hover:text-blue-300" > {arp.interface.if_name || arp.interface.if_descr} <% else %> ifIndex {arp.if_index} <% end %> {arp.entry_type || "unknown"} {time_ago(arp.last_seen_at)}
<% else %>
<.icon name="hero-table-cells" class="mx-auto h-12 w-12 text-gray-400" />

No ARP entries discovered

This device doesn't have any ARP entries, or ARP discovery hasn't run yet.

<% end %> <% "vlans" -> %> <%= if @vlans && length(@vlans) > 0 do %>

Configured VLANs ({length(@vlans)})

<%= for vlan <- @vlans do %> <% end %>
VLAN ID Name Type Status Last Checked
{vlan.vlan_id} {vlan.vlan_name || "-"} {vlan.vlan_type || "ethernet"} {String.upcase(vlan.status || "unknown")} {time_ago(vlan.last_checked_at)}
<% else %>
<.icon name="hero-square-3-stack-3d" class="mx-auto h-12 w-12 text-gray-400" />

No VLANs discovered

This device doesn't have any VLANs configured, or VLAN discovery hasn't run yet.

<% end %> <% "ip_addresses" -> %>
<%= if length(@ipv4_addresses) > 0 do %>

IPv4 Addresses ({length(@ipv4_addresses)})

<%= for ip <- @ipv4_addresses do %> <% end %>
IP Address Subnet Interface Primary
{ip.ip_address} <%= if ip.prefix_length do %> /{ip.prefix_length} <% else %> {ip.subnet_mask || "-"} <% end %> {(ip.snmp_interface && (ip.snmp_interface.if_name || ip.snmp_interface.if_descr)) || "-"} <%= if ip.is_primary do %> Primary <% else %> - <% end %>
<% end %> <%= if length(@ipv6_addresses) > 0 do %>

IPv6 Addresses ({length(@ipv6_addresses)})

<%= for ip <- @ipv6_addresses do %> <% end %>
IP Address Prefix Interface
{ip.ip_address} /{ip.prefix_length || "-"} {(ip.snmp_interface && (ip.snmp_interface.if_name || ip.snmp_interface.if_descr)) || "-"}
<% end %> <%= if length(@ipv4_addresses) == 0 && length(@ipv6_addresses) == 0 do %>
<.icon name="hero-globe-alt" class="mx-auto h-12 w-12 text-gray-400" />

No IP addresses discovered

This device doesn't have any IP addresses discovered, or IP discovery hasn't run yet.

<% end %>
<% "logs" -> %>

Event Logs

Showing the most recent 100 events

<%= if Enum.any?(@events) do %>
<%= for event <- @events do %>
<%= if event.severity == "info" do %> <.icon name="hero-information-circle" class="w-5 h-5" /> <% end %> <%= if event.severity == "warning" do %> <.icon name="hero-exclamation-triangle" class="w-5 h-5" /> <% end %> <%= if event.severity == "critical" do %> <.icon name="hero-x-circle" class="w-5 h-5" /> <% end %>

{event.message}

{format_event_type(event.event_type)} {event.severity}
<% end %>
<% else %>
<.icon name="hero-document-text" class="mx-auto h-12 w-12 text-gray-400" />

No events yet

Events will appear here as interface states change, speeds change, or other monitored changes occur.

<% end %>
<% "debug" -> %>

Raw Discovery Data

Raw SNMP OID values collected during the last discovery run at <%= if @snmp_device.last_discovery_at do %> {Calendar.strftime(@snmp_device.last_discovery_at, "%Y-%m-%d %H:%M:%S UTC")} <% else %> unknown time <% end %>.

<%= if @snmp_device.raw_discovery_data do %>

System OIDs

<%= for {key, data} <- Map.get(@snmp_device.raw_discovery_data, "system_oids", %{}) do %> <% end %>
Field OID Value
{key} {data["oid"]} {inspect(data["value"])}
<%= if Map.get(@snmp_device.raw_discovery_data, "health_sensor_table") do %>

Health Sensor Table Walk

<%= for {oid, value} <- Map.get(@snmp_device.raw_discovery_data, "health_sensor_table", %{}) do %> <% end %>
OID Value
{oid} {inspect(value)}
<% end %> <%= if Map.get(@snmp_device.raw_discovery_data, "discovered_sensors") do %>

Discovered Sensors

<%= for sensor <- Map.get(@snmp_device.raw_discovery_data, "discovered_sensors", []) do %> <% end %>
Type Description OID Value State
{sensor["type"]} {sensor["descr"]} {sensor["oid"]} {sensor["value"]} <%= if sensor["unit"] && sensor["unit"] != "" do %> {sensor["unit"]} <% end %> <%= if sensor["state_descr"] do %> {sensor["state_descr"]} <% else %> - <% end %>
<% end %>

Copyable Debug Data

Click the text box to select all data, then copy with Cmd+C or Ctrl+C

<% else %>

No raw discovery data available. Run discovery again to collect debug data.

<% end %>
<% _ -> %>

Tab not found

<% end %>