boneio 1.6.0.dev12__tar.gz → 1.6.0.dev13__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {boneio-1.6.0.dev12/boneio.egg-info → boneio-1.6.0.dev13}/PKG-INFO +1 -1
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/security/posture.py +44 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/system_ops.py +33 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/assets/MANIFEST.sha256 +1 -1
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/assets/helpers/boneio-system +198 -0
- boneio-1.6.0.dev13/boneio/migrations/plans/1.6.17.json +1 -0
- boneio-1.6.0.dev13/boneio/migrations/plans/1.6.17.sig +1 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/plans/1.6.5.json +1 -1
- boneio-1.6.0.dev13/boneio/migrations/plans/1.6.5.sig +1 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/plans/1.6.8.json +1 -1
- boneio-1.6.0.dev13/boneio/migrations/plans/1.6.8.sig +1 -0
- boneio-1.6.0.dev13/boneio/migrations/plans/1.6.9.json +1 -0
- boneio-1.6.0.dev13/boneio/migrations/plans/1.6.9.sig +1 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/plans/manifest.json +1 -1
- boneio-1.6.0.dev13/boneio/migrations/plans/manifest.sig +0 -0
- boneio-1.6.0.dev13/boneio/migrations/versions/v1_6_17_service_password.py +73 -0
- boneio-1.6.0.dev13/boneio/version.py +2 -0
- boneio-1.6.0.dev12/boneio/webui/frontend-dist/assets/AccountsView-C8JbdcCe.js → boneio-1.6.0.dev13/boneio/webui/frontend-dist/assets/AccountsView-1zkEjqfK.js +1 -1
- boneio-1.6.0.dev12/boneio/webui/frontend-dist/assets/BackupSection-7aQpPnK6.js → boneio-1.6.0.dev13/boneio/webui/frontend-dist/assets/BackupSection-z_ahIzDh.js +1 -1
- boneio-1.6.0.dev12/boneio/webui/frontend-dist/assets/BindingMatrix-BrW9e8h5.js → boneio-1.6.0.dev13/boneio/webui/frontend-dist/assets/BindingMatrix-Cg6AlMJP.js +1 -1
- boneio-1.6.0.dev12/boneio/webui/frontend-dist/assets/DeviceControlSection-B5V8Jr_f.js → boneio-1.6.0.dev13/boneio/webui/frontend-dist/assets/DeviceControlSection-DtO0A-x2.js +1 -1
- boneio-1.6.0.dev12/boneio/webui/frontend-dist/assets/DiagnosticsView-C2T9596Q.js → boneio-1.6.0.dev13/boneio/webui/frontend-dist/assets/DiagnosticsView-puuuU90c.js +1 -1
- boneio-1.6.0.dev12/boneio/webui/frontend-dist/assets/EntityCard-D-nx35e8.js → boneio-1.6.0.dev13/boneio/webui/frontend-dist/assets/EntityCard-CfRDx2Uw.js +1 -1
- boneio-1.6.0.dev12/boneio/webui/frontend-dist/assets/FactoryResetSection-D-82oG8p.js → boneio-1.6.0.dev13/boneio/webui/frontend-dist/assets/FactoryResetSection-BE3eAjb5.js +1 -1
- boneio-1.6.0.dev12/boneio/webui/frontend-dist/assets/FormInputToggle-BwRC4ON1.js → boneio-1.6.0.dev13/boneio/webui/frontend-dist/assets/FormInputToggle-azKtddGK.js +1 -1
- boneio-1.6.0.dev12/boneio/webui/frontend-dist/assets/HaDashboardWizard-zhWUzHi4.js → boneio-1.6.0.dev13/boneio/webui/frontend-dist/assets/HaDashboardWizard-P5s66Hns.js +1 -1
- boneio-1.6.0.dev12/boneio/webui/frontend-dist/assets/HostnameSection-B9KLRTVG.js → boneio-1.6.0.dev13/boneio/webui/frontend-dist/assets/HostnameSection-K0vtGwD2.js +1 -1
- boneio-1.6.0.dev12/boneio/webui/frontend-dist/assets/InputsView-DiEQmG3S.js → boneio-1.6.0.dev13/boneio/webui/frontend-dist/assets/InputsView-DaRxrrrY.js +1 -1
- boneio-1.6.0.dev12/boneio/webui/frontend-dist/assets/LocationSection-BPnusbRT.js → boneio-1.6.0.dev13/boneio/webui/frontend-dist/assets/LocationSection-CyRgM7rc.js +2 -2
- boneio-1.6.0.dev12/boneio/webui/frontend-dist/assets/LoggerForm-BrT1SETo.js → boneio-1.6.0.dev13/boneio/webui/frontend-dist/assets/LoggerForm-BkE05Anj.js +1 -1
- boneio-1.6.0.dev12/boneio/webui/frontend-dist/assets/MigrationsSection-DO9Uacty.js → boneio-1.6.0.dev13/boneio/webui/frontend-dist/assets/MigrationsSection-DPgEdObu.js +1 -1
- boneio-1.6.0.dev12/boneio/webui/frontend-dist/assets/ModbusView-Ci3xTQ2_.js → boneio-1.6.0.dev13/boneio/webui/frontend-dist/assets/ModbusView-D8p4e9u-.js +1 -1
- boneio-1.6.0.dev12/boneio/webui/frontend-dist/assets/MqttPasswordsSection-DhF-OUm2.js → boneio-1.6.0.dev13/boneio/webui/frontend-dist/assets/MqttPasswordsSection-CLiY1tas.js +1 -1
- boneio-1.6.0.dev12/boneio/webui/frontend-dist/assets/NodeRedManagement-B1Sqm_bX.js → boneio-1.6.0.dev13/boneio/webui/frontend-dist/assets/NodeRedManagement-BPiWeJZF.js +1 -1
- boneio-1.6.0.dev12/boneio/webui/frontend-dist/assets/OutputsView-Dg3jq4Pl.js → boneio-1.6.0.dev13/boneio/webui/frontend-dist/assets/OutputsView-lW4BfC1r.js +1 -1
- boneio-1.6.0.dev12/boneio/webui/frontend-dist/assets/SecurityView-CbDt6gSC.js → boneio-1.6.0.dev13/boneio/webui/frontend-dist/assets/SecurityView-DUu-7Uuv.js +1 -1
- boneio-1.6.0.dev12/boneio/webui/frontend-dist/assets/SensorView-DlX_I0B0.js → boneio-1.6.0.dev13/boneio/webui/frontend-dist/assets/SensorView-DW7-J86-.js +1 -1
- boneio-1.6.0.dev12/boneio/webui/frontend-dist/assets/SystemState-CQtNW-9U.js → boneio-1.6.0.dev13/boneio/webui/frontend-dist/assets/SystemState-C3EiprwY.js +1 -1
- boneio-1.6.0.dev12/boneio/webui/frontend-dist/assets/TemplatesView-Bh0-Q6Z8.js → boneio-1.6.0.dev13/boneio/webui/frontend-dist/assets/TemplatesView-CkvJEcxY.js +1 -1
- boneio-1.6.0.dev12/boneio/webui/frontend-dist/assets/TilePicker-wqj3iQWo.js → boneio-1.6.0.dev13/boneio/webui/frontend-dist/assets/TilePicker-CjpWxdf2.js +1 -1
- boneio-1.6.0.dev12/boneio/webui/frontend-dist/assets/TimezoneSection-BJ4ofvQ7.js → boneio-1.6.0.dev13/boneio/webui/frontend-dist/assets/TimezoneSection-7jDs6GmP.js +1 -1
- boneio-1.6.0.dev12/boneio/webui/frontend-dist/assets/UISettings-Cxia1tVS.js → boneio-1.6.0.dev13/boneio/webui/frontend-dist/assets/UISettings-myztQ0yi.js +4 -4
- boneio-1.6.0.dev12/boneio/webui/frontend-dist/assets/index-BWIpETfX.js → boneio-1.6.0.dev13/boneio/webui/frontend-dist/assets/index-D8GaCUlC.js +5 -5
- boneio-1.6.0.dev12/boneio/webui/frontend-dist/assets/monaco-_ZX9SR26.js → boneio-1.6.0.dev13/boneio/webui/frontend-dist/assets/monaco-Bn6AHlyd.js +1 -1
- boneio-1.6.0.dev12/boneio/webui/frontend-dist/assets/monaco-g8WJWyHq.js → boneio-1.6.0.dev13/boneio/webui/frontend-dist/assets/monaco-DvAIVkx2.js +2 -2
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/frontend-dist/index.html +1 -1
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/frontend-dist/sw.js +1 -1
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/routes/onboarding.py +39 -1
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/routes/security.py +30 -1
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13/boneio.egg-info}/PKG-INFO +1 -1
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio.egg-info/SOURCES.txt +31 -28
- boneio-1.6.0.dev12/boneio/migrations/plans/1.6.5.sig +0 -1
- boneio-1.6.0.dev12/boneio/migrations/plans/1.6.8.sig +0 -1
- boneio-1.6.0.dev12/boneio/migrations/plans/1.6.9.json +0 -1
- boneio-1.6.0.dev12/boneio/migrations/plans/1.6.9.sig +0 -0
- boneio-1.6.0.dev12/boneio/migrations/plans/manifest.sig +0 -0
- boneio-1.6.0.dev12/boneio/version.py +0 -2
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/LICENSE +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/MANIFEST.in +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/README.md +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/__init__.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/boards/0.2/input.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/boards/0.2/output_24_16.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/boards/0.2/output_32_10.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/boards/0.2/output_32_5.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/boards/0.2/output_cover.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/boards/0.2/output_cover_mix.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/boards/0.3/input.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/boards/0.3/output_24_16.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/boards/0.3/output_32_10.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/boards/0.3/output_32_5.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/boards/0.3/output_cover.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/boards/0.3/output_cover_mix.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/boards/0.4/input.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/boards/0.4/output_24_16.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/boards/0.4/output_32_10.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/boards/0.4/output_32_5.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/boards/0.4/output_cover.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/boards/0.4/output_cover_mix.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/boards/0.5/input.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/boards/0.5/output_24_16.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/boards/0.5/output_32_10.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/boards/0.5/output_cover.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/boards/0.5/output_cover_mix.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/boards/0.6/input.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/boards/0.6/output_24_16.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/boards/0.6/output_32_10.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/boards/0.6/output_cover.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/boards/0.6/output_cover_mix.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/boards/0.7/input.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/boards/0.7/output_24_16.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/boards/0.7/output_32_10.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/boards/0.7/output_48_4.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/boards/0.7/output_cover.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/boards/0.7/output_cover_mix.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/boards/0.8/input.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/boards/0.8/output_24_16.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/boards/0.8/output_32_10.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/boards/0.8/output_48_4.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/boards/0.8/output_cover.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/boards/0.8/output_cover_mix.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/boards/1.0/input.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/boards/1.0/output_24_16.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/boards/1.0/output_32_10.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/boards/1.0/output_48_4.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/boards/1.0/output_cover.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/boards/1.0/output_cover_mix.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/boards/1.1/input.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/boards/1.1/output_24_16.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/boards/1.1/output_32_10.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/boards/1.1/output_48_4.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/boards/1.1/output_cover.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/boards/1.1/output_cover_mix.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/bonecli.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/components/__init__.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/components/cover/__init__.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/components/cover/cover.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/components/cover/remote.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/components/cover/time_based.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/components/cover/venetian.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/components/group/__init__.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/components/group/output_group.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/components/input/__init__.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/components/input/binary_sensor.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/components/input/detectors.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/components/input/event.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/components/input/remote/__init__.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/components/input/remote/base.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/components/input/remote/esphome.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/components/input/remote/mqtt.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/components/irrigation/__init__.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/components/irrigation/controller.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/components/irrigation/water_source.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/components/output/__init__.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/components/output/basic.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/components/output/buzzer.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/components/output/mcp.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/components/output/pca.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/components/output/pcf.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/components/output/remote.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/components/sensor/__init__.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/components/sensor/virtual_energy.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/components/template/__init__.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/components/template/alarm_panel.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/components/template/gate_cover.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/components/template/thermostat.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/components/virtual_switch.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/const.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/__init__.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/auth/__init__.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/auth/cli.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/auth/hashing.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/auth/migration.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/auth/models.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/auth/store.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/cloud/__init__.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/cloud/data/__init__.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/cloud/data/docker-compose.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/cloud/data/init-certs-cloud.sh +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/cloud/registration.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/cloud/secrets.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/config/__init__.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/config/config_helper.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/config/input_bindings.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/config/migrations/__init__.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/config/migrations/v1_proxy_port.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/config/migrations/v2_transition.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/config/migrations/v4_wled_cache.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/config/migrations/v5_ina_screen.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/config/package-lock.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/config/package.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/config/provenance.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/config/schema_converter.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/config/secret_masking.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/config/yaml_compat.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/config/yaml_patch.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/config/yaml_util.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/containers.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/diagnostics/__init__.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/diagnostics/collect.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/discovery.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/events/__init__.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/events/bus.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/manager/__init__.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/manager/action_conditions.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/manager/canopen.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/manager/covers.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/manager/display.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/manager/inputs.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/manager/irrigation.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/manager/manager.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/manager/modbus.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/manager/outputs.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/manager/remote.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/manager/remote_input_registrar.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/manager/scheduler.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/manager/security_alert.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/manager/sensors.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/manager/sun.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/manager/templates/__init__.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/manager/templates/alarm.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/manager/templates/gate_cover.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/manager/templates/thermostat.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/manager/templates.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/manager/update.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/manager/virtual_switches.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/messaging/__init__.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/messaging/basic.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/messaging/basic_mqtt.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/messaging/composite.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/messaging/local.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/messaging/lox.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/messaging/mqtt.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/messaging/queue.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/net/__init__.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/net/discovery_guard.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/remote/__init__.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/remote/base.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/remote/can.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/remote/esphome.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/remote/mqtt.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/remote/wled.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/remote/wled_cache.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/security/__init__.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/security/certificate.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/security/framing.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/sensor/__init__.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/sensor/base.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/sensor/sun.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/sensor/system.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/state/__init__.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/state/manager.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/system/__init__.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/system/host_data.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/system/monitor.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/utils/__init__.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/utils/async_updater.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/utils/conditions.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/utils/filter.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/utils/font_util.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/utils/logger.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/utils/naming.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/utils/overlay.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/utils/sun.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/utils/timeperiod.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/core/utils/util.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/example_config/24x16/adc.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/example_config/24x16/binary_sensor.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/example_config/24x16/config.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/example_config/24x16/event.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/example_config/24x16/mqtt.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/example_config/24x16/output24x16A.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/example_config/32x10/adc.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/example_config/32x10/binary_sensor.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/example_config/32x10/config.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/example_config/32x10/event.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/example_config/32x10/mqtt.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/example_config/32x10/output32x10A.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/example_config/48x4/adc.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/example_config/48x4/binary_sensor.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/example_config/48x4/config.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/example_config/48x4/event.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/example_config/48x4/mqtt.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/example_config/48x4/output48x4A.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/example_config/__init__.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/example_config/can_master.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/example_config/can_slave.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/example_config/cover/adc.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/example_config/cover/binary_sensor.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/example_config/cover/config.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/example_config/cover/cover.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/example_config/cover/event.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/example_config/cover/mqtt.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/example_config/cover/outputCover.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/example_config/cover_mix/adc.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/example_config/cover_mix/binary_sensor.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/example_config/cover_mix/config.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/example_config/cover_mix/cover.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/example_config/cover_mix/event.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/example_config/cover_mix/mqtt.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/example_config/cover_mix/outputCoverMix.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/example_config/different_configs/adc.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/example_config/different_configs/all_binary_sensor.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/example_config/different_configs/binary_sensor.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/example_config/different_configs/binary_sensor_v_0_7.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/example_config/different_configs/config_24_16.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/example_config/different_configs/event_all.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/example_config/different_configs/event_v_0_7.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/example_config/different_configs/led32x4A.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/example_config/different_configs/output24x16A.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/example_config/different_configs/output24x16A_v0.3.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/example_config/different_configs/output32x10A.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/example_config/different_configs/output32x5A.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/exceptions.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/hardware/__init__.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/hardware/analog/__init__.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/hardware/analog/adc.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/hardware/can/__init__.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/hardware/can/bridge.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/hardware/can/client.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/hardware/can/interface.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/hardware/can/node.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/hardware/can/node_id.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/hardware/can/test_od.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/hardware/display/__init__.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/hardware/display/early_oled.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/hardware/display/fonts/danube__.ttf +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/hardware/display/oled.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/hardware/gpio/__init__.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/hardware/gpio/expanders/__init__.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/hardware/gpio/expanders/mcp23017.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/hardware/gpio/expanders/pca9685.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/hardware/gpio/expanders/pcf8575.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/hardware/gpio/input/__init__.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/hardware/gpio/input/base.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/hardware/gpio/input/manager.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/hardware/i2c/__init__.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/hardware/i2c/bus.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/hardware/i2c/ina219.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/hardware/i2c/ina219_driver.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/hardware/i2c/ina226.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/hardware/i2c/ina226_driver.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/hardware/i2c/mcp9808.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/hardware/i2c/pct2075.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/hardware/onewire/__init__.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/hardware/onewire/dallas.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/hardware/sensor/__init__.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/hardware/sensor/temperature/__init__.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/hardware/sensor/temperature/base.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/hardware/sensor/temperature/mcp9808.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/hardware/sensor/temperature/pct2075.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/integration/__init__.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/integration/homeassistant.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/integration/interlock.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/integration/lox_template.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/__init__.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/actions.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/assets/docker/daemon.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/assets/docker/nodered/caddy/502.html +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/assets/docker/nodered/caddy/init-certs.sh +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/assets/docker/nodered/docker-compose-cloud.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/assets/docker/nodered/docker-compose.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/assets/docker/nodered/node-red/settings.js +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/assets/helpers/boneio-containers +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/assets/helpers/boneio-helpers-heal +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/assets/helpers/boneio-migrate-v2 +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/assets/issue.d/10-boneio.issue +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/assets/journald/journald.conf +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/assets/kernel/postinst-boneio-overlay +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/assets/migrations-recovery.pem +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/assets/migrations.pem +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/assets/modules-load.d/onewire.conf +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/assets/mosquitto/boneio.conf +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/assets/sshd/10-boneio-hardening.conf +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/assets/sudoers/boneio +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/assets/sudoers/boneio-helpers +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/assets/sudoers/boneio-timedatectl +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/assets/systemd/boneio-helpers-heal.service +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/assets/systemd/boneio-oled-boot.service +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/assets/systemd/boneio-oled-shutdown.service +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/assets/systemd/boneio.service +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/assets/systemd/dropins/avahi-daemon-defer.conf +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/assets/systemd/dropins/bb-usb-gadgets-defer.conf +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/assets/systemd/dropins/mosquitto-priority.conf +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/assets/systemd/dropins/timer-no-persistent.conf +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/assets/systemd/dropins/user-manager-defer.conf +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/assets/systemd/linger-marker +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/assets/systemd/set-hostname-once.service +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/assets/usr-local-bin/set-hostname-once.sh +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/assets/usr-sbin/oled_boot_splash.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/assets/usr-sbin/oled_boot_splash.sh +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/assets/usr-sbin/oled_msg.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/assets/usr-sbin/oled_msg.sh +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/assets/wheels/pyyaml-6.0.3-cp313-cp313-linux_armv7l.whl +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/bootstrap/boneio-migrate +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/bootstrap/install-helper.sh +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/bootstrap/sudoers-migrate +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/plans/1.3.0.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/plans/1.3.0.sig +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/plans/1.3.1.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/plans/1.3.1.sig +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/plans/1.3.2.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/plans/1.3.2.sig +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/plans/1.4.0.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/plans/1.4.0.sig +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/plans/1.4.3.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/plans/1.4.3.sig +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/plans/1.4.4.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/plans/1.4.4.sig +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/plans/1.5.0.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/plans/1.5.0.sig +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/plans/1.5.1.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/plans/1.5.1.sig +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/plans/1.5.10.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/plans/1.5.10.sig +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/plans/1.5.11.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/plans/1.5.11.sig +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/plans/1.5.12.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/plans/1.5.12.sig +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/plans/1.5.13.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/plans/1.5.13.sig +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/plans/1.5.14.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/plans/1.5.14.sig +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/plans/1.5.15.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/plans/1.5.15.sig +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/plans/1.5.16.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/plans/1.5.16.sig +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/plans/1.5.17.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/plans/1.5.17.sig +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/plans/1.5.18.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/plans/1.5.18.sig +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/plans/1.5.2.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/plans/1.5.2.sig +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/plans/1.5.3.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/plans/1.5.3.sig +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/plans/1.5.4.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/plans/1.5.4.sig +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/plans/1.5.5.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/plans/1.5.5.sig +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/plans/1.5.6.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/plans/1.5.6.sig +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/plans/1.5.7.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/plans/1.5.7.sig +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/plans/1.5.8.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/plans/1.5.8.sig +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/plans/1.5.9.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/plans/1.5.9.sig +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/plans/1.6.0.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/plans/1.6.0.sig +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/plans/1.6.1.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/plans/1.6.1.sig +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/plans/1.6.10.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/plans/1.6.10.sig +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/plans/1.6.11.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/plans/1.6.11.sig +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/plans/1.6.12.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/plans/1.6.12.sig +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/plans/1.6.13.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/plans/1.6.13.sig +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/plans/1.6.14.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/plans/1.6.14.sig +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/plans/1.6.15.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/plans/1.6.15.sig +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/plans/1.6.16.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/plans/1.6.16.sig +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/plans/1.6.2.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/plans/1.6.2.sig +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/plans/1.6.3.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/plans/1.6.3.sig +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/plans/1.6.4.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/plans/1.6.4.sig +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/plans/1.6.6.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/plans/1.6.6.sig +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/plans/1.6.7.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/plans/1.6.7.sig +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/runner.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/versions/__init__.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/versions/v1_3_0_baseline.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/versions/v1_3_1_fix_oled_boot.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/versions/v1_3_2_cleanup_can_sudoers.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/versions/v1_4_0_fix_mqtt_sudoers.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/versions/v1_4_3_oled_shutdown.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/versions/v1_4_4_caddy.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/versions/v1_5_0_fix_oled_fifo_permissions.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/versions/v1_5_10_disable_console_setup.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/versions/v1_5_11_timer_catchup.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/versions/v1_5_12_oled_splash_off_critical_path.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/versions/v1_5_13_mosquitto_priority.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/versions/v1_5_14_journal_apparent_size.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/versions/v1_5_15_prune_orphan_journals.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/versions/v1_5_16_login_linger.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/versions/v1_5_17_defer_user_manager.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/versions/v1_5_18_fix_hostname_once.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/versions/v1_5_1_ufw_lox_udp.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/versions/v1_5_2_libyaml.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/versions/v1_5_3_libyaml_retry.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/versions/v1_5_4_onewire_modules.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/versions/v1_5_5_overlay_kernel_hook.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/versions/v1_5_6_boot_service_order.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/versions/v1_5_7_journald_limits.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/versions/v1_5_8_apparmor_prune.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/versions/v1_5_9_defer_nonessential.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/versions/v1_6_0_nodered_admin_auth.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/versions/v1_6_10_narrow_sudo_rules.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/versions/v1_6_11_drop_docker_group.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/versions/v1_6_12_console_shows_ip.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/versions/v1_6_13_custom_certificate.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/versions/v1_6_14_certificate_lifetime.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/versions/v1_6_15_web_port_reaches_caddy.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/versions/v1_6_16_release_floor_ordering.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/versions/v1_6_1_mosquitto_passwd_perms.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/versions/v1_6_2_drop_build_sudo_rule.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/versions/v1_6_3_firewall_rule_gaps.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/versions/v1_6_4_ssh_login_hardening.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/versions/v1_6_5_trust_transition.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/versions/v1_6_6_retire_legacy_helper.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/versions/v1_6_7_timedatectl_sudoers.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/versions/v1_6_8_system_helper.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/migrations/versions/v1_6_9_ntp_servers.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/modbus/__init__.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/modbus/cli.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/modbus/client.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/modbus/coordinator.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/modbus/devices/__init__.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/modbus/devices/energy_meters/dts1964_3f.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/modbus/devices/energy_meters/le-03mw.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/modbus/devices/energy_meters/le-03mwct.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/modbus/devices/energy_meters/orno-or-we-517.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/modbus/devices/energy_meters/sdm120.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/modbus/devices/energy_meters/sdm630.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/modbus/devices/energy_meters/socomec_e03.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/modbus/devices/energy_meters/socomec_e23.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/modbus/devices/hvac/defro-drx.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/modbus/devices/hvac/eht-topventil-plus.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/modbus/devices/hvac/fujitsu-ac.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/modbus/devices/hvac/thessla.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/modbus/devices/hvac/ventclear.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/modbus/devices/hvac/wanas415.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/modbus/devices/inverters/sofar.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/modbus/devices/other/esp32_relay_x4_modbus.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/modbus/devices/other/n4dsc08.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/modbus/devices/other/r4dcb08.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/modbus/devices/sensors/boneio-edge-temp.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/modbus/devices/sensors/cwt.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/modbus/devices/sensors/dyp-a12-ultrasonic.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/modbus/devices/sensors/gdfs.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/modbus/devices/sensors/gdfx.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/modbus/devices/sensors/liquid-sensor.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/modbus/devices/sensors/pt100.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/modbus/devices/sensors/qdw90a.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/modbus/devices/sensors/sht20.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/modbus/devices/sensors/sht30.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/modbus/entities/__init__.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/modbus/entities/base.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/modbus/entities/derived/__init__.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/modbus/entities/derived/numeric.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/modbus/entities/derived/select.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/modbus/entities/derived/switch.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/modbus/entities/derived/text.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/modbus/entities/sensor/__init__.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/modbus/entities/sensor/binary.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/modbus/entities/sensor/numeric.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/modbus/entities/sensor/text.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/modbus/entities/writeable/__init__.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/modbus/entities/writeable/binary.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/modbus/entities/writeable/numeric.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/modbus/mock_coordinator.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/modbus/utils.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/models/__init__.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/models/actions.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/models/events.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/models/files.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/models/logs.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/models/mqtt.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/models/state.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/runner.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/schema/actions.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/schema/actions_sensor.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/schema/actions_switch.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/schema/condition.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/schema/filters.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/schema/filters_adc.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/schema/id.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/schema/remote_devices.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/schema/remote_inputs.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/schema/remote_outputs.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/schema/schema.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/schema/temp_unit.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/schema/update_interval.yaml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/action_validation.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/app.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/bind.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/dashboard_cards.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/frontend-dist/assets/AppInitContext-vTo66GKy.js +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/frontend-dist/assets/EntityGrid-BiDlj33Y.js +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/frontend-dist/assets/LongPressWrapper-DJfAXNKc.js +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/frontend-dist/assets/NodeRedView-BTn8YfcX.js +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/frontend-dist/assets/Sparkline-CNZW64p4.js +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/frontend-dist/assets/ViewToggle-i1Ti0oPo.js +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/frontend-dist/assets/aiConfig-V_p4bX8d.js +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/frontend-dist/assets/aiWizardPrompt-DbidxtQG.js +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/frontend-dist/assets/axios-DJBeJS4R.js +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/frontend-dist/assets/basePath-CxHj-SSK.js +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/frontend-dist/assets/clipboard-CCtx29e-.js +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/frontend-dist/assets/codicon-ngg6Pgfi.ttf +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/frontend-dist/assets/configCache-BS98BpF9.js +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/frontend-dist/assets/dialog-BHkRvqJ3.js +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/frontend-dist/assets/editor.worker-O-CH8JUO.js +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/frontend-dist/assets/fa-DFicOgEn.js +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/frontend-dist/assets/formatters-Cc0QIRxb.js +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/frontend-dist/assets/gi-_T3Az7Xl.js +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/frontend-dist/assets/index-BFy6Y45i.css +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/frontend-dist/assets/longPress-Dx7OCSyP.js +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/frontend-dist/assets/monaco-Br_kD0ds.css +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/frontend-dist/assets/rolldown-runtime-hePW80VL.js +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/frontend-dist/assets/select-DXweKMhj.js +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/frontend-dist/assets/tabs-box-S5EvhXSU.js +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/frontend-dist/assets/utils-DOQQTBMN.js +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/frontend-dist/assets/workbox-window.prod.es5-Bd17z0YL.js +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/frontend-dist/assets/yaml.worker-CeS-z5zL.js +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/frontend-dist/boneio-192.png +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/frontend-dist/boneio-512.png +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/frontend-dist/boneio.svg +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/frontend-dist/boneio_fav.svg +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/frontend-dist/schema/adc.schema.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/frontend-dist/schema/areas.schema.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/frontend-dist/schema/binary_sensor.schema.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/frontend-dist/schema/boneio.schema.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/frontend-dist/schema/can.schema.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/frontend-dist/schema/config.schema.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/frontend-dist/schema/cover.schema.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/frontend-dist/schema/dallas.schema.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/frontend-dist/schema/ds2482.schema.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/frontend-dist/schema/event.schema.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/frontend-dist/schema/ina219.schema.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/frontend-dist/schema/ina226.schema.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/frontend-dist/schema/irrigation.schema.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/frontend-dist/schema/lm75.schema.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/frontend-dist/schema/location.schema.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/frontend-dist/schema/logger.schema.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/frontend-dist/schema/lox_udp.schema.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/frontend-dist/schema/mcp23017.schema.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/frontend-dist/schema/mcp9808.schema.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/frontend-dist/schema/modbus.schema.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/frontend-dist/schema/modbus_devices.schema.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/frontend-dist/schema/mqtt.schema.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/frontend-dist/schema/oled.schema.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/frontend-dist/schema/osdp.schema.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/frontend-dist/schema/output.schema.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/frontend-dist/schema/output_group.schema.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/frontend-dist/schema/pca9685.schema.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/frontend-dist/schema/pcf8575.schema.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/frontend-dist/schema/remote_devices.schema.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/frontend-dist/schema/remote_inputs.schema.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/frontend-dist/schema/remote_outputs.schema.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/frontend-dist/schema/schedule.schema.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/frontend-dist/schema/sensor.schema.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/frontend-dist/schema/template.schema.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/frontend-dist/schema/virtual_energy_sensor.schema.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/frontend-dist/schema/virtual_switch.schema.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/frontend-dist/schema/web.schema.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/frontend-dist/workbox-7e79c025.js +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/hvac_svg_templates.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/middleware/__init__.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/middleware/auth.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/middleware/csrf.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/middleware/policy.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/modbus_card_templates.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/rate_limit.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/routes/__init__.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/routes/accounts.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/routes/auth.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/routes/can.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/routes/config.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/routes/config_actions.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/routes/config_backups.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/routes/config_core.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/routes/config_discovery.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/routes/config_files.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/routes/covers.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/routes/dashboard.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/routes/dev_fake_device.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/routes/diagnostics.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/routes/irrigation.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/routes/migrations.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/routes/modbus.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/routes/mqtt_reference.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/routes/nodered.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/routes/outputs.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/routes/remote_devices.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/routes/schedule.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/routes/sensors.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/routes/sun.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/routes/system.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/routes/templates.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/routes/timezone_sudoers.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/routes/tools.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/routes/update.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/schema/adc.schema.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/schema/areas.schema.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/schema/binary_sensor.schema.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/schema/boneio.schema.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/schema/can.schema.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/schema/config.schema.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/schema/cover.schema.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/schema/dallas.schema.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/schema/ds2482.schema.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/schema/event.schema.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/schema/ina219.schema.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/schema/ina226.schema.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/schema/irrigation.schema.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/schema/lm75.schema.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/schema/location.schema.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/schema/logger.schema.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/schema/lox_udp.schema.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/schema/mcp23017.schema.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/schema/mcp9808.schema.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/schema/modbus.schema.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/schema/modbus_devices.schema.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/schema/mqtt.schema.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/schema/oled.schema.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/schema/osdp.schema.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/schema/output.schema.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/schema/output_group.schema.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/schema/pca9685.schema.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/schema/pcf8575.schema.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/schema/remote_devices.schema.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/schema/remote_inputs.schema.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/schema/remote_outputs.schema.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/schema/schedule.schema.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/schema/sensor.schema.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/schema/template.schema.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/schema/virtual_energy_sensor.schema.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/schema/virtual_switch.schema.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/schema/web.schema.json +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/security_headers.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/services/__init__.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/services/logs.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/sudo_rate_limiter.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/web_server.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio/webui/websocket_manager.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio.egg-info/dependency_links.txt +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio.egg-info/entry_points.txt +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio.egg-info/requires.txt +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/boneio.egg-info/top_level.txt +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/pyproject.toml +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/setup.cfg +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/setup.py +0 -0
- {boneio-1.6.0.dev12 → boneio-1.6.0.dev13}/tests/test_py313_compatibility.py +0 -0
|
@@ -237,6 +237,7 @@ def evaluate(
|
|
|
237
237
|
proxy_serving: bool | None = None,
|
|
238
238
|
custom_certificate: bool = False,
|
|
239
239
|
cloud_error: str | None = None,
|
|
240
|
+
service_password: str | None = None,
|
|
240
241
|
) -> Posture:
|
|
241
242
|
"""Work out what is still unlocked.
|
|
242
243
|
|
|
@@ -250,6 +251,9 @@ def evaluate(
|
|
|
250
251
|
panel right now. None when nobody looked.
|
|
251
252
|
custom_certificate: Whether an uploaded certificate is installed.
|
|
252
253
|
cloud_error: What cloud registration last failed with, if anything.
|
|
254
|
+
service_password: How the boneio SSH login stands, from boneio-system:
|
|
255
|
+
``locked``, ``empty``, ``shipped``, ``set`` or ``unknown``. None
|
|
256
|
+
when nobody could ask.
|
|
253
257
|
|
|
254
258
|
Returns:
|
|
255
259
|
The full set of checks.
|
|
@@ -354,6 +358,46 @@ def evaluate(
|
|
|
354
358
|
)
|
|
355
359
|
)
|
|
356
360
|
|
|
361
|
+
# The boneio login carries a password-gated (ALL:ALL) ALL, so its password
|
|
362
|
+
# is the root password. Images before 1.6 shipped it as "Black" on every
|
|
363
|
+
# unit, and that password is published; a device still using it can be
|
|
364
|
+
# taken over by anyone who reaches it over SSH first.
|
|
365
|
+
ssh_known = service_password in ("locked", "shipped", "empty", "set")
|
|
366
|
+
ssh_exposed = service_password in ("shipped", "empty")
|
|
367
|
+
checks.append(
|
|
368
|
+
Check(
|
|
369
|
+
id="ssh_password",
|
|
370
|
+
title="SSH login password",
|
|
371
|
+
severity=Severity.CRITICAL,
|
|
372
|
+
state=(
|
|
373
|
+
State.UNKNOWN
|
|
374
|
+
if not ssh_known
|
|
375
|
+
else State.FAILED
|
|
376
|
+
if ssh_exposed
|
|
377
|
+
else State.OK
|
|
378
|
+
),
|
|
379
|
+
detail=(
|
|
380
|
+
"The boneio account logs in over SSH with the password shipped "
|
|
381
|
+
"on every unit, or with none. That account can become root, so "
|
|
382
|
+
"anyone who reaches this device over SSH can too."
|
|
383
|
+
if ssh_exposed
|
|
384
|
+
else "Could not ask how the SSH login stands."
|
|
385
|
+
if not ssh_known
|
|
386
|
+
else "The SSH login does not use the shipped password."
|
|
387
|
+
),
|
|
388
|
+
# Not a button in the panel, on purpose: an operation that set this
|
|
389
|
+
# account's password from the panel whenever asked would be a way
|
|
390
|
+
# from the account to root. The first-run wizard sets it once; after
|
|
391
|
+
# that it is passwd, which asks for the current one.
|
|
392
|
+
remedy=(
|
|
393
|
+
"Log in over SSH as boneio and run passwd."
|
|
394
|
+
if ssh_exposed
|
|
395
|
+
else ""
|
|
396
|
+
),
|
|
397
|
+
settings_section=None,
|
|
398
|
+
)
|
|
399
|
+
)
|
|
400
|
+
|
|
357
401
|
web = config.get("web") if isinstance(config.get("web"), dict) else {}
|
|
358
402
|
cloud_enabled = bool((web.get("cloud") or {}).get("enabled"))
|
|
359
403
|
# Somebody said no to cloud registration and meant it. Registration
|
|
@@ -180,6 +180,39 @@ def mqtt_password(account: str, password: str, timeout: int = 60) -> Result:
|
|
|
180
180
|
return run("mqtt-password", account, timeout=timeout, stdin=f"{password}\n")
|
|
181
181
|
|
|
182
182
|
|
|
183
|
+
def service_password_state(timeout: int = 30) -> str | None:
|
|
184
|
+
"""How the boneio login stands: locked, empty, shipped, set or unknown.
|
|
185
|
+
|
|
186
|
+
Returns:
|
|
187
|
+
The state, or None when the helper is not there to ask.
|
|
188
|
+
"""
|
|
189
|
+
result = run("service-password-state", timeout=timeout)
|
|
190
|
+
if not result.ok:
|
|
191
|
+
return None
|
|
192
|
+
parsed = result.json() or {}
|
|
193
|
+
state = parsed.get("state")
|
|
194
|
+
return state if isinstance(state, str) else None
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
def service_password_init(password: str, timeout: int = 60) -> Result:
|
|
198
|
+
"""Set the boneio login password, once.
|
|
199
|
+
|
|
200
|
+
The helper allows this only while the account is still in a state the
|
|
201
|
+
factory left — locked, on the shipped password, or with none — and only the
|
|
202
|
+
first time. Anything else is the owner's password, and changing it is
|
|
203
|
+
theirs to do with ``passwd``. The password goes over stdin, never as an
|
|
204
|
+
argument.
|
|
205
|
+
|
|
206
|
+
Args:
|
|
207
|
+
password: The password the owner chose.
|
|
208
|
+
timeout: Seconds to allow.
|
|
209
|
+
|
|
210
|
+
Returns:
|
|
211
|
+
The outcome.
|
|
212
|
+
"""
|
|
213
|
+
return run("service-password-init", timeout=timeout, stdin=f"{password}\n")
|
|
214
|
+
|
|
215
|
+
|
|
183
216
|
def mqtt_reload(timeout: int = 30) -> Result:
|
|
184
217
|
"""Have the broker re-read its password file."""
|
|
185
218
|
return run("mqtt-reload", timeout=timeout)
|
|
@@ -11,7 +11,7 @@ bff00753c72fb17609a6f7b3a58ef78b7b394da12d19fd65b875f2889695e2b4 docker/nodered
|
|
|
11
11
|
84fd30fddc0928e4f82c434d42555cc96d9ac56e60ecfb78372b1661816506c8 helpers/boneio-containers
|
|
12
12
|
dff0cd02daad2cbd525a0535f8f3562bb742e7e737b24c69e5afa986415e67e4 helpers/boneio-helpers-heal
|
|
13
13
|
e91a24a2cc3645d9b96c2574f6ce8c19de48e80251da127c8aed0c7f5c8357dd helpers/boneio-migrate-v2
|
|
14
|
-
|
|
14
|
+
a12a773ace77b3ddfb4346f74f3df9a7ea059d0bbeb90035d5fd263481c619c1 helpers/boneio-system
|
|
15
15
|
f316c778b3125e4e992942c889c4082f8a12f578a6d68c4e7c79fa80e4cc94a1 issue.d/10-boneio.issue
|
|
16
16
|
e6013f4fbf11693f39123b1e6159c7d7224a7c832e994722120980f64039c17e journald/journald.conf
|
|
17
17
|
d28f2e9336b881b102c42f4278ec9ddf046c83dab4469dc5be7326768e074cb6 kernel/postinst-boneio-overlay
|
|
@@ -20,6 +20,8 @@ This replaces both with named operations:
|
|
|
20
20
|
ntp-set <servers|default> point systemd-timesyncd at given servers
|
|
21
21
|
mqtt-password <account> set a broker password, read from stdin
|
|
22
22
|
mqtt-reload have the broker re-read its password file
|
|
23
|
+
service-password-state is the boneio login locked, shipped or set
|
|
24
|
+
service-password-init set it once, from stdin — see below
|
|
23
25
|
|
|
24
26
|
Every argument is checked against a closed set before anything runs, and the
|
|
25
27
|
uEnv.txt edit is done here with a compiled pattern rather than by handing a
|
|
@@ -44,6 +46,7 @@ import shutil
|
|
|
44
46
|
import subprocess
|
|
45
47
|
import sys
|
|
46
48
|
import tempfile
|
|
49
|
+
import time
|
|
47
50
|
from pathlib import Path
|
|
48
51
|
|
|
49
52
|
LOG_FILE = "/var/log/boneio-system.log"
|
|
@@ -108,6 +111,24 @@ MQTT_ACCOUNTS = ("boneio", "homeassistant", "mqtt")
|
|
|
108
111
|
MOSQUITTO_PASSWD_MODE = 0o640
|
|
109
112
|
MOSQUITTO_PASSWD_OWNER = ("root", "mosquitto")
|
|
110
113
|
|
|
114
|
+
#: The login this helper serves, and the only account whose password it may
|
|
115
|
+
#: touch. Not a parameter: a verb that set "an account's password" would be a
|
|
116
|
+
#: way to give any local account a password its owner never chose.
|
|
117
|
+
SERVICE_ACCOUNT = "boneio"
|
|
118
|
+
SHADOW = Path("/etc/shadow")
|
|
119
|
+
#: What every image before 1.6 shipped as that account's password, identical on
|
|
120
|
+
#: every unit and published. Recognised so the panel can say it is still there;
|
|
121
|
+
#: never written by this helper.
|
|
122
|
+
SHIPPED_PASSWORD = "Black"
|
|
123
|
+
#: Written once the owner's password has been set. Root-owned and outside the
|
|
124
|
+
#: application's reach, so the one-shot cannot be re-armed by relocking the
|
|
125
|
+
#: account — see _service_password_init.
|
|
126
|
+
SERVICE_PASSWORD_FLAG = Path("/var/lib/boneio/service-password.set")
|
|
127
|
+
#: Generous, and well above anything a person types. chpasswd has no limit of
|
|
128
|
+
#: its own worth relying on, and a caller able to hand root a megabyte on stdin
|
|
129
|
+
#: is a caller who should be told no.
|
|
130
|
+
SERVICE_PASSWORD_MAX = 1024
|
|
131
|
+
|
|
111
132
|
#: One DNS name. Addresses are validated with :mod:`ipaddress` instead, so this
|
|
112
133
|
#: only has to cover hostnames.
|
|
113
134
|
#:
|
|
@@ -126,6 +147,7 @@ VERBS = (
|
|
|
126
147
|
"hostname-set",
|
|
127
148
|
"ntp-get", "ntp-set",
|
|
128
149
|
"mqtt-password", "mqtt-reload",
|
|
150
|
+
"service-password-state", "service-password-init",
|
|
129
151
|
)
|
|
130
152
|
|
|
131
153
|
|
|
@@ -644,6 +666,176 @@ def _ntp_set(argument: str | None) -> int:
|
|
|
644
666
|
return _run(["systemctl", "try-restart", "systemd-timesyncd"], tolerate=True)
|
|
645
667
|
|
|
646
668
|
|
|
669
|
+
# ---------------------------------------------------------- service password
|
|
670
|
+
#
|
|
671
|
+
# The boneio account carries a password-gated (ALL:ALL) ALL, so its password is
|
|
672
|
+
# the root password. Images before 1.6 shipped it as "Black" on every unit;
|
|
673
|
+
# images from 1.6 ship it locked, and the owner's first password — the one they
|
|
674
|
+
# give the first-run wizard — becomes it.
|
|
675
|
+
#
|
|
676
|
+
# Setting it is the one thing here that could undo F-04. This helper runs as
|
|
677
|
+
# root, without a password, for anyone holding the boneio account. An operation
|
|
678
|
+
# that sets that account's password whenever asked is boneio -> root in two
|
|
679
|
+
# steps: set a password, then sudo with it. So it is allowed in exactly the two
|
|
680
|
+
# states where it grants nothing new:
|
|
681
|
+
#
|
|
682
|
+
# locked nobody has chosen a password yet — the factory state.
|
|
683
|
+
# shipped the password is "Black". Whoever holds boneio already has root,
|
|
684
|
+
# through sudo with a password everybody knows.
|
|
685
|
+
# empty no password at all, which is the same thing without the typing.
|
|
686
|
+
#
|
|
687
|
+
# and never where the owner has chosen one. The flag makes it once-only even if
|
|
688
|
+
# somebody later locks the account again by hand.
|
|
689
|
+
|
|
690
|
+
|
|
691
|
+
def _shadow_hash(account: str = SERVICE_ACCOUNT) -> str | None:
|
|
692
|
+
"""The password field of *account* in /etc/shadow, or None if absent.
|
|
693
|
+
|
|
694
|
+
Args:
|
|
695
|
+
account: The account to look up.
|
|
696
|
+
|
|
697
|
+
Returns:
|
|
698
|
+
The hash field, possibly empty or carrying a lock prefix.
|
|
699
|
+
|
|
700
|
+
Raises:
|
|
701
|
+
Refused: If the shadow file cannot be read.
|
|
702
|
+
"""
|
|
703
|
+
try:
|
|
704
|
+
lines = SHADOW.read_text(encoding="utf-8").splitlines()
|
|
705
|
+
except OSError as exc:
|
|
706
|
+
raise Refused(f"cannot read {SHADOW}: {exc}") from exc
|
|
707
|
+
for line in lines:
|
|
708
|
+
name, _, rest = line.partition(":")
|
|
709
|
+
if name == account:
|
|
710
|
+
return rest.split(":", 1)[0]
|
|
711
|
+
return None
|
|
712
|
+
|
|
713
|
+
|
|
714
|
+
def _crypt_matches(password: str, stored: str) -> bool | None:
|
|
715
|
+
"""Whether *password* verifies against the crypt(3) hash *stored*.
|
|
716
|
+
|
|
717
|
+
Through libcrypt directly: Python 3.13 removed the crypt module, and the
|
|
718
|
+
alternatives — su, sudo -S, an expect script — all mean trying the password
|
|
719
|
+
against a live login and leaving a failed attempt in the log for every
|
|
720
|
+
check.
|
|
721
|
+
|
|
722
|
+
Returns:
|
|
723
|
+
True or False, or None when libcrypt cannot be used here.
|
|
724
|
+
"""
|
|
725
|
+
import ctypes
|
|
726
|
+
import ctypes.util
|
|
727
|
+
|
|
728
|
+
name = ctypes.util.find_library("crypt") or "libcrypt.so.1"
|
|
729
|
+
try:
|
|
730
|
+
libcrypt = ctypes.CDLL(name)
|
|
731
|
+
except OSError:
|
|
732
|
+
return None
|
|
733
|
+
libcrypt.crypt.restype = ctypes.c_char_p
|
|
734
|
+
libcrypt.crypt.argtypes = (ctypes.c_char_p, ctypes.c_char_p)
|
|
735
|
+
result = libcrypt.crypt(password.encode(), stored.encode())
|
|
736
|
+
if not result:
|
|
737
|
+
return None
|
|
738
|
+
return result.decode(errors="replace") == stored
|
|
739
|
+
|
|
740
|
+
|
|
741
|
+
def _service_password_state() -> str:
|
|
742
|
+
"""Classify the boneio login.
|
|
743
|
+
|
|
744
|
+
Returns:
|
|
745
|
+
``locked``, ``empty``, ``shipped``, ``set`` or ``unknown``.
|
|
746
|
+
|
|
747
|
+
Raises:
|
|
748
|
+
Refused: If the account does not exist.
|
|
749
|
+
"""
|
|
750
|
+
stored = _shadow_hash()
|
|
751
|
+
if stored is None:
|
|
752
|
+
raise Refused(f"no {SERVICE_ACCOUNT} account in {SHADOW}")
|
|
753
|
+
if stored.startswith(("!", "*")):
|
|
754
|
+
return "locked"
|
|
755
|
+
if stored == "":
|
|
756
|
+
# An empty field is a login with no password at all.
|
|
757
|
+
return "empty"
|
|
758
|
+
matches = _crypt_matches(SHIPPED_PASSWORD, stored)
|
|
759
|
+
if matches is None:
|
|
760
|
+
return "unknown"
|
|
761
|
+
return "shipped" if matches else "set"
|
|
762
|
+
|
|
763
|
+
|
|
764
|
+
def _service_password_state_verb() -> int:
|
|
765
|
+
"""Print the state as JSON. Changes nothing.
|
|
766
|
+
|
|
767
|
+
Returns:
|
|
768
|
+
Process exit status.
|
|
769
|
+
"""
|
|
770
|
+
state = _service_password_state()
|
|
771
|
+
print(json.dumps({"state": state, "initialised": SERVICE_PASSWORD_FLAG.exists()}))
|
|
772
|
+
return 0
|
|
773
|
+
|
|
774
|
+
|
|
775
|
+
def _service_password_init() -> int:
|
|
776
|
+
"""Set the boneio password once, from stdin.
|
|
777
|
+
|
|
778
|
+
Returns:
|
|
779
|
+
Process exit status.
|
|
780
|
+
|
|
781
|
+
Raises:
|
|
782
|
+
Refused: If a password has already been set this way, if the owner has
|
|
783
|
+
chosen one, or if the password on stdin is unusable.
|
|
784
|
+
"""
|
|
785
|
+
if SERVICE_PASSWORD_FLAG.exists():
|
|
786
|
+
raise Refused(
|
|
787
|
+
"the service account password has already been set once; change it "
|
|
788
|
+
"with passwd, which asks for the current one"
|
|
789
|
+
)
|
|
790
|
+
state = _service_password_state()
|
|
791
|
+
if state not in ("locked", "shipped", "empty"):
|
|
792
|
+
raise Refused(
|
|
793
|
+
f"the service account password is {state!r}, not one the factory "
|
|
794
|
+
"left; it is the owner's to change, with passwd"
|
|
795
|
+
)
|
|
796
|
+
|
|
797
|
+
password = sys.stdin.read()
|
|
798
|
+
password = password[:-1] if password.endswith("\n") else password
|
|
799
|
+
if not password:
|
|
800
|
+
raise Refused("no password on stdin")
|
|
801
|
+
if "\n" in password or "\r" in password:
|
|
802
|
+
raise Refused("a password cannot contain a line break")
|
|
803
|
+
if len(password) > SERVICE_PASSWORD_MAX:
|
|
804
|
+
raise Refused(f"a password longer than {SERVICE_PASSWORD_MAX} characters")
|
|
805
|
+
|
|
806
|
+
try:
|
|
807
|
+
result = subprocess.run(
|
|
808
|
+
["chpasswd"],
|
|
809
|
+
# chpasswd splits on the first colon, so one in the password is
|
|
810
|
+
# fine. Over stdin, never as an argument: ps would show it.
|
|
811
|
+
input=f"{SERVICE_ACCOUNT}:{password}\n",
|
|
812
|
+
capture_output=True,
|
|
813
|
+
text=True,
|
|
814
|
+
timeout=30,
|
|
815
|
+
)
|
|
816
|
+
except (OSError, subprocess.SubprocessError) as exc:
|
|
817
|
+
raise Refused(f"cannot run chpasswd: {exc}") from exc
|
|
818
|
+
if result.returncode != 0:
|
|
819
|
+
_LOGGER.error("chpasswd failed for %s (rc=%d)", SERVICE_ACCOUNT, result.returncode)
|
|
820
|
+
return result.returncode
|
|
821
|
+
|
|
822
|
+
# A password set from the expired 1.6-era state would still demand a change
|
|
823
|
+
# at the first login; the owner has just chosen this one, so it is current.
|
|
824
|
+
subprocess.run(
|
|
825
|
+
["chage", "-d", str(int(time.time()) // 86400), SERVICE_ACCOUNT],
|
|
826
|
+
capture_output=True,
|
|
827
|
+
timeout=30,
|
|
828
|
+
)
|
|
829
|
+
|
|
830
|
+
SERVICE_PASSWORD_FLAG.parent.mkdir(parents=True, exist_ok=True)
|
|
831
|
+
SERVICE_PASSWORD_FLAG.write_text(
|
|
832
|
+
f"set from state {state} at {int(time.time())}\n", encoding="utf-8"
|
|
833
|
+
)
|
|
834
|
+
os.chmod(SERVICE_PASSWORD_FLAG, 0o644)
|
|
835
|
+
_LOGGER.info("Service account password set (was %s)", state)
|
|
836
|
+
return 0
|
|
837
|
+
|
|
838
|
+
|
|
647
839
|
# ----------------------------------------------------------------- selftest
|
|
648
840
|
|
|
649
841
|
|
|
@@ -660,6 +852,8 @@ def selftest() -> int:
|
|
|
660
852
|
problems.append("hostnamectl is not installed")
|
|
661
853
|
if shutil.which("systemctl") is None:
|
|
662
854
|
problems.append("systemctl is not installed, so NTP servers cannot be applied")
|
|
855
|
+
if shutil.which("chpasswd") is None:
|
|
856
|
+
problems.append("chpasswd is not installed, so the service password cannot be set")
|
|
663
857
|
try:
|
|
664
858
|
_find_uenv()
|
|
665
859
|
except Refused as exc:
|
|
@@ -727,6 +921,10 @@ def main(argv: list[str] | None = None) -> int:
|
|
|
727
921
|
return _mqtt_password(args.argument)
|
|
728
922
|
if args.verb == "mqtt-reload":
|
|
729
923
|
return _mqtt_reload()
|
|
924
|
+
if args.verb == "service-password-state":
|
|
925
|
+
return _service_password_state_verb()
|
|
926
|
+
if args.verb == "service-password-init":
|
|
927
|
+
return _service_password_init()
|
|
730
928
|
if args.verb == "hostname-set":
|
|
731
929
|
return _hostname_set(args.argument)
|
|
732
930
|
if args.verb == "ntp-get":
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
[{"action":"install_file","dst":"/usr/lib/boneio/trusted/boneio-system","expected_sha256":"a12a773ace77b3ddfb4346f74f3df9a7ea059d0bbeb90035d5fd263481c619c1","group":"root","mode":493,"owner":"root","src":"helpers/boneio-system","template_vars":{},"validate":"python"},{"action":"install_file","dst":"/usr/sbin/boneio-system","expected_sha256":"a12a773ace77b3ddfb4346f74f3df9a7ea059d0bbeb90035d5fd263481c619c1","group":"root","mode":493,"owner":"root","src":"helpers/boneio-system","template_vars":{},"validate":"python"}]
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
P����{Pk�6���݅�r[;����U�u7���K���������%�F.���<�%i/�e
|
|
@@ -1 +1 @@
|
|
|
1
|
-
[{"action":"install_file","dst":"/usr/lib/boneio/trusted/boneio-migrate-v2","expected_sha256":"e91a24a2cc3645d9b96c2574f6ce8c19de48e80251da127c8aed0c7f5c8357dd","group":"root","mode":493,"owner":"root","src":"helpers/boneio-migrate-v2","template_vars":{}},{"action":"install_file","dst":"/usr/lib/boneio/trusted/boneio-containers","expected_sha256":"84fd30fddc0928e4f82c434d42555cc96d9ac56e60ecfb78372b1661816506c8","group":"root","mode":493,"owner":"root","src":"helpers/boneio-containers","template_vars":{}},{"action":"install_file","dst":"/usr/lib/boneio/trusted/boneio-system","expected_sha256":"
|
|
1
|
+
[{"action":"install_file","dst":"/usr/lib/boneio/trusted/boneio-migrate-v2","expected_sha256":"e91a24a2cc3645d9b96c2574f6ce8c19de48e80251da127c8aed0c7f5c8357dd","group":"root","mode":493,"owner":"root","src":"helpers/boneio-migrate-v2","template_vars":{}},{"action":"install_file","dst":"/usr/lib/boneio/trusted/boneio-containers","expected_sha256":"84fd30fddc0928e4f82c434d42555cc96d9ac56e60ecfb78372b1661816506c8","group":"root","mode":493,"owner":"root","src":"helpers/boneio-containers","template_vars":{}},{"action":"install_file","dst":"/usr/lib/boneio/trusted/boneio-system","expected_sha256":"a12a773ace77b3ddfb4346f74f3df9a7ea059d0bbeb90035d5fd263481c619c1","group":"root","mode":493,"owner":"root","src":"helpers/boneio-system","template_vars":{}},{"action":"install_file","dst":"/usr/lib/boneio/trusted/boneio-helpers-heal","expected_sha256":"dff0cd02daad2cbd525a0535f8f3562bb742e7e737b24c69e5afa986415e67e4","group":"root","mode":493,"owner":"root","src":"helpers/boneio-helpers-heal","template_vars":{}},{"action":"install_file","dst":"/usr/lib/boneio/trusted/sudoers-boneio-helpers","expected_sha256":"74e8c1209b80519dc6e3db6c6d8e7ca02f01f8f618cee6f741e8400270d3b05a","group":"root","mode":288,"owner":"root","src":"sudoers/boneio-helpers","template_vars":{}},{"action":"install_file","dst":"/usr/lib/boneio/trusted/migrations.pem","expected_sha256":"16a97c875edb68e19655b953b4baa773cc1a4e57810543cda646a3e3e83c0c0e","group":"root","mode":292,"owner":"root","src":"migrations.pem","template_vars":{}},{"action":"install_file","dst":"/usr/lib/boneio/trusted/migrations-recovery.pem","expected_sha256":"9681710e1a38b8ea7ba5558839e4ef8b5f01a75722dbf403913bad76437449ec","group":"root","mode":292,"owner":"root","src":"migrations-recovery.pem","template_vars":{}},{"action":"install_file","dst":"/usr/lib/boneio/trusted/docker-compose.yaml","expected_sha256":"c810560a25b1b393ab2602c3d81edcefdb7ce7d9f9d5bc2e799c43005ffd168a","group":"root","mode":420,"owner":"root","src":"docker/nodered/docker-compose.yaml","template_vars":{}},{"action":"install_file","dst":"/usr/lib/boneio/trusted/docker-compose-cloud.yaml","expected_sha256":"bf938ead2c25585a495fb3e79b27a73e7f3d7253f24896a2e779015273a7f22e","group":"root","mode":420,"owner":"root","src":"docker/nodered/docker-compose-cloud.yaml","template_vars":{}},{"action":"install_file","dst":"/etc/boneio/migrations.pem","expected_sha256":"16a97c875edb68e19655b953b4baa773cc1a4e57810543cda646a3e3e83c0c0e","group":"root","mode":292,"owner":"root","src":"migrations.pem","template_vars":{}},{"action":"install_file","dst":"/etc/boneio/migrations-recovery.pem","expected_sha256":"9681710e1a38b8ea7ba5558839e4ef8b5f01a75722dbf403913bad76437449ec","group":"root","mode":292,"owner":"root","src":"migrations-recovery.pem","template_vars":{}},{"action":"install_file","dst":"/usr/sbin/boneio-migrate-v2","expected_sha256":"e91a24a2cc3645d9b96c2574f6ce8c19de48e80251da127c8aed0c7f5c8357dd","group":"root","mode":493,"owner":"root","src":"helpers/boneio-migrate-v2","template_vars":{},"validate":"python","validate_cmd":"python3 -m py_compile"},{"action":"install_file","dst":"/usr/sbin/boneio-containers","expected_sha256":"84fd30fddc0928e4f82c434d42555cc96d9ac56e60ecfb78372b1661816506c8","group":"root","mode":493,"owner":"root","src":"helpers/boneio-containers","template_vars":{},"validate":"python","validate_cmd":"python3 -m py_compile"},{"action":"install_file","dst":"/usr/sbin/boneio-helpers-heal","expected_sha256":"dff0cd02daad2cbd525a0535f8f3562bb742e7e737b24c69e5afa986415e67e4","group":"root","mode":493,"owner":"root","src":"helpers/boneio-helpers-heal","template_vars":{},"validate":"python","validate_cmd":"python3 -m py_compile"},{"action":"install_file","dst":"/etc/sudoers.d/boneio-helpers","expected_sha256":"74e8c1209b80519dc6e3db6c6d8e7ca02f01f8f618cee6f741e8400270d3b05a","group":"root","mode":288,"owner":"root","src":"sudoers/boneio-helpers","template_vars":{},"validate":"sudoers","validate_cmd":"visudo -cf"},{"action":"install_file","dst":"/etc/systemd/system/boneio-helpers-heal.service","expected_sha256":"d3feacddc720307c6ce739e21cb5ca79d90b05c7e1a1f3d9481cd9dbb071c2c6","group":"root","mode":420,"on_change":{"action":"systemctl_daemon_reload"},"owner":"root","src":"systemd/boneio-helpers-heal.service","template_vars":{}},{"action":"systemctl_enable","unit":"boneio-helpers-heal.service"},{"action":"set_file_permissions","group":"root","mode":420,"owner":"root","path":"/home/boneio/docker/nodered/docker-compose.yaml"}]
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
�����&�4=�(t�'��6�Qc`2-�pl�&�����`�B��-�\Js����[�PC�RW
|
|
@@ -1 +1 @@
|
|
|
1
|
-
[{"action":"install_file","dst":"/usr/lib/boneio/trusted/boneio-system","expected_sha256":"
|
|
1
|
+
[{"action":"install_file","dst":"/usr/lib/boneio/trusted/boneio-system","expected_sha256":"a12a773ace77b3ddfb4346f74f3df9a7ea059d0bbeb90035d5fd263481c619c1","group":"root","mode":493,"owner":"root","src":"helpers/boneio-system","template_vars":{}},{"action":"install_file","dst":"/usr/sbin/boneio-system","expected_sha256":"a12a773ace77b3ddfb4346f74f3df9a7ea059d0bbeb90035d5fd263481c619c1","group":"root","mode":493,"owner":"root","src":"helpers/boneio-system","template_vars":{},"validate":"python","validate_cmd":"python3 -m py_compile"},{"action":"install_file","dst":"/etc/sudoers.d/boneio-helpers","expected_sha256":"74e8c1209b80519dc6e3db6c6d8e7ca02f01f8f618cee6f741e8400270d3b05a","group":"root","mode":288,"owner":"root","src":"sudoers/boneio-helpers","template_vars":{},"validate":"sudoers","validate_cmd":"visudo -cf"}]
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
�\''P��s�~�) ����Rs���Ժ�z��rg�#w�,Q�����aQ�#���'r����¿�
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
[{"action":"install_file","dst":"/usr/lib/boneio/trusted/boneio-system","expected_sha256":"a12a773ace77b3ddfb4346f74f3df9a7ea059d0bbeb90035d5fd263481c619c1","group":"root","mode":493,"owner":"root","src":"helpers/boneio-system","template_vars":{}},{"action":"install_file","dst":"/usr/sbin/boneio-system","expected_sha256":"a12a773ace77b3ddfb4346f74f3df9a7ea059d0bbeb90035d5fd263481c619c1","group":"root","mode":493,"owner":"root","src":"helpers/boneio-system","template_vars":{},"validate":"python","validate_cmd":"python3 -m py_compile"}]
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
t���[��/��0<�b��/K#�>�q�~:�z��r��WA�x4�H���M�,�
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"plans":{"1.3.0":"e251cb15b0603df5ba318eba03563757ef1401f577a25330aa135b11eb13156b","1.3.1":"580381a4f6f40fc1bd4e903e591ad0d5c1db27daaccafc6f79dabf8c3b84259a","1.3.2":"7a69ffaf0c41438be25a656dcdc87783daac0eae79218d023648ef9d708e373f","1.4.0":"41c3a16e7819857a4b826e944fcfb4f79c58e7192cb151b106a3acd7487d5771","1.4.3":"a8cfbabff09d21944a822c4a70f23a7ee14960c4054de151c9fbc7cdb29adff5","1.4.4":"e26cc8089d6b6679a6ead60916e1a08ca281502ac7168bb740b4cd6aa0f5c6a9","1.5.0":"52d9d118da099abda0e0153cd16892e201681f6e4d3c6e5790284d1ac469a407","1.5.1":"d283cb8c01024338fb614ae2199744d883379f59579423e4eb9234f5c59ebdd8","1.5.10":"889e2f12614e6e67d342571c1c3bab8940659bfbbf43fa30a6847e73decb85d1","1.5.11":"4906e4de2b3a9c2f0b0181817c9dc168cb910ba6941691d4e86b8387802b624a","1.5.12":"c0a0dc085bb33d9718e869ed5effc2c1581deffd7ed0d5adc119b94312181625","1.5.13":"bfe58c8756f9b5f5e55d5acbb6f7cfc469d201004d312c14e022eb7c52369b7d","1.5.14":"a0464f11e05128cba8881e6295e591fce1ed1e8d43ab0e16710effb8e543d810","1.5.15":"0687a735cb4aaf8f8f74ad6e228ca1b14e045cba8821991c7d19fc9beaeac766","1.5.16":"3544ac754f39d56ecf2b06300b7cca1b6f8723f99885cd11bd690f1a704d3728","1.5.17":"cf1e9e0ff6812cb7092a82dd588392d625decbe3680fe003dfc554f9045809d3","1.5.18":"1fd873effa66b632217d674745722f712a48b36bb79957fefae722757a74bc30","1.5.2":"39fccb7582e13e7e3436861fde7b83ddb8057788cbde792f2f0cf7003f068850","1.5.3":"39fccb7582e13e7e3436861fde7b83ddb8057788cbde792f2f0cf7003f068850","1.5.4":"e86174ba5aff6f257f8a3f4721c7942885cd203469a9d8ddc15dbe6c704e0f45","1.5.5":"f93ed2d4342e447eb9900a0150331113918f2a8b3baeeb795c07231d80f0337c","1.5.6":"e3d90e6ceb20d760f1e9fa63224c5a070a16b3ca6e7dc4cc2c594138e929cce8","1.5.7":"a0464f11e05128cba8881e6295e591fce1ed1e8d43ab0e16710effb8e543d810","1.5.8":"f075b84fb04f4043658a28402d963494dd58481f164c0b371cec94322fe6d131","1.5.9":"ac170fc924019fc2acd69a90a82ba5c2552dce7a2c01a05e5407443e7a9e5af7","1.6.0":"c8286514d1a4f1805e727e13d3c350bb390378c6f31ad6920030412d61ec9b3f","1.6.1":"aa1d3934091853fc21208993930c1bf92e17136428d1d0baaefabfa65d13e7fa","1.6.10":"41c3a16e7819857a4b826e944fcfb4f79c58e7192cb151b106a3acd7487d5771","1.6.11":"d136203e08e3b052254403815d4ccedb555b0a297686fe97952d275eb1f322eb","1.6.12":"c328d4e36bd6277e01cef0140993e23970f4dff84425f3eba236cdd9a8954355","1.6.13":"f1f8b091d054a08665f047b5ad91f1f309f729a8aa30a2992d6ffdbd7f9fa7e4","1.6.14":"f1f8b091d054a08665f047b5ad91f1f309f729a8aa30a2992d6ffdbd7f9fa7e4","1.6.15":"2b9566e3e9dd6fde10fd36044707319abbe2283ec95b0422705d23d3dcca0c5f","1.6.16":"4a2fbf391def4497c0c98aafb5cf02ef4ce6f225c8b6fdc272b2fb78ebdadf9c","1.6.2":"6ef96b5e00a04a929d16f0e4a136bfcc5b8132a466d6907a99b2c8516a8952d5","1.6.3":"5c10db827bcb92b9322d4aa5751076b825da87c6d18d6953847ba72317cca862","1.6.4":"baf2bb1c2ec7c1bfccfc514ef1cef67907e056e4f7153bb5932ecb835c9cff78","1.6.5":"
|
|
1
|
+
{"plans":{"1.3.0":"e251cb15b0603df5ba318eba03563757ef1401f577a25330aa135b11eb13156b","1.3.1":"580381a4f6f40fc1bd4e903e591ad0d5c1db27daaccafc6f79dabf8c3b84259a","1.3.2":"7a69ffaf0c41438be25a656dcdc87783daac0eae79218d023648ef9d708e373f","1.4.0":"41c3a16e7819857a4b826e944fcfb4f79c58e7192cb151b106a3acd7487d5771","1.4.3":"a8cfbabff09d21944a822c4a70f23a7ee14960c4054de151c9fbc7cdb29adff5","1.4.4":"e26cc8089d6b6679a6ead60916e1a08ca281502ac7168bb740b4cd6aa0f5c6a9","1.5.0":"52d9d118da099abda0e0153cd16892e201681f6e4d3c6e5790284d1ac469a407","1.5.1":"d283cb8c01024338fb614ae2199744d883379f59579423e4eb9234f5c59ebdd8","1.5.10":"889e2f12614e6e67d342571c1c3bab8940659bfbbf43fa30a6847e73decb85d1","1.5.11":"4906e4de2b3a9c2f0b0181817c9dc168cb910ba6941691d4e86b8387802b624a","1.5.12":"c0a0dc085bb33d9718e869ed5effc2c1581deffd7ed0d5adc119b94312181625","1.5.13":"bfe58c8756f9b5f5e55d5acbb6f7cfc469d201004d312c14e022eb7c52369b7d","1.5.14":"a0464f11e05128cba8881e6295e591fce1ed1e8d43ab0e16710effb8e543d810","1.5.15":"0687a735cb4aaf8f8f74ad6e228ca1b14e045cba8821991c7d19fc9beaeac766","1.5.16":"3544ac754f39d56ecf2b06300b7cca1b6f8723f99885cd11bd690f1a704d3728","1.5.17":"cf1e9e0ff6812cb7092a82dd588392d625decbe3680fe003dfc554f9045809d3","1.5.18":"1fd873effa66b632217d674745722f712a48b36bb79957fefae722757a74bc30","1.5.2":"39fccb7582e13e7e3436861fde7b83ddb8057788cbde792f2f0cf7003f068850","1.5.3":"39fccb7582e13e7e3436861fde7b83ddb8057788cbde792f2f0cf7003f068850","1.5.4":"e86174ba5aff6f257f8a3f4721c7942885cd203469a9d8ddc15dbe6c704e0f45","1.5.5":"f93ed2d4342e447eb9900a0150331113918f2a8b3baeeb795c07231d80f0337c","1.5.6":"e3d90e6ceb20d760f1e9fa63224c5a070a16b3ca6e7dc4cc2c594138e929cce8","1.5.7":"a0464f11e05128cba8881e6295e591fce1ed1e8d43ab0e16710effb8e543d810","1.5.8":"f075b84fb04f4043658a28402d963494dd58481f164c0b371cec94322fe6d131","1.5.9":"ac170fc924019fc2acd69a90a82ba5c2552dce7a2c01a05e5407443e7a9e5af7","1.6.0":"c8286514d1a4f1805e727e13d3c350bb390378c6f31ad6920030412d61ec9b3f","1.6.1":"aa1d3934091853fc21208993930c1bf92e17136428d1d0baaefabfa65d13e7fa","1.6.10":"41c3a16e7819857a4b826e944fcfb4f79c58e7192cb151b106a3acd7487d5771","1.6.11":"d136203e08e3b052254403815d4ccedb555b0a297686fe97952d275eb1f322eb","1.6.12":"c328d4e36bd6277e01cef0140993e23970f4dff84425f3eba236cdd9a8954355","1.6.13":"f1f8b091d054a08665f047b5ad91f1f309f729a8aa30a2992d6ffdbd7f9fa7e4","1.6.14":"f1f8b091d054a08665f047b5ad91f1f309f729a8aa30a2992d6ffdbd7f9fa7e4","1.6.15":"2b9566e3e9dd6fde10fd36044707319abbe2283ec95b0422705d23d3dcca0c5f","1.6.16":"4a2fbf391def4497c0c98aafb5cf02ef4ce6f225c8b6fdc272b2fb78ebdadf9c","1.6.17":"0fa5d642d4b60453f5125f61e62227a1b28a7a64acd85c5affd7e3a4c663c0ad","1.6.2":"6ef96b5e00a04a929d16f0e4a136bfcc5b8132a466d6907a99b2c8516a8952d5","1.6.3":"5c10db827bcb92b9322d4aa5751076b825da87c6d18d6953847ba72317cca862","1.6.4":"baf2bb1c2ec7c1bfccfc514ef1cef67907e056e4f7153bb5932ecb835c9cff78","1.6.5":"9e5b5bf2a2bb1acc58aab3a22d253b2bd4d7d3cb363c873a04913075c0221281","1.6.6":"535bb041b99d5ac1bc9028ea88bc2fbf3dbadc80ea8dea236cc219123c194114","1.6.7":"d59af413e270e6f34b1b9a1c8c4acef35328f00e26fad447cfe214545af78d8f","1.6.8":"d619d4c3074a55511529f463b86d73ba0203abf43710d1e6c6753a7381d40dba","1.6.9":"ec354f9a2b8df176a097719b93e095dc290f5faca9de111435d9074614c09f29"},"release":"1.6.0.dev13"}
|
|
Binary file
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"""Reinstall boneio-system, which can now set the SSH login password once.
|
|
2
|
+
|
|
3
|
+
Images before 1.6 shipped the ``boneio`` account with the password ``Black``,
|
|
4
|
+
the same on every unit and published. That account carries a password-gated
|
|
5
|
+
``(ALL:ALL) ALL``, so its password is the root password — and expiring it, as
|
|
6
|
+
1.6 images first did, only forced a change on whoever logged in first, which
|
|
7
|
+
need not be the owner.
|
|
8
|
+
|
|
9
|
+
Images from here on ship the account locked, and the owner's first password,
|
|
10
|
+
typed into the first-run wizard, becomes it. That needs two operations in the
|
|
11
|
+
privileged helper:
|
|
12
|
+
|
|
13
|
+
service-password-state read-only: locked, empty, shipped, set
|
|
14
|
+
service-password-init set it from stdin — once, and only while the
|
|
15
|
+
account is locked, on the shipped password, or has
|
|
16
|
+
none
|
|
17
|
+
|
|
18
|
+
The limits are what keep this from reopening F-04. The helper runs as root for
|
|
19
|
+
anyone holding ``boneio``; an operation that set that account's password
|
|
20
|
+
whenever asked would be a way to root in two steps. In the states it allows,
|
|
21
|
+
whoever holds the account either has no password to replace or already has
|
|
22
|
+
root through the one everybody knows. A password the owner chose is refused,
|
|
23
|
+
and a root-owned flag makes the operation once-only even if somebody locks the
|
|
24
|
+
account again later.
|
|
25
|
+
|
|
26
|
+
The pristine copy goes first for the same reason as in 1.6.16:
|
|
27
|
+
``boneio-helpers-heal.service`` restores from it, and a stale one would put the
|
|
28
|
+
old helper back at the next boot. ``validate="python"`` because a helper that
|
|
29
|
+
does not compile would take CAN, the overlay, the hostname, NTP and the broker
|
|
30
|
+
passwords down with it.
|
|
31
|
+
|
|
32
|
+
A device already in the field keeps whatever SSH password it has. The security
|
|
33
|
+
section says so when that is still ``Black``.
|
|
34
|
+
|
|
35
|
+
To retry on a device, delete ``/var/lib/boneio/migrations.d/1.6.17.applied``
|
|
36
|
+
and restart boneIO.
|
|
37
|
+
"""
|
|
38
|
+
|
|
39
|
+
from __future__ import annotations
|
|
40
|
+
|
|
41
|
+
from boneio.migrations.actions import InstallFile, MigrationAction
|
|
42
|
+
|
|
43
|
+
VERSION = "1.6.17"
|
|
44
|
+
DESCRIPTION = "Let the first-run wizard set the SSH login password, once"
|
|
45
|
+
REQUIRES_ROOT = True
|
|
46
|
+
|
|
47
|
+
TRUSTED_DIR = "/usr/lib/boneio/trusted"
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def plan() -> list[MigrationAction]:
|
|
51
|
+
"""Return the ordered list of migration actions.
|
|
52
|
+
|
|
53
|
+
Returns:
|
|
54
|
+
List of :class:`MigrationAction` to apply in order.
|
|
55
|
+
"""
|
|
56
|
+
return [
|
|
57
|
+
InstallFile(
|
|
58
|
+
src="helpers/boneio-system",
|
|
59
|
+
dst=f"{TRUSTED_DIR}/boneio-system",
|
|
60
|
+
mode=0o755,
|
|
61
|
+
owner="root",
|
|
62
|
+
group="root",
|
|
63
|
+
validate="python",
|
|
64
|
+
),
|
|
65
|
+
InstallFile(
|
|
66
|
+
src="helpers/boneio-system",
|
|
67
|
+
dst="/usr/sbin/boneio-system",
|
|
68
|
+
mode=0o755,
|
|
69
|
+
owner="root",
|
|
70
|
+
group="root",
|
|
71
|
+
validate="python",
|
|
72
|
+
),
|
|
73
|
+
]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{Qt as t,Zt as n,an as r,in as i}from"./fa-DFicOgEn.js";import{n as a}from"./axios-DJBeJS4R.js";import{A as o,M as s,S as c,c as l,d as u,f as d,g as f,j as p,k as m}from"./index-
|
|
1
|
+
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{Qt as t,Zt as n,an as r,in as i}from"./fa-DFicOgEn.js";import{n as a}from"./axios-DJBeJS4R.js";import{A as o,M as s,S as c,c as l,d as u,f as d,g as f,j as p,k as m}from"./index-D8GaCUlC.js";var h=e(r(),1),g=i();function _(e,t){return e?.response?.data?.detail||t}function v(){let{t:e}=p(),{username:r,isAdmin:i}=s(),[v,y]=(0,h.useState)([]),[b,x]=(0,h.useState)(!0),[S,C]=(0,h.useState)(null),[w,T]=(0,h.useState)(null),[E,D]=(0,h.useState)(``),[O,k]=(0,h.useState)(``),[A,j]=(0,h.useState)(`viewer`),[M,N]=(0,h.useState)(!1),P=O?o(O,E):null,F=P?e(m[P],{min:8}):null,I=(0,h.useCallback)(async()=>{try{let{data:e}=await a.get(`/api/accounts`);y(e.accounts??[]),C(null)}catch(t){C(_(t,e(`accounts.load_failed`)))}finally{x(!1)}},[e]);(0,h.useEffect)(()=>{i&&I()},[i,I]);let L=async t=>{t.preventDefault(),C(null),T(null),N(!0);try{await a.post(`/api/accounts`,{username:E,password:O,role:A}),D(``),k(``),j(`viewer`),T(e(`accounts.created`)),await I()}catch(t){C(_(t,e(`accounts.create_failed`)))}finally{N(!1)}},R=async t=>{if(window.confirm(e(`accounts.confirm_delete`,{username:t.username}))){C(null),T(null);try{await a.delete(`/api/accounts/${encodeURIComponent(t.username)}`),T(e(`accounts.deleted`,{username:t.username})),await I()}catch(t){C(_(t,e(`accounts.delete_failed`)))}}},z=async(t,n)=>{C(null),T(null);try{await a.put(`/api/accounts/${encodeURIComponent(t.username)}/role`,{role:n}),await I()}catch(t){C(_(t,e(`accounts.role_failed`))),await I()}},B=async t=>{let n=window.prompt(e(`accounts.prompt_new_password`,{username:t.username}));if(!n)return;C(null),T(null);let r=o(n,t.username);if(r){C(e(m[r],{min:8}));return}try{await a.put(`/api/accounts/${encodeURIComponent(t.username)}/password`,{password:n}),T(e(`accounts.password_reset`,{username:t.username}))}catch(t){C(_(t,e(`accounts.password_failed`)))}};return i?(0,g.jsxs)(c,{width:`wide`,children:[S&&(0,g.jsx)(l,{variant:`error`,message:S}),w&&(0,g.jsx)(l,{variant:`success`,message:w}),(0,g.jsx)(f,{icon:(0,g.jsx)(t,{}),title:e(`accounts.title`),children:b?(0,g.jsx)(`div`,{className:`flex justify-center py-6`,children:(0,g.jsx)(`span`,{className:`loading loading-spinner loading-md text-primary`})}):(0,g.jsx)(`div`,{className:`stg-inset overflow-x-auto`,children:(0,g.jsxs)(`table`,{className:`table table-sm`,children:[(0,g.jsx)(`thead`,{children:(0,g.jsxs)(`tr`,{children:[(0,g.jsx)(`th`,{children:e(`accounts.username`)}),(0,g.jsx)(`th`,{children:e(`accounts.role`)}),(0,g.jsx)(`th`,{className:`text-right`,children:e(`accounts.actions`)})]})}),(0,g.jsx)(`tbody`,{children:v.map(t=>{let n=t.username.toLowerCase()===(r??``).toLowerCase();return(0,g.jsxs)(`tr`,{children:[(0,g.jsxs)(`td`,{children:[(0,g.jsx)(`span`,{className:`font-medium font-mono`,children:t.username}),n&&(0,g.jsx)(`span`,{className:`ml-2 badge badge-ghost badge-xs`,children:e(`accounts.you`)})]}),(0,g.jsx)(`td`,{children:(0,g.jsxs)(`select`,{className:`select select-xs select-bordered`,value:t.role,disabled:n,onChange:e=>z(t,e.target.value),children:[(0,g.jsx)(`option`,{value:`admin`,children:e(`accounts.role_admin`)}),(0,g.jsx)(`option`,{value:`viewer`,children:e(`accounts.role_viewer`)})]})}),(0,g.jsxs)(`td`,{className:`text-right whitespace-nowrap`,children:[(0,g.jsx)(`button`,{className:`btn btn-ghost btn-xs`,onClick:()=>B(t),children:e(`accounts.reset_password`)}),(0,g.jsx)(`button`,{className:`btn btn-ghost btn-xs text-error ml-1`,disabled:n,onClick:()=>R(t),children:e(`accounts.delete`)})]})]},t.username)})})]})})}),(0,g.jsx)(`form`,{onSubmit:L,children:(0,g.jsx)(f,{icon:(0,g.jsx)(n,{}),title:e(`accounts.add_title`),description:e(`accounts.add_intro`),footer:(0,g.jsx)(u,{children:(0,g.jsxs)(`button`,{type:`submit`,className:`btn btn-primary btn-sm gap-2`,disabled:M||!E||!O||!!F,children:[M&&(0,g.jsx)(`span`,{className:`loading loading-spinner loading-xs`}),e(`accounts.add_button`)]})}),children:(0,g.jsxs)(`div`,{className:`grid grid-cols-1 sm:grid-cols-[1fr_1fr_auto] gap-3`,children:[(0,g.jsx)(d,{label:e(`accounts.username`),children:(0,g.jsx)(`input`,{type:`text`,className:`input input-bordered w-full font-mono`,placeholder:e(`accounts.username`),autoComplete:`off`,required:!0,value:E,onChange:e=>D(e.target.value)})}),(0,g.jsx)(d,{label:e(`accounts.password`),error:F||void 0,children:(0,g.jsx)(`input`,{type:`password`,className:`input input-bordered w-full font-mono ${F?`input-error`:``}`,placeholder:e(`accounts.password`),autoComplete:`new-password`,required:!0,minLength:8,"aria-invalid":F?!0:void 0,"aria-describedby":F?`accounts-password-error`:void 0,value:O,onChange:e=>k(e.target.value)})}),(0,g.jsx)(d,{label:e(`accounts.role`),className:`sm:w-40`,children:(0,g.jsxs)(`select`,{className:`select select-bordered w-full`,value:A,onChange:e=>j(e.target.value),children:[(0,g.jsx)(`option`,{value:`viewer`,children:e(`accounts.role_viewer`)}),(0,g.jsx)(`option`,{value:`admin`,children:e(`accounts.role_admin`)})]})})]})})})]}):(0,g.jsx)(c,{width:`wide`,children:(0,g.jsx)(l,{variant:`warning`,message:e(`accounts.admin_only`)})})}export{v as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{A as t,It as n,Jt as r,N as i,R as a,Xt as o,Yt as s,an as c,in as l}from"./fa-DFicOgEn.js";import{a as u,i as d,n as f,o as p,t as m}from"./dialog-BHkRvqJ3.js";import{n as h}from"./axios-DJBeJS4R.js";import{S as g,c as _,d as v,g as y,j as b}from"./index-BWIpETfX.js";var x=e(c(),1),S=l();function C(){let{t:e}=b(),c=(0,x.useRef)(null),[l,C]=(0,x.useState)(!1),[w,T]=(0,x.useState)(!1),[E,D]=(0,x.useState)(null),[O,k]=(0,x.useState)(null),[A,j]=(0,x.useState)([]),[M,N]=(0,x.useState)(!1),[P,F]=(0,x.useState)(null),I=(0,x.useCallback)(async()=>{try{let{data:e}=await h.get(`/api/config/backups`);j(e.backups||[])}catch(e){console.error(`Error fetching available backups:`,e)}},[]);(0,x.useEffect)(()=>{I()},[I]);let L=async()=>{C(!0),k(null);try{let{data:e}=await h.post(`/api/config/create_backup`);e.status===`success`?(await I(),alert(e.message)):k(e.message)}catch(t){k(e(`backup.error`)),console.error(`Error creating backup:`,t)}finally{C(!1)}},R=async(t,n)=>{try{let e=(await h.get(`/api/config/download_backup?backup_path=${encodeURIComponent(t)}`,{responseType:`blob`})).data,r=window.URL.createObjectURL(e),i=document.createElement(`a`);i.href=r,i.download=n,document.body.appendChild(i),i.click(),window.URL.revokeObjectURL(r),document.body.removeChild(i)}catch(t){k(e(`backup.error`)),console.error(`Error downloading backup:`,t)}},z=async(t,n)=>{if(confirm(`${e(`device_management.confirm_delete_backup`)||`Delete backup`} ${n}?`))try{let{data:e}=await h.delete(`/api/config/delete_backup`,{data:{backup_path:t}});e.status===`success`?(await I(),alert(e.message)):k(e.message)}catch(t){k(e(`backup.error`)),console.error(`Error deleting backup:`,t)}},B=async t=>{t.status===`success`?(D(t),confirm(e(`device_management.restore_success_restart`))&&(await h.post(`/api/restart`),setTimeout(()=>window.location.reload(),3e3))):k(t.message||e(`device_management.restore_failed`))},V=async(t,n)=>{T(!0);try{let{data:e}=await h.post(`/api/config/restore_backup`,{backup_path:t,override_serial:n},{timeout:3e4});await B(e)}catch(t){k(e(`device_management.restore_failed`)),console.error(`Error restoring config:`,t)}finally{T(!1)}},H=async t=>{T(!0),k(null),D(null);try{let{data:n}=await h.post(`/api/config/inspect_backup_path`,{backup_path:t});n.serial_mismatch?F({backupMeta:n.backup_meta,currentSerial:n.current_serial,onConfirm:e=>{F(null),V(t,e)},onCancel:()=>{F(null),T(!1)}}):confirm(e(`device_management.confirm_restore`))?await V(t,!1):T(!1)}catch(t){k(e(`device_management.restore_failed`)),console.error(`Error inspecting backup path:`,t),T(!1)}},U=async()=>{C(!0),k(null);try{let e=await h.get(`/api/config/download`,{responseType:`blob`}),t=e.headers[`content-disposition`],n=`boneio_config.tar.gz`;if(t){let e=t.match(/filename=(.+)/);e&&(n=e[1])}let r=e.data,i=window.URL.createObjectURL(r),a=document.createElement(`a`);a.href=i,a.download=n,document.body.appendChild(a),a.click(),window.URL.revokeObjectURL(i),document.body.removeChild(a)}catch(t){k(e(`backup.error`)),console.error(`Error downloading config:`,t)}finally{C(!1)}},W=async(t,n)=>{T(!0);try{let e=new FormData;e.append(`file`,t),e.append(`override_serial`,n?`true`:`false`);let{data:r}=await h.post(`/api/config/restore`,e,{headers:{"Content-Type":`multipart/form-data`},timeout:3e4});await B(r)}catch(t){k(e(`device_management.restore_failed`)),console.error(`Error restoring config:`,t)}finally{T(!1)}};return(0,S.jsxs)(g,{width:`wide`,children:[O&&(0,S.jsx)(_,{variant:`error`,message:O,action:(0,S.jsx)(`button`,{className:`btn btn-ghost btn-xs btn-circle`,onClick:()=>k(null),children:`×`})}),(0,S.jsx)(y,{icon:(0,S.jsx)(t,{}),title:e(`device_management.configuration_backup`),description:e(`device_management.backup_description`),footer:(0,S.jsxs)(v,{children:[(0,S.jsx)(`button`,{className:`btn btn-primary btn-sm gap-2`,onClick:U,disabled:l||w,children:l?(0,S.jsxs)(S.Fragment,{children:[(0,S.jsx)(n,{className:`animate-spin`}),e(`device_management.preparing`)]}):(0,S.jsxs)(S.Fragment,{children:[(0,S.jsx)(t,{}),e(`device_management.download_config`)]})}),(0,S.jsx)(`button`,{className:`btn btn-outline btn-sm gap-2`,onClick:()=>c.current?.click(),disabled:l||w,children:w?(0,S.jsxs)(S.Fragment,{children:[(0,S.jsx)(n,{className:`animate-spin`}),e(`device_management.restoring`)]}):(0,S.jsxs)(S.Fragment,{children:[(0,S.jsx)(o,{}),e(`device_management.restore_config`)]})})]}),children:(0,S.jsxs)(`div`,{className:`space-y-3`,children:[(0,S.jsx)(`input`,{ref:c,type:`file`,accept:`.tar.gz,.tgz`,onChange:async t=>{let n=t.target.files?.[0];if(n){T(!0),k(null),D(null);try{let t=new FormData;t.append(`file`,n);let{data:r}=await h.post(`/api/config/inspect_backup_file`,t,{headers:{"Content-Type":`multipart/form-data`}});r.serial_mismatch?F({backupMeta:r.backup_meta,currentSerial:r.current_serial,onConfirm:e=>{F(null),W(n,e)},onCancel:()=>{F(null),T(!1)}}):confirm(e(`device_management.confirm_restore`))?await W(n,!1):T(!1)}catch(t){k(e(`device_management.restore_failed`)),console.error(`Error inspecting backup file:`,t),T(!1)}}c.current&&(c.current.value=``)},style:{display:`none`}}),(0,S.jsx)(_,{variant:`info`,message:(0,S.jsxs)(S.Fragment,{children:[(0,S.jsx)(`span`,{className:`block`,children:e(`device_management.backup_info_1`)}),(0,S.jsx)(`span`,{className:`block`,children:e(`device_management.backup_info_2`)}),(0,S.jsx)(`span`,{className:`block font-semibold mt-1`,children:e(`device_management.restore_info`)})]})}),E&&(0,S.jsx)(_,{variant:E.validation_status===`success`?`success`:`warning`,message:(0,S.jsxs)(S.Fragment,{children:[(0,S.jsx)(`span`,{className:`block`,children:E.message}),(0,S.jsxs)(`span`,{className:`block text-xs opacity-70 mt-1 break-all`,children:[e(`device_management.backup_created`),`: `,E.backup_path]}),E.validation_status===`warning`&&(0,S.jsx)(`span`,{className:`block text-xs mt-1`,children:E.validation_message})]})})]})}),(0,S.jsx)(y,{icon:(0,S.jsx)(a,{}),title:e(`device_management.config_backups`),collapsible:A.length>0,open:M,onOpenChange:e=>{N(e),e&&I()},summary:A.length,action:(0,S.jsx)(`button`,{className:`btn btn-primary btn-sm gap-2`,onClick:L,disabled:l||w,children:l?(0,S.jsxs)(S.Fragment,{children:[(0,S.jsx)(n,{className:`animate-spin`}),e(`device_management.preparing`)]}):(0,S.jsxs)(S.Fragment,{children:[(0,S.jsx)(a,{}),e(`device_management.create_backup`)||`Create Backup`]})}),children:(0,S.jsxs)(`div`,{className:`space-y-3`,children:[(0,S.jsx)(_,{variant:`neutral`,message:e(`device_management.backup_limit_info`)||`Maximum 10 backups are kept. Oldest backups are automatically removed when creating new ones.`}),M&&A.length>0&&(0,S.jsx)(`div`,{className:`stg-inset overflow-x-auto`,children:(0,S.jsxs)(`table`,{className:`table table-sm`,children:[(0,S.jsx)(`thead`,{children:(0,S.jsxs)(`tr`,{children:[(0,S.jsx)(`th`,{children:e(`device_management.version`)}),(0,S.jsx)(`th`,{children:e(`device_management.date`)}),(0,S.jsx)(`th`,{children:e(`device_management.files`)}),(0,S.jsx)(`th`,{className:`text-right`,children:e(`device_management.actions`)})]})}),(0,S.jsx)(`tbody`,{children:A.map(n=>(0,S.jsxs)(`tr`,{children:[(0,S.jsx)(`td`,{className:`font-mono`,children:n.version}),(0,S.jsx)(`td`,{className:`text-xs font-mono`,children:n.timestamp}),(0,S.jsxs)(`td`,{children:[n.file_count,` `,e(`device_management.yaml_files`)]}),(0,S.jsx)(`td`,{children:(0,S.jsxs)(`div`,{className:`flex gap-1 justify-end`,children:[(0,S.jsxs)(`button`,{className:`btn btn-warning btn-xs gap-1.5`,onClick:()=>H(n.path),disabled:w,title:e(`device_management.restore`),children:[(0,S.jsx)(s,{}),e(`device_management.restore`)]}),(0,S.jsx)(`button`,{className:`btn btn-ghost btn-xs btn-square`,onClick:()=>R(n.path,n.filename),title:e(`device_management.download_config`),children:(0,S.jsx)(t,{})}),(0,S.jsx)(`button`,{className:`btn btn-ghost btn-xs btn-square text-error`,onClick:()=>z(n.path,n.filename),title:e(`device_management.delete`)||`Delete`,children:(0,S.jsx)(r,{})})]})})]},n.path))})]})})]})}),P&&(0,S.jsx)(m,{open:!0,onOpenChange:e=>{e||P.onCancel()},children:(0,S.jsxs)(f,{className:`max-w-md`,children:[(0,S.jsx)(u,{children:(0,S.jsxs)(p,{className:`flex items-center gap-2 text-warning`,children:[(0,S.jsx)(i,{}),e(`device_management.serial_mismatch_title`)||`Serial Number Mismatch`]})}),(0,S.jsxs)(`div`,{className:`py-4 text-sm space-y-4`,children:[(0,S.jsx)(`p`,{children:e(`device_management.serial_mismatch_desc`)||`The uploaded configuration backup was created on a device with a different serial number:`}),(0,S.jsxs)(`div`,{className:`bg-base-300 p-3 rounded-lg font-mono text-xs space-y-1`,children:[(0,S.jsxs)(`div`,{children:[(0,S.jsxs)(`span`,{className:`opacity-60`,children:[e(`device_management.backup_serial`)||`Backup Serial`,`:`]}),` `,(0,S.jsx)(`span`,{className:`text-warning font-semibold`,children:P.backupMeta?.effective_serial||`Unknown`})]}),P.backupMeta?.hostname&&(0,S.jsxs)(`div`,{children:[(0,S.jsxs)(`span`,{className:`opacity-60`,children:[e(`device_management.backup_hostname`)||`Backup Hostname`,`:`]}),` `,(0,S.jsx)(`span`,{children:P.backupMeta.hostname})]}),P.backupMeta?.created_at&&(0,S.jsxs)(`div`,{children:[(0,S.jsxs)(`span`,{className:`opacity-60`,children:[e(`device_management.backup_created_at`)||`Created At`,`:`]}),` `,(0,S.jsx)(`span`,{children:new Date(P.backupMeta.created_at).toLocaleString()})]}),(0,S.jsxs)(`div`,{children:[(0,S.jsxs)(`span`,{className:`opacity-60`,children:[e(`device_management.current_serial`)||`Current Serial`,`:`]}),` `,(0,S.jsx)(`span`,{className:`text-info font-semibold`,children:P.currentSerial})]})]}),(0,S.jsxs)(`div`,{className:`alert alert-warning text-xs`,children:[(0,S.jsx)(i,{className:`shrink-0`}),(0,S.jsx)(`span`,{children:e(`device_management.serial_override_warning`)||`WARNING: If both controllers are running at the same time on the same MQTT broker with the same serial number, conflicts will occur!`})]})]}),(0,S.jsxs)(d,{className:`flex flex-col sm:flex-row gap-2`,children:[(0,S.jsx)(`button`,{className:`btn btn-warning btn-sm`,onClick:()=>P.onConfirm(!0),children:e(`device_management.keep_old_serial`)||`Keep Old Serial`}),(0,S.jsx)(`button`,{className:`btn btn-outline btn-sm`,onClick:()=>P.onConfirm(!1),children:e(`device_management.use_new_serial`)||`Use New Serial`}),(0,S.jsx)(`button`,{className:`btn btn-ghost btn-sm`,onClick:P.onCancel,children:e(`common.cancel`)||`Cancel`})]})]})})]})}export{C as default};
|
|
1
|
+
import{r as e}from"./rolldown-runtime-hePW80VL.js";import{A as t,It as n,Jt as r,N as i,R as a,Xt as o,Yt as s,an as c,in as l}from"./fa-DFicOgEn.js";import{a as u,i as d,n as f,o as p,t as m}from"./dialog-BHkRvqJ3.js";import{n as h}from"./axios-DJBeJS4R.js";import{S as g,c as _,d as v,g as y,j as b}from"./index-D8GaCUlC.js";var x=e(c(),1),S=l();function C(){let{t:e}=b(),c=(0,x.useRef)(null),[l,C]=(0,x.useState)(!1),[w,T]=(0,x.useState)(!1),[E,D]=(0,x.useState)(null),[O,k]=(0,x.useState)(null),[A,j]=(0,x.useState)([]),[M,N]=(0,x.useState)(!1),[P,F]=(0,x.useState)(null),I=(0,x.useCallback)(async()=>{try{let{data:e}=await h.get(`/api/config/backups`);j(e.backups||[])}catch(e){console.error(`Error fetching available backups:`,e)}},[]);(0,x.useEffect)(()=>{I()},[I]);let L=async()=>{C(!0),k(null);try{let{data:e}=await h.post(`/api/config/create_backup`);e.status===`success`?(await I(),alert(e.message)):k(e.message)}catch(t){k(e(`backup.error`)),console.error(`Error creating backup:`,t)}finally{C(!1)}},R=async(t,n)=>{try{let e=(await h.get(`/api/config/download_backup?backup_path=${encodeURIComponent(t)}`,{responseType:`blob`})).data,r=window.URL.createObjectURL(e),i=document.createElement(`a`);i.href=r,i.download=n,document.body.appendChild(i),i.click(),window.URL.revokeObjectURL(r),document.body.removeChild(i)}catch(t){k(e(`backup.error`)),console.error(`Error downloading backup:`,t)}},z=async(t,n)=>{if(confirm(`${e(`device_management.confirm_delete_backup`)||`Delete backup`} ${n}?`))try{let{data:e}=await h.delete(`/api/config/delete_backup`,{data:{backup_path:t}});e.status===`success`?(await I(),alert(e.message)):k(e.message)}catch(t){k(e(`backup.error`)),console.error(`Error deleting backup:`,t)}},B=async t=>{t.status===`success`?(D(t),confirm(e(`device_management.restore_success_restart`))&&(await h.post(`/api/restart`),setTimeout(()=>window.location.reload(),3e3))):k(t.message||e(`device_management.restore_failed`))},V=async(t,n)=>{T(!0);try{let{data:e}=await h.post(`/api/config/restore_backup`,{backup_path:t,override_serial:n},{timeout:3e4});await B(e)}catch(t){k(e(`device_management.restore_failed`)),console.error(`Error restoring config:`,t)}finally{T(!1)}},H=async t=>{T(!0),k(null),D(null);try{let{data:n}=await h.post(`/api/config/inspect_backup_path`,{backup_path:t});n.serial_mismatch?F({backupMeta:n.backup_meta,currentSerial:n.current_serial,onConfirm:e=>{F(null),V(t,e)},onCancel:()=>{F(null),T(!1)}}):confirm(e(`device_management.confirm_restore`))?await V(t,!1):T(!1)}catch(t){k(e(`device_management.restore_failed`)),console.error(`Error inspecting backup path:`,t),T(!1)}},U=async()=>{C(!0),k(null);try{let e=await h.get(`/api/config/download`,{responseType:`blob`}),t=e.headers[`content-disposition`],n=`boneio_config.tar.gz`;if(t){let e=t.match(/filename=(.+)/);e&&(n=e[1])}let r=e.data,i=window.URL.createObjectURL(r),a=document.createElement(`a`);a.href=i,a.download=n,document.body.appendChild(a),a.click(),window.URL.revokeObjectURL(i),document.body.removeChild(a)}catch(t){k(e(`backup.error`)),console.error(`Error downloading config:`,t)}finally{C(!1)}},W=async(t,n)=>{T(!0);try{let e=new FormData;e.append(`file`,t),e.append(`override_serial`,n?`true`:`false`);let{data:r}=await h.post(`/api/config/restore`,e,{headers:{"Content-Type":`multipart/form-data`},timeout:3e4});await B(r)}catch(t){k(e(`device_management.restore_failed`)),console.error(`Error restoring config:`,t)}finally{T(!1)}};return(0,S.jsxs)(g,{width:`wide`,children:[O&&(0,S.jsx)(_,{variant:`error`,message:O,action:(0,S.jsx)(`button`,{className:`btn btn-ghost btn-xs btn-circle`,onClick:()=>k(null),children:`×`})}),(0,S.jsx)(y,{icon:(0,S.jsx)(t,{}),title:e(`device_management.configuration_backup`),description:e(`device_management.backup_description`),footer:(0,S.jsxs)(v,{children:[(0,S.jsx)(`button`,{className:`btn btn-primary btn-sm gap-2`,onClick:U,disabled:l||w,children:l?(0,S.jsxs)(S.Fragment,{children:[(0,S.jsx)(n,{className:`animate-spin`}),e(`device_management.preparing`)]}):(0,S.jsxs)(S.Fragment,{children:[(0,S.jsx)(t,{}),e(`device_management.download_config`)]})}),(0,S.jsx)(`button`,{className:`btn btn-outline btn-sm gap-2`,onClick:()=>c.current?.click(),disabled:l||w,children:w?(0,S.jsxs)(S.Fragment,{children:[(0,S.jsx)(n,{className:`animate-spin`}),e(`device_management.restoring`)]}):(0,S.jsxs)(S.Fragment,{children:[(0,S.jsx)(o,{}),e(`device_management.restore_config`)]})})]}),children:(0,S.jsxs)(`div`,{className:`space-y-3`,children:[(0,S.jsx)(`input`,{ref:c,type:`file`,accept:`.tar.gz,.tgz`,onChange:async t=>{let n=t.target.files?.[0];if(n){T(!0),k(null),D(null);try{let t=new FormData;t.append(`file`,n);let{data:r}=await h.post(`/api/config/inspect_backup_file`,t,{headers:{"Content-Type":`multipart/form-data`}});r.serial_mismatch?F({backupMeta:r.backup_meta,currentSerial:r.current_serial,onConfirm:e=>{F(null),W(n,e)},onCancel:()=>{F(null),T(!1)}}):confirm(e(`device_management.confirm_restore`))?await W(n,!1):T(!1)}catch(t){k(e(`device_management.restore_failed`)),console.error(`Error inspecting backup file:`,t),T(!1)}}c.current&&(c.current.value=``)},style:{display:`none`}}),(0,S.jsx)(_,{variant:`info`,message:(0,S.jsxs)(S.Fragment,{children:[(0,S.jsx)(`span`,{className:`block`,children:e(`device_management.backup_info_1`)}),(0,S.jsx)(`span`,{className:`block`,children:e(`device_management.backup_info_2`)}),(0,S.jsx)(`span`,{className:`block font-semibold mt-1`,children:e(`device_management.restore_info`)})]})}),E&&(0,S.jsx)(_,{variant:E.validation_status===`success`?`success`:`warning`,message:(0,S.jsxs)(S.Fragment,{children:[(0,S.jsx)(`span`,{className:`block`,children:E.message}),(0,S.jsxs)(`span`,{className:`block text-xs opacity-70 mt-1 break-all`,children:[e(`device_management.backup_created`),`: `,E.backup_path]}),E.validation_status===`warning`&&(0,S.jsx)(`span`,{className:`block text-xs mt-1`,children:E.validation_message})]})})]})}),(0,S.jsx)(y,{icon:(0,S.jsx)(a,{}),title:e(`device_management.config_backups`),collapsible:A.length>0,open:M,onOpenChange:e=>{N(e),e&&I()},summary:A.length,action:(0,S.jsx)(`button`,{className:`btn btn-primary btn-sm gap-2`,onClick:L,disabled:l||w,children:l?(0,S.jsxs)(S.Fragment,{children:[(0,S.jsx)(n,{className:`animate-spin`}),e(`device_management.preparing`)]}):(0,S.jsxs)(S.Fragment,{children:[(0,S.jsx)(a,{}),e(`device_management.create_backup`)||`Create Backup`]})}),children:(0,S.jsxs)(`div`,{className:`space-y-3`,children:[(0,S.jsx)(_,{variant:`neutral`,message:e(`device_management.backup_limit_info`)||`Maximum 10 backups are kept. Oldest backups are automatically removed when creating new ones.`}),M&&A.length>0&&(0,S.jsx)(`div`,{className:`stg-inset overflow-x-auto`,children:(0,S.jsxs)(`table`,{className:`table table-sm`,children:[(0,S.jsx)(`thead`,{children:(0,S.jsxs)(`tr`,{children:[(0,S.jsx)(`th`,{children:e(`device_management.version`)}),(0,S.jsx)(`th`,{children:e(`device_management.date`)}),(0,S.jsx)(`th`,{children:e(`device_management.files`)}),(0,S.jsx)(`th`,{className:`text-right`,children:e(`device_management.actions`)})]})}),(0,S.jsx)(`tbody`,{children:A.map(n=>(0,S.jsxs)(`tr`,{children:[(0,S.jsx)(`td`,{className:`font-mono`,children:n.version}),(0,S.jsx)(`td`,{className:`text-xs font-mono`,children:n.timestamp}),(0,S.jsxs)(`td`,{children:[n.file_count,` `,e(`device_management.yaml_files`)]}),(0,S.jsx)(`td`,{children:(0,S.jsxs)(`div`,{className:`flex gap-1 justify-end`,children:[(0,S.jsxs)(`button`,{className:`btn btn-warning btn-xs gap-1.5`,onClick:()=>H(n.path),disabled:w,title:e(`device_management.restore`),children:[(0,S.jsx)(s,{}),e(`device_management.restore`)]}),(0,S.jsx)(`button`,{className:`btn btn-ghost btn-xs btn-square`,onClick:()=>R(n.path,n.filename),title:e(`device_management.download_config`),children:(0,S.jsx)(t,{})}),(0,S.jsx)(`button`,{className:`btn btn-ghost btn-xs btn-square text-error`,onClick:()=>z(n.path,n.filename),title:e(`device_management.delete`)||`Delete`,children:(0,S.jsx)(r,{})})]})})]},n.path))})]})})]})}),P&&(0,S.jsx)(m,{open:!0,onOpenChange:e=>{e||P.onCancel()},children:(0,S.jsxs)(f,{className:`max-w-md`,children:[(0,S.jsx)(u,{children:(0,S.jsxs)(p,{className:`flex items-center gap-2 text-warning`,children:[(0,S.jsx)(i,{}),e(`device_management.serial_mismatch_title`)||`Serial Number Mismatch`]})}),(0,S.jsxs)(`div`,{className:`py-4 text-sm space-y-4`,children:[(0,S.jsx)(`p`,{children:e(`device_management.serial_mismatch_desc`)||`The uploaded configuration backup was created on a device with a different serial number:`}),(0,S.jsxs)(`div`,{className:`bg-base-300 p-3 rounded-lg font-mono text-xs space-y-1`,children:[(0,S.jsxs)(`div`,{children:[(0,S.jsxs)(`span`,{className:`opacity-60`,children:[e(`device_management.backup_serial`)||`Backup Serial`,`:`]}),` `,(0,S.jsx)(`span`,{className:`text-warning font-semibold`,children:P.backupMeta?.effective_serial||`Unknown`})]}),P.backupMeta?.hostname&&(0,S.jsxs)(`div`,{children:[(0,S.jsxs)(`span`,{className:`opacity-60`,children:[e(`device_management.backup_hostname`)||`Backup Hostname`,`:`]}),` `,(0,S.jsx)(`span`,{children:P.backupMeta.hostname})]}),P.backupMeta?.created_at&&(0,S.jsxs)(`div`,{children:[(0,S.jsxs)(`span`,{className:`opacity-60`,children:[e(`device_management.backup_created_at`)||`Created At`,`:`]}),` `,(0,S.jsx)(`span`,{children:new Date(P.backupMeta.created_at).toLocaleString()})]}),(0,S.jsxs)(`div`,{children:[(0,S.jsxs)(`span`,{className:`opacity-60`,children:[e(`device_management.current_serial`)||`Current Serial`,`:`]}),` `,(0,S.jsx)(`span`,{className:`text-info font-semibold`,children:P.currentSerial})]})]}),(0,S.jsxs)(`div`,{className:`alert alert-warning text-xs`,children:[(0,S.jsx)(i,{className:`shrink-0`}),(0,S.jsx)(`span`,{children:e(`device_management.serial_override_warning`)||`WARNING: If both controllers are running at the same time on the same MQTT broker with the same serial number, conflicts will occur!`})]})]}),(0,S.jsxs)(d,{className:`flex flex-col sm:flex-row gap-2`,children:[(0,S.jsx)(`button`,{className:`btn btn-warning btn-sm`,onClick:()=>P.onConfirm(!0),children:e(`device_management.keep_old_serial`)||`Keep Old Serial`}),(0,S.jsx)(`button`,{className:`btn btn-outline btn-sm`,onClick:()=>P.onConfirm(!1),children:e(`device_management.use_new_serial`)||`Use New Serial`}),(0,S.jsx)(`button`,{className:`btn btn-ghost btn-sm`,onClick:P.onCancel,children:e(`common.cancel`)||`Cancel`})]})]})})]})}export{C as default};
|