Ejemplo n.º 1
0
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()
Ejemplo n.º 2
0
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')
Ejemplo n.º 3
0
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')
Ejemplo n.º 4
0
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
Ejemplo n.º 5
0
def vacuum_folder_cache():
    with db.get_engine(bind='folders').begin() as conn:
        conn.execute('VACUUM')

    logger.info('Folder cache DB vacuumed')