From: Calin Crisan Date: Thu, 26 Nov 2015 18:41:42 +0000 (+0200) Subject: removed upload services state caching X-Git-Url: http://www.vanbest.org/gitweb/?a=commitdiff_plain;h=cd93f3bc0a5ebbd62acfa0037b918092ac644042;p=motioneye-debian removed upload services state caching --- diff --git a/motioneye/config.py b/motioneye/config.py index 69a4ae1..d3e1b69 100644 --- a/motioneye/config.py +++ b/motioneye/config.py @@ -282,7 +282,7 @@ def get_camera(camera_id, as_lines=False): camera_config = _conf_to_dict(lines, no_convert=['@name', '@network_share_name', '@network_server', '@network_username', '@network_password', '@storage_device', - '@upload_server', '@upload_username', '@upload_password', '@upload_authorization_key']) + '@upload_server', '@upload_username', '@upload_password']) if utils.local_motion_camera(camera_config): # determine the enabled status @@ -646,7 +646,6 @@ def motion_camera_ui_to_dict(ui, old_config=None): '@upload_subfolders': ui['upload_subfolders'], '@upload_username': ui['upload_username'], '@upload_password': ui['upload_password'], - '@upload_authorization_key': ui['upload_authorization_key'], # text overlay 'text_left': '', @@ -788,7 +787,7 @@ def motion_camera_ui_to_dict(ui, old_config=None): upload_settings = {k[7:]: ui[k] for k in ui.iterkeys() if k.startswith('upload_')} service = uploadservices.get(old_config['@id'], ui['upload_service']) service.load(upload_settings) - uploadservices.save() + service.save() if ui['text_overlay']: left_text = ui['left_text'] @@ -963,7 +962,7 @@ def motion_camera_dict_to_ui(data): 'upload_subfolders': data['@upload_subfolders'], 'upload_username': data['@upload_username'], 'upload_password': data['@upload_password'], - 'upload_authorization_key': data['@upload_authorization_key'], + 'upload_authorization_key': '', # needed, otherwise the field is hidden # text overlay 'text_overlay': False, @@ -1660,7 +1659,6 @@ def _set_default_motion_camera(camera_id, data): data.setdefault('@upload_subfolders', True) data.setdefault('@upload_username', '') data.setdefault('@upload_password', '') - data.setdefault('@upload_authorization_key', '') data.setdefault('stream_localhost', False) data.setdefault('stream_port', int('808' + str(camera_id))) diff --git a/motioneye/handlers.py b/motioneye/handlers.py index bd59d8f..2ea300e 100644 --- a/motioneye/handlers.py +++ b/motioneye/handlers.py @@ -756,7 +756,7 @@ class ConfigHandler(BaseHandler): self.finish_json() else: - logging.warn('accessing %s failed' % service) + logging.warn('accessing %s failed: %s' % (service, result)) self.finish_json({'error': result}) elif utils.remote_camera(camera_config): diff --git a/motioneye/server.py b/motioneye/server.py index f379ba5..7fd80bb 100644 --- a/motioneye/server.py +++ b/motioneye/server.py @@ -331,7 +331,6 @@ def run(): import motioneye import smbctl import tasks - import uploadservices import wsswitch configure_signals() @@ -357,9 +356,6 @@ def run(): tasks.start() logging.info('tasks started') - uploadservices.load() - logging.info('upload services loaded') - if settings.MJPG_CLIENT_TIMEOUT: mjpgclient.start() logging.info('mjpg client garbage collector started') diff --git a/motioneye/uploadservices.py b/motioneye/uploadservices.py index f0cc0c4..12fd2dd 100644 --- a/motioneye/uploadservices.py +++ b/motioneye/uploadservices.py @@ -27,14 +27,12 @@ import settings _STATE_FILE_NAME = 'uploadservices.json' -_services = None - class UploadService(object): NAME = 'base' - def __init__(self, **kwargs): - pass + def __init__(self, camera_id, **kwargs): + self.camera_id = camera_id def __str__(self): return self.NAME @@ -99,6 +97,13 @@ class UploadService(object): def load(self, data): pass + + def save(self): + services = _load() + camera_services = services.get(self.camera_id, {}) + camera_services[self.NAME] = self + + _save(services) def log(self, level, *args, **kwargs): logging.log(level, *args, **kwargs) @@ -134,11 +139,13 @@ class GoogleDrive(UploadService): BOUNDARY = 'motioneye_multipart_boundary' MAX_FILE_SIZE = 128 * 1024 * 1024 # 128 MB - def __init__(self, location=None, authorization_key=None, credentials=None, **kwargs): + def __init__(self, camera_id, location=None, authorization_key=None, credentials=None, **kwargs): self._location = location self._authorization_key = authorization_key self._credentials = credentials self._folder_id = None + + UploadService.__init__(self, camera_id) def get_authorize_url(self): query = { @@ -210,7 +217,7 @@ class GoogleDrive(UploadService): if not self._folder_id: self.debug('finding folder id for location "%s"' % self._location) self._folder_id = self._get_folder_id_by_path(self._location) - save() + self.save() return self._folder_id @@ -259,16 +266,16 @@ class GoogleDrive(UploadService): return items[0]['id'] def _request(self, url, body=None, headers=None, retry_auth=True): - if not self._authorization_key: - msg = 'missing authorization key' - self.error(msg) - raise Exception(msg) - if not self._credentials: + if not self._authorization_key: + msg = 'missing authorization key' + self.error(msg) + raise Exception(msg) + self.debug('requesting credentials') try: self._credentials = self._request_credentials(self._authorization_key) - save() + self.save() except Exception as e: self.error('failed to obtain credentials: %s' % e) @@ -287,7 +294,7 @@ class GoogleDrive(UploadService): try: self.debug('credentials have probably expired, refreshing them') self._credentials = self._refresh_credentials(self._credentials['refresh_token']) - save() + self.save() # retry the request with refreshed credentials return self._request(url, body, headers, retry_auth=False) @@ -388,11 +395,13 @@ class Dropbox(UploadService): MAX_FILE_SIZE = 128 * 1024 * 1024 # 128 MB - def __init__(self, location=None, subfolders=True, authorization_key=None, credentials=None, **kwargs): + def __init__(self, camera_id, location=None, subfolders=True, authorization_key=None, credentials=None, **kwargs): self._location = location self._subfolders = subfolders self._authorization_key = authorization_key self._credentials = credentials + + UploadService.__init__(self, camera_id) def get_authorize_url(self): query = { @@ -470,16 +479,16 @@ class Dropbox(UploadService): return location def _request(self, url, body=None, headers=None, retry_auth=True): - if not self._authorization_key: - msg = 'missing authorization key' - self.error(msg) - raise Exception(msg) - if not self._credentials: + if not self._authorization_key: + msg = 'missing authorization key' + self.error(msg) + raise Exception(msg) + self.debug('requesting credentials') try: self._credentials = self._request_credentials(self._authorization_key) - save() + self.save() except Exception as e: self.error('failed to obtain credentials: %s' % e) @@ -498,7 +507,7 @@ class Dropbox(UploadService): try: self.debug('credentials have probably expired, refreshing them') self._credentials = self._refresh_credentials(self._credentials['refresh_token']) - save() + self.save() # retry the request with refreshed credentials self._request(url, body, headers, retry_auth=False) @@ -551,27 +560,23 @@ class Dropbox(UploadService): } -def get(camera_id, name, create=True): - if _services is None: - load() +def get(camera_id, service_name, create=True): + services = _load() camera_id = str(camera_id) - service = _services.get(camera_id, {}).get(name) + service = services.get(camera_id, {}).get(service_name) if not service and create: classes = UploadService.get_service_classes() - cls = classes.get(name) + cls = classes.get(service_name) if cls: - logging.debug('creating upload service %s for camera with id %s' % (name, camera_id)) - service = cls() - _services.setdefault(camera_id, {})[name] = service + logging.debug('creating upload service %s for camera with id %s' % (service_name, camera_id)) + service = cls(camera_id=camera_id) return service -def load(): - global _services - - _services = {} +def _load(): + services = {} file_path = os.path.join(settings.CONF_PATH, _STATE_FILE_NAME) @@ -597,21 +602,20 @@ def load(): for camera_id, d in data.iteritems(): for name, state in d.iteritems(): - camera_services = _services.setdefault(camera_id, {}) + camera_services = services.setdefault(camera_id, {}) cls = UploadService.get_service_classes().get(name) if cls: - service = cls() + service = cls(camera_id=camera_id) service.load(state) camera_services[name] = service logging.debug('loaded upload service "%s" for camera with id "%s"' % (name, camera_id)) + + return services -def save(): - if _services is None: - return - +def _save(services): file_path = os.path.join(settings.CONF_PATH, _STATE_FILE_NAME) logging.debug('saving upload services state to "%s"...' % file_path) @@ -625,7 +629,7 @@ def save(): return data = {} - for camera_id, camera_services in _services.iteritems(): + for camera_id, camera_services in services.iteritems(): for name, service in camera_services.iteritems(): data.setdefault(camera_id, {})[name] = service.dump() @@ -640,10 +644,6 @@ def save(): def upload_media_file(camera_id, target_dir, service_name, filename): - # force a load from file with every upload, - # as settings might have changed - load() - service = get(camera_id, service_name, create=False) if not service: return logging.error('service "%s" not initialized for camera with id %s' % (service_name, camera_id))