Compare commits

..

No commits in common. "9a277b9031397d109edeb1867a3051303361aaa4" and "1aa01ed4e8167f3d1e825a75c126846a3b7690a3" have entirely different histories.

3 changed files with 5 additions and 34 deletions

20
app.py
View file

@ -22,7 +22,7 @@ urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
# Docker tab caches stale container IDs, so the footer is the reliable way # Docker tab caches stale container IDs, so the footer is the reliable way
# to confirm a `docker compose up -d --build` actually took effect. # to confirm a `docker compose up -d --build` actually took effect.
# Both are env-overridable if the deploy pipeline ever injects them. # Both are env-overridable if the deploy pipeline ever injects them.
APP_VERSION = os.environ.get("APP_VERSION", "1.6.3") APP_VERSION = os.environ.get("APP_VERSION", "1.6.2")
APP_VERSION_DATE = os.environ.get("APP_VERSION_DATE", "2026-08-27") APP_VERSION_DATE = os.environ.get("APP_VERSION_DATE", "2026-08-27")
# Must point at a path that survives `docker compose up --build` — the # Must point at a path that survives `docker compose up --build` — the
@ -888,17 +888,15 @@ def get_unraid_stats():
# HTTPS on 443 with SSL verification disabled (Unraid uses a self-signed cert) # HTTPS on 443 with SSL verification disabled (Unraid uses a self-signed cert)
url = f"https://{UNRAID_HOST}:443/graphql" url = f"https://{UNRAID_HOST}:443/graphql"
headers = {"x-api-key": UNRAID_API_KEY, "Content-Type": "application/json"} headers = {"x-api-key": UNRAID_API_KEY, "Content-Type": "application/json"}
# Parity is fetched for its temperature only — it mirrors the array # Parity is deliberately not requested: it mirrors the array rather
# rather than holding a filesystem, so the schema notes fsSize/fsFree # than holding a filesystem, so it has no size or usage to report and
# are "Not present on Parity type drive". It gets no table row; the # only ever rendered as a name and a temperature.
# card header carries the temp so a hot parity is still visible.
query = """{ query = """{
vars { version } vars { version }
array { array {
state state
disks { name device fsSize fsFree type temp isSpinning } disks { name device fsSize fsFree type temp isSpinning }
caches { name device fsSize fsFree type temp isSpinning } caches { name device fsSize fsFree type temp isSpinning }
parities { name device temp isSpinning }
} }
}""" }"""
try: try:
@ -942,16 +940,6 @@ def get_unraid_stats():
"array_used_pct": used_pct, "array_used_pct": used_pct,
"disks": [disk_row(dk) for dk in data_disks], "disks": [disk_row(dk) for dk in data_disks],
"caches": [disk_row(dk) for dk in arr.get("caches", [])], "caches": [disk_row(dk) for dk in arr.get("caches", [])],
# Temperature only — no size fields exist on parity.
"parities": [
{
"name": dk.get("name") or dk.get("device") or "parity",
"device": dk.get("device", ""),
"temp": dk.get("temp"),
"spinning": dk.get("isSpinning"),
}
for dk in arr.get("parities", [])
],
} }
except Exception: except Exception:
pass pass

View file

@ -135,11 +135,7 @@ header {
border: 1px solid var(--border); border: 1px solid var(--border);
border-radius: var(--radius-sm); border-radius: var(--radius-sm);
color: var(--text-2); color: var(--text-2);
/* The button was always a full --tap target, but the cog glyph inside it font-size: var(--fs-sm);
was set at --fs-sm (13px) and read as a speck in a 44px box. The glyph
is the affordance, so size it to the button. */
font-size: var(--fs-xl);
line-height: 1;
font-family: inherit; font-family: inherit;
text-decoration: none; text-decoration: none;
white-space: nowrap; white-space: nowrap;
@ -636,14 +632,6 @@ dd.is-accent { color: var(--accent); }
} }
/* Still used by the disk_state() macro when a disk reports no temperature. */ /* Still used by the disk_state() macro when a disk reports no temperature. */
.disk-null { color: var(--text-3); } .disk-null { color: var(--text-3); }
/* Parity temp in the Storage header — keep the label and its badge together
so they never wrap apart from each other. */
.meta-parity {
display: inline-flex;
align-items: center;
gap: 0.35rem;
white-space: nowrap;
}
@media (max-width: 720px) { @media (max-width: 720px) {
/* Below this the six columns stop fitting; the table scrolls in its own /* Below this the six columns stop fitting; the table scrolls in its own
container rather than squeezing the sizes into unreadable wraps. */ container rather than squeezing the sizes into unreadable wraps. */

View file

@ -181,11 +181,6 @@
{{ unraid.array_used_pct }}% used · {{ unraid.array_free }} free of {{ unraid.array_total }} {{ unraid.array_used_pct }}% used · {{ unraid.array_free }} free of {{ unraid.array_total }}
{%- if unraid.disk_count %} · {{ unraid.disk_count }} disk{{ 's' if unraid.disk_count != 1 }}{% endif %} {%- if unraid.disk_count %} · {{ unraid.disk_count }} disk{{ 's' if unraid.disk_count != 1 }}{% endif %}
{%- if unraid.array_state %} · {{ unraid.array_state | capitalize }}{% endif %} {%- if unraid.array_state %} · {{ unraid.array_state | capitalize }}{% endif %}
{#- Parity has no table row of its own (no filesystem to measure),
so its temperature rides here — the one thing worth watching. -#}
{%- if unraid.parities %} · <span class="meta-parity">Parity
{%- for dk in unraid.parities %} {{ disk_state(dk) }}{% endfor %}</span>
{%- endif %}
</span> </span>
{% endif %} {% endif %}
</div> </div>