From: Calin Crisan Date: Sun, 27 Oct 2013 08:22:41 +0000 (+0200) Subject: added an update handler X-Git-Url: http://www.vanbest.org/gitweb/?a=commitdiff_plain;h=fc22a26c286844fe577b9c8f901da19f2a222363;p=motioneye-debian added an update handler --- diff --git a/src/handlers.py b/src/handlers.py index 89bb9bd..81829aa 100644 --- a/src/handlers.py +++ b/src/handlers.py @@ -10,6 +10,7 @@ import mjpgclient import motionctl import remote import template +import update import v4l2ctl @@ -582,3 +583,25 @@ class MovieHandler(BaseHandler): # TODO implement me self.finish_json() + + +class UpdateHandler(BaseHandler): + @BaseHandler.auth(admin=True) + def get(self): + logging.debug('listing versions') + + stable = self.get_argument('stable', default='false') == 'true' + + versions = update.get_all_versions(stable=stable) + + self.finish_json(versions) + + @BaseHandler.auth(admin=True) + def post(self): + version = self.get_argument('version') + + logging.debug('performing update to version %(version)s' % {'version': version}) + + result = update.perform_update(version) + + return self.finish_json(result) diff --git a/src/server.py b/src/server.py index c47aa2b..8818a8a 100644 --- a/src/server.py +++ b/src/server.py @@ -32,6 +32,7 @@ application = Application( (r'^/snapshot/(?P\d+)/(?Pdownload)/(?P.+)/?$', handlers.SnapshotHandler), (r'^/movie/(?P\d+)/(?Plist)/?$', handlers.MovieHandler), (r'^/movie/(?P\d+)/(?Pdownload)/(?P.+)/?$', handlers.MovieHandler), + (r'^/update/?$', handlers.UpdateHandler), ], debug=False, # also disables autoreloading log_function=log_request, diff --git a/src/update.py b/src/update.py index 524149b..961a000 100644 --- a/src/update.py +++ b/src/update.py @@ -40,6 +40,9 @@ def get_all_versions(stable=False): if stable: versions = [v for v in versions if v.count('.') == 1] + versions.sort() + + return ['master'] # TODO return versions except Exception as e: @@ -85,6 +88,8 @@ def download(version): 'version': version} try: + logging.debug('downloading %(url)s...' % {'url': url}) + response = urllib2.urlopen(url, timeout=settings.REMOTE_REQUEST_TIMEOUT) data = response.read() @@ -96,6 +101,8 @@ def download(version): path = tempfile.mkdtemp() path = os.path.join(path, version + '.tar.gz') + logging.debug('writing archive to %(path)s...' % {'path': path}) + try: with open(path, 'w') as f: f.write(data) @@ -110,7 +117,7 @@ def download(version): def cleanup(path): try: - os.remove(path) + shutil.rmtree(path) except Exception as e: logging.error('could cleanup update directory: %(msg)s' % {'msg': unicode(e)}) @@ -126,32 +133,43 @@ def is_updatable(): def perform_update(version): + logging.info('updating to version %(version)s...' % {'version': version}) + try: # download the archive archive = download(version) temp_path = os.path.dirname(archive) # extract the archive - if os.system('tar zxf %(archive)s -C %(path)s' % { - 'archive': archive, 'path': temp_path}): + logging.debug('extracting archive %(archive)s...' % {'archive': archive}) + os.system('tar zxf %(archive)s -C %(path)s' % { + 'archive': archive, 'path': temp_path}) - raise Exception('archive extraction failed') - # determine the root path of the extracted archive - root_path = [f for f in os.listdir(temp_path) if os.path.isdir(f)][0] + root_name = [f for f in os.listdir(temp_path) if os.path.isdir(os.path.join(temp_path, f))][0] + root_path = os.path.join(temp_path, root_name) for p in _UPDATE_PATHS: src = os.path.join(root_path, p) dst = os.path.join(settings.PROJECT_PATH, p) + logging.debug('copying %(src)s over %(dst)s...' % {'src': src, 'dst': dst}) + if os.path.isdir(dst): - os.remove(dst) + shutil.rmtree(dst) - shutil.copytree(src, dst) + if os.path.isdir(src): + shutil.copytree(src, dst) + + else: + shutil.copy(src, dst) # remove the temporary update directory + logging.debug('removing %(path)s...' % {'path': temp_path}) cleanup(temp_path) + logging.info('updating done') + return True except Exception as e: