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 @@
+ 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 %>
+