def main(): logger.info(f'\n#\n# Booting Kanmail {get_version()}\n#') init_window_hacks() boot() server_thread = Thread(name='Server', target=run_server) server_thread.daemon = True server_thread.start() run_thread(validate_or_remove_license) run_thread(run_cache_cleanup_later) # Ensure the webserver is up & running by polling it waits = 0 while waits < 10: try: response = requests.get( f'http://{SERVER_HOST}:{server.get_port()}/ping') response.raise_for_status() except requests.RequestException as e: logger.warning(f'Waiting for main window: {e}') sleep(0.1 * waits) waits += 1 else: break else: logger.critical('Webserver did not start properly!') sys.exit(2) create_window( unique_key='main', **get_window_settings(), ) # Let's hope this thread doesn't fail! monitor_thread = Thread( name='Thread monitor', target=monitor_threads, args=(server_thread, ), ) monitor_thread.daemon = True monitor_thread.start() if DEBUG: sleep(1) # give webpack a second to start listening # Start the GUI - this will block until the main window is destroyed webview.start(gui=GUI_LIB, debug=DEBUG) # Main window closed, cleanup/exit sys.exit()
def remove_stale_folders(): settings = get_settings() accounts = settings['accounts'] account_names = set() for account in accounts: account_names.add(_make_account_key(account)) deleted = 0 all_folders = FolderCacheItem.query.all() for folder in all_folders: if folder.account_name not in account_names: logger.info(f'Deleting stale cache folder: {folder}') delete_cache_items(folder) deleted += 1 logger.info(f'Deleted {deleted}/{len(all_folders)} cache folders')
def remove_stale_headers(): folder_id_to_uids = {} for folder in FolderCacheItem.query.all(): if folder.uids: folder_id_to_uids[folder.id] = pickle_loads(folder.uids) all_headers = FolderHeaderCacheItem.query.all() headers_to_delete = [] for header in all_headers: if header.uid not in folder_id_to_uids.get(header.folder_id, set()): logger.info(f'Deleting stale cache header: {header}') headers_to_delete.append(header) if headers_to_delete: delete_cache_items(*headers_to_delete) logger.info(f'Deleted {len(headers_to_delete)}/{len(all_headers)} cache headers')
def check_device_update(): version_data = get_version_data() client = get_pyupdater_client() logger.info((f'Checking for updates (channel={version_data["channel"]}, ' f'currentVersion={version_data["version"]})...')) client.refresh() update = client.update_check( APP_NAME, version_data['version'], channel=version_data['channel'], ) if not update: logger.info('No update found') return logger.info(f'Update found: {update.version}') return update
def vacuum_folder_cache(): with db.get_engine(bind='folders').begin() as conn: conn.execute('VACUUM') logger.info('Folder cache DB vacuumed')