gitextract_a01nueng/ ├── .devcontainer/ │ ├── docker/ │ │ └── devcontainer.json │ ├── docker-compose.yml │ ├── docker-rootless/ │ │ └── devcontainer.json │ ├── podman/ │ │ └── devcontainer.json │ └── setup.sh ├── .dockerignore ├── .gitattributes ├── .github/ │ ├── DISCUSSION_TEMPLATE/ │ │ └── issue-triage.yml │ ├── ISSUE_TEMPLATE/ │ │ ├── config.yml │ │ └── preapproved.md │ └── workflows/ │ ├── ci.yaml │ ├── docker-build.yaml │ ├── docker-nightly.yaml │ ├── release.yaml │ └── sponsors.yaml ├── .gitignore ├── .golangci.yml ├── .vscode/ │ ├── launch.json │ └── tasks.json ├── AI_POLICY.md ├── CONTRIBUTING.md ├── LICENSE ├── Makefile ├── README.md ├── REFERENCES.md ├── collector/ │ ├── cmd/ │ │ ├── collector-metrics/ │ │ │ └── collector-metrics.go │ │ └── collector-selftest/ │ │ └── collector-selftest.go │ └── pkg/ │ ├── collector/ │ │ ├── base.go │ │ ├── metrics.go │ │ ├── metrics_test.go │ │ └── selftest.go │ ├── common/ │ │ └── shell/ │ │ ├── factory.go │ │ ├── interface.go │ │ ├── local_shell.go │ │ ├── local_shell_test.go │ │ └── mock/ │ │ └── mock_shell.go │ ├── config/ │ │ ├── config.go │ │ ├── config_test.go │ │ ├── factory.go │ │ ├── interface.go │ │ ├── mock/ │ │ │ └── mock_config.go │ │ └── testdata/ │ │ ├── allow_listed_devices_present.yaml │ │ ├── device_type_comma.yaml │ │ ├── ignore_device.yaml │ │ ├── invalid_commands_includes_device.yaml │ │ ├── invalid_commands_missing_json.yaml │ │ ├── override_commands.yaml │ │ ├── override_device_commands.yaml │ │ ├── raid_device.yaml │ │ └── simple_device.yaml │ ├── detect/ │ │ ├── detect.go │ │ ├── detect_test.go │ │ ├── devices_darwin.go │ │ ├── devices_freebsd.go │ │ ├── devices_linux.go │ │ ├── devices_linux_test.go │ │ ├── devices_windows.go │ │ ├── testdata/ │ │ │ ├── smartctl_info_nvme.json │ │ │ ├── smartctl_scan_megaraid.json │ │ │ ├── smartctl_scan_nvme.json │ │ │ └── smartctl_scan_simple.json │ │ ├── wwn.go │ │ └── wwn_test.go │ ├── errors/ │ │ ├── errors.go │ │ └── errors_test.go │ └── models/ │ ├── device.go │ ├── scan.go │ └── scan_override.go ├── docker/ │ ├── Dockerfile │ ├── Dockerfile.collector │ ├── Dockerfile.smartmontools │ ├── Dockerfile.web │ ├── README.md │ ├── entrypoint-collector.sh │ ├── example.hubspoke.docker-compose.yml │ └── example.omnibus.docker-compose.yml ├── docs/ │ ├── DOWNSAMPLING.md │ ├── INSTALL_ANSIBLE.md │ ├── INSTALL_HUB_SPOKE.md │ ├── INSTALL_MANUAL.md │ ├── INSTALL_MANUAL_WINDOWS.md │ ├── INSTALL_NAS.md │ ├── INSTALL_PFSENSE.md │ ├── INSTALL_ROOTLESS_PODMAN.md │ ├── INSTALL_SYNOLOGY_COLLECTOR.md │ ├── INSTALL_UNRAID.md │ ├── SUPPORTED_NAS_OS.md │ ├── TESTERS.md │ ├── TROUBLESHOOTING_DEVICE_COLLECTOR.md │ ├── TROUBLESHOOTING_DOCKER.md │ ├── TROUBLESHOOTING_INFLUXDB.md │ ├── TROUBLESHOOTING_NOTIFICATIONS.md │ ├── TROUBLESHOOTING_REVERSE_PROXY.md │ ├── TROUBLESHOOTING_UDEV.md │ └── dbdiagram.io.txt ├── example.collector.yaml ├── example.scrutiny.yaml ├── go.mod ├── go.sum ├── packagr.yml ├── rootfs/ │ └── etc/ │ ├── cont-init.d/ │ │ ├── 01-timezone │ │ └── 50-cron-config │ ├── cron.d/ │ │ └── scrutiny │ └── services.d/ │ ├── collector-once/ │ │ └── run │ ├── cron/ │ │ ├── finish │ │ └── run │ ├── influxdb/ │ │ └── run │ └── scrutiny/ │ └── run └── webapp/ ├── backend/ │ ├── cmd/ │ │ └── scrutiny/ │ │ └── scrutiny.go │ └── pkg/ │ ├── config/ │ │ ├── config.go │ │ ├── config_test.go │ │ ├── factory.go │ │ ├── interface.go │ │ └── mock/ │ │ └── mock_config.go │ ├── constants.go │ ├── database/ │ │ ├── interface.go │ │ ├── migrations/ │ │ │ ├── m20201107210306/ │ │ │ │ ├── device.go │ │ │ │ ├── smart.go │ │ │ │ ├── smart_ata_attribute.go │ │ │ │ ├── smart_nvme_attribute.go │ │ │ │ └── smart_scsci_attribute.go │ │ │ ├── m20220503120000/ │ │ │ │ └── device.go │ │ │ ├── m20220509170100/ │ │ │ │ └── device.go │ │ │ ├── m20220716214900/ │ │ │ │ └── setting.go │ │ │ └── m20250221084400/ │ │ │ └── device.go │ │ ├── mock/ │ │ │ └── mock_database.go │ │ ├── scrutiny_repository.go │ │ ├── scrutiny_repository_device.go │ │ ├── scrutiny_repository_device_smart_attributes.go │ │ ├── scrutiny_repository_migrations.go │ │ ├── scrutiny_repository_settings.go │ │ ├── scrutiny_repository_tasks.go │ │ ├── scrutiny_repository_tasks_test.go │ │ ├── scrutiny_repository_temperature.go │ │ └── scrutiny_repository_temperature_test.go │ ├── errors/ │ │ ├── errors.go │ │ └── errors_test.go │ ├── models/ │ │ ├── collector/ │ │ │ ├── smart.go │ │ │ └── smart_test.go │ │ ├── device.go │ │ ├── device_summary.go │ │ ├── measurements/ │ │ │ ├── smart.go │ │ │ ├── smart_ata_attribute.go │ │ │ ├── smart_attribute.go │ │ │ ├── smart_nvme_attribute.go │ │ │ ├── smart_scsci_attribute.go │ │ │ ├── smart_temperature.go │ │ │ └── smart_test.go │ │ ├── setting_entry.go │ │ ├── settings.go │ │ └── testdata/ │ │ ├── helper.go │ │ ├── smart-ata-date.json │ │ ├── smart-ata-date2.json │ │ ├── smart-ata-failed-scrutiny.json │ │ ├── smart-ata-full.json │ │ ├── smart-ata.json │ │ ├── smart-ata2.json │ │ ├── smart-fail.json │ │ ├── smart-fail2.json │ │ ├── smart-megaraid0.json │ │ ├── smart-megaraid1.json │ │ ├── smart-nvme-failed.json │ │ ├── smart-nvme.json │ │ ├── smart-nvme2.json │ │ ├── smart-pass.json │ │ ├── smart-raid.json │ │ ├── smart-sat.json │ │ ├── smart-scsi.json │ │ └── smart-scsi2.json │ ├── notify/ │ │ ├── notify.go │ │ └── notify_test.go │ ├── thresholds/ │ │ ├── ata_attribute_metadata.go │ │ ├── nvme_attribute_metadata.go │ │ └── scsi_attribute_metadata.go │ ├── version/ │ │ └── version.go │ └── web/ │ ├── handler/ │ │ ├── archive_device.go │ │ ├── delete_device.go │ │ ├── get_device_details.go │ │ ├── get_devices_summary.go │ │ ├── get_devices_summary_temp_history.go │ │ ├── get_settings.go │ │ ├── health_check.go │ │ ├── register_devices.go │ │ ├── save_settings.go │ │ ├── send_test_notification.go │ │ ├── unarchive_device.go │ │ ├── upload_device_metrics.go │ │ └── upload_device_self_tests.go │ ├── middleware/ │ │ ├── config.go │ │ ├── logger.go │ │ └── repository.go │ ├── server.go │ ├── server_test.go │ └── testdata/ │ ├── register-devices-req-2.json │ ├── register-devices-req.json │ ├── register-devices-single-req.json │ └── upload-device-metrics-req.json └── frontend/ ├── .editorconfig ├── .gitignore ├── CREDITS ├── LICENSE.md ├── README.md ├── angular.json ├── browserslist ├── e2e/ │ ├── protractor.conf.js │ ├── src/ │ │ ├── app.e2e-spec.ts │ │ └── app.po.ts │ └── tsconfig.json ├── git.version.sh ├── karma.conf.js ├── package.json ├── src/ │ ├── @treo/ │ │ ├── animations/ │ │ │ ├── defaults.ts │ │ │ ├── expand-collapse.ts │ │ │ ├── fade.ts │ │ │ ├── index.ts │ │ │ ├── public-api.ts │ │ │ ├── shake.ts │ │ │ ├── slide.ts │ │ │ └── zoom.ts │ │ ├── components/ │ │ │ ├── card/ │ │ │ │ ├── card.component.html │ │ │ │ ├── card.component.scss │ │ │ │ ├── card.component.ts │ │ │ │ ├── card.module.ts │ │ │ │ ├── index.ts │ │ │ │ └── public-api.ts │ │ │ ├── date-range/ │ │ │ │ ├── date-range.component.html │ │ │ │ ├── date-range.component.scss │ │ │ │ ├── date-range.component.ts │ │ │ │ ├── date-range.module.ts │ │ │ │ ├── index.ts │ │ │ │ └── public-api.ts │ │ │ ├── drawer/ │ │ │ │ ├── drawer.component.html │ │ │ │ ├── drawer.component.scss │ │ │ │ ├── drawer.component.ts │ │ │ │ ├── drawer.module.ts │ │ │ │ ├── drawer.service.ts │ │ │ │ ├── drawer.types.ts │ │ │ │ ├── index.ts │ │ │ │ └── public-api.ts │ │ │ ├── highlight/ │ │ │ │ ├── highlight.component.html │ │ │ │ ├── highlight.component.scss │ │ │ │ ├── highlight.component.ts │ │ │ │ ├── highlight.module.ts │ │ │ │ ├── highlight.service.ts │ │ │ │ ├── index.ts │ │ │ │ └── public-api.ts │ │ │ ├── message/ │ │ │ │ ├── index.ts │ │ │ │ ├── message.component.html │ │ │ │ ├── message.component.scss │ │ │ │ ├── message.component.ts │ │ │ │ ├── message.module.ts │ │ │ │ ├── message.service.ts │ │ │ │ ├── message.types.ts │ │ │ │ └── public-api.ts │ │ │ └── navigation/ │ │ │ ├── horizontal/ │ │ │ │ ├── components/ │ │ │ │ │ ├── basic/ │ │ │ │ │ │ ├── basic.component.html │ │ │ │ │ │ └── basic.component.ts │ │ │ │ │ ├── branch/ │ │ │ │ │ │ ├── branch.component.html │ │ │ │ │ │ └── branch.component.ts │ │ │ │ │ ├── divider/ │ │ │ │ │ │ ├── divider.component.html │ │ │ │ │ │ └── divider.component.ts │ │ │ │ │ └── spacer/ │ │ │ │ │ ├── spacer.component.html │ │ │ │ │ └── spacer.component.ts │ │ │ │ ├── horizontal.component.html │ │ │ │ ├── horizontal.component.scss │ │ │ │ └── horizontal.component.ts │ │ │ ├── index.ts │ │ │ ├── navigation.module.ts │ │ │ ├── navigation.service.ts │ │ │ ├── navigation.types.ts │ │ │ ├── public-api.ts │ │ │ └── vertical/ │ │ │ ├── components/ │ │ │ │ ├── aside/ │ │ │ │ │ ├── aside.component.html │ │ │ │ │ └── aside.component.ts │ │ │ │ ├── basic/ │ │ │ │ │ ├── basic.component.html │ │ │ │ │ └── basic.component.ts │ │ │ │ ├── collapsable/ │ │ │ │ │ ├── collapsable.component.html │ │ │ │ │ └── collapsable.component.ts │ │ │ │ ├── divider/ │ │ │ │ │ ├── divider.component.html │ │ │ │ │ └── divider.component.ts │ │ │ │ ├── group/ │ │ │ │ │ ├── group.component.html │ │ │ │ │ └── group.component.ts │ │ │ │ └── spacer/ │ │ │ │ ├── spacer.component.html │ │ │ │ └── spacer.component.ts │ │ │ ├── vertical.component.html │ │ │ ├── vertical.component.scss │ │ │ └── vertical.component.ts │ │ ├── directives/ │ │ │ ├── autogrow/ │ │ │ │ ├── autogrow.directive.ts │ │ │ │ ├── autogrow.module.ts │ │ │ │ ├── index.ts │ │ │ │ └── public-api.ts │ │ │ └── scrollbar/ │ │ │ ├── index.ts │ │ │ ├── public-api.ts │ │ │ ├── scrollbar.directive.ts │ │ │ ├── scrollbar.interfaces.ts │ │ │ └── scrollbar.module.ts │ │ ├── index.ts │ │ ├── lib/ │ │ │ └── mock-api/ │ │ │ ├── index.ts │ │ │ ├── mock-api.interceptor.ts │ │ │ ├── mock-api.interfaces.ts │ │ │ ├── mock-api.module.ts │ │ │ ├── mock-api.request-handler.ts │ │ │ ├── mock-api.service.ts │ │ │ └── mock-api.utils.ts │ │ ├── pipes/ │ │ │ └── find-by-key/ │ │ │ ├── find-by-key.module.ts │ │ │ ├── find-by-key.pipe.ts │ │ │ ├── index.ts │ │ │ └── public-api.ts │ │ ├── services/ │ │ │ ├── config/ │ │ │ │ ├── config.constants.ts │ │ │ │ ├── config.module.ts │ │ │ │ ├── config.service.ts │ │ │ │ ├── index.ts │ │ │ │ └── public-api.ts │ │ │ ├── media-watcher/ │ │ │ │ ├── index.ts │ │ │ │ ├── media-watcher.module.ts │ │ │ │ ├── media-watcher.service.ts │ │ │ │ └── public-api.ts │ │ │ └── splash-screen/ │ │ │ ├── index.ts │ │ │ ├── public-api.ts │ │ │ ├── splash-screen.module.ts │ │ │ └── splash-screen.service.ts │ │ ├── styles/ │ │ │ ├── base/ │ │ │ │ ├── _colors.scss │ │ │ │ ├── _preflight.scss │ │ │ │ ├── _theming.scss │ │ │ │ └── _typography.scss │ │ │ ├── components/ │ │ │ │ ├── _card.scss │ │ │ │ ├── _input.scss │ │ │ │ └── _table.scss │ │ │ ├── layout/ │ │ │ │ └── _content.scss │ │ │ ├── main.scss │ │ │ ├── overrides/ │ │ │ │ ├── _angular-material.scss │ │ │ │ ├── _highlightjs.scss │ │ │ │ ├── _perfect-scrollbar.scss │ │ │ │ └── _quill.scss │ │ │ ├── treo.scss │ │ │ ├── utilities/ │ │ │ │ ├── _breakpoints.scss │ │ │ │ ├── _colors.scss │ │ │ │ ├── _elevations.scss │ │ │ │ ├── _icons.scss │ │ │ │ ├── _keyframes.scss │ │ │ │ └── _theming.scss │ │ │ └── vendors/ │ │ │ ├── _angular-material.scss │ │ │ └── _normalize.scss │ │ ├── tailwind/ │ │ │ ├── export.css │ │ │ ├── export.js │ │ │ ├── exported/ │ │ │ │ ├── _variables.scss │ │ │ │ └── variables.ts │ │ │ └── plugins/ │ │ │ ├── index.js │ │ │ ├── utilities/ │ │ │ │ ├── color-combinations.js │ │ │ │ ├── color-contrasts.js │ │ │ │ ├── icon-color.js │ │ │ │ ├── icon-size.js │ │ │ │ └── mirror.js │ │ │ └── variants/ │ │ │ ├── dark-light.js │ │ │ ├── export-box-shadow.js │ │ │ ├── export-colors.js │ │ │ ├── export-font-family.js │ │ │ └── export-screens.js │ │ ├── treo.module.ts │ │ └── validators/ │ │ ├── index.ts │ │ ├── public-api.ts │ │ └── validators.ts │ ├── app/ │ │ ├── app.component.html │ │ ├── app.component.scss │ │ ├── app.component.ts │ │ ├── app.module.ts │ │ ├── app.routing.ts │ │ ├── core/ │ │ │ ├── config/ │ │ │ │ ├── app.config.ts │ │ │ │ ├── scrutiny-config.module.ts │ │ │ │ └── scrutiny-config.service.ts │ │ │ ├── core.module.ts │ │ │ └── models/ │ │ │ ├── device-details-response-wrapper.ts │ │ │ ├── device-model.ts │ │ │ ├── device-summary-model.ts │ │ │ ├── device-summary-response-wrapper.ts │ │ │ ├── device-summary-temp-response-wrapper.ts │ │ │ ├── measurements/ │ │ │ │ ├── smart-attribute-model.ts │ │ │ │ ├── smart-model.ts │ │ │ │ └── smart-temperature-model.ts │ │ │ └── thresholds/ │ │ │ └── attribute-metadata-model.ts │ │ ├── data/ │ │ │ └── mock/ │ │ │ ├── device/ │ │ │ │ └── details/ │ │ │ │ ├── index.ts │ │ │ │ ├── sda.ts │ │ │ │ ├── sdb.ts │ │ │ │ ├── sdc.ts │ │ │ │ ├── sdd.ts │ │ │ │ ├── sde.ts │ │ │ │ └── sdf.ts │ │ │ ├── index.ts │ │ │ └── summary/ │ │ │ ├── data.ts │ │ │ ├── index.ts │ │ │ └── temp_history.ts │ │ ├── layout/ │ │ │ ├── common/ │ │ │ │ ├── dashboard-device/ │ │ │ │ │ ├── dashboard-device.component.html │ │ │ │ │ ├── dashboard-device.component.scss │ │ │ │ │ ├── dashboard-device.component.spec.ts │ │ │ │ │ ├── dashboard-device.component.ts │ │ │ │ │ └── dashboard-device.module.ts │ │ │ │ ├── dashboard-device-archive-dialog/ │ │ │ │ │ ├── dashboard-device-archive-dialog.component.html │ │ │ │ │ ├── dashboard-device-archive-dialog.component.scss │ │ │ │ │ ├── dashboard-device-archive-dialog.component.spec.ts │ │ │ │ │ ├── dashboard-device-archive-dialog.component.ts │ │ │ │ │ ├── dashboard-device-archive-dialog.module.ts │ │ │ │ │ └── dashboard-device-archive-dialog.service.ts │ │ │ │ ├── dashboard-device-delete-dialog/ │ │ │ │ │ ├── dashboard-device-delete-dialog.component.html │ │ │ │ │ ├── dashboard-device-delete-dialog.component.scss │ │ │ │ │ ├── dashboard-device-delete-dialog.component.spec.ts │ │ │ │ │ ├── dashboard-device-delete-dialog.component.ts │ │ │ │ │ ├── dashboard-device-delete-dialog.module.ts │ │ │ │ │ └── dashboard-device-delete-dialog.service.ts │ │ │ │ ├── dashboard-settings/ │ │ │ │ │ ├── dashboard-settings.component.html │ │ │ │ │ ├── dashboard-settings.component.scss │ │ │ │ │ ├── dashboard-settings.component.ts │ │ │ │ │ └── dashboard-settings.module.ts │ │ │ │ ├── detail-settings/ │ │ │ │ │ ├── detail-settings.component.html │ │ │ │ │ ├── detail-settings.component.scss │ │ │ │ │ ├── detail-settings.component.spec.ts │ │ │ │ │ ├── detail-settings.component.ts │ │ │ │ │ └── detail-settings.module.ts │ │ │ │ └── search/ │ │ │ │ ├── search.component.html │ │ │ │ ├── search.component.scss │ │ │ │ ├── search.component.ts │ │ │ │ └── search.module.ts │ │ │ ├── layout.component.html │ │ │ ├── layout.component.scss │ │ │ ├── layout.component.ts │ │ │ ├── layout.module.ts │ │ │ ├── layout.types.ts │ │ │ └── layouts/ │ │ │ ├── empty/ │ │ │ │ ├── empty.component.html │ │ │ │ ├── empty.component.scss │ │ │ │ ├── empty.component.ts │ │ │ │ └── empty.module.ts │ │ │ └── horizontal/ │ │ │ └── material/ │ │ │ ├── material.component.html │ │ │ ├── material.component.scss │ │ │ ├── material.component.ts │ │ │ └── material.module.ts │ │ ├── modules/ │ │ │ ├── dashboard/ │ │ │ │ ├── dashboard.component.html │ │ │ │ ├── dashboard.component.scss │ │ │ │ ├── dashboard.component.ts │ │ │ │ ├── dashboard.module.ts │ │ │ │ ├── dashboard.resolvers.ts │ │ │ │ ├── dashboard.routing.ts │ │ │ │ ├── dashboard.service.spec.ts │ │ │ │ └── dashboard.service.ts │ │ │ ├── detail/ │ │ │ │ ├── detail.component.html │ │ │ │ ├── detail.component.scss │ │ │ │ ├── detail.component.ts │ │ │ │ ├── detail.module.ts │ │ │ │ ├── detail.resolvers.ts │ │ │ │ ├── detail.routing.ts │ │ │ │ ├── detail.service.spec.ts │ │ │ │ └── detail.service.ts │ │ │ └── landing/ │ │ │ └── home/ │ │ │ ├── home.component.html │ │ │ ├── home.component.scss │ │ │ ├── home.component.ts │ │ │ ├── home.module.ts │ │ │ └── home.routing.ts │ │ └── shared/ │ │ ├── device-hours.pipe.spec.ts │ │ ├── device-hours.pipe.ts │ │ ├── device-sort.pipe.spec.ts │ │ ├── device-sort.pipe.ts │ │ ├── device-status.pipe.spec.ts │ │ ├── device-status.pipe.ts │ │ ├── device-title.pipe.spec.ts │ │ ├── device-title.pipe.ts │ │ ├── file-size.pipe.spec.ts │ │ ├── file-size.pipe.ts │ │ ├── shared.module.ts │ │ ├── temperature.pipe.spec.ts │ │ └── temperature.pipe.ts │ ├── assets/ │ │ ├── .gitkeep │ │ ├── fonts/ │ │ │ ├── ibm-plex-mono/ │ │ │ │ └── ibm-plex-mono.css │ │ │ ├── inter/ │ │ │ │ └── inter.css │ │ │ ├── material-icons/ │ │ │ │ ├── MaterialIcons-Regular.codepoints │ │ │ │ ├── MaterialIconsOutlined-Regular.codepoints │ │ │ │ ├── MaterialIconsOutlined-Regular.otf │ │ │ │ ├── MaterialIconsRound-Regular.codepoints │ │ │ │ ├── MaterialIconsRound-Regular.otf │ │ │ │ ├── MaterialIconsSharp-Regular.codepoints │ │ │ │ ├── MaterialIconsSharp-Regular.otf │ │ │ │ ├── MaterialIconsTwoTone-Regular.codepoints │ │ │ │ ├── MaterialIconsTwoTone-Regular.otf │ │ │ │ ├── README.md │ │ │ │ └── material-icons.css │ │ │ └── roboto/ │ │ │ └── roboto.css │ │ └── images/ │ │ └── logo/ │ │ ├── scrutiny-logo-dark-social.psd │ │ ├── scrutiny-logo-dark-text.psd │ │ ├── scrutiny-logo-white-text.psd │ │ └── scrutiny-logo-white.psd │ ├── browserconfig.xml │ ├── environments/ │ │ ├── environment.prod.ts │ │ ├── environment.ts │ │ └── versions.ts │ ├── index.html │ ├── main.ts │ ├── manifest.json │ ├── polyfills.ts │ ├── styles/ │ │ ├── styles.scss │ │ ├── tailwind.scss │ │ ├── themes.scss │ │ └── vendors.scss │ ├── tailwind/ │ │ ├── config.js │ │ └── main.css │ └── test.ts ├── tsconfig.app.json ├── tsconfig.json ├── tsconfig.spec.json └── tslint.json