diff options
Diffstat (limited to 'addons/service.xbmc.versioncheck/service.py')
-rw-r--r-- | addons/service.xbmc.versioncheck/service.py | 260 |
1 files changed, 59 insertions, 201 deletions
diff --git a/addons/service.xbmc.versioncheck/service.py b/addons/service.xbmc.versioncheck/service.py index 49acf3a6ab..eeac15187f 100644 --- a/addons/service.xbmc.versioncheck/service.py +++ b/addons/service.xbmc.versioncheck/service.py @@ -18,235 +18,93 @@ # -import os import platform import xbmc -import xbmcaddon -import xbmcgui -import xbmcvfs +import lib.common +from lib.common import log, dialog_yesno +from lib.common import upgrade_message as _upgrademessage -if sys.version_info < (2, 7): - import simplejson -else: - import json as simplejson +__addon__ = lib.common.__addon__ +__addonversion__ = lib.common.__addonversion__ +__addonname__ = lib.common.__addonname__ +__addonpath__ = lib.common.__addonpath__ +__icon__ = lib.common.__icon__ +__localize__ = lib.common.__localize__ -__addon__ = xbmcaddon.Addon() -__addonversion__ = __addon__.getAddonInfo('version') -__addonname__ = __addon__.getAddonInfo('name') -__addonpath__ = __addon__.getAddonInfo('path').decode('utf-8') -__icon__ = __addon__.getAddonInfo('icon') -__localize__ = __addon__.getLocalizedString - -def log(txt): - if isinstance (txt,str): - txt = txt.decode("utf-8") - message = u'%s: %s' % (__addonname__, txt) - xbmc.log(msg=message.encode("utf-8"), level=xbmc.LOGDEBUG) class Main: def __init__(self): + linux = False + packages = [] if __addon__.getSetting("versioncheck_enable") == 'true' and not xbmc.getCondVisibility('System.HasAddon(os.openelec.tv)'): if not sys.argv[0]: xbmc.executebuiltin('XBMC.AlarmClock(CheckAtBoot,XBMC.RunScript(service.xbmc.versioncheck, started),00:00:30,silent)') xbmc.executebuiltin('XBMC.AlarmClock(CheckWhileRunning,XBMC.RunScript(service.xbmc.versioncheck, started),24:00:00,silent,loop)') elif sys.argv[0] and sys.argv[1] == 'started': if xbmc.getCondVisibility('System.Platform.Linux'): - oldversion = _versionchecklinux('xbmc') + packages = ['xbmc'] + _versionchecklinux(packages) else: - oldversion = _versioncheck() - if oldversion[0]: - _upgrademessage(oldversion[1]) + oldversion, msg = _versioncheck() + if oldversion: + _upgrademessage(msg, False) else: pass def _versioncheck(): # initial vars - oldversion = False - msg = '' + from lib.jsoninterface import get_installedversion, get_versionfilelist + from lib.versions import compare_version # retrieve versionlists from supplied version file - version_file = os.path.join(__addonpath__, 'resources/versions.txt') - # Eden didn't have xbmcvfs.File() - if xbmcaddon.Addon('xbmc.addon').getAddonInfo('version') < "11.9.3": - file = open(version_file, 'r') - else: - file = xbmcvfs.File(version_file) - data = file.read() - file.close() - version_query = unicode(data, 'utf-8', errors='ignore') - version_query = simplejson.loads(version_query) - - # Create seperate version lists - versionlist_stable = version_query['releases']['stable'] - versionlist_rc = version_query['releases']['releasecandidate'] - versionlist_beta = version_query['releases']['beta'] - versionlist_alpha = version_query['releases']['alpha'] - versionlist_prealpha = version_query['releases']['prealpha'] - - # retrieve current installed version - json_query = xbmc.executeJSONRPC('{ "jsonrpc": "2.0", "method": "Application.GetProperties", "params": {"properties": ["version", "name"]}, "id": 1 }') - json_query = unicode(json_query, 'utf-8', errors='ignore') - json_query = simplejson.loads(json_query) - version_installed = [] - if json_query.has_key('result') and json_query['result'].has_key('version'): - version_installed = json_query['result']['version'] - log("Version installed %s" %version_installed) - # set oldversion flag to false - oldversion = False - - ### Check to upgrade to newest available stable version - # check on smaller major version. Smaller version than available always notify - if version_installed['major'] < int(versionlist_stable[0]['major']): - msg = __localize__(32003) - oldversion = True - log("Version available %s" %versionlist_stable[0]) - - # check on same major version installed and available - elif version_installed['major'] == int(versionlist_stable[0]['major']): - # check on smaller minor version - if version_installed['minor'] < int(versionlist_stable[0]['minor']): - msg = __localize__(32003) - oldversion = True - log("Version available %s" %versionlist_stable[0]) - # check if not installed a stable so always notify - elif version_installed['tag'] != "stable": - msg = __localize__(32008) - oldversion = True - log("Version available %s" %versionlist_stable[0]) - else: - log("Last available stable installed") - - ### Check to upgrade to newest available RC version if not installed stable - ## Check also oldversion hasn't been set true by previous check because if so this need to be skipped - if not oldversion and version_installed['tag'] != "stable": - # only check on equal or lower major because newer installed beta/alpha/prealpha version will be higher - if versionlist_rc and version_installed['major'] <= int(versionlist_rc[0]['major']): - if version_installed['revision'] <= versionlist_rc[0]['revision']: - msg = __localize__(32004) - oldversion = True - log("Version available %s" %versionlist_rc[0]) - - # exclude if installed RC on checking for newer beta - if not oldversion and versionlist_beta and version_installed['tag'] not in ["releasecandidate"]: - if version_installed['major'] <= int(versionlist_beta[0]['major']): - if version_installed['revision'] < versionlist_beta[0]['revision']: - msg = __localize__(32005) - oldversion = True - log("Version available %s" %versionlist_beta[0]) - - # exclude if installed RC or beta on checking for newer alpha - if not oldversion and versionlist_alpha and version_installed['tag'] not in ["releasecandidate", "beta"]: - if version_installed['major'] <= int(versionlist_alpha[0]['major']): - if version_installed['revision'] < versionlist_alpha[0]['revision']: - msg = __localize__(32006) - oldversion = True - log("Version available %s" %versionlist_alpha[0]) - - # exclude if installed RC, beta or alpha on checking for newer prealpha - if not oldversion and versionlist_prealpha and version_installed['tag'] not in ["releasecandidate", "beta", "alpha"]: - if version_installed['major'] <= int(versionlist_prealpha[0]['major']): - if version_installed['revision'] < versionlist_prealpha[0]['revision']: - msg = __localize__(32007) - oldversion = True - log("Version available %s" %versionlist_prealpha[0]) - - # Nothing to see here, move along - else: - # Nothing to see here, move along - pass + versionlist = get_versionfilelist() + # retrieve version installed + version_installed = get_installedversion() + # copmpare installed and available + oldversion, msg = compare_version(version_installed, versionlist) return oldversion, msg -def _versionchecklinux(package): - if (platform.dist()[0] == "Ubuntu" or platform.dist()[0] == "Debian"): - oldversion, msg = _versioncheckapt(package) +def _versionchecklinux(packages): + if platform.dist()[0].lower() in ['ubuntu', 'debian', 'linuxmint']: + handler = False + result = False + try: + # try aptdeamon first + from lib.aptdeamonhandler import AptdeamonHandler + handler = AptdeamonHandler() + except: + # fallback to shell + # since we need the user password, ask to check for new version first + from lib.shellhandlerapt import ShellHandlerApt + sudo = True + handler = ShellHandlerApt(sudo) + if dialog_yesno(32015): + pass + elif dialog_yesno(32009, 32010): + log("disabling addon by user request") + __addon__.setSetting("versioncheck_enable", 'false') + return + + if handler: + if handler.check_upgrade_available(packages[0]): + if _upgrademessage(32012, True): + if __addon__.getSetting("upgrade_system") == "false": + result = handler.upgrade_package(packages[0]) + else: + result = handler.upgrade_system() + if result: + from lib.common import message_upgrade_success, message_restart + message_upgrade_success() + message_restart() + else: + log("Error during upgrade") + else: + log("Error: no handler found") else: log("Unsupported platform %s" %platform.dist()[0]) sys.exit(0) - return oldversion, msg - -def _versioncheckapt(package): - #check for linux using Apt - # initial vars - oldversion = False - msg = '' - result = '' - - # try to import apt - try: - import apt - from aptdaemon import client - from aptdaemon import errors - except: - log('python apt import error') - sys.exit(0) - apt_client = client.AptClient() - try: - result = apt_client.update_cache(wait=True) - if (result == "exit-success"): - log("Finished updating the cache") - else: - log("Error updating the cache %s" %result) - except errors.NotAuthorizedError: - log("You are not allowed to update the cache") - sys.exit(0) - - trans = apt_client.upgrade_packages([package]) - trans.simulate(reply_handler=_apttransstarted, error_handler=_apterrorhandler) - pkg = trans.packages[4][0] - if (pkg == package): - cache=apt.Cache() - cache.open(None) - cache.upgrade() - if (cache[package].installed and cache[package].installed.version != cache[package].candidate.version): - log("Version installed %s" %cache[package].installed.version) - log("Version available %s" %cache[package].candidate.version) - oldversion = True - msg = __localize__(32011) - elif (cache[package].installed): - log("Already on newest version %s" %cache[package].installed.version) - else: - log("No installed package found, probably manual install") - sys.exit(0) - - return oldversion, msg -def _apttransstarted(): - pass -def _apterrorhandler(error): - raise error - -def _upgrademessage(msg): - # Don't show while watching a video - while(xbmc.Player().isPlayingVideo() and not xbmc.abortRequested): - xbmc.sleep(1000) - i = 0 - while(i < 5 and not xbmc.abortRequested): - xbmc.sleep(1000) - i += 1 - # Detect if it's first run and only show OK dialog + ask to disable on that - firstrun = __addon__.getSetting("versioncheck_firstrun") != 'false' - if firstrun and not xbmc.abortRequested: - xbmcgui.Dialog().ok(__addonname__, - msg, - __localize__(32001), - __localize__(32002)) - # sets check to false which is checked on startup - if xbmcgui.Dialog().yesno(__addonname__, - __localize__(32009), - __localize__(32010)): - __addon__.setSetting("versioncheck_enable", 'false') - # set first run to false to only show a popup next startup / every two days - __addon__.setSetting("versioncheck_firstrun", 'false') - # Show notification after firstrun - elif not xbmc.abortRequested: - log(__localize__(32001) + '' + __localize__(32002)) - xbmc.executebuiltin("XBMC.Notification(%s, %s, %d, %s)" %(__addonname__, - __localize__(32001) + '' + __localize__(32002), - 15000, - __icon__)) - else: - pass if (__name__ == "__main__"): log('Version %s started' % __addonversion__) |