From 8ab494beacad17ff80fc30f15c81f658f4d4a0bf Mon Sep 17 00:00:00 2001 From: Andres Bott Date: Sat, 16 Aug 2025 15:45:30 +0200 Subject: [PATCH] first ui working --- Makefile | 78 +++ README.md | 11 + webui/index.html | 16 +- webui/sampledata/nvme1n1_smart.json | 87 ++++ webui/sampledata/sda_smart.json | 467 ++++++++++++++++++ webui/sampledata/sdb_smart.json | 315 ++++++++++++ webui/sampledata/sdc_smart.json | 315 ++++++++++++ .../assets/icons/android-chrome-144x144.png | Bin 0 -> 5687 bytes .../assets/icons/android-chrome-192x192.png | Bin 0 -> 7854 bytes .../assets/icons/android-chrome-512x512.png | Bin 0 -> 16001 bytes .../assets/icons/apple-touch-icon-144x144.png | Bin 0 -> 5687 bytes webui/src/assets/icons/apple-touch-icon.png | Bin 0 -> 7335 bytes webui/src/assets/icons/favicon-16x16.png | Bin 0 -> 999 bytes webui/src/assets/icons/favicon-32x32.png | Bin 0 -> 1539 bytes webui/src/assets/icons/favicon-48x48.png | Bin 0 -> 1892 bytes webui/src/assets/icons/favicon.ico | Bin 0 -> 1150 bytes webui/src/assets/icons/icon.png | Bin 0 -> 15826 bytes webui/src/assets/icons/site.webmanifest | 46 ++ webui/src/views/OverviewView.vue | 2 +- webui/vite.config.js | 9 + zarf/icon/icon.png | Bin 0 -> 15826 bytes zarf/icon/icon.svg | 56 +++ zarf/screenshots/detail.jpg | Bin 0 -> 65489 bytes zarf/screenshots/overview.jpg | Bin 0 -> 47422 bytes 24 files changed, 1393 insertions(+), 9 deletions(-) create mode 100644 webui/sampledata/nvme1n1_smart.json create mode 100644 webui/sampledata/sda_smart.json create mode 100644 webui/sampledata/sdb_smart.json create mode 100644 webui/sampledata/sdc_smart.json create mode 100644 webui/src/assets/icons/android-chrome-144x144.png create mode 100644 webui/src/assets/icons/android-chrome-192x192.png create mode 100644 webui/src/assets/icons/android-chrome-512x512.png create mode 100644 webui/src/assets/icons/apple-touch-icon-144x144.png create mode 100644 webui/src/assets/icons/apple-touch-icon.png create mode 100644 webui/src/assets/icons/favicon-16x16.png create mode 100644 webui/src/assets/icons/favicon-32x32.png create mode 100644 webui/src/assets/icons/favicon-48x48.png create mode 100644 webui/src/assets/icons/favicon.ico create mode 100644 webui/src/assets/icons/icon.png create mode 100644 webui/src/assets/icons/site.webmanifest create mode 100644 zarf/icon/icon.png create mode 100644 zarf/icon/icon.svg create mode 100644 zarf/screenshots/detail.jpg create mode 100644 zarf/screenshots/overview.jpg diff --git a/Makefile b/Makefile index bce1eaa..ff20859 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,6 @@ SHELL := /bin/bash +COMMIT_SHA_SHORT ?= $(shell git rev-parse --short=12 HEAD) +PWD_DIR := ${CURDIR} default: help; mkfile_path := $(abspath $(lastword $(MAKEFILE_LIST))) @@ -7,6 +9,82 @@ ROOT_DIR:=$(shell dirname $(realpath $(firstword $(MAKEFILE_LIST)))) # ====================================================================================== +##@ Build +build: ## builds the web UI and packages it (use VERSION=v1.2.3 or defaults to commit-SNAPSHOT) + @echo "Building web UI..." + @cd webui && make build + @echo "Creating package..." + @mkdir -p dist + @VERSION=$${VERSION:-$(COMMIT_SHA_SHORT)-SNAPSHOT} && \ + PACKAGE_NAME="nanoSmart-$$VERSION" && \ + mkdir -p "dist/$$PACKAGE_NAME/cron" && \ + mkdir -p "dist/$$PACKAGE_NAME/webui" && \ + cp -r webui/dist/assets "dist/$$PACKAGE_NAME/webui/" && \ + cp -r webui/dist/icons "dist/$$PACKAGE_NAME/webui/" && \ + cp webui/dist/index.html "dist/$$PACKAGE_NAME/webui/" && \ + cp -r cron/smart_monitor.conf "dist/$$PACKAGE_NAME/cron/smart_monitor.conf" && \ + cp -r cron/smart_monitor.sh "dist/$$PACKAGE_NAME/cron/smart_monitor.sh" && \ + cp LICENSE "dist/$$PACKAGE_NAME/" && \ + cp README.md "dist/$$PACKAGE_NAME/" && \ + cd dist && zip -r "$$PACKAGE_NAME.zip" "$$PACKAGE_NAME/" && \ + rm -rf "$$PACKAGE_NAME" && \ + echo "Package created: dist/$$PACKAGE_NAME.zip" && \ + echo "Package size: $$(du -h "$$PACKAGE_NAME.zip" | cut -f1)" + +clean: ## clean the build environment + @rm -rf ./dist + +##@ Release + +check_env: # check for needed envs +ifndef GITHUB_TOKEN + $(error GITHUB_TOKEN is undefined, create one with repo permissions here: https://github.com/settings/tokens/new?scopes=repo,write%3Apackages ) +endif + @[ "${version}" ] || ( echo ">> version is not set, usage: make release version=\"v1.2.3\" "; exit 1 ) + @which jq > /dev/null || ( echo ">> jq is not installed. Please install jq for JSON parsing."; exit 1 ) + +.PHONY: check-git-clean +check-git-clean: # check if git repo is clen + @git diff --quiet + +.PHONY: check-branch +check-branch: + @current_branch=$$(git symbolic-ref --short HEAD) && \ + if [ "$$current_branch" != "main" ]; then \ + echo "Error: You are on branch '$$current_branch'. Please switch to 'main'."; \ + exit 1; \ + fi + + +#release: check_env check-branch check-git-clean ## release a new version, call with version="v1.2.3", make sure to have valid GH token +release: check_env check-branch check-git-clean ## release a new version, call with version="v1.2.3", make sure to have valid GH token + @[ "${version}" ] || ( echo ">> version is not set, usage: make release version=\"v1.2.3\" "; exit 1 ) + @echo "Building release package for version $(version)..." + @VERSION=$(version) make build + @echo "Creating GitHub release..." + @git tag -d $(version) || true + @git tag -a $(version) -m "Release version: $(version)" + @git push --delete origin $(version) || true + @git push origin $(version) || true + @echo "Creating GitHub release..." + @RELEASE_ID=$$(curl -s -H "Authorization: token $(GITHUB_TOKEN)" \ + -H "Accept: application/vnd.github.v3+json" \ + -X POST \ + -d '{"tag_name":"$(version)","name":"Release $(version)","body":"Release version $(version)","draft":false,"prerelease":false}' \ + "https://api.github.com/repos/ansible-autobott/nanoSmart/releases" | \ + jq -r '.id') && \ + if [ "$$RELEASE_ID" = "null" ] || [ -z "$$RELEASE_ID" ]; then \ + echo "Error: Could not create release for tag $(version)"; \ + exit 1; \ + fi && \ + echo "Release created with ID: $$RELEASE_ID" && \ + echo "Uploading release assets..." && \ + curl -s -H "Authorization: token $(GITHUB_TOKEN)" \ + -H "Accept: application/vnd.github.v3+json" \ + -H "Content-Type: application/zip" \ + --data-binary @dist/nanoSmart-$(version).zip \ + "https://uploads.github.com/repos/ansible-autobott/nanoSmart/releases/$$RELEASE_ID/assets?name=nanoSmart-$(version).zip" && \ + echo "Release $(version) created and asset uploaded successfully!" ##@ Help diff --git a/README.md b/README.md index f6a5311..1372e16 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,13 @@ # nanoSmart micro UI for displaying SMART data + + +![Overview](zarf/screenshots/overview.jpg) +![Detail](zarf/screenshots/detail.jpg) + +## How it works + +nanoSmart is composed of 2 components: + +a) a cron script that generates static json files to a specific location +b) an SPA that can consume the static json and represent relevant information \ No newline at end of file diff --git a/webui/index.html b/webui/index.html index ff91160..7642558 100644 --- a/webui/index.html +++ b/webui/index.html @@ -5,21 +5,21 @@ - - - - + + + + - - + + - + - + nano Smart diff --git a/webui/sampledata/nvme1n1_smart.json b/webui/sampledata/nvme1n1_smart.json new file mode 100644 index 0000000..c60be11 --- /dev/null +++ b/webui/sampledata/nvme1n1_smart.json @@ -0,0 +1,87 @@ +{ + "device": "/dev/nvme1n1", + "timestamp": 1755340242, + "smart_data": { + "device_info": { + "json_format_version": [1, 0], + "smartctl": { + "version": [7, 3], + "svn_revision": "5338", + "platform_info": "x86_64-linux-6.1.0-37-amd64", + "build_info": "(local build)", + "argv": ["smartctl", "-i", "-j", "/dev/nvme1n1"], + "exit_status": 0 + }, + "local_time": { + "time_t": 1755340242, + "asctime": "Sat Aug 16 12:30:42 2025 CEST" + }, + "device": { + "name": "/dev/nvme1n1", + "info_name": "/dev/nvme1n1", + "type": "nvme", + "protocol": "NVMe" + }, + "model_name": "INTEL SSDPE2KX080T8", + "serial_number": "INTEL987654321", + "firmware_version": "REDACTED", + "nvme_total_capacity": 8001563222016, + "nvme_unallocated_capacity": 0, + "nvme_controller_id": 1, + "nvme_ieee_oui_identifier": 6083300, + "nvme_number_of_namespaces": 128, + "nvme_pci_vendor": { + "id": 32902, + "subsystem_id": 32902 + }, + "nvme_version": { + "string": "1.2", + "value": 66048 + }, + "smart_support": { + "available": true, + "enabled": true + } + }, + "smart_attributes": { + "json_format_version": [1, 0], + "smartctl": { + "version": [7, 3], + "svn_revision": "5338", + "platform_info": "x86_64-linux-6.1.0-37-amd64", + "build_info": "(local build)", + "argv": ["smartctl", "-A", "-j", "/dev/nvme1n1"], + "exit_status": 0 + }, + "nvme_smart_health_information_log": { + "critical_warning": 1, + "temperature": 75, + "available_spare": 85, + "available_spare_threshold": 10, + "percentage_used": 85, + "data_units_read": 20126802, + "data_units_written": 184919244, + "host_reads": 134106494, + "host_writes": 4922206599, + "controller_busy_time": 165, + "power_cycles": 22, + "power_on_hours": 45678, + "unsafe_shutdowns": 8, + "media_errors": 2, + "num_err_log_entries": 5, + "warning_temp_time": 120, + "critical_comp_time": 0 + } + }, + "smart_health": { + "smart_status": { + "nvme": { + "value": 1 + }, + "passed": false + } + }, + "smart_errors": {}, + "smart_selftest": {} + } +} \ No newline at end of file diff --git a/webui/sampledata/sda_smart.json b/webui/sampledata/sda_smart.json new file mode 100644 index 0000000..d737467 --- /dev/null +++ b/webui/sampledata/sda_smart.json @@ -0,0 +1,467 @@ +{ + "device": "/dev/sda", + "timestamp": 1755340242, + "smart_data": { + "device_info": { + "json_format_version": [1, 0], + "smartctl": { + "version": [7, 3], + "svn_revision": "5338", + "platform_info": "x86_64-linux-6.1.0-37-amd64", + "build_info": "(local build)", + "argv": ["smartctl", "-i", "-j", "/dev/sda"], + "exit_status": 0 + }, + "local_time": { + "time_t": 1755340242, + "asctime": "Sat Aug 16 12:30:42 2025 CEST" + }, + "device": { + "name": "/dev/sda", + "info_name": "/dev/sda", + "type": "sat", + "protocol": "SATA" + }, + "model_name": "INTEL SSDSC2BB240G4", + "serial_number": "INTEL123456789", + "firmware_version": "XCV10132", + "user_capacity": { + "blocks": 468862128, + "bytes": 240057809920 + }, + "logical_block_size": 512, + "smart_support": { + "available": true, + "enabled": true + } + }, + "smart_attributes": { + "json_format_version": [1, 0], + "smartctl": { + "version": [7, 3], + "svn_revision": "5338", + "platform_info": "x86_64-linux-6.1.0-37-amd64", + "build_info": "(local build)", + "argv": ["smartctl", "-A", "-j", "/dev/sda"], + "exit_status": 0 + }, + "table": [ + { + "id": 5, + "name": "Reallocated_Sector_Ct", + "value": 100, + "worst": 100, + "thresh": 0, + "raw": {"value": 0, "string": "0"}, + "flags": { + "prefailure": false, + "updated_online": true, + "performance": false, + "error_rate": false, + "event_count": true, + "auto_keep": true, + "string": "-O--CK " + } + }, + { + "id": 9, + "name": "Power_On_Hours", + "value": 85, + "worst": 85, + "thresh": 0, + "raw": {"value": 69412, "string": "69412"}, + "flags": { + "prefailure": false, + "updated_online": true, + "performance": false, + "error_rate": false, + "event_count": true, + "auto_keep": true, + "string": "-O--CK " + } + }, + { + "id": 12, + "name": "Power_Cycle_Count", + "value": 100, + "worst": 100, + "thresh": 0, + "raw": {"value": 55, "string": "55"}, + "flags": { + "prefailure": false, + "updated_online": true, + "performance": false, + "error_rate": false, + "event_count": true, + "auto_keep": true, + "string": "-O--CK " + } + }, + { + "id": 170, + "name": "Available_Reservd_Space", + "value": 100, + "worst": 100, + "thresh": 10, + "raw": {"value": 0, "string": "0"}, + "flags": { + "prefailure": true, + "updated_online": true, + "performance": false, + "error_rate": false, + "event_count": true, + "auto_keep": true, + "string": "PO--CK " + } + }, + { + "id": 171, + "name": "Program_Fail_Count", + "value": 100, + "worst": 100, + "thresh": 0, + "raw": {"value": 0, "string": "0"}, + "flags": { + "prefailure": false, + "updated_online": true, + "performance": false, + "error_rate": false, + "event_count": true, + "auto_keep": true, + "string": "-O--CK " + } + }, + { + "id": 172, + "name": "Erase_Fail_Count", + "value": 100, + "worst": 100, + "thresh": 0, + "raw": {"value": 0, "string": "0"}, + "flags": { + "prefailure": false, + "updated_online": true, + "performance": false, + "error_rate": false, + "event_count": true, + "auto_keep": true, + "string": "-O--CK " + } + }, + { + "id": 173, + "name": "Wear_Leveling_Count", + "value": 100, + "worst": 100, + "thresh": 0, + "raw": {"value": 0, "string": "0"}, + "flags": { + "prefailure": false, + "updated_online": true, + "performance": false, + "error_rate": false, + "event_count": true, + "auto_keep": true, + "string": "-O--CK " + } + }, + { + "id": 174, + "name": "Unexpected_Power_Loss_Ct", + "value": 100, + "worst": 100, + "thresh": 0, + "raw": {"value": 3, "string": "3"}, + "flags": { + "prefailure": false, + "updated_online": true, + "performance": false, + "error_rate": false, + "event_count": true, + "auto_keep": true, + "string": "-O--CK " + } + }, + { + "id": 184, + "name": "End-to-End_Error", + "value": 100, + "worst": 100, + "thresh": 0, + "raw": {"value": 0, "string": "0"}, + "flags": { + "prefailure": true, + "updated_online": true, + "performance": false, + "error_rate": false, + "event_count": true, + "auto_keep": true, + "string": "PO--CK " + } + }, + { + "id": 187, + "name": "Reported_Uncorrect", + "value": 100, + "worst": 100, + "thresh": 0, + "raw": {"value": 0, "string": "0"}, + "flags": { + "prefailure": true, + "updated_online": true, + "performance": false, + "error_rate": false, + "event_count": true, + "auto_keep": true, + "string": "PO--CK " + } + }, + { + "id": 194, + "name": "Temperature_Celsius", + "value": 100, + "worst": 100, + "thresh": 0, + "raw": {"value": 35, "string": "35"}, + "flags": { + "prefailure": false, + "updated_online": true, + "performance": false, + "error_rate": false, + "event_count": false, + "auto_keep": false, + "string": "-O---- " + } + }, + { + "id": 195, + "name": "Hardware_ECC_Recovered", + "value": 100, + "worst": 100, + "thresh": 0, + "raw": {"value": 0, "string": "0"}, + "flags": { + "prefailure": false, + "updated_online": true, + "performance": false, + "error_rate": false, + "event_count": true, + "auto_keep": true, + "string": "-O--CK " + } + }, + { + "id": 199, + "name": "UDMA_CRC_Error_Count", + "value": 100, + "worst": 100, + "thresh": 0, + "raw": {"value": 0, "string": "0"}, + "flags": { + "prefailure": false, + "updated_online": true, + "performance": false, + "error_rate": false, + "event_count": true, + "auto_keep": true, + "string": "-O--CK " + } + }, + { + "id": 202, + "name": "Data_Address_Mark_Errs", + "value": 100, + "worst": 100, + "thresh": 0, + "raw": {"value": 0, "string": "0"}, + "flags": { + "prefailure": false, + "updated_online": true, + "performance": false, + "error_rate": false, + "event_count": true, + "auto_keep": true, + "string": "-O--CK " + } + }, + { + "id": 225, + "name": "Load_Cycle_Count", + "value": 100, + "worst": 100, + "thresh": 0, + "raw": {"value": 0, "string": "0"}, + "flags": { + "prefailure": false, + "updated_online": true, + "performance": false, + "error_rate": false, + "event_count": true, + "auto_keep": true, + "string": "-O--CK " + } + }, + { + "id": 226, + "name": "Load_In_Time", + "value": 100, + "worst": 100, + "thresh": 0, + "raw": {"value": 0, "string": "0"}, + "flags": { + "prefailure": false, + "updated_online": true, + "performance": false, + "error_rate": false, + "event_count": true, + "auto_keep": true, + "string": "-O--CK " + } + }, + { + "id": 227, + "name": "Torque_Amplification_Count", + "value": 100, + "worst": 100, + "thresh": 0, + "raw": {"value": 0, "string": "0"}, + "flags": { + "prefailure": false, + "updated_online": true, + "performance": false, + "error_rate": false, + "event_count": true, + "auto_keep": true, + "string": "-O--CK " + } + }, + { + "id": 228, + "name": "Power-Off_Retract_Count", + "value": 100, + "worst": 100, + "thresh": 0, + "raw": {"value": 0, "string": "0"}, + "flags": { + "prefailure": false, + "updated_online": true, + "performance": false, + "error_rate": false, + "event_count": true, + "auto_keep": true, + "string": "-O--CK " + } + }, + { + "id": 232, + "name": "Available_Reservd_Space", + "value": 100, + "worst": 100, + "thresh": 0, + "raw": {"value": 0, "string": "0"}, + "flags": { + "prefailure": false, + "updated_online": true, + "performance": false, + "error_rate": false, + "event_count": true, + "auto_keep": true, + "string": "-O--CK " + } + }, + { + "id": 233, + "name": "Media_Wearout_Indicator", + "value": 100, + "worst": 100, + "thresh": 0, + "raw": {"value": 0, "string": "0"}, + "flags": { + "prefailure": false, + "updated_online": true, + "performance": false, + "error_rate": false, + "event_count": true, + "auto_keep": true, + "string": "-O--CK " + } + }, + { + "id": 234, + "name": "Average_Erase_Count", + "value": 100, + "worst": 100, + "thresh": 0, + "raw": {"value": 0, "string": "0"}, + "flags": { + "prefailure": false, + "updated_online": true, + "performance": false, + "error_rate": false, + "event_count": true, + "auto_keep": true, + "string": "-O--CK " + } + }, + { + "id": 235, + "name": "Max_Erase_Count", + "value": 100, + "worst": 100, + "thresh": 0, + "raw": {"value": 0, "string": "0"}, + "flags": { + "prefailure": false, + "updated_online": true, + "performance": false, + "error_rate": false, + "event_count": true, + "auto_keep": true, + "string": "-O--CK " + } + }, + { + "id": 241, + "name": "Total_LBAs_Written", + "value": 100, + "worst": 100, + "thresh": 0, + "raw": {"value": 0, "string": "0"}, + "flags": { + "prefailure": false, + "updated_online": true, + "performance": false, + "error_rate": false, + "event_count": true, + "auto_keep": true, + "string": "-O--CK " + } + }, + { + "id": 242, + "name": "Total_LBAs_Read", + "value": 100, + "worst": 100, + "thresh": 0, + "raw": {"value": 0, "string": "0"}, + "flags": { + "prefailure": false, + "updated_online": true, + "performance": false, + "error_rate": false, + "event_count": true, + "auto_keep": true, + "string": "-O--CK " + } + } + ] + }, + "smart_health": { + "smart_status": { + "passed": true + } + }, + "smart_errors": {}, + "smart_selftest": {} + } +} \ No newline at end of file diff --git a/webui/sampledata/sdb_smart.json b/webui/sampledata/sdb_smart.json new file mode 100644 index 0000000..881004d --- /dev/null +++ b/webui/sampledata/sdb_smart.json @@ -0,0 +1,315 @@ +{ + "device": "/dev/sdb", + "timestamp": 1755340242, + "smart_data": { + "device_info": { + "json_format_version": [1, 0], + "smartctl": { + "version": [7, 3], + "svn_revision": "5338", + "platform_info": "x86_64-linux-6.1.0-37-amd64", + "build_info": "(local build)", + "argv": ["smartctl", "-i", "-j", "/dev/sdb"], + "exit_status": 0 + }, + "local_time": { + "time_t": 1755340242, + "asctime": "Sat Aug 16 12:30:42 2025 CEST" + }, + "device": { + "name": "/dev/sdb", + "info_name": "/dev/sdb", + "type": "sat", + "protocol": "SATA" + }, + "model_name": "SEAGATE ST373453LC", + "serial_number": "SEAGATE123456", + "firmware_version": "DX10", + "user_capacity": { + "blocks": 143374650, + "bytes": 73407820800 + }, + "logical_block_size": 512, + "rotation_rate": 15015, + "smart_support": { + "available": true, + "enabled": true + } + }, + "smart_attributes": { + "json_format_version": [1, 0], + "smartctl": { + "version": [7, 3], + "svn_revision": "5338", + "platform_info": "x86_64-linux-6.1.0-37-amd64", + "build_info": "(local build)", + "argv": ["smartctl", "-A", "-j", "/dev/sdb"], + "exit_status": 0 + }, + "table": [ + { + "id": 1, + "name": "Raw_Read_Error_Rate", + "value": 100, + "worst": 100, + "thresh": 16, + "raw": {"value": 0, "string": "0"}, + "flags": { + "prefailure": true, + "updated_online": true, + "performance": false, + "error_rate": true, + "event_count": false, + "auto_keep": false, + "string": "PO-R-- " + } + }, + { + "id": 2, + "name": "Throughput_Performance", + "value": 136, + "worst": 136, + "thresh": 54, + "raw": {"value": 108, "string": "108"}, + "flags": { + "prefailure": true, + "updated_online": false, + "performance": true, + "error_rate": false, + "event_count": false, + "auto_keep": false, + "string": "POS--- " + } + }, + { + "id": 3, + "name": "Spin_Up_Time", + "value": 134, + "worst": 134, + "thresh": 24, + "raw": {"value": 222, "string": "222 (Average 222)"}, + "flags": { + "prefailure": true, + "updated_online": true, + "performance": true, + "error_rate": false, + "event_count": false, + "auto_keep": false, + "string": "POS--- " + } + }, + { + "id": 4, + "name": "Start_Stop_Count", + "value": 100, + "worst": 100, + "thresh": 0, + "raw": {"value": 12, "string": "12"}, + "flags": { + "prefailure": false, + "updated_online": true, + "performance": false, + "error_rate": false, + "event_count": true, + "auto_keep": true, + "string": "-O--CK " + } + }, + { + "id": 5, + "name": "Reallocated_Sector_Ct", + "value": 100, + "worst": 100, + "thresh": 36, + "raw": {"value": 0, "string": "0"}, + "flags": { + "prefailure": true, + "updated_online": true, + "performance": false, + "error_rate": false, + "event_count": true, + "auto_keep": true, + "string": "PO--CK " + } + }, + { + "id": 7, + "name": "Seek_Error_Rate", + "value": 100, + "worst": 100, + "thresh": 30, + "raw": {"value": 0, "string": "0"}, + "flags": { + "prefailure": true, + "updated_online": true, + "performance": false, + "error_rate": true, + "event_count": false, + "auto_keep": false, + "string": "PO-R-- " + } + }, + { + "id": 9, + "name": "Power_On_Hours", + "value": 100, + "worst": 100, + "thresh": 0, + "raw": {"value": 102880, "string": "102880"}, + "flags": { + "prefailure": false, + "updated_online": true, + "performance": false, + "error_rate": false, + "event_count": true, + "auto_keep": true, + "string": "-O--CK " + } + }, + { + "id": 10, + "name": "Spin_Retry_Count", + "value": 100, + "worst": 100, + "thresh": 97, + "raw": {"value": 0, "string": "0"}, + "flags": { + "prefailure": true, + "updated_online": true, + "performance": false, + "error_rate": false, + "event_count": true, + "auto_keep": true, + "string": "PO--CK " + } + }, + { + "id": 12, + "name": "Power_Cycle_Count", + "value": 100, + "worst": 100, + "thresh": 20, + "raw": {"value": 12, "string": "12"}, + "flags": { + "prefailure": false, + "updated_online": true, + "performance": false, + "error_rate": false, + "event_count": true, + "auto_keep": true, + "string": "-O--CK " + } + }, + { + "id": 194, + "name": "Temperature_Celsius", + "value": 100, + "worst": 100, + "thresh": 0, + "raw": {"value": 33, "string": "33"}, + "flags": { + "prefailure": false, + "updated_online": true, + "performance": false, + "error_rate": false, + "event_count": false, + "auto_keep": false, + "string": "-O---- " + } + }, + { + "id": 195, + "name": "Hardware_ECC_Recovered", + "value": 100, + "worst": 100, + "thresh": 0, + "raw": {"value": 0, "string": "0"}, + "flags": { + "prefailure": false, + "updated_online": true, + "performance": false, + "error_rate": false, + "event_count": true, + "auto_keep": true, + "string": "-O--CK " + } + }, + { + "id": 197, + "name": "Current_Pending_Sector", + "value": 100, + "worst": 100, + "thresh": 0, + "raw": {"value": 0, "string": "0"}, + "flags": { + "prefailure": true, + "updated_online": true, + "performance": false, + "error_rate": false, + "event_count": true, + "auto_keep": true, + "string": "PO--CK " + } + }, + { + "id": 198, + "name": "Offline_Uncorrectable", + "value": 100, + "worst": 100, + "thresh": 0, + "raw": {"value": 0, "string": "0"}, + "flags": { + "prefailure": true, + "updated_online": true, + "performance": false, + "error_rate": false, + "event_count": true, + "auto_keep": true, + "string": "PO--CK " + } + }, + { + "id": 199, + "name": "UDMA_CRC_Error_Count", + "value": 100, + "worst": 100, + "thresh": 0, + "raw": {"value": 0, "string": "0"}, + "flags": { + "prefailure": false, + "updated_online": true, + "performance": false, + "error_rate": false, + "event_count": true, + "auto_keep": true, + "string": "-O--CK " + } + }, + { + "id": 200, + "name": "Multi_Zone_Error_Rate", + "value": 100, + "worst": 100, + "thresh": 0, + "raw": {"value": 0, "string": "0"}, + "flags": { + "prefailure": true, + "updated_online": true, + "performance": false, + "error_rate": true, + "event_count": false, + "auto_keep": false, + "string": "PO-R-- " + } + } + ] + }, + "smart_health": { + "smart_status": { + "passed": true + } + }, + "smart_errors": {}, + "smart_selftest": {} + } +} \ No newline at end of file diff --git a/webui/sampledata/sdc_smart.json b/webui/sampledata/sdc_smart.json new file mode 100644 index 0000000..d8f58bc --- /dev/null +++ b/webui/sampledata/sdc_smart.json @@ -0,0 +1,315 @@ +{ + "device": "/dev/sdc", + "timestamp": 1755340242, + "smart_data": { + "device_info": { + "json_format_version": [1, 0], + "smartctl": { + "version": [7, 3], + "svn_revision": "5338", + "platform_info": "x86_64-linux-6.1.0-37-amd64", + "build_info": "(local build)", + "argv": ["smartctl", "-i", "-j", "/dev/sdc"], + "exit_status": 0 + }, + "local_time": { + "time_t": 1755340242, + "asctime": "Sat Aug 16 12:30:42 2025 CEST" + }, + "device": { + "name": "/dev/sdc", + "info_name": "/dev/sdc", + "type": "scsi", + "protocol": "SCSI" + }, + "model_name": "HGST HUS724020ALA640", + "serial_number": "HGST123456789", + "firmware_version": "A21D", + "user_capacity": { + "blocks": 3907029168, + "bytes": 2000398934016 + }, + "logical_block_size": 512, + "rotation_rate": 7200, + "smart_support": { + "available": true, + "enabled": true + } + }, + "smart_attributes": { + "json_format_version": [1, 0], + "smartctl": { + "version": [7, 3], + "svn_revision": "5338", + "platform_info": "x86_64-linux-6.1.0-37-amd64", + "build_info": "(local build)", + "argv": ["smartctl", "-A", "-j", "/dev/sdc"], + "exit_status": 0 + }, + "table": [ + { + "id": 1, + "name": "Raw_Read_Error_Rate", + "value": 100, + "worst": 100, + "thresh": 16, + "raw": {"value": 0, "string": "0"}, + "flags": { + "prefailure": true, + "updated_online": true, + "performance": false, + "error_rate": true, + "event_count": false, + "auto_keep": false, + "string": "PO-R-- " + } + }, + { + "id": 2, + "name": "Throughput_Performance", + "value": 136, + "worst": 136, + "thresh": 54, + "raw": {"value": 108, "string": "108"}, + "flags": { + "prefailure": true, + "updated_online": false, + "performance": true, + "error_rate": false, + "event_count": false, + "auto_keep": false, + "string": "POS--- " + } + }, + { + "id": 3, + "name": "Spin_Up_Time", + "value": 134, + "worst": 134, + "thresh": 24, + "raw": {"value": 222, "string": "222 (Average 222)"}, + "flags": { + "prefailure": true, + "updated_online": true, + "performance": true, + "error_rate": false, + "event_count": false, + "auto_keep": false, + "string": "POS--- " + } + }, + { + "id": 4, + "name": "Start_Stop_Count", + "value": 100, + "worst": 100, + "thresh": 0, + "raw": {"value": 8, "string": "8"}, + "flags": { + "prefailure": false, + "updated_online": true, + "performance": false, + "error_rate": false, + "event_count": true, + "auto_keep": true, + "string": "-O--CK " + } + }, + { + "id": 5, + "name": "Reallocated_Sector_Ct", + "value": 100, + "worst": 100, + "thresh": 36, + "raw": {"value": 0, "string": "0"}, + "flags": { + "prefailure": true, + "updated_online": true, + "performance": false, + "error_rate": false, + "event_count": true, + "auto_keep": true, + "string": "PO--CK " + } + }, + { + "id": 7, + "name": "Seek_Error_Rate", + "value": 100, + "worst": 100, + "thresh": 30, + "raw": {"value": 0, "string": "0"}, + "flags": { + "prefailure": true, + "updated_online": true, + "performance": false, + "error_rate": true, + "event_count": false, + "auto_keep": false, + "string": "PO-R-- " + } + }, + { + "id": 9, + "name": "Power_On_Hours", + "value": 100, + "worst": 100, + "thresh": 0, + "raw": {"value": 8760, "string": "8760"}, + "flags": { + "prefailure": false, + "updated_online": true, + "performance": false, + "error_rate": false, + "event_count": true, + "auto_keep": true, + "string": "-O--CK " + } + }, + { + "id": 10, + "name": "Spin_Retry_Count", + "value": 100, + "worst": 100, + "thresh": 97, + "raw": {"value": 0, "string": "0"}, + "flags": { + "prefailure": true, + "updated_online": true, + "performance": false, + "error_rate": false, + "event_count": true, + "auto_keep": true, + "string": "PO--CK " + } + }, + { + "id": 12, + "name": "Power_Cycle_Count", + "value": 100, + "worst": 100, + "thresh": 20, + "raw": {"value": 8, "string": "8"}, + "flags": { + "prefailure": false, + "updated_online": true, + "performance": false, + "error_rate": false, + "event_count": true, + "auto_keep": true, + "string": "-O--CK " + } + }, + { + "id": 194, + "name": "Temperature_Celsius", + "value": 100, + "worst": 100, + "thresh": 0, + "raw": {"value": 28, "string": "28"}, + "flags": { + "prefailure": false, + "updated_online": true, + "performance": false, + "error_rate": false, + "event_count": false, + "auto_keep": false, + "string": "-O---- " + } + }, + { + "id": 195, + "name": "Hardware_ECC_Recovered", + "value": 100, + "worst": 100, + "thresh": 0, + "raw": {"value": 0, "string": "0"}, + "flags": { + "prefailure": false, + "updated_online": true, + "performance": false, + "error_rate": false, + "event_count": true, + "auto_keep": true, + "string": "-O--CK " + } + }, + { + "id": 197, + "name": "Current_Pending_Sector", + "value": 100, + "worst": 100, + "thresh": 0, + "raw": {"value": 0, "string": "0"}, + "flags": { + "prefailure": true, + "updated_online": true, + "performance": false, + "error_rate": false, + "event_count": true, + "auto_keep": true, + "string": "PO--CK " + } + }, + { + "id": 198, + "name": "Offline_Uncorrectable", + "value": 100, + "worst": 100, + "thresh": 0, + "raw": {"value": 0, "string": "0"}, + "flags": { + "prefailure": true, + "updated_online": true, + "performance": false, + "error_rate": false, + "event_count": true, + "auto_keep": true, + "string": "PO--CK " + } + }, + { + "id": 199, + "name": "UDMA_CRC_Error_Count", + "value": 100, + "worst": 100, + "thresh": 0, + "raw": {"value": 0, "string": "0"}, + "flags": { + "prefailure": false, + "updated_online": true, + "performance": false, + "error_rate": false, + "event_count": true, + "auto_keep": true, + "string": "-O--CK " + } + }, + { + "id": 200, + "name": "Multi_Zone_Error_Rate", + "value": 100, + "worst": 100, + "thresh": 0, + "raw": {"value": 0, "string": "0"}, + "flags": { + "prefailure": true, + "updated_online": true, + "performance": false, + "error_rate": true, + "event_count": false, + "auto_keep": false, + "string": "PO-R-- " + } + } + ] + }, + "smart_health": { + "smart_status": { + "passed": true + } + }, + "smart_errors": {}, + "smart_selftest": {} + } +} \ No newline at end of file diff --git a/webui/src/assets/icons/android-chrome-144x144.png b/webui/src/assets/icons/android-chrome-144x144.png new file mode 100644 index 0000000000000000000000000000000000000000..f44f6c2c23c25ce3afc8b56f5cd4989f2e73942d GIT binary patch literal 5687 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 literal 0 HcmV?d00001 diff --git a/webui/src/assets/icons/android-chrome-192x192.png b/webui/src/assets/icons/android-chrome-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..4f069c211a68f2a3f86264e97e7d4823e2ff896f GIT binary patch literal 7854 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 F{{p};ACdq7 literal 0 HcmV?d00001 diff --git a/webui/src/assets/icons/android-chrome-512x512.png b/webui/src/assets/icons/android-chrome-512x512.png new file mode 100644 index 0000000000000000000000000000000000000000..9665c48511eb376b598b8d7835f88bf7247fcf99 GIT binary patch literal 16001 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 IZFc|v01=2M8vpBE3qH8oGcKsY(?=IubxY zO6a{;sS%KGJ>Q@AeP_??Jv%%1-m`a}=g!@U(9%$%ro2Z90)eQJ$_Nx7-~H?4*Ma+* z;$l4@NNt{|KLLTN;%;1^uK~{wER<2|Adn9S2ox9$0{sDo0@pzxcQ^>N`2qxzOa+1H zov@ACQoxJr=Bi2v(AB>yr@1H*7@=@dHgE-jZnppHMBR=bErCHYH>A1(*#`M7Dkxa) z7$pw^-629Ep6Gf_?qu4!(T%5tW*g0*?96T{KixKu2US7Y9#Swa&~h%}EV0s6nQ94) znjC4-v>6PKyQXtZ{K7@)O8xm z156RMJOz8f&|39{zwzW{>=W=#2U2E{#TV$(uW#O>*#V ziR|HZakts6mus5hYyi`FW?rQT_GJEyY zY4JiT2yfWH+}|>W>2iq9VP^Abp)413U!EtSyr2_3@`&|OGOtrbCRxepo?KpfyspXM zQ5o}5(-8uKqGBTu$rk3x?1!eKzK;996^(i9eQwArQ}DItb?}l7C3qpGrbzjqxwmD^ zFBmIF`TKiHA&I}b!mSV#rAcu1{eXp!nZjxJ zIax)vEl~((mUbvAQpRMhj=$gSGd7K=9Z>ux2xt^Ir?^Onjg0wB1ckX z#j*+Bgb(cO?2X9#k+7#WX7`IE9bC$GcryK(DZugIi$z#XZ*$HM%WIyBi%v$Qj9{HR5os;Z6m0_oi~ z`h@q)^KRYhrm`bX5Bs-n$^h-%L#p{>P`7Fy;8cv1o@OTLb{)b^Fcll$ z&-;buHv$hqT_Qb~`9HN(M8O}6$B}Vpe1Et8$F=)JZfwFt)|O{b;1dV$8MRBIR}$)I zU9v)iWjCDh1-*0XLU8H5ykf|j6rB;@oV&<)ICX<7ZP zI<~=k$yj`?YVuF%s^`R{TOg|+i2vqdug1;&#cD$tZK*B)v7_LhNsvjph9y$V@OSUA zxXIu5o?q{_u0t3R=Z;cVWJ&h^k@wx$-inIy8oof58K64pt@}l%T(TFn1MkWoGP6IR zxEC^)-jXzk<6^nE%if4SjUd43nqXL~oo_S7%`^5*UTh2{vJI8kihh$9hRpKYRTj4S z7NnL2+h(bvDFLZD*hBd<^*E4687X?5kvNg?6%+@mFy0N=Ov?-tBu86?{XP z{w*@i;B{G9z8g+|JVHq)vQ&DeY^Eh6b8Rpc922uc52gx^)8MxD8>Q?j{LqORynapg z$ca7oACi$83n9Pny^7>$;9aEjOrzOd8BI=Hy-wQH34LlmWNBJ%h}8D6{-CfY|1=7n z>Dxxi24OqLV0;&ZWLB!f`)+H-$+X7BG0&&;?>(59ay48uNRZ9qA3av<8+dY`!*$r* z^#Sjq&({ypoImb{-gRk0uUAh>ykNLE(x;V`9us*@^V^gGf@2j<<`+H2v99LIu;p+y zUe({|`NJVCQjjXDTB3Z|#JNaGPY}qMTj*9&OTnL9B%|T{kHY{je7*N&%jBC^OcYe7 zuUWdcZ}DvQXsUX~c`>-91&j~lLf-;lsGGAI>&)STCf?^a^X`^%esoo0mj^eYDzsjy z%q@vEXs|GbvXXnI4OV(wIh3DF>Bg@|q_i9I$%GILw8|@;R-(Fh zG{Su@k$FFp7Wdz)N=;QJx@NM}HsPLY>;r*h<%Th$Ttw0b?>2|gk(FWkb)u3F^w4SM z;x818Im^u~)Z1@rOjpiXi6NAa&k4JWDy;mOQPmPX;l1+J#~SdnPlO-a1dRPa+s6dI zh&GqBL66!Dn5!Mec-6AMyKYrrC88l}pZnZ3C_U0&!>TlpZ~SPXSXiG0H(rmFN=E?* z?!0mCS+muKudm0YqcHZn#97Ar8r1@g%j>tUO1xJSX~zMY^7RQU7DO6$6?Qo^bVt4G zn;!4}BTsz+(|`%L(yOj^&CF`?{DJj|5p9G%arS^Qm29SFWirv%*gvXow{nndtw^6E z+NO^KWpib9p7z-R9PLn-3L?>A3?;YF8995Rz<=i&t?}rgKI~94mUW@1J9Ywwu}ckb z8Ws`L9TkKTNq@;t{;UEI(r>O$2rC+Bl`{rA8!Ups{s+5)rnZvGapm3YEzhL=AsHol zLV{2`{e*mZg@tzyaX#c`nKgkeY0`5i`>qp{ENa0#^PWW-)dyN{cVIQ_Sqe*(c;jZC z-1e`~yvm=CWb8RK1xg;U!@wQ;IYAEF1BW(V4`X4jwhpXDuQs_=_XlW|sL-M0&q8Ru zs`8Qr-{_9xd|SW12`e{V#CM(5;~LR$cHRv2(c>g~I(7_;Zd(|92A-NG97_GnU9JBI zvgZ*i_4AJ7qMW`92WDey6DrCPVXuZ)?C!K2Qwhv0JQOi)RN&tu!v=Z{LF`LiO@(V! zwa13ALnCLWG-~i~;^MMW{qNm{8lE^vV=x65Mt(}ENX_$EM*+8johQBB>5jE0V0J4! zeXXyQa1=eP^%%QvB|JzRcgWmB7ni-qXV|sGZWY`3@U-o=rjptHEt;K`QJs?}TqrrW zjBF|Wv;Bf$@7O4fFAUiA@FG`o_(SPL-R$i0H~w^QJ(^%owSBIa((C>9LNX#@5%p~* ztDn@*34@+-B!CGdusf{@ENmU#T^bkZrar7ipc~0ot||PhN&M9#OS#t_I=@@pofjzTU+#=FbRj-a zja7VWuiiqzM|P^8q9SZ%%__mj0w2PFs{K{-OMZ#bEae}WzBgoN?;;O zqQ$-}GH=AuFD(igEf(`(TMIXRIBYmLBqTqGEmhk~A3&z9{0q@!{mzDcQUR}tj9xt# z6t;=B89hTPJ2G_*-EGFgWD-}S7OJcUXUo%$Cj+hc+omRjs>t(O)6 z2FR!{0SGvZAw-$zwJbTj6igCv{}PDHtBBlL)9miIdaiP?GVEPus{15T;7_7oG>wBUUP`C#7 zTYb^tE>)l0KAt)Q0QI!5&h$yd9cBV z!!gqGNHFd(G42Y~iCDu{ybdPavCrw3Ms2pDBKkh~h+U$b`jtF^9Wz$nFz%<2B9br?iH6t3#WoA|L157}if&^k8+nF`z=6NteiB#HT*y4i zm6`U5*xSZ;J+{}g2M?W_tOf+E#nsBHnNV?9TUOb6OZVO2Iz{Ed90v5Qm@A(ZbSC->D;K&?f)6ZeDmggfTMHEV$EgU*-8}xN@UH}#K_jog&QKqo}Q7U^nbw}IHg(eGi_Lx z*`(~dXg-(sFq7)rl%A3p^>^)oP&VM~^$bQTp}#WlAy#TKU<Ni?J$ z-)Ywo8}5H(e%o(6^qRuapR~JUBHPPtp9W}fHhc$eG*p!mH(`e?R?w7+4_p>rKNK6& zz9Wx*9w@nw-eL+PZ;`!Z4JBvd*-DL1Wcraw5Q*86t|K^)5KWn^?pMcWgf+bWkP)#G z$USw9^ex0^2bbM2G1?1cVl?3_g3V4wWBTP1r&8R07yhnWMi^K=Si+*K`iu1)SL5do zCpB=aT#a^1kO!sl;rrcodS^v5j&N>hlx23@VVz_Hew=nX!_v{k&Cuf}fNcY;*?MDt zfXCt)E7vcrg8kg}QTOzzinpl?`8$ggyi5j0%h3R(gByN80HZuP``6FSAN_jCMU@;= zwv^l3`Lj~e(u500YItTaw)GB@s1g!k^!j5-o0nO z+{Q^r)&0T)d>9C){Woy-Iqj>iwrY9%KmTC*kdTy^3v}h{4>LyoijSd%WIh4-9wdwl z_%g-egy-_X*I!l>`jSYxp!VD6N2b0C|S%mVO_!*kR%KG>>3yq$!<@(5t93D#MH zeG?3z5O(c)XSp==EkBc}ecswpK&jkxRh%=ZGpHj~L42<_^+?+opwPb1}pSir8-rQ@KgY2q_B2uww3TPk24$(F6 zHOp`~KX2G%9`d4*Q2%L7w0-^!)~``xYiIXtc1Sz?SOoeEbPJ48IT-5gT)vLVTYrO4 zJ~$^#HQcbRcgs5bUXx{i^+Hhh)(HbEg4859G6*8`*fo|Qy!-7^!lfBr07vMj%Vwn{ zkD^kuz6YX%lMTG0rOFVstWwc#CM%R2R+edFD#3Oa_fJAqxMd`ogTE%}{$1ITXKr+f zFaPVWiGbcx=XN0`+T_$&nYxi8DBy@SpgCn7p%3`@`P9Ue?weDy|FG`e7~XlUE%w;Y zrmHTV^dzD2>x0{ZYQVP4VP#!amJ=RgaRZm{9FAcqE?|;{gAmv+hHb;tZ-L_(8gFEqb_2RR1(J&Vz`=KgW!F^f#KoS%8ygXt(?5!yOhM;+#DwHsSmk zbZNLx=I9b<+S9(|=SJcS`uu`>Pw_>ZIGgu0r*9G}Mul6X9ZOzEl97a>r=1a^v4KM9 z->Azqp&4El7Z-!hF8`W9et!-(R(69*VDD)NY_S#e)?q!Aqe~+#QO$Yl2&Y6}RGqVlUF*Rw!=8-QA(Zy?AkomD2BU z@47$kx3W%VWioqa&Yow>vnN_ZO#u(*1r7)V!c%-Fs|B=mPY)Ib@GUlu@fK*%Y^7AC zK%km<+y^K+@cX6ZJ1tcZ$d?%e3JwE-?t!l0eGupa7YKA{0RjmlK_GIM%oa^i;13L# zvVtt=-_s|z{c94?gYELp&>aNA?|phu2I0k4Kqsb$qN*I`0T$tNh#-~8pZ6dTm8+tx zl#ch(ah8ua>0ZF8#3}VbW}J`e8-rpGd?*6!LnNqJwy$`?%A{jY{74?`o5 z7r%snVChAS%*^<{4e}yG}p8?_3WWcZDXJwRsce zOh!goJyS;w!u|rX<8aIji!wodY}7jR0aW`na&At?A~;uu-JR@AhUm_{Fd2Fi?#L_9 z4Nf#iB|xz)Pgw%(pPUTvj(Zas;@fdM!cd+ykr?3jd3kv~%Oh=RZKW#INs4+G%5rEjY^abr z&&*vfg|&jaIaf7Lvt6a2e_W3pyy-7-p!zNFEgCKZ=K!jOQqRk*Ue0)$xbJ)xSvkkB??p>imAg}1%ay$=@~;%GE>)1UBCgM)lr=z;`& z1)HMQZVk{06Wd)%8b9mf*SVE6lFP&x@g?j<;mT*PzNr~|46c%XXHBV zmjcXtr5X2W2;MWV?65Sx9?{5eS^dmYil&k@tKWhl#tD(SNwaa`vAZ$FBjWjKG92Mo(Ce?$G&n0winYbc9l_NDW)DmcrQ@SaP%tDtv$fTV#*Ri>`_h+L1OtR zvia8+hfS(vNqI`cxJ=+T{cIrtspakDI#c%<=s5NS!YoI#n0 zNp-}$f>&-1kABPk$?4$B7C8Alwh63#qZK&cR&ditJY89hzrb)1-mZm2r34U2`pBE&CH82c(2;oQxCEeNt?A)Sq zHNe(ZwY)(%WsUINJxrs5Ya7>;Tvei4Vq%{bH#S|8%aBE*Ca+#bh<9>#%IQDjE;X(&n&5S{jX7zxcVGq0jz{}Q83*pZ0Z;52Tc_NL(ay&hvdO8x z?E2^Ljw!L+DNveGx@mz(AU@q0MhJHZe??Qb5*q9NgVIJz;2J?hN}!{HyR@V@uQIZC zFv4VYPwe#1Md44NZgJPv>H1o4{Q8ny&N!9X=$v0uIihth8UN_m``ed-JmT39emP`T z;xJ%qMTJEqgg3rC7>J+xnCrWKtr-W0r;U7_^0H?yXlYqF_NWT2`=|!0*W#w@{#xoy z6=9K(BzZTKX7>vvt+c--dFUcNqf=P3{2n)+d2~=?3Mli*2}F|VML6$n`eSSdhV#q4 zL&WSY@9?c?X+&XH;$=#@pz|cdE~70)7u!B+XMHZ%+IqqH<6DR24->uDl}tk7fwH(t zXYn60E2kjRnQw2){(F1!>XmD|!m|+AdwYrgZR2_O+a4cL{?vBEjI&AgoPHkN--&a7 z@Z6-OH&0o`*q5`%Tu#KUxZpXOeg6y$KEkQJd7l@0-#i%7uGeP&i1SETf1#6I zW^VzL*3waFcWst7rj5OCV=FH&XIK^KN$K8v{s~pQ=EJjbXBMaNqHozjzx({n%ANCH zGI2O$xIE)~)U(qLYfdvPFMS_%*y{oLG2&m;8e_Y*(AQ!aS&*H=ucJb=Yr9k3P#L{Q znWkx?lD~|>z>MaMNXSSYD=qaUvr+ZGIZx$8oM6KF1iy!FvbKi*{jcPP3KdHm9c{ytv>u{aF>6z5Kr1>U8 zG=+tHK5_SV%a8YDjMV54tBEq@OOL|jzQ?hsMmB4Rix($IzI(Vl>HT2+uwoGw6G^S1 zsVSWrp;rNt{ucT|>HI$0vV5f>v4K6S;ZOSCY(ZKhgW-7udD!T@{NH=mQwCGCaQpv+Wwr1LGuDnwfC zX4xht3fn(R3Tg{Har88My4`JkoJM`Gg0AYDHrRl>bYbTY8@bYW zl^-Maf}YzPM-Cos!9V>Vb>uh4W1Ku9a~Sxujum9N)`dO z#qThD{x~mr@D#E8&KJ=ib9{?N=axHu3eSwuX$X@-k^v~c&lThu{SCv98dkqK-h|T- zqSu)eI3A@VleoLDZRsvEq_x95s&YSu$nGZSru=Tf5l^qf;~fE=7%*LJO!p_p^yH~hv)Aw za^=ENw5l#{<7`(JwwGEGE~;myJcAX(o)wn|ZdK2L_5b)y-E0Tv$o*dAXx&fTAviKD zFT<2xP(OHuodHR<-Meto6(b=j(2n1geSNd?(Va%L<2T=OL9kxRgC*c@40V1L_rS^w z4aO>_P`J}l(XtQ#x2?_f14`}rwIQ!hsPcj-4F!$aJ9BsVvVbHtCt03J1ocDv~rqd0e zQCSr8h31qXpMSZ>nv#WJbGBET({kS#=fEvqk6q1TPI>gxVpd0RiFc}FQDCC7csyN~01oX*a? zJM+fI1s%&-@?MoB9;%UJ-lZJdcv0Vs8|77l#4EHrJ=rP|;J;Xkq+57_{#b;ulFC+iy1dy+eaf*j%l-jD0tMY<<|phY9EeKAIKfk)NsH+wC!X zO$*D)MU(1MO0VqABznI4EY;j=!27ybHwcUyE|tK0S_C(~KmtH8@n)~X2lu=Ql4Byr z@tI+3dZ-9%*zAqY&0Qhcg>=+}d z##-%m-DF?e9p#x$GJ%)lFYgUtWJG~JXU>6BupqDoTYuKKy>kN}JVnD(sj>upr6xQ`%nAM!^u7Q=ugY+s_93Jix!TN+sfi}D9>>{@ zK!45cg?WDm9rX-+?+&;qXvpLw;J#P*$J-AY=X-VWCXc&_-*?(y%mlOMX2H~=Z!Toz zXo7^@C-~;~Jx#vTE#YGT;nme82eA4wF4$fEtCMW)!zGgoDpx+O{T?=hg7L1n+)g34 zs69`oO&GkY;-q<_ZpH27jjPw?NCpuHeVmAtF;xQIVEje$v;5!)t%v@VJAX$gQ=s}v z6ZjIzeA|jA!{#Z>h=b)a2!!a4rc|rXUa)pH;m?-)24$Nfd&1uSWq&m#QN#rT$bfLo zG`mOF3BxCPc&&3w5U{Wpebx1`lUX$4NO;{HqBq-9@R_q3I0w%K02aPh0;<^~?tFME zDk`48_xIj$>v)8$6Yaud7X5NvoDF-lYS`f#Ch$^2s( zkiXz5b-#QH0wrwrmE)5XuPpUKNI9hrPxl%X)^^O-M20XwbHZ4M)YbAJET7d?($rjS z$j&1^M$5WR9S>Fa`PT>-;NHUd+=S-;b_2FRIZ~xaR!vxn^*kcS&NRa;57Ga-~`tYjG`%@>e z-}D%SGy->L6u`D-*2v5pob%QP^!;3DEx8tpmkN)kzw_BM5;O{<--p&h8@vrcH zY*OZbfgg8FfTu6F3NXChsw&I*gCx!6elvnmvBrPDC~4PQvb`oe7qXo^fMXy?PTl6q z6!95h>ytIdSDu4s35^3X1%-d-ilfF#(M5d^P}QB5yCxcv8st$@wERD)v5k(FzH>P+ zNt=Gj?100ed1?>0ygNGbK2kB(k)w%2H9N2>Bt@^&90LK?hOf?9$Ib93?&Ux^iC0C|O-IdpYSjeu)rqT>5WekQHT(5yJj%?&8JFFAL!w0K?cLuRBv z6_w|G5z~tJ?9ajApf4x2P-OCKj#PYG|dD((HAlqutC?4YD{* zo28($7l!@)S2h@THdXX*E6e>_?g^pNNnbk*1dUm!`E}x*5J?{gdVEzEuHt*CCiN_R>z;0LD2vY^~}{5^jHzCA!0Vg(HT8gn%QN)k)Q- zhUG1z$vl#=k<8)t2jwM>Fjuw8_ZU0_c2Ww7!AM}HCjcs67NHrZ9oTSLA}p6F`d$=a z89vJD>CU^4&PiwGKuLVV<4}vRO3dD@mlSVb_dq0L7CEUGh1gQL6cu#*gZGEUAZSVKJ0-g1LCB-S2$L-u9^P~@49hb;q3uJbaEEd0r(w1d;l-hkXvxbdsJkE^@TA$xp3BjUPcDGA>xa^EgQw(!i`PreQQ8pfnma zJ1ozwP-nB<*Opsx4i4h>5+~p&?>dd1g~dsMTMk8jH8=ggQiYj%HbQsK+dQwrssKoM z`)5;>htKZnk(LxPatfcg+3eUCi|sFXv#abaw6xx$aO@)GWAz)en0C_@lYD9_6GOma zJ|lRamb(zqTmlR+eD$$oYLj#9-;}W$P^oO$fz&%VYQ-^AYfbJOpa*_AD- z8rW>7ov=Tg4AG+&32h~}Mxi<1BR(eirm@j6NUpQ~I0X#B^@b;=6`|C_^8-GR8>08hV2_W1BNX7**b~P*s;gv@ zJf%@sD6@=j*uqm%l#z+4M9+JkUwFpZY1=8@0DRX!N4?tNkIi+C7)kwYt2_@O3L5mi z4H-Lo>e&HX-lD+s%ElTl|tnCF<@_>*~;o1`un1=BL*{k!PdB$NJZ?;P__DUh~3onOp@WzmgPC z0){#W7m~OkQ`6-$-&V#gP|4<`MpTftu>VI_+d)T268{#NmO4>>^_(W*hb-Rc3oiPV zYe7`*XC5eh;bH#N`{->%e`luNaE01_`$K7GqV(kiTB!5p3_8T{6@(u(gxw04ETF`P zxS7b}qf$UZ?9=H$RL31$u{MIh?Zm4>aSbKt?ccy;tpKHxoalFvtK?s&pNA*d1TjMb z#B)v^Ec$uJ$Gb+uR4ii$4x*y4+g?MA%d03sft_@{T=&UZ>zHQPG{w_`lq9$4X92mB zr#H`@Nw15EiGgS!wbZvnF2g76KkVLjF%jJ*Y8?VwQ-H(aw^VeOF=1iHnBsW;&x*+s zJqpXT`1px&GBe2&oq>ITIx$-U#Mk)-P4&M3Q|Vc88Okbsl#`@SC{4at2yjn74~;?# z#_fU@&T$gi12;<;x5Y^Mo|XKG2{ln#byjlYs=4$UnGmQXHX7=G$;nnXJOBGS>;K$w zHAVg-U>P($#M0q=2HeLndB_=fSV29kg)QBzfd=%J>n$G#mmmi>zYh0XVICe~K7MvC zE@3V%alTB~|4+afZe?%d^S=e&3iEOOUx8j<-(f(2@@WNaxQ&Mw)Xf?M+(B{Lzjt)E bgt}OB!rg2$PDEb-gFuRMYO14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>OI=-hJ=(o_n`<-Ma-;f9&yt z4`09h`t=KF%kN*mWoJ*|n$*TIsnu%v+=*w7Pdj&V`uS7sCk`pjnaDY*jc-av_~z9P zD;LPj>epR39cbpi-@pI<`t|qs?{7bT)EwR`Ftw9sa(n*1?eD*S0lH0UW}ob={`EJn z{{Hpr=g*(tethpdd022-7uV#rq#YYyefm^(aF_DjNmI_An04W_*o>aA&8we$c>nt+ zNHx%dYj0fn^zGZK>z8F`_j|2d3iKw>Q$X(novk`=GW*2VYp-79?cH|$)yrd#AL=if zVYYPknP-pdj_i||(Yx-(Rht#_bQeuO^zeSe(f!<$+l8lfZ@+u9>DU4J*%Q{>xbpkw z&mTX3wj4hwJ*!WAMh`ID{`~s==hv^c;|E2j_vkE~-h2A!jPs{woIf?~{Hf@zYk}dz zK2bOs7-woFL4Ltf1_n~QUcCf^SG%4g1BmdeT~dZpZI=xcfI1kHyxm=x(zt6;O zkH}&M2EM}}%y>M11xS#+#M9T6{UwJ0kCJBLo7;1MLN7gC977~7CnqGNI5G8{;n7)> z^G0S)PR^W|H*aF@*zDn{$$BL$*;g=sTVrp*zWKa1_jZkFZUMjWXwX=z8(pIbEhaGermjha1u zy?i*sv)vZrUCgXGHeFrbF3 zg%}!H85>)fnrRytSQ!}Dna(Lh(U6;;l9^VCuEEI4)BvL4a8=bwpaw~h4Z-BuF?hQAxvXz82&Xvh$MxGO66YEP=+HVx3QHhan&cpEFT{o;z^008W_Fo)j+ ztLjdQLBJE9k7@^tu!r#tV*sd3lGt+HyED9Re)9$Zgq{X~r%?c~0YXoi0PqM30P`*Y zV1NgJBZ#a9TSEZY<7Q)NZvqn5cVly7KUil}Ih(;#7g%1u|#N!Q55{+x@o ztSIbf&Q^~ONvFq)r^ZO6#qLXuk;5ezza*KJ<(rj0H!Xdxnw6qLNIr~D5KW0r?rJX` z9+1YwOQyx{$Hd8E(J5UWD;&-mm%Ga4vUt3)#f7USB)9s?KITjur8T&@k;CKt_}mhQ z?a@$u@6D@u77H}kG(IMSMTw`yIKD0i|HA*c2&ibE6d7+B=fTT(Zz*+=FBld@};7j{<+zKx!DW(nPfU`Xr4K; zFn=OD72F5r+S=^e>Z_5@y|dFg`I&l!S$YLoM>CUZMu(|WjNJa7>`&dFYbyA-qAV(7o$s@Xn}e z5d_%mLzw>-002_0J1NxRTjU0UqJb7SOho6z4oIFjhffMG2KQOd0&Z-t-x;08za^`! zM23_zG^K20t{0=Q!ZyDP2fRU~6vc79n)FeoT6vLo5NHV{Ix#o*jUPH}MQ|%)jC)P1 zBB|F`5PlgMf_n?e)nG6hAFarsiA{{Br%1@0ca=<>i_kY8&!DgdvbI;vNBMfIIuEx5 zWj)|_cE*8yRaF7))=)e%RaT5vpT;UBXBsJJpduv-Ewf=x9;OqP>LS$Ak&xg-Nu5f^ z9<3Ahv0a37Sa~h=ySJ+-lCM1cv~3F<;*s&zQrIsS9ICn`=`6X-iMeYL#jA)xuktEg z@2f(NN9f0`JN;Ag$lU3BWY{5jp)bs-4IV+gxCj%@J}dx66*0zgQdo;K6N96MExzL< zBXZCKw5s3G@};oiN}-C8GnWr6SHSL4q?8QZ_CnBq))rP=)HL*;m7R=Uq}a+x=CyI6 zJ5(KPokxXWm`KjW2;)D}9p6T^31MKc3?i$O8@?uY zE4d`nhT(%1WqPk2?6(W&W;z>*4&V9URnZA)(|Z^cO!cL~_AJ&1)Y&SjntJ-k5LsdA zq$|e!>AfwY(zRmNA+(bb>kS1FTTy1A)STC`5TVDstq5y@1QHH7i{u#&Qk|6l>R3bd ztJe&bO#rnQ72;!>LP|t0C-^z^H1bvQJU7)V!YF5A#Sp7(oYmt;Pd15SsRJrTM}^;q zBWHTY3)NgKju~j4ZcWotb%)PW@cHd80tNhSh*F=@9c5|TX>hAf1)AIrbaM@KH@NTb z4i-QMs-vp~)z{L7*=y?e|bMLuPMurFp$O#Al01|pgm@$aZ z0}&Abwe^fB0fa-3bPRL=pejym*G3TZ&)Ol44FJIJX8;Hc1pqD>3j7KHULbMZ8UQp? z0YLT{uIZi@0PqhQ>6^g81kS$~o6QDIQ2)2V<#2YnTpkz1gRTGQ1Jd8__sHL*gWc~g zs6hg0V=ZO4FS4gCvZwu3e^=+?XBL}1xv_SmC<}rOhhV}*G2!PkFoYQrcs^JqZKPie z8zGL3kVuRaPmDO493zt&dn_eZGBHv(AlVUKPG>hD2PLBYvKJ++3?!m=VzV z?qO}IR8o`(Cd{;^c!$M`?d!Z%k~6cp@r}ouCvPIl@+|AhXSX)@c)UdlSuHEL>_KnrI%kyWqHsGbX(kU^i z!+qeK+dDg6#76PNNbRCG<7;23I}Ai=?(_B*28+dHvBJ7r4<|*d=cf;>EKzrM^vd$A z>noCndKI!$+7{;Kw>EhkZo&BIskFEYnb`W-Ng8uUzoI}n_x0eHr4rId8k1>QQTPvB zLfy<{`{MlZ*RQh1hUiS@-AX)ebYNt4GF@v)aCKH5 zDy4GrQ~vnq$+WoZ_^c0KSO2IhKaw2%w55(PO;XKE>swxY@|Lhkr?)T6%V#IQ|2%8k zQ0exrev3gLKIjMcQwFwnnq=Qt`x3`>5i?gn;{J6F%k`Pu#8ux8$Zkn6g-`_VUk0^o{S`KY&hynmH zbzNO`F`3M54x6(rd7(2o2t-kRD)LjmGyWCD|q^ncU9>S|%l`7h1+=e`sc6TMI$Vl__P1YL6mT8GMp2EvVoI$-=BmL0Pzlj-Hu7B)v~)Gw!>2#;{>^jds6Jh%^q#t{ zoT-y925$=MHwIq&Gy0Qg6nO?-5KEaV^N-7HvHi$To{hL@9d+d7#DjjHr~0RY*f00S zgSD*B@&zG6gy{3#x5Co`F5S>k=xGlZ_zCiSOytD^5vlbU-8x{`Reb32k167vV#a43 zb`Pnm7-pC?jOk(FL4D34@jddWV27^4yAJXOC(c29HdRqdSt3q;LQ90#D(s&B!_ftgL=jsa8~bb zR+-qkUzNSDTSn7}7CcvS)GU83ZM%&)<)yD(G9g^VCN)UlG@c9`xtubSA_^H>gULOe zvP1{gJvrtBb+zNi+qzQ!{A7K3l`Q3poODJQ5gS}Ie%IdcONGf9Gf9fQmY9~(R%yy~ z#kzQ4f&4rp2p6*b#MLw8htpq#7klo>%c*wzJWL;3`bAwS1h*{FRcL5If1|h5=I42M z7^eX3`EAbn`8R&Pjf=7|aYAaAO|jA*E0>oD6Xi#<>F_p*1?s)_L5tCP3bh2yk_+b5 zsc0F^MnuTg95riSHvJ8NkiH~vyL!1=FHO(5Y|^N(7loJngPocSdzro@+nvXivi;Ow zMJHEBMX&Ma4_jUR%=gdgWB6TK(s{WNmyRhVNCTg6^D!`6t|&hawW z>%X8T2FLRm`vbeeW>|LtpAY>9|J4OF+zf4RgLcrg^KbwGP=+e2DL}6(D5;w$DQl{z zXsW5pL!p{b=nXZT`~MK0y4gEB`u;ybSyK)AozU***9#JkA5=iOIikI7JRAUTZ*N6s eR~Jt^n`aJ+ZXS=)$yz7CBtQ>t2rIv79sDmCO#gBK literal 0 HcmV?d00001 diff --git a/webui/src/assets/icons/favicon.ico b/webui/src/assets/icons/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..385c3c8cc0b1002fbb10f61436b6f4fc1439655b GIT binary patch literal 1150 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 {