boneIO 1.6.0.dev3__py3-none-any.whl → 1.6.0.dev4__py3-none-any.whl

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.
@@ -0,0 +1,114 @@
1
+ """Tell a freshly flashed controller from one that has been in service.
2
+
3
+ The first-run wizard has two steps that are only appropriate on a blank
4
+ device. The import step offers to restore a configuration, which on a device
5
+ that already has one reads as "yours is gone". The devices step is worse than
6
+ misleading: it replaces the whole ``event`` section, so a controller with fifty
7
+ configured inputs loses them to a wizard its owner opened only to create an
8
+ account.
9
+
10
+ So the question has to be answered before those steps are offered, and the two
11
+ ways of getting it wrong are not equally bad:
12
+
13
+ * Treating an upgraded device as fresh costs the owner their configuration.
14
+ * Treating a fresh device as upgraded costs them a step in a wizard; they
15
+ can still import and bind inputs from the normal interface afterwards.
16
+
17
+ This module is therefore written to answer "is it fresh" and to say no when it
18
+ cannot tell. Freshness has to be demonstrated, not assumed.
19
+
20
+ The demonstration is that the configuration is still the factory one. The image
21
+ copies a variant out of ``~/.cache/boneio_configs/<variant>/`` verbatim, and
22
+ per-device work touches only ``mqtt.yaml`` (the broker password), so a
23
+ controller nobody has configured yet still has a ``config.yaml`` byte-identical
24
+ to its template.
25
+ """
26
+
27
+ from __future__ import annotations
28
+
29
+ import logging
30
+ import os
31
+ from pathlib import Path
32
+
33
+ _LOGGER = logging.getLogger(__name__)
34
+
35
+ #: Where the image leaves the per-variant templates it seeded the device from.
36
+ FACTORY_TEMPLATE_DIR = Path.home() / ".cache" / "boneio_configs"
37
+
38
+
39
+ def _digest(path: Path) -> bytes | None:
40
+ """Read a file for comparison.
41
+
42
+ Args:
43
+ path: File to read.
44
+
45
+ Returns:
46
+ Its contents, or None when it cannot be read.
47
+ """
48
+ try:
49
+ return path.read_bytes()
50
+ except OSError:
51
+ return None
52
+
53
+
54
+ def looks_factory_fresh(
55
+ config_path: str | os.PathLike[str],
56
+ template_dir: str | os.PathLike[str] | None = None,
57
+ ) -> bool:
58
+ """Whether this device still carries an untouched factory configuration.
59
+
60
+ Args:
61
+ config_path: The device's ``config.yaml``.
62
+ template_dir: Where the per-variant templates live. Defaults to
63
+ :data:`FACTORY_TEMPLATE_DIR`.
64
+
65
+ Returns:
66
+ True only when freshness can be positively shown: there is no
67
+ configuration at all, or the configuration is identical to one of the
68
+ templates the image ships. False whenever the answer is not certain.
69
+ """
70
+ config = Path(config_path)
71
+ current = _digest(config)
72
+ if current is None:
73
+ # Nothing to lose, and nothing that an import could overwrite.
74
+ _LOGGER.debug("No configuration at %s — treating the device as fresh", config)
75
+ return True
76
+
77
+ root = Path(template_dir) if template_dir is not None else FACTORY_TEMPLATE_DIR
78
+ try:
79
+ variants = sorted(p for p in root.iterdir() if p.is_dir())
80
+ except OSError:
81
+ # No templates to compare against: the honest answer is "cannot tell",
82
+ # and the safe reading of that is "assume it has been configured".
83
+ _LOGGER.debug("No factory templates under %s — assuming configured", root)
84
+ return False
85
+
86
+ for variant in variants:
87
+ if current == _digest(variant / "config.yaml"):
88
+ _LOGGER.debug("Configuration matches the %s template", variant.name)
89
+ return True
90
+
91
+ return False
92
+
93
+
94
+ def was_configured_before(
95
+ config_path: str | os.PathLike[str],
96
+ had_legacy_auth: bool = False,
97
+ template_dir: str | os.PathLike[str] | None = None,
98
+ ) -> bool:
99
+ """Whether the wizard should skip the steps that assume a blank device.
100
+
101
+ Args:
102
+ config_path: The device's ``config.yaml``.
103
+ had_legacy_auth: Whether a pre-1.6 ``web.auth`` block was found. It
104
+ proves the device is not fresh, but its absence proves nothing —
105
+ most 1.5.x controllers never had web authentication at all, which
106
+ is exactly the case this used to get wrong.
107
+ template_dir: Passed through to :func:`looks_factory_fresh`.
108
+
109
+ Returns:
110
+ True when the device already has a configuration of its own.
111
+ """
112
+ if had_legacy_auth:
113
+ return True
114
+ return not looks_factory_fresh(config_path, template_dir)
@@ -12,6 +12,7 @@ e08f0e81a507e625398f87cad7b922c9af00cba2bda53280697178cbbf9eea86 helpers/boneio
12
12
  dff0cd02daad2cbd525a0535f8f3562bb742e7e737b24c69e5afa986415e67e4 helpers/boneio-helpers-heal
13
13
  643cfaea029d9b1a9ce6c7f12d1d6b63e8374cb4038a89b8fa48df9848f3af77 helpers/boneio-migrate-v2
14
14
  9f9675297a2de2c708bb7cf72d96ecd18e58f97a9dc3eec3e2069bf1659f3fa5 helpers/boneio-system
15
+ 485d37182fe6a1261b472cbc6b6e922d30e690333c27672497a7b13dc775499c issue.d/10-boneio.issue
15
16
  e6013f4fbf11693f39123b1e6159c7d7224a7c832e994722120980f64039c17e journald/journald.conf
16
17
  d28f2e9336b881b102c42f4278ec9ddf046c83dab4469dc5be7326768e074cb6 kernel/postinst-boneio-overlay
17
18
  9681710e1a38b8ea7ba5558839e4ef8b5f01a75722dbf403913bad76437449ec migrations-recovery.pem
@@ -0,0 +1 @@
1
+ boneIO eth0 \4{eth0} (blank? press Enter to redraw)
@@ -0,0 +1 @@
1
+ [{"action":"install_file","dst":"/etc/issue.d/10-boneio.issue","expected_sha256":"485d37182fe6a1261b472cbc6b6e922d30e690333c27672497a7b13dc775499c","group":"root","mode":420,"owner":"root","src":"issue.d/10-boneio.issue","template_vars":{}}]
@@ -0,0 +1,2 @@
1
+ Qd
2
+ ��M)��!���4z! =�Uj�G���=�eGʤ��\�y� ��5Ҭ�O�bK8�)��/
@@ -1 +1 @@
1
- {"plans":{"1.3.0":"28f5b17fc82667ddfda08d567195b10466e673b8a62f72a1b07bb52581095629","1.3.1":"580381a4f6f40fc1bd4e903e591ad0d5c1db27daaccafc6f79dabf8c3b84259a","1.3.2":"7a69ffaf0c41438be25a656dcdc87783daac0eae79218d023648ef9d708e373f","1.4.0":"c50ba85a587c756f69ec4b3ee3ae4b5729281208c68ed138f4bd996d5dddc82f","1.4.3":"a8cfbabff09d21944a822c4a70f23a7ee14960c4054de151c9fbc7cdb29adff5","1.4.4":"a2089ad8d97d2de58a520fe633f519c8872b3052b911f040ce4957a308c6ccaa","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.2":"6ef96b5e00a04a929d16f0e4a136bfcc5b8132a466d6907a99b2c8516a8952d5","1.6.3":"5c10db827bcb92b9322d4aa5751076b825da87c6d18d6953847ba72317cca862","1.6.4":"258b3fd6a5ba62067ee6743051b66686bb7640ccbad52de45d898034c3d65e67","1.6.5":"92417668ba1c0e9ddd2482fa9513b980dea8e92130a6b849c58ccda4956a8a1a","1.6.6":"535bb041b99d5ac1bc9028ea88bc2fbf3dbadc80ea8dea236cc219123c194114","1.6.7":"d59af413e270e6f34b1b9a1c8c4acef35328f00e26fad447cfe214545af78d8f","1.6.8":"7175f827b99c602df80436db588c87277ce50f2734051a444163b048f5d0b23e","1.6.9":"732d5a9bcd2e496a260263a643c78a6346e9f3cef5b48fe59ac6b120bd03ba4e"},"release":"1.6.0.dev3"}
1
+ {"plans":{"1.3.0":"28f5b17fc82667ddfda08d567195b10466e673b8a62f72a1b07bb52581095629","1.3.1":"580381a4f6f40fc1bd4e903e591ad0d5c1db27daaccafc6f79dabf8c3b84259a","1.3.2":"7a69ffaf0c41438be25a656dcdc87783daac0eae79218d023648ef9d708e373f","1.4.0":"c50ba85a587c756f69ec4b3ee3ae4b5729281208c68ed138f4bd996d5dddc82f","1.4.3":"a8cfbabff09d21944a822c4a70f23a7ee14960c4054de151c9fbc7cdb29adff5","1.4.4":"a2089ad8d97d2de58a520fe633f519c8872b3052b911f040ce4957a308c6ccaa","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":"fe4426b91a10a01fa2ebba9c818bf3ccb64103fbc6183f712507c38929645857","1.6.2":"6ef96b5e00a04a929d16f0e4a136bfcc5b8132a466d6907a99b2c8516a8952d5","1.6.3":"5c10db827bcb92b9322d4aa5751076b825da87c6d18d6953847ba72317cca862","1.6.4":"258b3fd6a5ba62067ee6743051b66686bb7640ccbad52de45d898034c3d65e67","1.6.5":"92417668ba1c0e9ddd2482fa9513b980dea8e92130a6b849c58ccda4956a8a1a","1.6.6":"535bb041b99d5ac1bc9028ea88bc2fbf3dbadc80ea8dea236cc219123c194114","1.6.7":"d59af413e270e6f34b1b9a1c8c4acef35328f00e26fad447cfe214545af78d8f","1.6.8":"7175f827b99c602df80436db588c87277ce50f2734051a444163b048f5d0b23e","1.6.9":"732d5a9bcd2e496a260263a643c78a6346e9f3cef5b48fe59ac6b120bd03ba4e"},"release":"1.6.0.dev4"}
Binary file
@@ -0,0 +1,58 @@
1
+ """Show the device's address on the serial console login prompt.
2
+
3
+ A controller in a cabinet is reached over the network, and the first thing
4
+ anybody attaching a serial cable wants to know is which address it ended up
5
+ with. Until now the console said only the hostname, so the answer meant logging
6
+ in and running ``ip addr`` — on a device that, after the 1.6 hardening, an
7
+ installer may not have an account on.
8
+
9
+ ``agetty`` expands the escape when it draws the prompt, not when it starts, so
10
+ the address is current rather than whatever DHCP had managed by the time the
11
+ getty came up. If the lease had not arrived yet the field is simply blank, and
12
+ pressing Enter redraws the prompt with the address filled in — which is what
13
+ the hint on the line is for.
14
+
15
+ The interface is named explicitly. A bare ``\\4`` means "the first fully
16
+ configured interface", and this device has ``docker0`` and a compose bridge
17
+ holding 172.17/172.18 addresses that are of no use to anybody standing at the
18
+ cabinet.
19
+
20
+ It goes in ``/etc/issue.d`` rather than into ``/etc/issue``, which belongs to
21
+ ``base-files`` and already carries text the board vendor put there.
22
+
23
+ The line carries the address and nothing else — deliberately. A URL would have
24
+ to name a port, and the panel's port is ``web.port`` from the operator's
25
+ ``config.yaml``, defaulting to 8090 but not fixed at it; there is also a TLS
26
+ front on 8443 that some deployments use instead. A signed plan is frozen at
27
+ release time and this file is static, so any port written here is a guess that
28
+ cannot be corrected on the device that proves it wrong. The address is the
29
+ thing somebody at the cabinet does not already know.
30
+
31
+ To retry on a device, delete ``/var/lib/boneio/migrations.d/1.6.12.applied``
32
+ and restart boneIO.
33
+ """
34
+
35
+ from __future__ import annotations
36
+
37
+ from boneio.migrations.actions import InstallFile, MigrationAction
38
+
39
+ VERSION = "1.6.12"
40
+ DESCRIPTION = "Show the IP address on the serial console"
41
+ REQUIRES_ROOT = True
42
+
43
+
44
+ def plan() -> list[MigrationAction]:
45
+ """Return the ordered list of migration actions.
46
+
47
+ Returns:
48
+ List of :class:`MigrationAction` to apply in order.
49
+ """
50
+ return [
51
+ InstallFile(
52
+ src="issue.d/10-boneio.issue",
53
+ dst="/etc/issue.d/10-boneio.issue",
54
+ mode=0o644,
55
+ owner="root",
56
+ group="root",
57
+ )
58
+ ]
boneio/version.py CHANGED
@@ -1,2 +1,2 @@
1
1
  # flake8: noqa
2
- __version__ = "1.6.0.dev3"
2
+ __version__ = "1.6.0.dev4"
boneio/webui/app.py CHANGED
@@ -24,6 +24,7 @@ from boneio.const import COVER, NONE
24
24
  from boneio.core.auth.migration import migrate_legacy_auth
25
25
  from boneio.core.auth.store import UserStore, UserStoreError
26
26
  from boneio.core.config import ConfigHelper
27
+ from boneio.core.config.provenance import was_configured_before
27
28
  from boneio.core.events import GracefulExit
28
29
  from boneio.core.manager import Manager
29
30
  from boneio.models import (
@@ -785,14 +786,22 @@ def init_app(
785
786
  "username": migration.username,
786
787
  "used_secret_file": migration.used_secret_file,
787
788
  }
788
- # A web.auth block means this device was configured under a pre-1.6
789
- # release, whether or not the credentials in it were usable. The
790
- # factory config ships web: with ports and no auth, so its presence is
791
- # what separates an upgraded controller from a fresh one — and the
792
- # first-run wizard must not offer to import a configuration, or to
793
- # generate input bindings, on a device that already has both.
789
+ # Whether the first-run wizard may offer the steps that assume a blank
790
+ # device — the import, and the one that replaces the whole event
791
+ # section.
792
+ #
793
+ # This used to be read off the web.auth block alone, which was wrong in
794
+ # the direction that costs the owner their configuration: most 1.5.x
795
+ # controllers never had web authentication, so an upgraded device with
796
+ # a full config.yaml looked exactly like a fresh one. Freshness is now
797
+ # something that has to be shown, not assumed — see
798
+ # boneio.core.config.provenance.
794
799
  onboarding_module.set_configured_before(
795
- bool(migration) or migration.reason == "incomplete_legacy_auth"
800
+ was_configured_before(
801
+ yaml_config_file,
802
+ had_legacy_auth=bool(migration)
803
+ or migration.reason == "incomplete_legacy_auth",
804
+ )
796
805
  )
797
806
  except UserStoreError as err:
798
807
  # Refusing to start would brick the UI over a file the user can fix,
@@ -1,13 +1,13 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boneio
3
- Version: 1.6.0.dev3
3
+ Version: 1.6.0.dev4
4
4
  Summary: Python App for BoneIO
5
5
  Author-email: Paweł Szafer <pszafer@gmail.com>
6
6
  License: GNU General Public License v3.0
7
7
  Project-URL: Homepage, https://boneio.eu
8
- Project-URL: Repository, https://github.com/boneIO-eu/app_bbb
8
+ Project-URL: Repository, https://github.com/boneIO-eu/app_black
9
9
  Project-URL: Documentation, https://boneio.eu/docs/intro/
10
- Project-URL: Changelog, https://github.com/boneIO-eu/app_bbb/releases
10
+ Project-URL: Changelog, https://github.com/boneIO-eu/app_black/releases
11
11
  Requires-Python: >=3.13
12
12
  Description-Content-Type: text/markdown
13
13
  License-File: LICENSE
@@ -3,7 +3,7 @@ boneio/bonecli.py,sha256=_MbWYilR4-Er0xNTi453pAiVmJJpzbNPHg1nCOcTk-Q,13324
3
3
  boneio/const.py,sha256=90YIo-mqg2UVtBz7Pk8LfkQmTCyCcr7bsbKTR_HdRNw,7299
4
4
  boneio/exceptions.py,sha256=cBph-TsLF7FSz6p4wYeMs3pjVmVRaNQRJP82JgYYV-c,810
5
5
  boneio/runner.py,sha256=hwROkZmck0KusYen0X0BPNA6D_GNZWQy1D5S7dRWpKA,21964
6
- boneio/version.py,sha256=pf2cb3MBFKFbbacWcXBXuzf3WM9a_HpNGL3qOr-1hRY,42
6
+ boneio/version.py,sha256=N9RYO59MLEBlX-N8VZrXvgpcDRygS6fIttx8jtpXFI8,42
7
7
  boneio/boards/0.2/input.yaml,sha256=K5EcB44BZ8PxbPnH1izYwJ-ePo8gs4qZttMXhnMnfQ8,1259
8
8
  boneio/boards/0.2/output_24_16.yaml,sha256=GQGM3gUK7UobdGL-Ejt9UKdCs1HLPgZ7kziVZ1tjQlA,1462
9
9
  boneio/boards/0.2/output_32_10.yaml,sha256=169ubuzRqFLGiOr7zgB1xL1tKdQyOx2FJZvTCkxCA4U,1920
@@ -103,6 +103,7 @@ boneio/core/config/config_helper.py,sha256=wVhIgOYucaxY-5_uxQPnoGlXQ9TfnH8jVQSXZ
103
103
  boneio/core/config/input_bindings.py,sha256=ItwftM6Ju0gjAFdROHLmZQtmwtFHkd7pa2vz9zquF6M,7853
104
104
  boneio/core/config/package-lock.json,sha256=AeqhAJcsqGoKGJHoF_Qduy0gatmXV6nNesZwZYYrnWM,85
105
105
  boneio/core/config/package.json,sha256=yj0WO6sFU4GCciYUBWjzvvfqrBh869doeOC2Pp5EI1Y,3
106
+ boneio/core/config/provenance.py,sha256=NNCxRi-mPhc8QWHhaYDgC6bW5fd4caUrK4grIDJ3cU8,4252
106
107
  boneio/core/config/schema_converter.py,sha256=BczSQV8bnr9lSm83J5pbRXLpeeM-u_lz3dwFnUrYN-A,14896
107
108
  boneio/core/config/secret_masking.py,sha256=SlyuJ3JPVsaE-2Ite3EwkEfACrc9cOFgZuflHc-1w_w,6608
108
109
  boneio/core/config/yaml_compat.py,sha256=IgYpBswrJJ-rr7Psr1yQNVXIm34K-AJv8cqUXGO3BN4,1651
@@ -269,7 +270,7 @@ boneio/integration/lox_template.py,sha256=Lich2C57w0CV-BDWlivtXsdd1irUltHD2ZfdD0
269
270
  boneio/migrations/__init__.py,sha256=ymImsxVT2PF3lfiqqANJSBugMT8IW9gSSUqWcDDaYrk,349
270
271
  boneio/migrations/actions.py,sha256=9MEpjgM5avnv-AP_YrCQWbcUEMwxBsgjeWCHtu_2E3w,16899
271
272
  boneio/migrations/runner.py,sha256=zrQitqwBeCLvd5GEWp301AK-lrvhbZ0_qcYu673Bls8,38640
272
- boneio/migrations/assets/MANIFEST.sha256,sha256=waY6Z_GSuiihBhTTNd6o_fefATcR_WmUVkKQUHKw_AY,3690
273
+ boneio/migrations/assets/MANIFEST.sha256,sha256=qLUleSCr1u47ziJ7wMrwtBk8jk2L5F14MT4sFBNI8D8,3780
273
274
  boneio/migrations/assets/migrations-recovery.pem,sha256=loFxDho4uOp7pVWIOeTvi18Bp1ci2_QDkTutdkN0Sew,113
274
275
  boneio/migrations/assets/migrations.pem,sha256=Fql8h17baOGWVblTtLqnc8waTleBBUPNpkaj4-g8DA4,113
275
276
  boneio/migrations/assets/docker/daemon.json,sha256=8u0FxvWTShXxJXETm9wiWAT2e4yDVhzDmGj3siltJpc,96
@@ -282,6 +283,7 @@ boneio/migrations/assets/helpers/boneio-containers,sha256=4I8OgaUH5iU5j4fK17kiya
282
283
  boneio/migrations/assets/helpers/boneio-helpers-heal,sha256=3_DNAtqtLL1SWgU1-PNWK7dC5-c3skxp5a-phkFeZ-Q,7089
283
284
  boneio/migrations/assets/helpers/boneio-migrate-v2,sha256=ZDz66gKdmxqc5sfxLR1rY-g3TLQDiom4-kjfmEjzr3c,54825
284
285
  boneio/migrations/assets/helpers/boneio-system,sha256=n5Z1KXot4scIu3z3LZbs0Y5Y-Xqdw-7D4gab8WWfP6U,24572
286
+ boneio/migrations/assets/issue.d/10-boneio.issue,sha256=SF03GC_moSYbRyy8a26SLTDmkDM8J2ckl6exPcd1SZw,55
285
287
  boneio/migrations/assets/journald/journald.conf,sha256=5gE_T78RaT85EjseYVnH1yJKfIMumUciEgmA9kA5wX4,1929
286
288
  boneio/migrations/assets/kernel/postinst-boneio-overlay,sha256=0o8ukza4gbECxC9CeOyd3wRsg9q0Rp3FvnMmdo4HTLY,2871
287
289
  boneio/migrations/assets/modules-load.d/onewire.conf,sha256=deOYWqviFwAh3Nxw6wf_RRbOn3GQ4y3frjsOnZY6rIg,16
@@ -368,6 +370,8 @@ boneio/migrations/plans/1.6.10.json,sha256=QcOhbngZhXpLgm6UT8-095xY5xkssVGxBqOs1
368
370
  boneio/migrations/plans/1.6.10.sig,sha256=4-qgEvgoWUbh5ZGEBAdlWupmeRubB0S2El8ZWvrttLM,64
369
371
  boneio/migrations/plans/1.6.11.json,sha256=0TYgPgjjsFIlRAOBXUzO21VbCil2hv6XlS0nXrHzIus,68
370
372
  boneio/migrations/plans/1.6.11.sig,sha256=9sXzurZBVYwt-JzyoI5vlSuCB_ld7AR4JxQS8Azm8zg,64
373
+ boneio/migrations/plans/1.6.12.json,sha256=_kQmuRoQoB-i67qcgYvzzLZBA_vGGD9xJQfDiSlkWFc,241
374
+ boneio/migrations/plans/1.6.12.sig,sha256=8Npe60FYbTUvmuVmQqfwd7VnHtYpLOx-qGrM1kLmDPs,64
371
375
  boneio/migrations/plans/1.6.2.json,sha256=bvlrXgCgSpKdFvDkoTa_zFuBMqRm1pB6mbLIUWqJUtU,63
372
376
  boneio/migrations/plans/1.6.2.sig,sha256=9KnV4GixPAxKeoZMOgJzhzze3OTpY4F-cxihFNpHT10,64
373
377
  boneio/migrations/plans/1.6.3.json,sha256=XBDbgnvLkrkyLUqldRB2uCXah8bRjWlThHunIxfMqGI,178
@@ -384,8 +388,8 @@ boneio/migrations/plans/1.6.8.json,sha256=cXX4J7mcYC34BDbbWIyHJ3zlDyc0BRpEQWOwSP
384
388
  boneio/migrations/plans/1.6.8.sig,sha256=fQOS_Ly_amrM_ucOCkZdjX9jn0Pe7JBnbWqTmVs9SHw,64
385
389
  boneio/migrations/plans/1.6.9.json,sha256=cy1am80uSWomAmOmQ8eKY0bp8871tI_lmsaxIL0Duk4,540
386
390
  boneio/migrations/plans/1.6.9.sig,sha256=s6Xj7sFKeHfBb9f9oBnYeEFDBAxFHvDzqR8LbmqOqHU,64
387
- boneio/migrations/plans/manifest.json,sha256=SEfaTULE8Q9deDiVu7GFJp1V6dLzq6t4e7VlkrCn_hQ,2820
388
- boneio/migrations/plans/manifest.sig,sha256=uv9wW_pYI0reUzeMJSdmrK2OYZ5ICQOxOKbbWkFAQ6s,64
391
+ boneio/migrations/plans/manifest.json,sha256=f751HgNcb9NOiRrdXwhw-BLhO7r5LWWNVkXWq1fE7rs,2896
392
+ boneio/migrations/plans/manifest.sig,sha256=k8cCPLVjf5JOofoqfME_8NyvU1fHObUNSF-z_aSPks8,64
389
393
  boneio/migrations/versions/__init__.py,sha256=JfouqluRirihGluvLOivkL7Sz7PF4lEyiCfMnOoMLwI,53
390
394
  boneio/migrations/versions/v1_3_0_baseline.py,sha256=wwb6MUiVsbLPwLMcvuPsdyxaEhyRmYhX8UUR2jPm56Q,6468
391
395
  boneio/migrations/versions/v1_3_1_fix_oled_boot.py,sha256=afKamxSo-zsYrKCHr8tXiPmQqaehioEwtg4JxRp7SEU,2505
@@ -415,6 +419,7 @@ boneio/migrations/versions/v1_5_9_defer_nonessential.py,sha256=frVwXMrVpW2RZ817m
415
419
  boneio/migrations/versions/v1_6_0_nodered_admin_auth.py,sha256=RWZwKNDCzQSPV_syEsuYVjwNG82BY3hpBvaV2dblYFU,2153
416
420
  boneio/migrations/versions/v1_6_10_narrow_sudo_rules.py,sha256=0xnfbu0Iu6Gzmkjrl4TyYhZliAEDHDSawcluWi5zIjM,1875
417
421
  boneio/migrations/versions/v1_6_11_drop_docker_group.py,sha256=GmCN1xu9elFV1sDEGaelO75JZaPCMekQbBMcY7RDgGc,1811
422
+ boneio/migrations/versions/v1_6_12_console_shows_ip.py,sha256=HdRoZC62b1FD_Q8n8VZeIO5f7TaZHsi72mz09QAHG2U,2351
418
423
  boneio/migrations/versions/v1_6_1_mosquitto_passwd_perms.py,sha256=-7dTKHPB7X5rwYbuzPTWe7Fg082uLczPIeWj1dESTLs,1635
419
424
  boneio/migrations/versions/v1_6_2_drop_build_sudo_rule.py,sha256=oOyBBsP1nv-siAVixRQcjPko86WZPW_Tv9rD6ywejU4,1733
420
425
  boneio/migrations/versions/v1_6_3_firewall_rule_gaps.py,sha256=3GdU_wevVUJv6fxVTRd87GoMr_sm84naWWDKWOJNVlQ,1435
@@ -494,7 +499,7 @@ boneio/schema/schema.yaml,sha256=v3kdA6itqw23Bnla1M6TstAjNVV-y6PfZk1H1vb7iGU,796
494
499
  boneio/schema/temp_unit.yaml,sha256=m32VGz9RTW92Lz08l9n6RftkcVNZquOGPPr5mc3eZVc,65
495
500
  boneio/schema/update_interval.yaml,sha256=RBuAFj1gGn89ydZkaUUP-f88utvth1Qtt5u6lau2iOc,186
496
501
  boneio/webui/action_validation.py,sha256=LRTYziwe-TVe5gc10c4iwe4wsM0RbPF9PRVhMKImRK4,10343
497
- boneio/webui/app.py,sha256=Fl7Ryi38Kz2cKbHvIBwEv5AYmzdhkgKCqBcPDUXb5As,45152
502
+ boneio/webui/app.py,sha256=sY-7FzJfJNEyaW2q_0n3By4s-gLp2-OWpVz0zC_icVo,45487
498
503
  boneio/webui/dashboard_cards.py,sha256=6vftTIoJN26UBSWgADromnGjmsnae-1wFkYXHpyWy-M,10547
499
504
  boneio/webui/hvac_svg_templates.py,sha256=T9hVFtZtYK8fN9FtstMKZBk5QTVwOCkWDE0zH8GZJXM,8656
500
505
  boneio/webui/modbus_card_templates.py,sha256=XMEpz4aumo5-vYctLGmp-TB2JUf8zdT_hLbsSFUWOMM,18568
@@ -677,9 +682,9 @@ boneio/webui/schema/virtual_energy_sensor.schema.json,sha256=BN6Egh-CAnXSa80bQ6Y
677
682
  boneio/webui/schema/web.schema.json,sha256=SIvYzjoluAyhjZQdoHMYl2Dfyx__V5CNyuIi0oHCkBI,4406
678
683
  boneio/webui/services/__init__.py,sha256=l_L3YUPhc0ZbrWqKH1RurC7UQ4q0k-5ABGTwOSS-YFQ,282
679
684
  boneio/webui/services/logs.py,sha256=rKx-7jbNXNuQpuqJHtIHBCXZ3ELguDJL82RySAUT38Y,11980
680
- boneio-1.6.0.dev3.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
681
- boneio-1.6.0.dev3.dist-info/METADATA,sha256=SXQ4vz-ZZd0yqfUmch9dpoLcBwuvw1QS-HzoK4fEcpg,1961
682
- boneio-1.6.0.dev3.dist-info/WHEEL,sha256=YVMoNqKzERt-wjUZwJ33xBGAwnFl-4cqbYkTtWa4itE,91
683
- boneio-1.6.0.dev3.dist-info/entry_points.txt,sha256=JX7gluDIkQ6MBlzzxGHMItnBjciiJ73tsXwYcazMW_U,47
684
- boneio-1.6.0.dev3.dist-info/top_level.txt,sha256=ag9S5n1_KXZfyk9tN8R0YUDYbdA--e5a2w2FOD_yMdg,7
685
- boneio-1.6.0.dev3.dist-info/RECORD,,
685
+ boneio-1.6.0.dev4.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
686
+ boneio-1.6.0.dev4.dist-info/METADATA,sha256=-Jd72qG5k7s725A9lb0w6JIznBSqLA_A7JD0sKLNqdw,1965
687
+ boneio-1.6.0.dev4.dist-info/WHEEL,sha256=YVMoNqKzERt-wjUZwJ33xBGAwnFl-4cqbYkTtWa4itE,91
688
+ boneio-1.6.0.dev4.dist-info/entry_points.txt,sha256=JX7gluDIkQ6MBlzzxGHMItnBjciiJ73tsXwYcazMW_U,47
689
+ boneio-1.6.0.dev4.dist-info/top_level.txt,sha256=ag9S5n1_KXZfyk9tN8R0YUDYbdA--e5a2w2FOD_yMdg,7
690
+ boneio-1.6.0.dev4.dist-info/RECORD,,