astrXbian/.install/.kodi/addons/service.xbmc.versioncheck/resources/lib/version_check/service.py

162 lines
5.3 KiB
Python

# -*- coding: utf-8 -*-
"""
Copyright (C) 2013-2014 Team-XBMC
Copyright (C) 2014-2019 Team Kodi
This file is part of service.xbmc.versioncheck
SPDX-License-Identifier: GPL-3.0-or-later
See LICENSES/GPL-3.0-or-later.txt for more information.
"""
import platform
import sys
import xbmc # pylint: disable=import-error
import xbmcgui # pylint: disable=import-error
from .common import ADDON
from .common import ADDON_NAME
from .common import ADDON_VERSION
from .common import dialog_yes_no
from .common import localise
from .common import log
from .common import wait_for_abort
from .common import message_restart
from .common import message_upgrade_success
from .common import upgrade_message
from .common import upgrade_message2
from .json_interface import get_version_file_list
from .json_interface import get_installed_version
from .versions import compare_version
if sys.version_info[0] == 3 and sys.version_info[1] >= 8:
try:
from .distro import distro
DISTRIBUTION = distro.linux_distribution(full_distribution_name=False)[0].lower()
except (AttributeError, ImportError):
DISTRIBUTION = ''
else:
DISTRIBUTION = platform.linux_distribution(full_distribution_name=0)[0].lower() # pylint: disable=deprecated-method
if not DISTRIBUTION:
DISTRIBUTION = platform.uname()[0].lower()
def _version_check():
""" Check versions (non-linux)
:return: old, current, available, and stable versions
:rtype: bool / 'stable', dict, dict, dict
"""
# retrieve version_lists from supplied version file
version_list = get_version_file_list()
# retrieve version installed
version_installed = get_installed_version()
# compare installed and available
old_version, version_installed, version_available, version_stable = \
compare_version(version_installed, version_list)
return old_version, version_installed, version_available, version_stable
def _version_check_linux(packages):
""" Check package version on linux
:param packages: list of packages to check
:type packages: list of str
"""
if DISTRIBUTION in ['ubuntu', 'debian', 'linuxmint']:
try:
# try aptdaemon first
# pylint: disable=import-outside-toplevel
from .apt_daemon_handler import AptDaemonHandler
handler = AptDaemonHandler()
except: # pylint: disable=bare-except
# fallback to shell
# since we need the user password, ask to check for new version first
# pylint: disable=import-outside-toplevel
from .shell_handler_apt import ShellHandlerApt
handler = ShellHandlerApt(use_sudo=True)
if dialog_yes_no(32015):
pass
elif dialog_yes_no(32009, 32010):
log('disabling addon by user request')
ADDON.setSetting('versioncheck_enable', 'false')
return
if handler:
if handler.check_upgrade_available(packages[0]):
if upgrade_message(32012):
if ADDON.getSetting('upgrade_system') == 'false':
result = handler.upgrade_package(packages[0])
else:
result = handler.upgrade_system()
if result:
message_upgrade_success()
message_restart()
else:
log('Error during upgrade')
return
log('No upgrade available')
return
log('Error: no handler found')
return
log('Unsupported platform %s' % DISTRIBUTION)
sys.exit(0)
def _check_cryptography():
""" Check for cryptography package, and version
Python cryptography < 1.7 (still shipped with Ubuntu 16.04) has issues with
pyOpenSSL integration, leading to all sorts of weird bugs - check here to save
on some troubleshooting. This check may be removed in the future (when switching
to Python3?)
See https://github.com/pyca/pyopenssl/issues/542
"""
try:
import cryptography # pylint: disable=import-outside-toplevel
ver = cryptography.__version__
except ImportError:
# If the module is not found - no problem
return
ver_parts = list(map(int, ver.split('.')))
if len(ver_parts) < 2 or ver_parts[0] < 1 or (ver_parts[0] == 1 and ver_parts[1] < 7):
log('Python cryptography module version %s is too old, at least version 1.7 needed' % ver)
xbmcgui.Dialog().ok(
ADDON_NAME,
'[CR]'.join([localise(32040) % ver, localise(32041), localise(32042)])
)
def run():
""" Service entry-point
"""
_check_cryptography()
if ADDON.getSetting('versioncheck_enable') == 'false':
log('Disabled')
else:
log('Version %s started' % ADDON_VERSION)
if wait_for_abort(5):
sys.exit(0)
if (xbmc.getCondVisibility('System.Platform.Linux') and
ADDON.getSetting('upgrade_apt') == 'true'):
_version_check_linux(['kodi'])
else:
old_version, version_installed, version_available, version_stable = _version_check()
if old_version:
upgrade_message2(version_installed, version_available, version_stable, old_version)