]> www.vanbest.org Git - motioneye-debian/commitdiff
removed upload services state caching
authorCalin Crisan <ccrisan@gmail.com>
Thu, 26 Nov 2015 18:41:42 +0000 (20:41 +0200)
committerCalin Crisan <ccrisan@gmail.com>
Thu, 26 Nov 2015 18:41:42 +0000 (20:41 +0200)
motioneye/config.py
motioneye/handlers.py
motioneye/server.py
motioneye/uploadservices.py

index 69a4ae146d0373095caa45487e3ebe4a0bb387c7..d3e1b6926a772ed4806a79742527731f34823663 100644 (file)
@@ -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)))
index bd59d8faee06debf0b183d05e86828e7c0dff590..2ea300e94409af172699e4c0bdb69222039e937e 100644 (file)
@@ -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):
index f379ba54b7ee124e38f6ae56ff978a69c0189708..7fd80bb22d40f06bf5cfa6c810e46c39064de3de 100644 (file)
@@ -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')
index f0cc0c4a0378d3064b3672290bc741681ea4b8d5..12fd2dd304aa5466c1ae6faa93b31f4ac32fda27 100644 (file)
@@ -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))