boneio 1.6.0.dev29__tar.gz → 1.6.0.dev31__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.dev29/boneio.egg-info → boneio-1.6.0.dev31}/PKG-INFO +1 -1
- boneio-1.6.0.dev31/boneio/core/auth/jwt_secret.py +129 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/cloud/registration.py +40 -6
- boneio-1.6.0.dev31/boneio/core/nodered_guard.py +153 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/assets/MANIFEST.sha256 +1 -0
- boneio-1.6.0.dev31/boneio/migrations/assets/sshd/15-boneio-penalties.conf +19 -0
- boneio-1.6.0.dev31/boneio/migrations/plans/1.6.34.json +1 -0
- boneio-1.6.0.dev31/boneio/migrations/plans/1.6.34.sig +2 -0
- boneio-1.6.0.dev31/boneio/migrations/plans/1.6.35.json +1 -0
- boneio-1.6.0.dev31/boneio/migrations/plans/1.6.35.sig +1 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/manifest.json +1 -1
- boneio-1.6.0.dev31/boneio/migrations/plans/manifest.sig +1 -0
- boneio-1.6.0.dev31/boneio/migrations/versions/v1_6_34_nodered_admin_auth_again.py +51 -0
- boneio-1.6.0.dev31/boneio/migrations/versions/v1_6_35_ssh_guessing_penalty.py +52 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/runner.py +11 -0
- boneio-1.6.0.dev31/boneio/version.py +2 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/app.py +14 -1
- boneio-1.6.0.dev29/boneio/webui/frontend-dist/assets/AccountsView-hSkFhGZn.js → boneio-1.6.0.dev31/boneio/webui/frontend-dist/assets/AccountsView-CrzcITM9.js +1 -1
- boneio-1.6.0.dev31/boneio/webui/frontend-dist/assets/AccountsView-CrzcITM9.js.gz +0 -0
- boneio-1.6.0.dev29/boneio/webui/frontend-dist/assets/AppInitContext-XnlT3sSY.js → boneio-1.6.0.dev31/boneio/webui/frontend-dist/assets/AppInitContext-BaUlPm1W.js +1 -1
- boneio-1.6.0.dev31/boneio/webui/frontend-dist/assets/AppInitContext-BaUlPm1W.js.gz +0 -0
- boneio-1.6.0.dev29/boneio/webui/frontend-dist/assets/BackupSection-CdrNqwc2.js → boneio-1.6.0.dev31/boneio/webui/frontend-dist/assets/BackupSection-AHoCSntx.js +1 -1
- boneio-1.6.0.dev31/boneio/webui/frontend-dist/assets/BackupSection-AHoCSntx.js.gz +0 -0
- boneio-1.6.0.dev29/boneio/webui/frontend-dist/assets/BindingMatrix-Dyyc2Plw.js → boneio-1.6.0.dev31/boneio/webui/frontend-dist/assets/BindingMatrix-Bh6eogZS.js +1 -1
- boneio-1.6.0.dev31/boneio/webui/frontend-dist/assets/BindingMatrix-Bh6eogZS.js.gz +0 -0
- boneio-1.6.0.dev29/boneio/webui/frontend-dist/assets/DeviceControlSection-BI2Gx_ht.js → boneio-1.6.0.dev31/boneio/webui/frontend-dist/assets/DeviceControlSection-BEZ-rfT5.js +1 -1
- boneio-1.6.0.dev31/boneio/webui/frontend-dist/assets/DeviceControlSection-BEZ-rfT5.js.gz +0 -0
- boneio-1.6.0.dev29/boneio/webui/frontend-dist/assets/DiagnosticsView-DVFMNJGF.js → boneio-1.6.0.dev31/boneio/webui/frontend-dist/assets/DiagnosticsView-hXKAR31e.js +1 -1
- boneio-1.6.0.dev31/boneio/webui/frontend-dist/assets/DiagnosticsView-hXKAR31e.js.gz +0 -0
- boneio-1.6.0.dev29/boneio/webui/frontend-dist/assets/EntityGrid-D1gJhSPK.js → boneio-1.6.0.dev31/boneio/webui/frontend-dist/assets/EntityGrid-DmqQBGaN.js +1 -1
- boneio-1.6.0.dev31/boneio/webui/frontend-dist/assets/EntityGrid-DmqQBGaN.js.gz +0 -0
- boneio-1.6.0.dev29/boneio/webui/frontend-dist/assets/FactoryResetSection-B6zeFfLF.js → boneio-1.6.0.dev31/boneio/webui/frontend-dist/assets/FactoryResetSection-DgiR5Lle.js +1 -1
- boneio-1.6.0.dev31/boneio/webui/frontend-dist/assets/FactoryResetSection-DgiR5Lle.js.gz +0 -0
- boneio-1.6.0.dev29/boneio/webui/frontend-dist/assets/FormInputToggle-B9vctUNt.js → boneio-1.6.0.dev31/boneio/webui/frontend-dist/assets/FormInputToggle-CxFL8RKD.js +1 -1
- boneio-1.6.0.dev31/boneio/webui/frontend-dist/assets/FormInputToggle-CxFL8RKD.js.gz +0 -0
- boneio-1.6.0.dev29/boneio/webui/frontend-dist/assets/HaDashboardWizard-BtouQnje.js → boneio-1.6.0.dev31/boneio/webui/frontend-dist/assets/HaDashboardWizard-V8b13hJz.js +1 -1
- boneio-1.6.0.dev31/boneio/webui/frontend-dist/assets/HaDashboardWizard-V8b13hJz.js.gz +0 -0
- boneio-1.6.0.dev29/boneio/webui/frontend-dist/assets/HostnameSection-h9UyWAS0.js → boneio-1.6.0.dev31/boneio/webui/frontend-dist/assets/HostnameSection-CK_d38Cu.js +1 -1
- boneio-1.6.0.dev31/boneio/webui/frontend-dist/assets/HostnameSection-CK_d38Cu.js.gz +0 -0
- boneio-1.6.0.dev29/boneio/webui/frontend-dist/assets/InputsView-DHMMyEtN.js → boneio-1.6.0.dev31/boneio/webui/frontend-dist/assets/InputsView-AnIelzWL.js +1 -1
- boneio-1.6.0.dev31/boneio/webui/frontend-dist/assets/InputsView-AnIelzWL.js.gz +0 -0
- boneio-1.6.0.dev29/boneio/webui/frontend-dist/assets/LoadingState-BnMjvLnH.js → boneio-1.6.0.dev31/boneio/webui/frontend-dist/assets/LoadingState-k0MWyIJz.js +1 -1
- boneio-1.6.0.dev29/boneio/webui/frontend-dist/assets/LocationSection-BWJEPzOe.js → boneio-1.6.0.dev31/boneio/webui/frontend-dist/assets/LocationSection-Cw5XoezZ.js +2 -2
- boneio-1.6.0.dev31/boneio/webui/frontend-dist/assets/LocationSection-Cw5XoezZ.js.gz +0 -0
- boneio-1.6.0.dev29/boneio/webui/frontend-dist/assets/LoggerForm-B4wgrOCg.js → boneio-1.6.0.dev31/boneio/webui/frontend-dist/assets/LoggerForm-BThTeHcV.js +1 -1
- boneio-1.6.0.dev31/boneio/webui/frontend-dist/assets/LoggerForm-BThTeHcV.js.gz +0 -0
- boneio-1.6.0.dev29/boneio/webui/frontend-dist/assets/LongPressWrapper-BuYVn91a.js → boneio-1.6.0.dev31/boneio/webui/frontend-dist/assets/LongPressWrapper-DysRtE34.js +1 -1
- boneio-1.6.0.dev31/boneio/webui/frontend-dist/assets/LongPressWrapper-DysRtE34.js.gz +0 -0
- boneio-1.6.0.dev29/boneio/webui/frontend-dist/assets/MigrationsSection-CyxjY5qf.js → boneio-1.6.0.dev31/boneio/webui/frontend-dist/assets/MigrationsSection-DG-0G83Q.js +1 -1
- boneio-1.6.0.dev31/boneio/webui/frontend-dist/assets/MigrationsSection-DG-0G83Q.js.gz +0 -0
- boneio-1.6.0.dev29/boneio/webui/frontend-dist/assets/ModbusView-3TzfMJLo.js → boneio-1.6.0.dev31/boneio/webui/frontend-dist/assets/ModbusView-Co7H3-1O.js +1 -1
- boneio-1.6.0.dev31/boneio/webui/frontend-dist/assets/ModbusView-Co7H3-1O.js.gz +0 -0
- boneio-1.6.0.dev29/boneio/webui/frontend-dist/assets/MqttPasswordsSection-BJUmLN6j.js → boneio-1.6.0.dev31/boneio/webui/frontend-dist/assets/MqttPasswordsSection-DbmNuJsl.js +1 -1
- boneio-1.6.0.dev31/boneio/webui/frontend-dist/assets/MqttPasswordsSection-DbmNuJsl.js.gz +0 -0
- boneio-1.6.0.dev31/boneio/webui/frontend-dist/assets/NodeRedManagement-DuFEL1SK.js +1 -0
- boneio-1.6.0.dev31/boneio/webui/frontend-dist/assets/NodeRedManagement-DuFEL1SK.js.gz +0 -0
- boneio-1.6.0.dev29/boneio/webui/frontend-dist/assets/OutputsView-hB9mXMLS.js → boneio-1.6.0.dev31/boneio/webui/frontend-dist/assets/OutputsView-DJgHXWaD.js +1 -1
- boneio-1.6.0.dev31/boneio/webui/frontend-dist/assets/OutputsView-DJgHXWaD.js.gz +0 -0
- boneio-1.6.0.dev29/boneio/webui/frontend-dist/assets/SecurityView-DxbLaDjP.js → boneio-1.6.0.dev31/boneio/webui/frontend-dist/assets/SecurityView-FRya51LN.js +1 -1
- boneio-1.6.0.dev31/boneio/webui/frontend-dist/assets/SecurityView-FRya51LN.js.gz +0 -0
- boneio-1.6.0.dev29/boneio/webui/frontend-dist/assets/SensorView-BA_6vwE1.js → boneio-1.6.0.dev31/boneio/webui/frontend-dist/assets/SensorView-D5SQeEU1.js +1 -1
- boneio-1.6.0.dev31/boneio/webui/frontend-dist/assets/SensorView-D5SQeEU1.js.gz +0 -0
- boneio-1.6.0.dev29/boneio/webui/frontend-dist/assets/SystemState-CLMEarw1.js → boneio-1.6.0.dev31/boneio/webui/frontend-dist/assets/SystemState-CoJxY13l.js +1 -1
- boneio-1.6.0.dev31/boneio/webui/frontend-dist/assets/SystemState-CoJxY13l.js.gz +0 -0
- boneio-1.6.0.dev29/boneio/webui/frontend-dist/assets/TemplatesView-B7Hx_815.js → boneio-1.6.0.dev31/boneio/webui/frontend-dist/assets/TemplatesView-C8KHVSAd.js +1 -1
- boneio-1.6.0.dev31/boneio/webui/frontend-dist/assets/TemplatesView-C8KHVSAd.js.gz +0 -0
- boneio-1.6.0.dev29/boneio/webui/frontend-dist/assets/TilePicker-u6F0_WYh.js → boneio-1.6.0.dev31/boneio/webui/frontend-dist/assets/TilePicker-vWXRKYi4.js +1 -1
- boneio-1.6.0.dev31/boneio/webui/frontend-dist/assets/TilePicker-vWXRKYi4.js.gz +0 -0
- boneio-1.6.0.dev29/boneio/webui/frontend-dist/assets/TimezoneSection-D2NOMHRt.js → boneio-1.6.0.dev31/boneio/webui/frontend-dist/assets/TimezoneSection-CLAdLi7w.js +1 -1
- boneio-1.6.0.dev31/boneio/webui/frontend-dist/assets/TimezoneSection-CLAdLi7w.js.gz +0 -0
- boneio-1.6.0.dev29/boneio/webui/frontend-dist/assets/UISettings-D09Ovoxp.js → boneio-1.6.0.dev31/boneio/webui/frontend-dist/assets/UISettings-BAI0qkpM.js +5 -5
- boneio-1.6.0.dev31/boneio/webui/frontend-dist/assets/UISettings-BAI0qkpM.js.gz +0 -0
- boneio-1.6.0.dev29/boneio/webui/frontend-dist/assets/UpdateSafetyNotice-5anVj_YS.js → boneio-1.6.0.dev31/boneio/webui/frontend-dist/assets/UpdateSafetyNotice-DuHAF2_n.js +1 -1
- boneio-1.6.0.dev31/boneio/webui/frontend-dist/assets/UpdateSafetyNotice-DuHAF2_n.js.gz +0 -0
- boneio-1.6.0.dev29/boneio/webui/frontend-dist/assets/aiConfig-AbhmFxmh.js → boneio-1.6.0.dev31/boneio/webui/frontend-dist/assets/aiConfig-CA8wKp_v.js +1 -1
- boneio-1.6.0.dev31/boneio/webui/frontend-dist/assets/aiConfig-CA8wKp_v.js.gz +0 -0
- boneio-1.6.0.dev29/boneio/webui/frontend-dist/assets/aiWizardPrompt-DROK5vS0.js → boneio-1.6.0.dev31/boneio/webui/frontend-dist/assets/aiWizardPrompt-BSYiCh9D.js +1 -1
- boneio-1.6.0.dev31/boneio/webui/frontend-dist/assets/aiWizardPrompt-BSYiCh9D.js.gz +0 -0
- boneio-1.6.0.dev29/boneio/webui/frontend-dist/assets/groupByArea-S-fs_0iK.js → boneio-1.6.0.dev31/boneio/webui/frontend-dist/assets/groupByArea-CJJPwGJ3.js +1 -1
- boneio-1.6.0.dev31/boneio/webui/frontend-dist/assets/groupByArea-CJJPwGJ3.js.gz +0 -0
- boneio-1.6.0.dev29/boneio/webui/frontend-dist/assets/index-DULLFI0R.js → boneio-1.6.0.dev31/boneio/webui/frontend-dist/assets/index-D2ManUuV.js +11 -11
- boneio-1.6.0.dev31/boneio/webui/frontend-dist/assets/index-D2ManUuV.js.gz +0 -0
- boneio-1.6.0.dev29/boneio/webui/frontend-dist/assets/index-Mmx3ZGXj.css → boneio-1.6.0.dev31/boneio/webui/frontend-dist/assets/index-ybynnlsQ.css +1 -1
- boneio-1.6.0.dev29/boneio/webui/frontend-dist/assets/index-Mmx3ZGXj.css.gz → boneio-1.6.0.dev31/boneio/webui/frontend-dist/assets/index-ybynnlsQ.css.gz +0 -0
- boneio-1.6.0.dev29/boneio/webui/frontend-dist/assets/monaco-C_baIGg_.js → boneio-1.6.0.dev31/boneio/webui/frontend-dist/assets/monaco-BNh4MXlA.js +1 -1
- boneio-1.6.0.dev31/boneio/webui/frontend-dist/assets/monaco-BNh4MXlA.js.gz +0 -0
- boneio-1.6.0.dev29/boneio/webui/frontend-dist/assets/monaco-sF_y08LI.js → boneio-1.6.0.dev31/boneio/webui/frontend-dist/assets/monaco-DbB-_Hga.js +2 -2
- boneio-1.6.0.dev31/boneio/webui/frontend-dist/assets/monaco-DbB-_Hga.js.gz +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/frontend-dist/index.html +3 -3
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/frontend-dist/sw.js +1 -1
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/routes/nodered.py +169 -88
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/routes/system.py +28 -8
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/security_headers.py +7 -1
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31/boneio.egg-info}/PKG-INFO +1 -1
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio.egg-info/SOURCES.txt +79 -71
- boneio-1.6.0.dev29/boneio/core/auth/jwt_secret.py +0 -59
- boneio-1.6.0.dev29/boneio/migrations/plans/manifest.sig +0 -0
- boneio-1.6.0.dev29/boneio/version.py +0 -2
- boneio-1.6.0.dev29/boneio/webui/frontend-dist/assets/AccountsView-hSkFhGZn.js.gz +0 -0
- boneio-1.6.0.dev29/boneio/webui/frontend-dist/assets/AppInitContext-XnlT3sSY.js.gz +0 -0
- boneio-1.6.0.dev29/boneio/webui/frontend-dist/assets/BackupSection-CdrNqwc2.js.gz +0 -0
- boneio-1.6.0.dev29/boneio/webui/frontend-dist/assets/BindingMatrix-Dyyc2Plw.js.gz +0 -0
- boneio-1.6.0.dev29/boneio/webui/frontend-dist/assets/DeviceControlSection-BI2Gx_ht.js.gz +0 -0
- boneio-1.6.0.dev29/boneio/webui/frontend-dist/assets/DiagnosticsView-DVFMNJGF.js.gz +0 -0
- boneio-1.6.0.dev29/boneio/webui/frontend-dist/assets/EntityGrid-D1gJhSPK.js.gz +0 -0
- boneio-1.6.0.dev29/boneio/webui/frontend-dist/assets/FactoryResetSection-B6zeFfLF.js.gz +0 -0
- boneio-1.6.0.dev29/boneio/webui/frontend-dist/assets/FormInputToggle-B9vctUNt.js.gz +0 -0
- boneio-1.6.0.dev29/boneio/webui/frontend-dist/assets/HaDashboardWizard-BtouQnje.js.gz +0 -0
- boneio-1.6.0.dev29/boneio/webui/frontend-dist/assets/HostnameSection-h9UyWAS0.js.gz +0 -0
- boneio-1.6.0.dev29/boneio/webui/frontend-dist/assets/InputsView-DHMMyEtN.js.gz +0 -0
- boneio-1.6.0.dev29/boneio/webui/frontend-dist/assets/LocationSection-BWJEPzOe.js.gz +0 -0
- boneio-1.6.0.dev29/boneio/webui/frontend-dist/assets/LoggerForm-B4wgrOCg.js.gz +0 -0
- boneio-1.6.0.dev29/boneio/webui/frontend-dist/assets/LongPressWrapper-BuYVn91a.js.gz +0 -0
- boneio-1.6.0.dev29/boneio/webui/frontend-dist/assets/MigrationsSection-CyxjY5qf.js.gz +0 -0
- boneio-1.6.0.dev29/boneio/webui/frontend-dist/assets/ModbusView-3TzfMJLo.js.gz +0 -0
- boneio-1.6.0.dev29/boneio/webui/frontend-dist/assets/MqttPasswordsSection-BJUmLN6j.js.gz +0 -0
- boneio-1.6.0.dev29/boneio/webui/frontend-dist/assets/NodeRedManagement-BVfo9HUs.js +0 -1
- boneio-1.6.0.dev29/boneio/webui/frontend-dist/assets/NodeRedManagement-BVfo9HUs.js.gz +0 -0
- boneio-1.6.0.dev29/boneio/webui/frontend-dist/assets/OutputsView-hB9mXMLS.js.gz +0 -0
- boneio-1.6.0.dev29/boneio/webui/frontend-dist/assets/SecurityView-DxbLaDjP.js.gz +0 -0
- boneio-1.6.0.dev29/boneio/webui/frontend-dist/assets/SensorView-BA_6vwE1.js.gz +0 -0
- boneio-1.6.0.dev29/boneio/webui/frontend-dist/assets/SystemState-CLMEarw1.js.gz +0 -0
- boneio-1.6.0.dev29/boneio/webui/frontend-dist/assets/TemplatesView-B7Hx_815.js.gz +0 -0
- boneio-1.6.0.dev29/boneio/webui/frontend-dist/assets/TilePicker-u6F0_WYh.js.gz +0 -0
- boneio-1.6.0.dev29/boneio/webui/frontend-dist/assets/TimezoneSection-D2NOMHRt.js.gz +0 -0
- boneio-1.6.0.dev29/boneio/webui/frontend-dist/assets/UISettings-D09Ovoxp.js.gz +0 -0
- boneio-1.6.0.dev29/boneio/webui/frontend-dist/assets/UpdateSafetyNotice-5anVj_YS.js.gz +0 -0
- boneio-1.6.0.dev29/boneio/webui/frontend-dist/assets/aiConfig-AbhmFxmh.js.gz +0 -0
- boneio-1.6.0.dev29/boneio/webui/frontend-dist/assets/aiWizardPrompt-DROK5vS0.js.gz +0 -0
- boneio-1.6.0.dev29/boneio/webui/frontend-dist/assets/groupByArea-S-fs_0iK.js.gz +0 -0
- boneio-1.6.0.dev29/boneio/webui/frontend-dist/assets/index-DULLFI0R.js.gz +0 -0
- boneio-1.6.0.dev29/boneio/webui/frontend-dist/assets/monaco-C_baIGg_.js.gz +0 -0
- boneio-1.6.0.dev29/boneio/webui/frontend-dist/assets/monaco-sF_y08LI.js.gz +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/LICENSE +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/MANIFEST.in +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/README.md +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/__init__.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/boards/0.2/input.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/boards/0.2/output_24_16.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/boards/0.2/output_32_10.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/boards/0.2/output_32_5.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/boards/0.2/output_cover.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/boards/0.2/output_cover_mix.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/boards/0.3/input.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/boards/0.3/output_24_16.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/boards/0.3/output_32_10.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/boards/0.3/output_32_5.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/boards/0.3/output_cover.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/boards/0.3/output_cover_mix.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/boards/0.4/input.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/boards/0.4/output_24_16.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/boards/0.4/output_32_10.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/boards/0.4/output_32_5.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/boards/0.4/output_cover.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/boards/0.4/output_cover_mix.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/boards/0.5/input.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/boards/0.5/output_24_16.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/boards/0.5/output_32_10.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/boards/0.5/output_cover.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/boards/0.5/output_cover_mix.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/boards/0.6/input.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/boards/0.6/output_24_16.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/boards/0.6/output_32_10.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/boards/0.6/output_cover.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/boards/0.6/output_cover_mix.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/boards/0.7/input.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/boards/0.7/output_24_16.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/boards/0.7/output_32_10.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/boards/0.7/output_48_4.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/boards/0.7/output_cover.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/boards/0.7/output_cover_mix.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/boards/0.8/input.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/boards/0.8/output_24_16.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/boards/0.8/output_32_10.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/boards/0.8/output_48_4.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/boards/0.8/output_cover.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/boards/0.8/output_cover_mix.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/boards/1.0/input.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/boards/1.0/output_24_16.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/boards/1.0/output_32_10.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/boards/1.0/output_48_4.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/boards/1.0/output_cover.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/boards/1.0/output_cover_mix.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/boards/1.1/input.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/boards/1.1/output_24_16.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/boards/1.1/output_32_10.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/boards/1.1/output_48_4.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/boards/1.1/output_cover.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/boards/1.1/output_cover_mix.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/bonecli.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/components/__init__.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/components/cover/__init__.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/components/cover/cover.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/components/cover/remote.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/components/cover/time_based.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/components/cover/venetian.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/components/group/__init__.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/components/group/output_group.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/components/input/__init__.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/components/input/binary_sensor.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/components/input/detectors.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/components/input/event.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/components/input/remote/__init__.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/components/input/remote/base.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/components/input/remote/esphome.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/components/input/remote/mqtt.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/components/irrigation/__init__.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/components/irrigation/controller.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/components/irrigation/water_source.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/components/output/__init__.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/components/output/basic.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/components/output/buzzer.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/components/output/mcp.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/components/output/pca.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/components/output/pcf.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/components/output/remote.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/components/sensor/__init__.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/components/sensor/virtual_energy.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/components/template/__init__.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/components/template/alarm_panel.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/components/template/gate_cover.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/components/template/thermostat.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/components/virtual_switch.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/const.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/__init__.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/atomic_file.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/auth/__init__.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/auth/cli.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/auth/hashing.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/auth/migration.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/auth/models.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/auth/store.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/cloud/__init__.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/cloud/data/__init__.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/cloud/data/docker-compose.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/cloud/data/init-certs-cloud.sh +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/cloud/secrets.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/config/__init__.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/config/config_helper.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/config/input_bindings.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/config/migrations/__init__.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/config/migrations/v1_proxy_port.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/config/migrations/v2_transition.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/config/migrations/v4_wled_cache.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/config/migrations/v5_ina_screen.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/config/migrations/v6_input_keys.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/config/migrations/v7_mqtt_password_secret.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/config/package-lock.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/config/package.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/config/provenance.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/config/schema_converter.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/config/secret_masking.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/config/write_lock.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/config/yaml_compat.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/config/yaml_patch.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/config/yaml_util.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/containers.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/diagnostics/__init__.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/diagnostics/collect.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/discovery.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/events/__init__.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/events/bus.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/manager/__init__.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/manager/action_conditions.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/manager/canopen.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/manager/covers.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/manager/display.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/manager/inputs.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/manager/irrigation.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/manager/manager.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/manager/modbus.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/manager/outputs.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/manager/remote.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/manager/remote_input_registrar.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/manager/scheduler.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/manager/security_alert.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/manager/sensors.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/manager/sun.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/manager/templates/__init__.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/manager/templates/alarm.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/manager/templates/gate_cover.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/manager/templates/thermostat.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/manager/templates.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/manager/update.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/manager/virtual_switches.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/messaging/__init__.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/messaging/basic.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/messaging/basic_mqtt.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/messaging/broker_tls.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/messaging/composite.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/messaging/local.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/messaging/lox.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/messaging/mqtt.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/messaging/mqtt_tls.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/messaging/queue.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/net/__init__.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/net/discovery_guard.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/recovery.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/remote/__init__.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/remote/base.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/remote/can.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/remote/esphome.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/remote/mqtt.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/remote/wled.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/remote/wled_cache.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/security/__init__.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/security/certificate.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/security/framing.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/security/posture.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/sensor/__init__.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/sensor/base.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/sensor/sun.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/sensor/system.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/state/__init__.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/state/manager.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/system/__init__.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/system/host_data.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/system/monitor.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/system_ops.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/utils/__init__.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/utils/async_updater.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/utils/conditions.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/utils/filter.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/utils/font_util.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/utils/logger.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/utils/naming.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/utils/overlay.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/utils/sun.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/utils/timeperiod.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/core/utils/util.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/example_config/24x16/adc.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/example_config/24x16/binary_sensor.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/example_config/24x16/config.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/example_config/24x16/event.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/example_config/24x16/mqtt.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/example_config/24x16/output24x16A.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/example_config/32x10/adc.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/example_config/32x10/binary_sensor.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/example_config/32x10/config.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/example_config/32x10/event.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/example_config/32x10/mqtt.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/example_config/32x10/output32x10A.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/example_config/48x4/adc.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/example_config/48x4/binary_sensor.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/example_config/48x4/config.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/example_config/48x4/event.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/example_config/48x4/mqtt.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/example_config/48x4/output48x4A.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/example_config/__init__.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/example_config/can_master.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/example_config/can_slave.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/example_config/cover/adc.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/example_config/cover/binary_sensor.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/example_config/cover/config.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/example_config/cover/cover.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/example_config/cover/event.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/example_config/cover/mqtt.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/example_config/cover/outputCover.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/example_config/cover_mix/adc.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/example_config/cover_mix/binary_sensor.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/example_config/cover_mix/config.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/example_config/cover_mix/cover.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/example_config/cover_mix/event.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/example_config/cover_mix/mqtt.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/example_config/cover_mix/outputCoverMix.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/example_config/different_configs/adc.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/example_config/different_configs/all_binary_sensor.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/example_config/different_configs/binary_sensor.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/example_config/different_configs/binary_sensor_v_0_7.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/example_config/different_configs/config_24_16.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/example_config/different_configs/event_all.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/example_config/different_configs/event_v_0_7.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/example_config/different_configs/led32x4A.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/example_config/different_configs/output24x16A.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/example_config/different_configs/output24x16A_v0.3.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/example_config/different_configs/output32x10A.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/example_config/different_configs/output32x5A.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/exceptions.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/hardware/__init__.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/hardware/analog/__init__.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/hardware/analog/adc.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/hardware/can/__init__.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/hardware/can/bridge.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/hardware/can/client.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/hardware/can/interface.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/hardware/can/node.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/hardware/can/node_id.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/hardware/can/test_od.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/hardware/display/__init__.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/hardware/display/early_oled.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/hardware/display/fonts/danube__.ttf +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/hardware/display/oled.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/hardware/gpio/__init__.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/hardware/gpio/expanders/__init__.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/hardware/gpio/expanders/mcp23017.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/hardware/gpio/expanders/pca9685.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/hardware/gpio/expanders/pcf8575.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/hardware/gpio/input/__init__.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/hardware/gpio/input/base.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/hardware/gpio/input/manager.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/hardware/i2c/__init__.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/hardware/i2c/bus.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/hardware/i2c/ina219.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/hardware/i2c/ina219_driver.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/hardware/i2c/ina226.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/hardware/i2c/ina226_driver.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/hardware/i2c/mcp9808.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/hardware/i2c/pct2075.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/hardware/onewire/__init__.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/hardware/onewire/dallas.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/hardware/sensor/__init__.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/hardware/sensor/temperature/__init__.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/hardware/sensor/temperature/base.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/hardware/sensor/temperature/mcp9808.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/hardware/sensor/temperature/pct2075.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/hardware/udev_wait.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/integration/__init__.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/integration/homeassistant.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/integration/interlock.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/integration/lox_template.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/__init__.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/actions.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/assets/apt/52boneio-periodic +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/assets/apt/52boneio-unattended +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/assets/docker/daemon.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/assets/docker/nodered/caddy/502.html +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/assets/docker/nodered/caddy/init-certs.sh +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/assets/docker/nodered/docker-compose-cloud.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/assets/docker/nodered/docker-compose.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/assets/docker/nodered/node-red/settings.js +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/assets/helpers/boneio-containers +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/assets/helpers/boneio-helpers-heal +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/assets/helpers/boneio-migrate-v2 +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/assets/helpers/boneio-system +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/assets/issue.d/10-boneio.issue +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/assets/journald/boneio-console.conf +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/assets/journald/journald.conf +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/assets/kernel/postinst-boneio-overlay +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/assets/migrations-recovery.pem +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/assets/migrations.pem +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/assets/modules-load.d/onewire.conf +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/assets/mosquitto/boneio.conf +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/assets/motd/20-boneio +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/assets/overlays/BONEIO-BLACK-PINS-v0.2-v0.3.dtbo +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/assets/sshd/10-boneio-hardening.conf +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/assets/sshd/20-boneio-banner.conf +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/assets/sshd/boneio-banner +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/assets/sudoers/boneio +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/assets/sudoers/boneio-helpers +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/assets/sudoers/boneio-timedatectl +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/assets/systemd/boneio-dpkg-recover.service +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/assets/systemd/boneio-helpers-heal.service +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/assets/systemd/boneio-oled-boot.service +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/assets/systemd/boneio-oled-shutdown.service +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/assets/systemd/boneio.service +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/assets/systemd/dropins/apt-daily-priority.conf +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/assets/systemd/dropins/avahi-daemon-defer.conf +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/assets/systemd/dropins/bb-usb-gadgets-defer.conf +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/assets/systemd/dropins/mosquitto-priority.conf +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/assets/systemd/dropins/timer-no-persistent.conf +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/assets/systemd/dropins/user-manager-defer.conf +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/assets/systemd/linger-marker +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/assets/systemd/set-hostname-once.service +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/assets/usr-local-bin/set-hostname-once.sh +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/assets/usr-sbin/oled_boot_splash.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/assets/usr-sbin/oled_boot_splash.sh +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/assets/usr-sbin/oled_msg.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/assets/usr-sbin/oled_msg.sh +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/assets/wheels/pyyaml-6.0.3-cp313-cp313-linux_armv7l.whl +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/bootstrap/boneio-migrate +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/bootstrap/install-helper.sh +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/bootstrap/sudoers-migrate +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.3.0.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.3.0.sig +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.3.1.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.3.1.sig +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.3.2.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.3.2.sig +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.4.0.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.4.0.sig +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.4.3.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.4.3.sig +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.4.4.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.4.4.sig +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.5.0.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.5.0.sig +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.5.1.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.5.1.sig +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.5.10.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.5.10.sig +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.5.11.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.5.11.sig +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.5.12.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.5.12.sig +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.5.13.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.5.13.sig +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.5.14.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.5.14.sig +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.5.15.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.5.15.sig +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.5.16.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.5.16.sig +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.5.17.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.5.17.sig +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.5.18.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.5.18.sig +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.5.2.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.5.2.sig +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.5.3.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.5.3.sig +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.5.4.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.5.4.sig +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.5.5.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.5.5.sig +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.5.6.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.5.6.sig +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.5.7.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.5.7.sig +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.5.8.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.5.8.sig +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.5.9.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.5.9.sig +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.6.0.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.6.0.sig +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.6.1.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.6.1.sig +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.6.10.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.6.10.sig +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.6.11.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.6.11.sig +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.6.12.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.6.12.sig +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.6.13.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.6.13.sig +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.6.14.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.6.14.sig +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.6.15.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.6.15.sig +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.6.16.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.6.16.sig +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.6.17.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.6.17.sig +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.6.18.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.6.18.sig +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.6.19.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.6.19.sig +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.6.2.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.6.2.sig +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.6.20.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.6.20.sig +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.6.21.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.6.21.sig +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.6.22.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.6.22.sig +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.6.23.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.6.23.sig +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.6.24.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.6.24.sig +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.6.25.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.6.25.sig +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.6.26.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.6.26.sig +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.6.27.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.6.27.sig +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.6.28.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.6.28.sig +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.6.29.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.6.29.sig +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.6.3.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.6.3.sig +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.6.30.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.6.30.sig +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.6.31.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.6.31.sig +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.6.32.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.6.32.sig +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.6.33.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.6.33.sig +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.6.4.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.6.4.sig +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.6.5.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.6.5.sig +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.6.6.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.6.6.sig +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.6.7.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.6.7.sig +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.6.8.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.6.8.sig +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.6.9.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/plans/1.6.9.sig +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/runner.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/versions/__init__.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/versions/v1_3_0_baseline.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/versions/v1_3_1_fix_oled_boot.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/versions/v1_3_2_cleanup_can_sudoers.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/versions/v1_4_0_fix_mqtt_sudoers.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/versions/v1_4_3_oled_shutdown.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/versions/v1_4_4_caddy.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/versions/v1_5_0_fix_oled_fifo_permissions.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/versions/v1_5_10_disable_console_setup.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/versions/v1_5_11_timer_catchup.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/versions/v1_5_12_oled_splash_off_critical_path.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/versions/v1_5_13_mosquitto_priority.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/versions/v1_5_14_journal_apparent_size.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/versions/v1_5_15_prune_orphan_journals.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/versions/v1_5_16_login_linger.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/versions/v1_5_17_defer_user_manager.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/versions/v1_5_18_fix_hostname_once.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/versions/v1_5_1_ufw_lox_udp.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/versions/v1_5_2_libyaml.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/versions/v1_5_3_libyaml_retry.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/versions/v1_5_4_onewire_modules.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/versions/v1_5_5_overlay_kernel_hook.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/versions/v1_5_6_boot_service_order.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/versions/v1_5_7_journald_limits.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/versions/v1_5_8_apparmor_prune.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/versions/v1_5_9_defer_nonessential.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/versions/v1_6_0_nodered_admin_auth.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/versions/v1_6_10_narrow_sudo_rules.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/versions/v1_6_11_drop_docker_group.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/versions/v1_6_12_console_shows_ip.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/versions/v1_6_13_custom_certificate.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/versions/v1_6_14_certificate_lifetime.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/versions/v1_6_15_web_port_reaches_caddy.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/versions/v1_6_16_release_floor_ordering.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/versions/v1_6_17_service_password.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/versions/v1_6_18_os_updates.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/versions/v1_6_19_helper_apt_purge.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/versions/v1_6_1_mosquitto_passwd_perms.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/versions/v1_6_20_drop_packagekit.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/versions/v1_6_21_caddy_pinned.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/versions/v1_6_22_security_autoupdates.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/versions/v1_6_23_helper_fstab_options.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/versions/v1_6_24_boot_partition_nofail.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/versions/v1_6_25_journal_to_serial_console.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/versions/v1_6_26_kernel_check_old_images.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/versions/v1_6_27_startup_overlay_repair.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/versions/v1_6_28_ssh_login_screen.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/versions/v1_6_29_service_password_change.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/versions/v1_6_2_drop_build_sudo_rule.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/versions/v1_6_30_os_update_apt_cache.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/versions/v1_6_31_overlay_v02_v03_inputs.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/versions/v1_6_32_mqtt_broker_tls.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/versions/v1_6_33_os_update_measured_space.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/versions/v1_6_3_firewall_rule_gaps.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/versions/v1_6_4_ssh_login_hardening.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/versions/v1_6_5_trust_transition.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/versions/v1_6_6_retire_legacy_helper.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/versions/v1_6_7_timedatectl_sudoers.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/versions/v1_6_8_system_helper.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/migrations/versions/v1_6_9_ntp_servers.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/modbus/__init__.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/modbus/cli.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/modbus/client.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/modbus/coordinator.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/modbus/devices/__init__.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/modbus/devices/energy_meters/dts1964_3f.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/modbus/devices/energy_meters/le-03mw.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/modbus/devices/energy_meters/le-03mwct.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/modbus/devices/energy_meters/orno-or-we-517.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/modbus/devices/energy_meters/sdm120.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/modbus/devices/energy_meters/sdm630.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/modbus/devices/energy_meters/socomec_e03.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/modbus/devices/energy_meters/socomec_e23.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/modbus/devices/hvac/defro-drx.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/modbus/devices/hvac/eht-topventil-plus.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/modbus/devices/hvac/fujitsu-ac.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/modbus/devices/hvac/thessla.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/modbus/devices/hvac/ventclear.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/modbus/devices/hvac/wanas415.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/modbus/devices/inverters/sofar.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/modbus/devices/other/esp32_relay_x4_modbus.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/modbus/devices/other/n4dsc08.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/modbus/devices/other/r4dcb08.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/modbus/devices/sensors/boneio-edge-temp.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/modbus/devices/sensors/cwt.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/modbus/devices/sensors/dyp-a12-ultrasonic.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/modbus/devices/sensors/gdfs.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/modbus/devices/sensors/gdfx.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/modbus/devices/sensors/liquid-sensor.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/modbus/devices/sensors/pt100.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/modbus/devices/sensors/qdw90a.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/modbus/devices/sensors/sht20.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/modbus/devices/sensors/sht30.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/modbus/entities/__init__.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/modbus/entities/base.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/modbus/entities/derived/__init__.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/modbus/entities/derived/numeric.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/modbus/entities/derived/select.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/modbus/entities/derived/switch.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/modbus/entities/derived/text.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/modbus/entities/sensor/__init__.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/modbus/entities/sensor/binary.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/modbus/entities/sensor/numeric.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/modbus/entities/sensor/text.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/modbus/entities/writeable/__init__.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/modbus/entities/writeable/binary.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/modbus/entities/writeable/numeric.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/modbus/mock_coordinator.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/modbus/utils.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/models/__init__.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/models/actions.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/models/events.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/models/files.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/models/logs.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/models/mqtt.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/models/state.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/schema/actions.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/schema/actions_sensor.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/schema/actions_switch.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/schema/condition.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/schema/filters.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/schema/filters_adc.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/schema/id.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/schema/remote_devices.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/schema/remote_inputs.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/schema/remote_outputs.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/schema/schema.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/schema/temp_unit.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/schema/update_interval.yaml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/action_validation.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/bind.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/dashboard_cards.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/frontend-dist/assets/NodeRedView-CP86NnC4.js +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/frontend-dist/assets/NodeRedView-CP86NnC4.js.gz +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/frontend-dist/assets/NumericInput-CrVNlFps.js +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/frontend-dist/assets/NumericInput-CrVNlFps.js.gz +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/frontend-dist/assets/Sparkline-6iDv_8hd.js +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/frontend-dist/assets/Sparkline-6iDv_8hd.js.gz +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/frontend-dist/assets/ViewToggle-CVWoIKqI.js +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/frontend-dist/assets/axios-DyqbZVcF.js +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/frontend-dist/assets/axios-DyqbZVcF.js.gz +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/frontend-dist/assets/basePath-CxHj-SSK.js +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/frontend-dist/assets/clipboard-CCtx29e-.js +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/frontend-dist/assets/codicon-ngg6Pgfi.ttf +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/frontend-dist/assets/codicon-ngg6Pgfi.ttf.gz +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/frontend-dist/assets/configCache-DZ0vWq_Z.js +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/frontend-dist/assets/dialog-DMaCttcv.js +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/frontend-dist/assets/dialog-DMaCttcv.js.gz +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/frontend-dist/assets/editor.worker-O-CH8JUO.js +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/frontend-dist/assets/editor.worker-O-CH8JUO.js.gz +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/frontend-dist/assets/fa-ChDOCx3T.js +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/frontend-dist/assets/fa-ChDOCx3T.js.gz +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/frontend-dist/assets/formatters-Cc0QIRxb.js +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/frontend-dist/assets/gi-DiFRP1nv.js +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/frontend-dist/assets/monaco-Br_kD0ds.css +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/frontend-dist/assets/monaco-Br_kD0ds.css.gz +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/frontend-dist/assets/rolldown-runtime-hePW80VL.js +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/frontend-dist/assets/select-iQAUlBVk.js +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/frontend-dist/assets/select-iQAUlBVk.js.gz +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/frontend-dist/assets/utils-DOQQTBMN.js +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/frontend-dist/assets/utils-DOQQTBMN.js.gz +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/frontend-dist/assets/workbox-window.prod.es5-Bd17z0YL.js +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/frontend-dist/assets/workbox-window.prod.es5-Bd17z0YL.js.gz +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/frontend-dist/assets/yaml.worker-CeS-z5zL.js +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/frontend-dist/assets/yaml.worker-CeS-z5zL.js.gz +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/frontend-dist/boneio-192.png +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/frontend-dist/boneio-512.png +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/frontend-dist/boneio.svg +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/frontend-dist/boneio_fav.svg +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/frontend-dist/schema/adc.schema.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/frontend-dist/schema/areas.schema.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/frontend-dist/schema/binary_sensor.schema.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/frontend-dist/schema/boneio.schema.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/frontend-dist/schema/can.schema.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/frontend-dist/schema/config.schema.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/frontend-dist/schema/cover.schema.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/frontend-dist/schema/dallas.schema.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/frontend-dist/schema/ds2482.schema.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/frontend-dist/schema/event.schema.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/frontend-dist/schema/ina219.schema.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/frontend-dist/schema/ina226.schema.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/frontend-dist/schema/irrigation.schema.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/frontend-dist/schema/lm75.schema.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/frontend-dist/schema/location.schema.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/frontend-dist/schema/logger.schema.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/frontend-dist/schema/lox_udp.schema.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/frontend-dist/schema/mcp23017.schema.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/frontend-dist/schema/mcp9808.schema.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/frontend-dist/schema/modbus.schema.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/frontend-dist/schema/modbus_devices.schema.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/frontend-dist/schema/mqtt.schema.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/frontend-dist/schema/oled.schema.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/frontend-dist/schema/osdp.schema.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/frontend-dist/schema/output.schema.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/frontend-dist/schema/output_group.schema.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/frontend-dist/schema/pca9685.schema.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/frontend-dist/schema/pcf8575.schema.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/frontend-dist/schema/remote_devices.schema.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/frontend-dist/schema/remote_inputs.schema.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/frontend-dist/schema/remote_outputs.schema.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/frontend-dist/schema/schedule.schema.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/frontend-dist/schema/sensor.schema.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/frontend-dist/schema/template.schema.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/frontend-dist/schema/virtual_energy_sensor.schema.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/frontend-dist/schema/virtual_switch.schema.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/frontend-dist/schema/web.schema.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/frontend-dist/workbox-7e79c025.js +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/hvac_svg_templates.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/input_validation.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/middleware/__init__.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/middleware/auth.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/middleware/csrf.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/middleware/policy.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/middleware/proxy.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/modbus_card_templates.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/rate_limit.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/recovery/__init__.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/recovery/app.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/recovery/server.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/recovery/static/index.html +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/recovery/static/recovery.css +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/recovery/static/recovery.js +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/routes/__init__.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/routes/accounts.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/routes/auth.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/routes/can.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/routes/config.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/routes/config_actions.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/routes/config_backups.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/routes/config_core.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/routes/config_discovery.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/routes/config_files.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/routes/covers.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/routes/dashboard.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/routes/dev_fake_device.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/routes/diagnostics.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/routes/irrigation.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/routes/migrations.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/routes/modbus.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/routes/mqtt_reference.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/routes/mqtt_tls.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/routes/onboarding.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/routes/os_update.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/routes/outputs.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/routes/remote_devices.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/routes/schedule.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/routes/security.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/routes/sensors.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/routes/sun.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/routes/templates.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/routes/timezone_sudoers.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/routes/tools.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/routes/update.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/schema/adc.schema.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/schema/areas.schema.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/schema/binary_sensor.schema.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/schema/boneio.schema.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/schema/can.schema.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/schema/config.schema.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/schema/cover.schema.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/schema/dallas.schema.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/schema/ds2482.schema.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/schema/event.schema.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/schema/ina219.schema.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/schema/ina226.schema.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/schema/irrigation.schema.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/schema/lm75.schema.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/schema/location.schema.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/schema/logger.schema.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/schema/lox_udp.schema.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/schema/mcp23017.schema.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/schema/mcp9808.schema.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/schema/modbus.schema.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/schema/modbus_devices.schema.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/schema/mqtt.schema.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/schema/oled.schema.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/schema/osdp.schema.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/schema/output.schema.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/schema/output_group.schema.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/schema/pca9685.schema.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/schema/pcf8575.schema.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/schema/remote_devices.schema.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/schema/remote_inputs.schema.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/schema/remote_outputs.schema.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/schema/schedule.schema.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/schema/sensor.schema.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/schema/template.schema.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/schema/virtual_energy_sensor.schema.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/schema/virtual_switch.schema.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/schema/web.schema.json +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/security_events.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/services/__init__.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/services/logs.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/static_assets.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/sudo_rate_limiter.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/web_server.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio/webui/websocket_manager.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio.egg-info/dependency_links.txt +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio.egg-info/entry_points.txt +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio.egg-info/requires.txt +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/boneio.egg-info/top_level.txt +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/pyproject.toml +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/setup.cfg +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/setup.py +0 -0
- {boneio-1.6.0.dev29 → boneio-1.6.0.dev31}/tests/test_py313_compatibility.py +0 -0
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
"""The secret the panel signs its login tokens with.
|
|
2
|
+
|
|
3
|
+
Kept in ``jwt_secret`` next to config.yaml so a token outlives a restart. Here
|
|
4
|
+
rather than in the web server so recovery mode signs with the same secret
|
|
5
|
+
without importing the web server, which pulls in the whole Manager: a token
|
|
6
|
+
issued in recovery keeps working once the controller is back, and the other
|
|
7
|
+
way round.
|
|
8
|
+
|
|
9
|
+
The secret belongs to one controller, and the file says which: its second
|
|
10
|
+
line is a hash of the machine-id it was drawn on. A file that names another
|
|
11
|
+
machine — or none — came from somewhere else, most likely an SD card image
|
|
12
|
+
built on a controller that had already run, and every device flashed from that
|
|
13
|
+
image would otherwise sign with the same key. Anyone holding the image could
|
|
14
|
+
then sign an administrator's token for all of them. Such a file is replaced
|
|
15
|
+
rather than trusted, which signs everybody out once.
|
|
16
|
+
|
|
17
|
+
Only the hash is stored: machine-id is meant to stay on the machine, and the
|
|
18
|
+
file needs no more than to recognise it.
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
from __future__ import annotations
|
|
22
|
+
|
|
23
|
+
import hashlib
|
|
24
|
+
import logging
|
|
25
|
+
import os
|
|
26
|
+
import secrets
|
|
27
|
+
from pathlib import Path
|
|
28
|
+
|
|
29
|
+
_LOGGER = logging.getLogger(__name__)
|
|
30
|
+
|
|
31
|
+
JWT_SECRET_FILENAME = "jwt_secret"
|
|
32
|
+
|
|
33
|
+
#: Where systemd keeps this installation's identity. Emptied when an image is
|
|
34
|
+
#: sealed and drawn afresh on the first boot, which is what makes it the thing
|
|
35
|
+
#: to bind to.
|
|
36
|
+
MACHINE_ID_PATH = Path("/etc/machine-id")
|
|
37
|
+
|
|
38
|
+
_BINDING_PREFIX = "machine:"
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def _machine_binding(machine_id_path: Path) -> str | None:
|
|
42
|
+
"""The binding line for this machine, or None when it has no identity yet.
|
|
43
|
+
|
|
44
|
+
None is not an error. On an image being built machine-id is empty on
|
|
45
|
+
purpose; a secret drawn then stays unbound and is replaced on the first
|
|
46
|
+
boot, once there is an identity to bind it to.
|
|
47
|
+
|
|
48
|
+
Args:
|
|
49
|
+
machine_id_path: The machine-id file.
|
|
50
|
+
|
|
51
|
+
Returns:
|
|
52
|
+
``machine:<sha256 of machine-id>``, or None.
|
|
53
|
+
"""
|
|
54
|
+
try:
|
|
55
|
+
machine_id = machine_id_path.read_text().strip()
|
|
56
|
+
except OSError:
|
|
57
|
+
return None
|
|
58
|
+
if not machine_id:
|
|
59
|
+
return None
|
|
60
|
+
digest = hashlib.sha256(f"boneio-jwt:{machine_id}".encode()).hexdigest()
|
|
61
|
+
return f"{_BINDING_PREFIX}{digest}"
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def _write_secret(path: Path, secret: str, binding: str | None) -> None:
|
|
65
|
+
"""Write the secret readable by its owner only, from the first byte.
|
|
66
|
+
|
|
67
|
+
Created 0600 rather than chmod-ed afterwards, and swapped in with a rename,
|
|
68
|
+
so there is never a moment when the key is on disk with looser permissions
|
|
69
|
+
or half written.
|
|
70
|
+
"""
|
|
71
|
+
content = secret + (f"\n{binding}" if binding else "") + "\n"
|
|
72
|
+
tmp = path.with_name(f".{path.name}.tmp")
|
|
73
|
+
try:
|
|
74
|
+
tmp.unlink()
|
|
75
|
+
except FileNotFoundError:
|
|
76
|
+
pass
|
|
77
|
+
fd = os.open(tmp, os.O_WRONLY | os.O_CREAT | os.O_EXCL, 0o600)
|
|
78
|
+
with os.fdopen(fd, "w") as f:
|
|
79
|
+
f.write(content)
|
|
80
|
+
f.flush()
|
|
81
|
+
os.fsync(f.fileno())
|
|
82
|
+
os.replace(tmp, path)
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
def load_or_create_jwt_secret(
|
|
86
|
+
config_dir: str | os.PathLike[str],
|
|
87
|
+
machine_id_path: Path = MACHINE_ID_PATH,
|
|
88
|
+
) -> str:
|
|
89
|
+
"""Read the token secret, creating it on first use.
|
|
90
|
+
|
|
91
|
+
A stored secret is used only if it was drawn on this machine. One with no
|
|
92
|
+
binding, or another machine's, is replaced — unless this machine has no
|
|
93
|
+
identity to compare with, in which case it is kept as it is: replacing it
|
|
94
|
+
then would sign everybody out on every start.
|
|
95
|
+
|
|
96
|
+
Never raises: a secret that cannot be persisted is replaced by one that
|
|
97
|
+
lives as long as the process, which logs everybody out on the next restart
|
|
98
|
+
but does not keep the panel from starting.
|
|
99
|
+
|
|
100
|
+
Args:
|
|
101
|
+
config_dir: The directory config.yaml is in.
|
|
102
|
+
machine_id_path: The machine-id file. A parameter for the tests.
|
|
103
|
+
|
|
104
|
+
Returns:
|
|
105
|
+
The secret.
|
|
106
|
+
"""
|
|
107
|
+
jwt_secret_file = Path(config_dir) / JWT_SECRET_FILENAME
|
|
108
|
+
binding = _machine_binding(machine_id_path)
|
|
109
|
+
|
|
110
|
+
try:
|
|
111
|
+
if jwt_secret_file.exists():
|
|
112
|
+
lines = jwt_secret_file.read_text().split()
|
|
113
|
+
stored = lines[0] if lines else ""
|
|
114
|
+
stored_binding = lines[1] if len(lines) > 1 else None
|
|
115
|
+
if stored and (binding is None or stored_binding == binding):
|
|
116
|
+
return stored
|
|
117
|
+
if stored:
|
|
118
|
+
_LOGGER.warning(
|
|
119
|
+
"The token secret was not drawn on this controller; "
|
|
120
|
+
"replacing it. Everybody signed in has to sign in again."
|
|
121
|
+
)
|
|
122
|
+
|
|
123
|
+
jwt_secret = secrets.token_hex(32) # 256-bit random secret
|
|
124
|
+
_write_secret(jwt_secret_file, jwt_secret, binding)
|
|
125
|
+
except Exception as e:
|
|
126
|
+
# If we can't persist the secret, generate a temporary one
|
|
127
|
+
_LOGGER.error(f"Failed to handle JWT secret file: {e}")
|
|
128
|
+
jwt_secret = secrets.token_hex(32)
|
|
129
|
+
return jwt_secret
|
|
@@ -88,6 +88,7 @@ class CloudRegistration:
|
|
|
88
88
|
self._task: asyncio.Task | None = None
|
|
89
89
|
self._session: aiohttp.ClientSession | None = None
|
|
90
90
|
self._last_error: str | None = None
|
|
91
|
+
self._switching = False
|
|
91
92
|
|
|
92
93
|
@property
|
|
93
94
|
def domain(self) -> str | None:
|
|
@@ -104,6 +105,18 @@ class CloudRegistration:
|
|
|
104
105
|
"""Get the last error message, if any."""
|
|
105
106
|
return self._last_error
|
|
106
107
|
|
|
108
|
+
@property
|
|
109
|
+
def serving(self) -> bool:
|
|
110
|
+
"""Whether Caddy is up on the cloud template with the certificate.
|
|
111
|
+
|
|
112
|
+
False while the template is being swapped and Caddy recreated: the
|
|
113
|
+
compose file already names the cloud script then, but the proxy — the
|
|
114
|
+
only way into a panel with ``web.expose: proxy`` — is down for the half
|
|
115
|
+
minute that takes. Anything sending somebody to the registered name
|
|
116
|
+
has to wait for this rather than for the template.
|
|
117
|
+
"""
|
|
118
|
+
return self._domain is not None and not self._switching and self.is_cloud_config_active()
|
|
119
|
+
|
|
107
120
|
@property
|
|
108
121
|
def is_compose_writable(self) -> bool:
|
|
109
122
|
"""Check if docker-compose.yaml is writable without side effects."""
|
|
@@ -551,6 +564,14 @@ class CloudRegistration:
|
|
|
551
564
|
Returns:
|
|
552
565
|
True if the switch was successful.
|
|
553
566
|
"""
|
|
567
|
+
self._switching = True
|
|
568
|
+
try:
|
|
569
|
+
return await self._apply_cloud_config()
|
|
570
|
+
finally:
|
|
571
|
+
self._switching = False
|
|
572
|
+
|
|
573
|
+
async def _apply_cloud_config(self) -> bool:
|
|
574
|
+
"""The body of :meth:`_switch_to_cloud_config`, without the flag."""
|
|
554
575
|
# The init script still comes from the package; it is mounted read-only
|
|
555
576
|
# into the container and is not what compose executes on the host.
|
|
556
577
|
self._ensure_cloud_script()
|
|
@@ -571,7 +592,9 @@ class CloudRegistration:
|
|
|
571
592
|
return False
|
|
572
593
|
|
|
573
594
|
_LOGGER.info("Switched docker-compose.yaml to the cloud template")
|
|
574
|
-
|
|
595
|
+
# The service definition changed, so ``up`` recreates the container
|
|
596
|
+
# and it reads the certificate as it starts.
|
|
597
|
+
return await self._recreate_caddy(restart=False)
|
|
575
598
|
|
|
576
599
|
async def _restore_local_config(self) -> bool:
|
|
577
600
|
"""Restore the plain compose template and restart Caddy.
|
|
@@ -595,14 +618,21 @@ class CloudRegistration:
|
|
|
595
618
|
return False
|
|
596
619
|
|
|
597
620
|
_LOGGER.info("Restored the local docker-compose.yaml template")
|
|
598
|
-
return await self._recreate_caddy()
|
|
621
|
+
return await self._recreate_caddy(restart=False)
|
|
599
622
|
|
|
600
|
-
async def _recreate_caddy(self) -> bool:
|
|
623
|
+
async def _recreate_caddy(self, restart: bool = True) -> bool:
|
|
601
624
|
"""Recreate and restart Caddy so it picks up new certs or compose config.
|
|
602
625
|
|
|
603
626
|
Both steps go through the container helper, so neither passes anything
|
|
604
627
|
from here to Docker.
|
|
605
628
|
|
|
629
|
+
Args:
|
|
630
|
+
restart: Restart after ``up``. Needed when the compose file did not
|
|
631
|
+
change — ``up`` then leaves the running container alone and it
|
|
632
|
+
keeps the certificate it read at start. Not after a template
|
|
633
|
+
swap: ``up`` has just recreated it, and a restart on top takes
|
|
634
|
+
the proxy down a second time.
|
|
635
|
+
|
|
606
636
|
Returns:
|
|
607
637
|
True if the recreate was successful.
|
|
608
638
|
"""
|
|
@@ -614,12 +644,16 @@ class CloudRegistration:
|
|
|
614
644
|
)
|
|
615
645
|
return False
|
|
616
646
|
|
|
647
|
+
if not restart:
|
|
648
|
+
_LOGGER.info("Caddy container recreated successfully")
|
|
649
|
+
return True
|
|
650
|
+
|
|
617
651
|
# Restart as well: mounted TLS certificates are only re-read on start.
|
|
618
|
-
|
|
619
|
-
if not
|
|
652
|
+
restarted = await loop.run_in_executor(None, containers.restart_caddy)
|
|
653
|
+
if not restarted.ok:
|
|
620
654
|
_LOGGER.warning(
|
|
621
655
|
"Caddy was recreated but the restart failed: %s",
|
|
622
|
-
|
|
656
|
+
restarted.stderr.strip() or "unknown error",
|
|
623
657
|
)
|
|
624
658
|
|
|
625
659
|
_LOGGER.info("Caddy container recreated and restarted successfully")
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
"""Make sure the running Node-RED asks for a password.
|
|
2
|
+
|
|
3
|
+
Node-RED reads ``settings.js`` once, when its container starts. The file can
|
|
4
|
+
say ``adminAuth`` while the editor still answers anyone: a migration installs
|
|
5
|
+
the file during an update, and an update restarts boneIO, not the controller,
|
|
6
|
+
so the container goes on with the settings it started with — an open editor,
|
|
7
|
+
and deploying a flow with an ``exec`` node is code execution in it.
|
|
8
|
+
|
|
9
|
+
So after boneIO starts it asks Node-RED, through the local proxy the way a
|
|
10
|
+
browser would, what its login looks like. An editor that wants no login while
|
|
11
|
+
the file on disk asks for one is restarted, once. Anything else is left alone:
|
|
12
|
+
Node-RED switched off, still starting, or behind a proxy that is being
|
|
13
|
+
recreated all look like "no answer", which is not a reason to restart.
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
from __future__ import annotations
|
|
17
|
+
|
|
18
|
+
import asyncio
|
|
19
|
+
import json
|
|
20
|
+
import logging
|
|
21
|
+
import re
|
|
22
|
+
import ssl
|
|
23
|
+
import urllib.error
|
|
24
|
+
import urllib.request
|
|
25
|
+
from collections.abc import Callable
|
|
26
|
+
from pathlib import Path
|
|
27
|
+
|
|
28
|
+
from boneio.core import containers
|
|
29
|
+
|
|
30
|
+
_LOGGER = logging.getLogger(__name__)
|
|
31
|
+
|
|
32
|
+
SETTINGS_FILE = containers.PROJECT_DIR / "node-red" / "settings.js"
|
|
33
|
+
|
|
34
|
+
#: Node-RED needs a while after a boot; so does the first start of Caddy.
|
|
35
|
+
FIRST_CHECK_AFTER = 60.0
|
|
36
|
+
RETRY_EVERY = 60.0
|
|
37
|
+
ATTEMPTS = 10
|
|
38
|
+
|
|
39
|
+
OPEN = "open"
|
|
40
|
+
PROTECTED = "protected"
|
|
41
|
+
UNKNOWN = "unknown"
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def probe(port: int, timeout: float = 5.0) -> str:
|
|
45
|
+
"""Ask the editor how it signs people in.
|
|
46
|
+
|
|
47
|
+
``GET /nodered/auth/login`` answers ``{}`` when ``adminAuth`` is off and
|
|
48
|
+
names the login type when it is on. The proxy's certificate is the
|
|
49
|
+
device's own, unverifiable from here, and this request never leaves the
|
|
50
|
+
machine, so it is not checked.
|
|
51
|
+
|
|
52
|
+
Args:
|
|
53
|
+
port: The HTTPS port Caddy publishes.
|
|
54
|
+
timeout: Seconds to wait.
|
|
55
|
+
|
|
56
|
+
Returns:
|
|
57
|
+
OPEN, PROTECTED, or UNKNOWN when there was no usable answer.
|
|
58
|
+
"""
|
|
59
|
+
context = ssl.create_default_context()
|
|
60
|
+
context.check_hostname = False
|
|
61
|
+
context.verify_mode = ssl.CERT_NONE
|
|
62
|
+
url = f"https://127.0.0.1:{port}/nodered/auth/login"
|
|
63
|
+
try:
|
|
64
|
+
with urllib.request.urlopen(url, timeout=timeout, context=context) as response: # noqa: S310
|
|
65
|
+
body = json.loads(response.read(4096) or b"null")
|
|
66
|
+
except (OSError, ValueError, urllib.error.URLError):
|
|
67
|
+
return UNKNOWN
|
|
68
|
+
if not isinstance(body, dict):
|
|
69
|
+
return UNKNOWN
|
|
70
|
+
return PROTECTED if body.get("type") else OPEN
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
#: Comments, so a commented-out ``adminAuth`` — or the shipped file's own
|
|
74
|
+
#: explanation of it — does not count as one that is set.
|
|
75
|
+
_JS_COMMENTS = re.compile(r"/\*.*?\*/|//[^\n]*", re.DOTALL)
|
|
76
|
+
_ADMIN_AUTH = re.compile(r"\badminAuth\s*:")
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def settings_require_login(path: Path = SETTINGS_FILE) -> bool:
|
|
80
|
+
"""Whether the settings on disk turn ``adminAuth`` on.
|
|
81
|
+
|
|
82
|
+
A property, outside comments. Not a JavaScript parser: it decides only
|
|
83
|
+
whether restarting Node-RED could help, and a file that fools it gets an
|
|
84
|
+
error in the log instead of a restart that changes nothing.
|
|
85
|
+
|
|
86
|
+
Args:
|
|
87
|
+
path: Node-RED's settings.js.
|
|
88
|
+
|
|
89
|
+
Returns:
|
|
90
|
+
True when the file configures it.
|
|
91
|
+
"""
|
|
92
|
+
try:
|
|
93
|
+
code = _JS_COMMENTS.sub("", path.read_text())
|
|
94
|
+
except OSError:
|
|
95
|
+
return False
|
|
96
|
+
return bool(_ADMIN_AUTH.search(code))
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
async def ensure_admin_auth(
|
|
100
|
+
port: int,
|
|
101
|
+
*,
|
|
102
|
+
first_check_after: float = FIRST_CHECK_AFTER,
|
|
103
|
+
retry_every: float = RETRY_EVERY,
|
|
104
|
+
attempts: int = ATTEMPTS,
|
|
105
|
+
probe_fn: Callable[[int], str] = probe,
|
|
106
|
+
settings_path: Path = SETTINGS_FILE,
|
|
107
|
+
restart: Callable[[], containers.Result] = containers.restart_nodered,
|
|
108
|
+
) -> str:
|
|
109
|
+
"""Restart Node-RED once if it runs open while its settings say otherwise.
|
|
110
|
+
|
|
111
|
+
Args:
|
|
112
|
+
port: The HTTPS port Caddy publishes.
|
|
113
|
+
first_check_after: Seconds before the first look.
|
|
114
|
+
retry_every: Seconds between looks while there is no answer.
|
|
115
|
+
attempts: Looks before giving up on an editor that never answers.
|
|
116
|
+
probe_fn: The probe. A parameter for the tests.
|
|
117
|
+
settings_path: Node-RED's settings.js.
|
|
118
|
+
restart: Restarts the container. A parameter for the tests.
|
|
119
|
+
|
|
120
|
+
Returns:
|
|
121
|
+
What it found or did: ``protected``, ``restarted``, ``open`` (the file
|
|
122
|
+
itself asks for no login), ``restart_failed`` or ``unknown``.
|
|
123
|
+
"""
|
|
124
|
+
loop = asyncio.get_running_loop()
|
|
125
|
+
await asyncio.sleep(first_check_after)
|
|
126
|
+
for attempt in range(attempts):
|
|
127
|
+
if attempt:
|
|
128
|
+
await asyncio.sleep(retry_every)
|
|
129
|
+
state = await loop.run_in_executor(None, probe_fn, port)
|
|
130
|
+
if state == UNKNOWN:
|
|
131
|
+
continue
|
|
132
|
+
if state == PROTECTED:
|
|
133
|
+
return PROTECTED
|
|
134
|
+
if not settings_require_login(settings_path):
|
|
135
|
+
_LOGGER.error(
|
|
136
|
+
"Node-RED's editor accepts anyone, and %s does not configure "
|
|
137
|
+
"adminAuth either. Apply the pending system migrations.",
|
|
138
|
+
settings_path,
|
|
139
|
+
)
|
|
140
|
+
return OPEN
|
|
141
|
+
_LOGGER.warning(
|
|
142
|
+
"Node-RED is running without the login its settings ask for; "
|
|
143
|
+
"restarting it so it reads them."
|
|
144
|
+
)
|
|
145
|
+
result = await loop.run_in_executor(None, restart)
|
|
146
|
+
if not result.ok:
|
|
147
|
+
_LOGGER.error(
|
|
148
|
+
"Could not restart Node-RED: %s",
|
|
149
|
+
(result.stderr or result.stdout).strip() or "unknown error",
|
|
150
|
+
)
|
|
151
|
+
return "restart_failed"
|
|
152
|
+
return "restarted"
|
|
153
|
+
return UNKNOWN
|
|
@@ -25,6 +25,7 @@ d28f2e9336b881b102c42f4278ec9ddf046c83dab4469dc5be7326768e074cb6 kernel/postins
|
|
|
25
25
|
99a9d81f833347563e8349599a248a641216d01d182e8a2723344b017d87f9f4 motd/20-boneio
|
|
26
26
|
e4dc9400201f74f04e71e2e9eaab3eed4dca39f0906dd717511578c138fcf97b overlays/BONEIO-BLACK-PINS-v0.2-v0.3.dtbo
|
|
27
27
|
6289c9b3d6e7836fcd809b7a9dcd85f5a2acf85af09be279dd6e466b99a14209 sshd/10-boneio-hardening.conf
|
|
28
|
+
e8759a106b07c05a7f945f5cb9cc0e53c1d190a93d8e9184ae2b864967e4fa81 sshd/15-boneio-penalties.conf
|
|
28
29
|
27adb0eb71d07b1f0e3fbd5098795325672a55f8d6bb6f5bb505300152dd5256 sshd/20-boneio-banner.conf
|
|
29
30
|
00e4fb7961045f99f2559ebc76472c9d001f8e128182e48762f7a2b177896d11 sshd/boneio-banner
|
|
30
31
|
6c994908ea9d8d0cb85501480b7a6236a31310012deebe6ee3d034da2dc2d4e9 sudoers/boneio
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# boneIO SSH guessing penalty. Installed by migration 1.6.35; edit at your own
|
|
2
|
+
# risk, as a later migration may replace it.
|
|
3
|
+
#
|
|
4
|
+
# Password login stays on: people setting up from Windows with PuTTY rarely
|
|
5
|
+
# have a key, and a controller they cannot reach is worse than one they reach
|
|
6
|
+
# with a password. What it must not allow is guessing at network speed.
|
|
7
|
+
#
|
|
8
|
+
# sshd keeps the count itself (OpenSSH 9.8+), per source address, in memory —
|
|
9
|
+
# no log parser, no firewall rules, no extra daemon on a board with half a
|
|
10
|
+
# gigabyte of RAM. A connection that ends without a successful login costs its
|
|
11
|
+
# source five minutes in which sshd refuses it outright; repeated, the penalty
|
|
12
|
+
# adds up to an hour. Typing the password wrong and then right in the same
|
|
13
|
+
# connection costs nothing. Three guesses per connection (MaxAuthTries, in
|
|
14
|
+
# 10-boneio-hardening.conf) every five minutes is under nine hundred a day.
|
|
15
|
+
#
|
|
16
|
+
# The penalty is per address, so behind one NAT a stranger's guessing also
|
|
17
|
+
# keeps a colleague out for those minutes. The panel's own login is counted
|
|
18
|
+
# separately and is unaffected.
|
|
19
|
+
PerSourcePenalties authfail:300s max:3600s
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
[{"action":"install_file","dst":"/home/boneio/docker/nodered/node-red/settings.js","expected_sha256":"bff00753c72fb17609a6f7b3a58ef78b7b394da12d19fd65b875f2889695e2b4","group":"boneio","mode":420,"owner":"boneio","src":"docker/nodered/node-red/settings.js","template_vars":{}}]
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
[{"action":"install_file","dst":"/etc/ssh/sshd_config.d/15-boneio-penalties.conf","expected_sha256":"e8759a106b07c05a7f945f5cb9cc0e53c1d190a93d8e9184ae2b864967e4fa81","group":"root","mode":420,"on_change":{"action":"systemctl_reload","unit":"ssh"},"owner":"root","src":"sshd/15-boneio-penalties.conf","template_vars":{},"validate":"sshd"}]
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
?aQ�N���>ZN0�"�����/5��s�".YCi߿�ܠnYd�XP�L�Fh/6Dx��
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"plans":{"1.3.0":"645ac6bdda8dc0a73c219aa3684a29df4bdd4032aad97a833b259de489b2ce32","1.3.1":"580381a4f6f40fc1bd4e903e591ad0d5c1db27daaccafc6f79dabf8c3b84259a","1.3.2":"7a69ffaf0c41438be25a656dcdc87783daac0eae79218d023648ef9d708e373f","1.4.0":"41c3a16e7819857a4b826e944fcfb4f79c58e7192cb151b106a3acd7487d5771","1.4.3":"a8cfbabff09d21944a822c4a70f23a7ee14960c4054de151c9fbc7cdb29adff5","1.4.4":"19508f66d84f1e16bd24932aaa17d45417912ffd1c20d326b2f003b931ac2f8c","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":"8cfaeae24ceefe171d40241549c1f62527ce41821e5fd2904c0df1973596c0c7","1.6.16":"4b7e00dbe218a173ee83dd9cb32103f7129520352bdb4b11172d62e55df519c1","1.6.17":"7f87b537e2d2618d0fed97683c9db9b13143025f63aae7fa6bf6ee2534d9cf68","1.6.18":"7f87b537e2d2618d0fed97683c9db9b13143025f63aae7fa6bf6ee2534d9cf68","1.6.19":"4b7e00dbe218a173ee83dd9cb32103f7129520352bdb4b11172d62e55df519c1","1.6.2":"6ef96b5e00a04a929d16f0e4a136bfcc5b8132a466d6907a99b2c8516a8952d5","1.6.20":"28027c836eef19b21b95500760961e181f6078d22cccf8cca62b77bbbb11a0c5","1.6.21":"b0d0777e81edc8532d42bcd3b6d518fecd6078153dfe9f5f859469d2c13b369d","1.6.22":"6600f96197356bdc676e9cd7d2d40b18c9d8838323f8cae0892f056175396313","1.6.23":"4b7e00dbe218a173ee83dd9cb32103f7129520352bdb4b11172d62e55df519c1","1.6.24":"701460ed5e3ed236c8c7273ba0a98a0235786b4a04bd6c7aa6088fb835549aa6","1.6.25":"efa09d1677148bdfe4639273479c9a1fa527d4cf5d2ca9af6dd876883652ba22","1.6.26":"7f87b537e2d2618d0fed97683c9db9b13143025f63aae7fa6bf6ee2534d9cf68","1.6.27":"7f87b537e2d2618d0fed97683c9db9b13143025f63aae7fa6bf6ee2534d9cf68","1.6.28":"6e219d09a06a5de8162a521c9b3c3b54067e6bb4d1d15b3b47a8ec522fd76b5c","1.6.29":"7f87b537e2d2618d0fed97683c9db9b13143025f63aae7fa6bf6ee2534d9cf68","1.6.3":"5c10db827bcb92b9322d4aa5751076b825da87c6d18d6953847ba72317cca862","1.6.30":"7f87b537e2d2618d0fed97683c9db9b13143025f63aae7fa6bf6ee2534d9cf68","1.6.31":"fe5e93397dfe4e459cb7c19bfb09153707ebe4b6c92a60a279bf61b0fbc482fb","1.6.32":"c5dbc5a513107d179d55c2f7360e66299167107acd92bc1f5c3a6b19bc7b6e31","1.6.33":"7f87b537e2d2618d0fed97683c9db9b13143025f63aae7fa6bf6ee2534d9cf68","1.6.4":"baf2bb1c2ec7c1bfccfc514ef1cef67907e056e4f7153bb5932ecb835c9cff78","1.6.5":"65a083182affb9a2beef674bb17dee390bec0007441f1ee71b92e05117c65937","1.6.6":"535bb041b99d5ac1bc9028ea88bc2fbf3dbadc80ea8dea236cc219123c194114","1.6.7":"d59af413e270e6f34b1b9a1c8c4acef35328f00e26fad447cfe214545af78d8f","1.6.8":"5c03d447037a48211f0223bb9ecc8cdc1fa84b93bec8e61b1a3073188ac7ea4e","1.6.9":"978c88cc23a2ce07fe419d40a4f9aaf1a1388d01c6b43235e6f08fc09a03a96f"},"release":"1.6.0.
|
|
1
|
+
{"plans":{"1.3.0":"645ac6bdda8dc0a73c219aa3684a29df4bdd4032aad97a833b259de489b2ce32","1.3.1":"580381a4f6f40fc1bd4e903e591ad0d5c1db27daaccafc6f79dabf8c3b84259a","1.3.2":"7a69ffaf0c41438be25a656dcdc87783daac0eae79218d023648ef9d708e373f","1.4.0":"41c3a16e7819857a4b826e944fcfb4f79c58e7192cb151b106a3acd7487d5771","1.4.3":"a8cfbabff09d21944a822c4a70f23a7ee14960c4054de151c9fbc7cdb29adff5","1.4.4":"19508f66d84f1e16bd24932aaa17d45417912ffd1c20d326b2f003b931ac2f8c","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":"8cfaeae24ceefe171d40241549c1f62527ce41821e5fd2904c0df1973596c0c7","1.6.16":"4b7e00dbe218a173ee83dd9cb32103f7129520352bdb4b11172d62e55df519c1","1.6.17":"7f87b537e2d2618d0fed97683c9db9b13143025f63aae7fa6bf6ee2534d9cf68","1.6.18":"7f87b537e2d2618d0fed97683c9db9b13143025f63aae7fa6bf6ee2534d9cf68","1.6.19":"4b7e00dbe218a173ee83dd9cb32103f7129520352bdb4b11172d62e55df519c1","1.6.2":"6ef96b5e00a04a929d16f0e4a136bfcc5b8132a466d6907a99b2c8516a8952d5","1.6.20":"28027c836eef19b21b95500760961e181f6078d22cccf8cca62b77bbbb11a0c5","1.6.21":"b0d0777e81edc8532d42bcd3b6d518fecd6078153dfe9f5f859469d2c13b369d","1.6.22":"6600f96197356bdc676e9cd7d2d40b18c9d8838323f8cae0892f056175396313","1.6.23":"4b7e00dbe218a173ee83dd9cb32103f7129520352bdb4b11172d62e55df519c1","1.6.24":"701460ed5e3ed236c8c7273ba0a98a0235786b4a04bd6c7aa6088fb835549aa6","1.6.25":"efa09d1677148bdfe4639273479c9a1fa527d4cf5d2ca9af6dd876883652ba22","1.6.26":"7f87b537e2d2618d0fed97683c9db9b13143025f63aae7fa6bf6ee2534d9cf68","1.6.27":"7f87b537e2d2618d0fed97683c9db9b13143025f63aae7fa6bf6ee2534d9cf68","1.6.28":"6e219d09a06a5de8162a521c9b3c3b54067e6bb4d1d15b3b47a8ec522fd76b5c","1.6.29":"7f87b537e2d2618d0fed97683c9db9b13143025f63aae7fa6bf6ee2534d9cf68","1.6.3":"5c10db827bcb92b9322d4aa5751076b825da87c6d18d6953847ba72317cca862","1.6.30":"7f87b537e2d2618d0fed97683c9db9b13143025f63aae7fa6bf6ee2534d9cf68","1.6.31":"fe5e93397dfe4e459cb7c19bfb09153707ebe4b6c92a60a279bf61b0fbc482fb","1.6.32":"c5dbc5a513107d179d55c2f7360e66299167107acd92bc1f5c3a6b19bc7b6e31","1.6.33":"7f87b537e2d2618d0fed97683c9db9b13143025f63aae7fa6bf6ee2534d9cf68","1.6.34":"c8286514d1a4f1805e727e13d3c350bb390378c6f31ad6920030412d61ec9b3f","1.6.35":"f111f7717fd1fb7f36ff50c59e5aae0f37440ae8e60ae649e0a781d107f13216","1.6.4":"baf2bb1c2ec7c1bfccfc514ef1cef67907e056e4f7153bb5932ecb835c9cff78","1.6.5":"65a083182affb9a2beef674bb17dee390bec0007441f1ee71b92e05117c65937","1.6.6":"535bb041b99d5ac1bc9028ea88bc2fbf3dbadc80ea8dea236cc219123c194114","1.6.7":"d59af413e270e6f34b1b9a1c8c4acef35328f00e26fad447cfe214545af78d8f","1.6.8":"5c03d447037a48211f0223bb9ecc8cdc1fa84b93bec8e61b1a3073188ac7ea4e","1.6.9":"978c88cc23a2ce07fe419d40a4f9aaf1a1388d01c6b43235e6f08fc09a03a96f"},"release":"1.6.0.dev31"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
��G�����z�`���k� ]=}�m��9�-X��O��r��=�-X��;�`�ڲQ/�vE~
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"""BoneIO 1.6.34 — install the Node-RED settings that require a login, again.
|
|
2
|
+
|
|
3
|
+
1.6.0 installed ``settings.js`` with ``adminAuth`` delegated to boneIO, and
|
|
4
|
+
recorded itself as applied. On the SD card images that record did not mean the
|
|
5
|
+
file was still there: the images are built on a rootfs that had already been
|
|
6
|
+
through setup once, so 1.6.0 counted as done, and the image script's own step
|
|
7
|
+
then wrote its four-line ``settings.js`` over the real one — no ``adminAuth``.
|
|
8
|
+
Every controller flashed from such an image (seen on dev29, blk239bb2, audit
|
|
9
|
+
finding A-02) ran Node-RED's editor open to anyone who could reach the device,
|
|
10
|
+
which is F-01 back: a flow with an ``exec`` node is code execution.
|
|
11
|
+
|
|
12
|
+
The same file again, under a new version so it is applied once more on every
|
|
13
|
+
device. Where the file is already the right one, the helper finds the hash
|
|
14
|
+
matching and writes nothing.
|
|
15
|
+
|
|
16
|
+
The running container keeps the settings it started with. boneIO restarts it
|
|
17
|
+
on its own after starting, when the editor answers without a login while this
|
|
18
|
+
file asks for one (see :mod:`boneio.core.nodered_guard`), so an update is
|
|
19
|
+
enough and no reboot is needed.
|
|
20
|
+
|
|
21
|
+
To retry on a device, delete ``/var/lib/boneio/migrations.d/1.6.34.applied``
|
|
22
|
+
and restart boneIO.
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
from __future__ import annotations
|
|
26
|
+
|
|
27
|
+
from boneio.migrations.actions import InstallFile, MigrationAction
|
|
28
|
+
|
|
29
|
+
VERSION = "1.6.34"
|
|
30
|
+
DESCRIPTION = "Install the Node-RED settings that require a login, again (F-01, A-02)"
|
|
31
|
+
REQUIRES_ROOT = True
|
|
32
|
+
|
|
33
|
+
_BONEIO_HOME = "/home/boneio"
|
|
34
|
+
_BONEIO_USER = "boneio"
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def plan() -> list[MigrationAction]:
|
|
38
|
+
"""Return the ordered list of migration actions for version 1.6.34.
|
|
39
|
+
|
|
40
|
+
Returns:
|
|
41
|
+
List of :class:`MigrationAction` to apply in order.
|
|
42
|
+
"""
|
|
43
|
+
return [
|
|
44
|
+
InstallFile(
|
|
45
|
+
src="docker/nodered/node-red/settings.js",
|
|
46
|
+
dst=f"{_BONEIO_HOME}/docker/nodered/node-red/settings.js",
|
|
47
|
+
mode=0o644,
|
|
48
|
+
owner=_BONEIO_USER,
|
|
49
|
+
group=_BONEIO_USER,
|
|
50
|
+
),
|
|
51
|
+
]
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"""BoneIO 1.6.35 — make guessing an SSH password slow.
|
|
2
|
+
|
|
3
|
+
1.6.4 cut attempts per connection to three and shortened the window, but
|
|
4
|
+
nothing stopped a client opening the next connection straight away, so a
|
|
5
|
+
password could still be guessed at network speed. The audit of blk239bb2 on
|
|
6
|
+
dev30 (A-03, the SSH half of F-06) found exactly that: password login on,
|
|
7
|
+
``boneio`` a sudoer with that same password, and no throttling.
|
|
8
|
+
|
|
9
|
+
Password login stays on — owners setting up from Windows with PuTTY rarely
|
|
10
|
+
have a key. Instead a drop-in sets ``PerSourcePenalties``: sshd, not a log
|
|
11
|
+
parser, keeps the count per source address and refuses a source for five
|
|
12
|
+
minutes after a connection that ends without logging in, accumulating up to an
|
|
13
|
+
hour. No new package, no daemon, nothing in the firewall; fail2ban was weighed
|
|
14
|
+
and set aside for its memory on a 512 MB board.
|
|
15
|
+
|
|
16
|
+
A file of its own rather than a line in ``10-boneio-hardening.conf``, so the
|
|
17
|
+
1.6.4 plan and its signature stay as they are. Validated with ``sshd -t``
|
|
18
|
+
before it goes in, like the other drop-ins: OpenSSH learned the keyword in 9.8,
|
|
19
|
+
and every 1.6 device runs Debian 13 (OpenSSH 10). On an older sshd the
|
|
20
|
+
validation would fail this migration rather than leave a config that sshd
|
|
21
|
+
cannot start with. Reloaded, not restarted — open sessions stay up.
|
|
22
|
+
|
|
23
|
+
To retry on a device, delete ``/var/lib/boneio/migrations.d/1.6.35.applied``
|
|
24
|
+
and restart boneIO.
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
from __future__ import annotations
|
|
28
|
+
|
|
29
|
+
from boneio.migrations.actions import InstallFile, MigrationAction, SystemctlReload
|
|
30
|
+
|
|
31
|
+
VERSION = "1.6.35"
|
|
32
|
+
DESCRIPTION = "Make guessing an SSH password slow: per-source penalties (F-06, A-03)"
|
|
33
|
+
REQUIRES_ROOT = True
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def plan() -> list[MigrationAction]:
|
|
37
|
+
"""Return the ordered list of migration actions for version 1.6.35.
|
|
38
|
+
|
|
39
|
+
Returns:
|
|
40
|
+
List of :class:`MigrationAction` to apply in order.
|
|
41
|
+
"""
|
|
42
|
+
return [
|
|
43
|
+
InstallFile(
|
|
44
|
+
src="sshd/15-boneio-penalties.conf",
|
|
45
|
+
dst="/etc/ssh/sshd_config.d/15-boneio-penalties.conf",
|
|
46
|
+
mode=0o644,
|
|
47
|
+
owner="root",
|
|
48
|
+
group="root",
|
|
49
|
+
validate="sshd",
|
|
50
|
+
on_change=SystemctlReload(unit="ssh"),
|
|
51
|
+
),
|
|
52
|
+
]
|
|
@@ -616,6 +616,16 @@ async def async_run(
|
|
|
616
616
|
|
|
617
617
|
stable_task = asyncio.create_task(_forgive_earlier_crashes())
|
|
618
618
|
|
|
619
|
+
# An update restarts boneIO, not the controller, so a Node-RED settings
|
|
620
|
+
# file installed by it is not what the running editor read. Not in the
|
|
621
|
+
# main gather either: it finishes after a look or two.
|
|
622
|
+
from boneio.const import DEFAULT_PROXY_PORT
|
|
623
|
+
from boneio.core.nodered_guard import ensure_admin_auth
|
|
624
|
+
|
|
625
|
+
nodered_task = asyncio.create_task(
|
|
626
|
+
ensure_admin_auth(_config_helper.proxy_port or DEFAULT_PROXY_PORT)
|
|
627
|
+
)
|
|
628
|
+
|
|
619
629
|
try:
|
|
620
630
|
# Convert tasks set to list for main gather
|
|
621
631
|
task_list = list(tasks)
|
|
@@ -668,6 +678,7 @@ async def async_run(
|
|
|
668
678
|
finally:
|
|
669
679
|
_LOGGER.info("Cleaning up resources...")
|
|
670
680
|
stable_task.cancel()
|
|
681
|
+
nodered_task.cancel()
|
|
671
682
|
|
|
672
683
|
# Cancel pending deferred state saves and write final state synchronously.
|
|
673
684
|
# This MUST happen before event_bus.stop() which may trigger sigterm
|
|
@@ -14,7 +14,7 @@ from typing import TYPE_CHECKING
|
|
|
14
14
|
from fastapi import Depends, FastAPI, WebSocket, WebSocketDisconnect
|
|
15
15
|
from fastapi.middleware.cors import CORSMiddleware
|
|
16
16
|
from fastapi.middleware.gzip import GZipMiddleware
|
|
17
|
-
from fastapi.responses import FileResponse, JSONResponse
|
|
17
|
+
from fastapi.responses import FileResponse, JSONResponse, Response
|
|
18
18
|
from fastapi.staticfiles import StaticFiles
|
|
19
19
|
from starlette.types import Receive, Scope, Send
|
|
20
20
|
from starlette.websockets import WebSocketState
|
|
@@ -1096,6 +1096,12 @@ if FRONTEND_DIR.exists() and (FRONTEND_DIR / "index.html").exists():
|
|
|
1096
1096
|
headers={"Cache-Control": "no-store, no-cache, must-revalidate"},
|
|
1097
1097
|
)
|
|
1098
1098
|
|
|
1099
|
+
#: FastAPI's own schema and docs routes. In dev mode they are registered
|
|
1100
|
+
#: ahead of this catch-all and answer first; otherwise nothing should.
|
|
1101
|
+
_API_DOC_PATHS = frozenset(
|
|
1102
|
+
{"docs", "docs/oauth2-redirect", "redoc", "openapi.json", "openapi.yaml"}
|
|
1103
|
+
)
|
|
1104
|
+
|
|
1099
1105
|
@app.get("/{filename:path}")
|
|
1100
1106
|
async def serve_react_app(filename: str):
|
|
1101
1107
|
"""Serve static files from frontend-dist, fallback to index.html for SPA routing.
|
|
@@ -1104,6 +1110,13 @@ if FRONTEND_DIR.exists() and (FRONTEND_DIR / "index.html").exists():
|
|
|
1104
1110
|
them. index.html (SPA fallback) is never cached to prevent stale
|
|
1105
1111
|
versions being served through Cloudflare Tunnel or other caching proxies.
|
|
1106
1112
|
"""
|
|
1113
|
+
# Matched loosely — a trailing slash or capitals reach the same
|
|
1114
|
+
# fallback, and a scanner tries both.
|
|
1115
|
+
if filename.strip("/").lower() in _API_DOC_PATHS:
|
|
1116
|
+
# The schema is off outside dev mode, and these names answering
|
|
1117
|
+
# with the panel's index.html read to a scanner as an exposed API
|
|
1118
|
+
# schema. Saying "not here" is the truth.
|
|
1119
|
+
return Response(status_code=404)
|
|
1107
1120
|
file_path = (FRONTEND_DIR / filename).resolve()
|
|
1108
1121
|
if filename and file_path.is_relative_to(FRONTEND_DIR.resolve()) and file_path.exists() and file_path.is_file():
|
|
1109
1122
|
return FileResponse(str(file_path))
|