(self)
| 193 | } |
| 194 | |
| 195 | |
| 196 | logger = Logger(name="shared.py", level=logging.DEBUG) # Create a logger object |
| 197 | |
| 198 | class SharedData: |
| 199 | """Shared data between the different modules.""" |
| 200 | def __init__(self): |
| 201 | # Detect Pager mode (set by pager_payload.sh before Python launch) |
| 202 | self._pager_mode = os.environ.get('RAGNAR_PAGER_MODE') == '1' |
| 203 | |
| 204 | self.initialize_paths() # Initialize the paths used by the application |
| 205 | |
| 206 | # --- Network storage & context (not available on Pager) --- |
| 207 | if not self._pager_mode and NetworkStorageManager is not None: |
| 208 | self.storage_manager = NetworkStorageManager(self.datadir) |
| 209 | else: |
| 210 | self.storage_manager = None |
| 211 | self.active_network_ssid = None |
| 212 | self.active_network_slug = None |
| 213 | self.current_network_dir = None |
| 214 | self.current_network_db_path = None |
| 215 | self.network_intelligence_dir = None |
| 216 | self.network_threat_dir = None |
| 217 | if self.storage_manager is not None: |
| 218 | self._apply_network_context( |
| 219 | self.storage_manager.get_active_context(), |
| 220 | configure_db=False |
| 221 | ) |
| 222 | if not self._pager_mode and NetworkContextRegistry is not None: |
| 223 | self.context_registry = NetworkContextRegistry(self) |
| 224 | else: |
| 225 | self.context_registry = None |
| 226 | |
| 227 | self.status_list = [] |
| 228 | self.last_comment_time = time.time() # Last time a comment was displayed |
| 229 | self._stats_lock = threading.Lock() # Thread-safe lock for update_stats() |
| 230 | self._config_lock = threading.RLock() # Serializes save_config() vs mutations |
| 231 | self.default_config = self.get_default_config() # Default configuration of the application |
| 232 | self.config = self.default_config.copy() # Configuration of the application |
| 233 | # Load existing configuration first |
| 234 | self.load_config() |
| 235 | |
| 236 | if not self._pager_mode and MultiInterfaceState is not None: |
| 237 | self.multi_interface_state = MultiInterfaceState(self) |
| 238 | else: |
| 239 | self.multi_interface_state = None |
| 240 | |
| 241 | # Ensure the selected EPD profile is consistent and expose flip settings early |
| 242 | self.config.setdefault('epd_type', DEFAULT_EPD_TYPE) |
| 243 | self.apply_display_profile(self.config['epd_type'], set_orientation_if_missing=True, persist=not self._pager_mode) |
| 244 | self.screen_reversed = normalize_rotation(self.config.get('screen_reversed', 0)) |
| 245 | self.web_screen_reversed = normalize_rotation(self.config.get('web_screen_reversed', 0)) |
| 246 | |
| 247 | # Check if auth is configured and DB might be encrypted |
| 248 | if not self._pager_mode: |
| 249 | self.auth_configured = self._check_auth_configured() |
| 250 | else: |
| 251 | self.auth_configured = False |
| 252 |
nothing calls this directly
no test coverage detected