mirror of
https://github.com/smittix/intercept.git
synced 2026-06-13 00:03:33 -07:00
Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 2bbf896e7c |
@@ -2,6 +2,13 @@
|
|||||||
|
|
||||||
All notable changes to iNTERCEPT will be documented in this file.
|
All notable changes to iNTERCEPT will be documented in this file.
|
||||||
|
|
||||||
|
## [2.26.5] - 2026-03-14
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
- **Database errors crash entire UI** — `get_setting()` now catches `sqlite3.OperationalError` and returns the default value instead of propagating the exception. Previously, if the database was inaccessible (e.g. root-owned `instance/` directory from running with `sudo`), the `inject_offline_settings` context processor would crash every page render with a 500 Internal Server Error. (#190)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## [2.26.4] - 2026-03-14
|
## [2.26.4] - 2026-03-14
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
|
|||||||
@@ -7,10 +7,17 @@ import os
|
|||||||
import sys
|
import sys
|
||||||
|
|
||||||
# Application version
|
# Application version
|
||||||
VERSION = "2.26.4"
|
VERSION = "2.26.5"
|
||||||
|
|
||||||
# Changelog - latest release notes (shown on welcome screen)
|
# Changelog - latest release notes (shown on welcome screen)
|
||||||
CHANGELOG = [
|
CHANGELOG = [
|
||||||
|
{
|
||||||
|
"version": "2.26.5",
|
||||||
|
"date": "March 2026",
|
||||||
|
"highlights": [
|
||||||
|
"Fix database errors crashing the entire UI — pages now degrade gracefully",
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"version": "2.26.4",
|
"version": "2.26.4",
|
||||||
"date": "March 2026",
|
"date": "March 2026",
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
[project]
|
[project]
|
||||||
name = "intercept"
|
name = "intercept"
|
||||||
version = "2.26.4"
|
version = "2.26.5"
|
||||||
description = "Signal Intelligence Platform - Pager/433MHz/ADS-B/Satellite/WiFi/Bluetooth"
|
description = "Signal Intelligence Platform - Pager/433MHz/ADS-B/Satellite/WiFi/Bluetooth"
|
||||||
readme = "README.md"
|
readme = "README.md"
|
||||||
requires-python = ">=3.9"
|
requires-python = ">=3.9"
|
||||||
|
|||||||
+28
-24
@@ -661,32 +661,36 @@ def get_setting(key: str, default: Any = None) -> Any:
|
|||||||
Returns:
|
Returns:
|
||||||
Setting value (auto-converted from JSON for complex types)
|
Setting value (auto-converted from JSON for complex types)
|
||||||
"""
|
"""
|
||||||
with get_db() as conn:
|
try:
|
||||||
cursor = conn.execute(
|
with get_db() as conn:
|
||||||
'SELECT value, value_type FROM settings WHERE key = ?',
|
cursor = conn.execute(
|
||||||
(key,)
|
'SELECT value, value_type FROM settings WHERE key = ?',
|
||||||
)
|
(key,)
|
||||||
row = cursor.fetchone()
|
)
|
||||||
|
row = cursor.fetchone()
|
||||||
|
|
||||||
if row is None:
|
if row is None:
|
||||||
return default
|
|
||||||
|
|
||||||
value, value_type = row['value'], row['value_type']
|
|
||||||
|
|
||||||
# Convert based on type
|
|
||||||
if value_type == 'json':
|
|
||||||
try:
|
|
||||||
return json.loads(value)
|
|
||||||
except json.JSONDecodeError:
|
|
||||||
return default
|
return default
|
||||||
elif value_type == 'int':
|
|
||||||
return int(value)
|
value, value_type = row['value'], row['value_type']
|
||||||
elif value_type == 'float':
|
|
||||||
return float(value)
|
# Convert based on type
|
||||||
elif value_type == 'bool':
|
if value_type == 'json':
|
||||||
return value.lower() in ('true', '1', 'yes')
|
try:
|
||||||
else:
|
return json.loads(value)
|
||||||
return value
|
except json.JSONDecodeError:
|
||||||
|
return default
|
||||||
|
elif value_type == 'int':
|
||||||
|
return int(value)
|
||||||
|
elif value_type == 'float':
|
||||||
|
return float(value)
|
||||||
|
elif value_type == 'bool':
|
||||||
|
return value.lower() in ('true', '1', 'yes')
|
||||||
|
else:
|
||||||
|
return value
|
||||||
|
except sqlite3.OperationalError:
|
||||||
|
logger.warning("Database unavailable reading setting '%s', using default", key)
|
||||||
|
return default
|
||||||
|
|
||||||
|
|
||||||
def set_setting(key: str, value: Any) -> None:
|
def set_setting(key: str, value: Any) -> None:
|
||||||
|
|||||||
Reference in New Issue
Block a user