diff --git a/lib/towerops_web/live/device_live/show.ex b/lib/towerops_web/live/device_live/show.ex index d7c3a1aa..84f53192 100644 --- a/lib/towerops_web/live/device_live/show.ex +++ b/lib/towerops_web/live/device_live/show.ex @@ -4,6 +4,8 @@ defmodule ToweropsWeb.DeviceLive.Show do alias Towerops.Agents alias Towerops.Devices + alias Towerops.Devices.Firmware + alias Towerops.Devices.VersionComparator alias Towerops.Monitoring alias Towerops.Repo alias Towerops.Snmp @@ -233,6 +235,9 @@ defmodule ToweropsWeb.DeviceLive.Show do # Group interfaces by type for the ports tab interfaces_by_type = group_interfaces_by_type(snmp_data.interfaces) + # Check for available firmware updates + available_firmware = get_available_firmware(snmp_data.device) + socket |> assign(:page_title, device.name) |> assign(:timezone, socket.assigns.current_scope.timezone) @@ -267,6 +272,42 @@ defmodule ToweropsWeb.DeviceLive.Show do |> assign(:wireless_sensors, wireless_sensors) |> assign(:grouped_transceivers, grouped_transceivers) |> assign(:agent_info, agent_info) + |> assign(:available_firmware, available_firmware) + end + + defp get_available_firmware(nil), do: nil + + defp get_available_firmware(snmp_device) do + vendor = determine_vendor(snmp_device.manufacturer) + product_line = determine_product_line(snmp_device.manufacturer) + + if vendor do + Firmware.get_latest_firmware_release(vendor, product_line) + end + end + + defp determine_vendor("MikroTik"), do: "mikrotik" + defp determine_vendor("Cisco"), do: "cisco" + defp determine_vendor("Ubiquiti"), do: "ubiquiti" + defp determine_vendor(_), do: nil + + defp determine_product_line("MikroTik"), do: "routeros" + defp determine_product_line(_), do: nil + + defp firmware_update_available?(nil, _), do: false + defp firmware_update_available?(_, nil), do: false + + defp firmware_update_available?(snmp_device, available_firmware) do + current = snmp_device.firmware_version + available = available_firmware.version + + current && available && VersionComparator.newer?(current, available) + end + + defp format_date(nil), do: "" + + defp format_date(date) do + Calendar.strftime(date, "%B %-d, %Y") end defp load_agent_info(nil, :none) do diff --git a/lib/towerops_web/live/device_live/show.html.heex b/lib/towerops_web/live/device_live/show.html.heex index f93f3bca..6b20a4eb 100644 --- a/lib/towerops_web/live/device_live/show.html.heex +++ b/lib/towerops_web/live/device_live/show.html.heex @@ -205,6 +205,57 @@
<%= case @active_tab do %> <% "overview" -> %> + + <%= if firmware_update_available?(@snmp_device, @available_firmware) do %> +
+
+
+ <.icon name="hero-arrow-up-circle" class="h-5 w-5 text-blue-400" /> +
+
+

+ Firmware Update Available +

+
+

+ Current version: + {@snmp_device.firmware_version} +
Latest version: + {@available_firmware.version} + <%= if @available_firmware.release_date do %> + + (released {format_date(@available_firmware.release_date)}) + + <% end %> +

+
+ +
+
+
+ <% end %> +