From 1eccf1afbe5a9cd22c7d8cae92f27d8ed2a52110 Mon Sep 17 00:00:00 2001 From: Calin Crisan Date: Sun, 5 Mar 2017 20:49:00 +0200 Subject: [PATCH] generalize update mechanism for platforms that support it --- motioneye/handlers.py | 21 ++++++++---- motioneye/templates/main.html | 4 +++ motioneye/templates/version.html | 4 ++- motioneye/update.py | 59 +++++++++++++++++++++++++++----- 4 files changed, 72 insertions(+), 16 deletions(-) diff --git a/motioneye/handlers.py b/motioneye/handlers.py index 1d30196..78e7758 100644 --- a/motioneye/handlers.py +++ b/motioneye/handlers.py @@ -203,12 +203,14 @@ class MainHandler(BaseHandler): main_sections = config.get_additional_structure(camera=False, separators=True)[0] camera_sections = config.get_additional_structure(camera=True, separators=True)[0] - motion_info = motionctl.find_motion(); + motion_info = motionctl.find_motion() + os_version = update.get_os_version() self.render('main.html', frame=False, version=motioneye.VERSION, motion_version=motion_info[1] if motion_info else '(none)', + os_version=' '.join(os_version), enable_update=settings.ENABLE_UPDATE, enable_reboot=settings.ENABLE_REBOOT, add_remove_cameras=settings.ADD_REMOVE_CAMERAS, @@ -1764,10 +1766,10 @@ class UpdateHandler(BaseHandler): logging.debug('listing versions') versions = update.get_all_versions() - current_version = update.get_version() - update_version = None - if versions and update.compare_versions(versions[-1], current_version) > 0: - update_version = versions[-1] + current_version = update.get_os_version()[1] # os version is returned as (name, version) tuple + recent_versions = [v for v in versions if update.compare_versions(v, current_version) > 0] + recent_versions.sort(cmp=update.compare_versions) + update_version = recent_versions[-1] if recent_versions else None self.finish_json({ 'update_version': update_version, @@ -1805,8 +1807,15 @@ class PowerHandler(BaseHandler): class VersionHandler(BaseHandler): def get(self): + import motioneye + + motion_info = motionctl.find_motion() + os_version = update.get_os_version() + self.render('version.html', - version=update.get_version(), + version=motioneye.VERSION, + os_version=' '.join(os_version), + motion_version=motion_info[1] if motion_info else '', hostname=socket.gethostname()) post = get diff --git a/motioneye/templates/main.html b/motioneye/templates/main.html index de06837..d32f3a6 100644 --- a/motioneye/templates/main.html +++ b/motioneye/templates/main.html @@ -184,6 +184,10 @@ Motion Version {{motion_version}} + + OS Version + {{os_version}} + {% if enable_update %} Software Update diff --git a/motioneye/templates/version.html b/motioneye/templates/version.html index d3a9249..41281f5 100644 --- a/motioneye/templates/version.html +++ b/motioneye/templates/version.html @@ -11,5 +11,7 @@ {% block body %} hostname = "{{hostname}}"
-version = "{{version}}" +version = "{{version}}"
+motion_version = "{{motion_version}}"
+os_version = "{{os_version}}" {% endblock %} diff --git a/motioneye/update.py b/motioneye/update.py index 265cb97..88a67d6 100644 --- a/motioneye/update.py +++ b/motioneye/update.py @@ -17,18 +17,43 @@ import logging import re +import subprocess -# versions +def get_os_version(): + try: + import platformupdate + + return platformupdate.get_os_version() -def get_version(): - import motioneye - - return motioneye.VERSION + except ImportError: + return _get_os_version_lsb_release() -def get_all_versions(): - return [] +def _get_os_version_lsb_release(): + try: + output = subprocess.check_output('lsb_release -sri', shell=True) + lines = output.strip().split() + name, version = lines + if version.lower() == 'rolling': + version = '' + + return name, version + + except: + return _get_os_version_uname() + + +def _get_os_version_uname(): + try: + output = subprocess.check_output('uname -rs', shell=True) + lines = output.strip().split() + name, version = lines + + return name, version + + except: + return ('Linux', '') # most likely :) def compare_versions(version1, version2): @@ -68,7 +93,23 @@ def compare_versions(version1, version2): return 0 +def get_all_versions(): + try: + import platformupdate + + except ImportError: + return [] + + return platformupdate.get_all_versions() + + def perform_update(version): - logging.error('updating is not implemented') + logging.info('updating to version %(version)s...' % {'version': version}) + + try: + import platformupdate + + except ImportError: + logging.error('updating is not implemented') - return False + platformupdate.perform_update(version) -- 2.39.5