async def test_only_send_duplicates(time, debug_worker: DebugWorker,
                                    config: Config, global_info: GlobalInfo,
                                    server, error_store: ErrorStore):
    config.override(Setting.SEND_ERROR_REPORTS, True)
    config.override(Setting.DRIVE_HOST_NAME, "localhost")
    global_info.failed(Exception("boom1"))
    firstExceptionTime = time.now()
    await debug_worker.doWork()
    report = error_store.last_error
    assert report['report']["error"] == getLogger("test").formatException(
        Exception("boom1"))
    assert report['report']["time"] == firstExceptionTime.isoformat()

    # Same exception shouldn't cause us to send the error report again
    time.advance(days=1)
    global_info.failed(Exception("boom1"))
    await debug_worker.doWork()
    report = error_store.last_error
    assert report['report']["error"] == getLogger("test").formatException(
        Exception("boom1"))
    assert report['report']["time"] == firstExceptionTime.isoformat()

    # Btu a new one will send a new report
    global_info.failed(Exception("boom2"))
    await debug_worker.doWork()
    report = error_store.last_error
    assert report['report']["error"] == getLogger("test").formatException(
        Exception("boom2"))
    assert report['report']["time"] == time.now().isoformat()
async def test_send_error_report(time, debug_worker: DebugWorker,
                                 config: Config, global_info: GlobalInfo,
                                 server, error_store: ErrorStore):
    config.override(Setting.SEND_ERROR_REPORTS, True)
    config.override(Setting.DRIVE_HOST_NAME, "localhost")
    global_info.sync()
    global_info.success()
    global_info.sync()
    global_info.success()
    global_info.sync()
    global_info.failed(Exception())
    await debug_worker.doWork()
    report = error_store.last_error
    assert report['report']['sync_success_count'] == 2
    assert report['report']['sync_count'] == 3
    assert report['report']['failure_count'] == 1
    assert report['report']['sync_last_start'] == time.now().isoformat()
    assert report['report']['failure_time'] == time.now().isoformat()
    assert report['report']['error'] == getLogger("test").formatException(
        Exception())
Exemple #3
0
from injector import Module, provider, singleton, multiprovider
from typing import List

from backup.config import Config, Startable, Setting
from backup.drive import DriveSource
from backup.ha import HaSource, HaUpdater, AddonStopper
from backup.model import BackupDestination, BackupSource, Scyncer
from backup.util import Resolver
from backup.model import Coordinator
from backup.worker import Trigger, Watcher
from backup.ui import UiServer, Restarter
from backup.logger import getLogger
from backup.debug import DebugServer
from .debugworker import DebugWorker
from .tracing_session import TracingSession
logger = getLogger(__name__)


class BaseModule(Module):
    '''
    A module shared between tests and main
    '''
    def __init__(self, override_dns=True):
        self._override_dns = override_dns

    @multiprovider
    @singleton
    def getTriggers(self, coord: Coordinator, ha: HaSource, drive: DriveSource,
                    watcher: Watcher, server: UiServer) -> List[Trigger]:
        return [coord, ha, drive, watcher, server]
import json
import os

from backup.config import Config, Setting
from backup.worker import Worker
from backup.exceptions import SupervisorFileSystemError
from .harequests import HaRequests
from injector import inject, singleton
from backup.time import Time
from backup.logger import getLogger
from datetime import timedelta
from asyncio import Lock

LOGGER = getLogger(__name__)
CHECK_DURATION = timedelta(seconds=60)
ATTR_STATE = "state"
ATTR_WATCHDOG = "watchdog"
ATTR_NAME = "name"
STATE_STOPPED = "stopped"
STATE_STARTED = "started"


@singleton
class AddonStopper(Worker):
    @inject
    def __init__(self, config: Config, requests: HaRequests, time: Time):
        super().__init__("StartandStopTimer", self.check, time, 10)
        self.requests = requests
        self.config = config
        self.time = time
        self.must_start = set()
import os
import json
from backup.logger import getLogger, StandardLogger
from injector import inject, singleton
from google.cloud import logging
from google.auth.exceptions import DefaultCredentialsError

basic_logger = getLogger(__name__)


@singleton
class CloudLogger(StandardLogger):
    @inject
    def __init__(self):
        super().__init__(__name__)
        self.google_logger = None
        if os.environ.get('GOOGLE_APPLICATION_CREDENTIALS') is not None:
            try:
                google_logger_client = logging.Client()
                self.googler_logger = google_logger_client.logger("refresh_server")
            except DefaultCredentialsError:
                basic_logger.error("Unable to start Google Logger, no default credentials")

    def log_struct(self, data):
        if self.google_logger is not None:
            self.google_logger.log_struct(data)
        else:
            basic_logger.info(json.dumps(data))