aboutsummaryrefslogtreecommitdiff
path: root/addons/service.xbmc.versioncheck/resources/lib/version_check/apt_daemon_handler.py
blob: c70fb09d2e243b71740ff1604186b5ccfb1fae19 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
# -*- 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.

"""

from .common import log
from .handler import Handler

try:
    import apt
    from aptdaemon import client
    from aptdaemon import errors
except ImportError:
    apt = None
    client = None
    errors = None
    log('ImportError: apt, aptdaemon')


class AptDaemonHandler(Handler):
    """ Apt daemon handler
    """

    def __init__(self):
        Handler.__init__(self)
        self.apt_client = client.AptClient()

    def _check_versions(self, package):
        """ Check apt package versions

        :param package: package to check
        :type package: str
        :return: installed version, candidate version
        :rtype: str, str / False, False
        """
        if self.update and not self._update_cache():
            return False, False
        try:
            trans = self.apt_client.upgrade_packages([package])
            # trans = self.apt_client.upgrade_packages('bla')
            trans.simulate(reply_handler=self._apt_trans_started,
                           error_handler=self._apt_error_handler)
            pkg = trans.packages[4][0]
            if pkg == package:
                cache = apt.Cache()
                cache.open(None)
                cache.upgrade()
                if cache[pkg].installed:
                    return cache[pkg].installed.version, cache[pkg].candidate.version

            return False, False

        except Exception as error:  # pylint: disable=broad-except
            log('Exception while checking versions: %s' % error)
            return False, False

    def _update_cache(self):
        """ Update apt client cache

        :return: success of updating apt cache
        :rtype: bool
        """
        try:
            return self.apt_client.update_cache(wait=True) == 'exit-success'
        except errors.NotAuthorizedError:
            log('You are not allowed to update the cache')
            return False

    def upgrade_package(self, package):
        """ Upgrade apt package

        :param package: package to upgrade
        :type package: str
        :return: success of apt package upgrade
        :rtype: bool
        """
        try:
            log('Installing new version')
            if self.apt_client.upgrade_packages([package], wait=True) == 'exit-success':
                log('Upgrade successful')
                return True
        except Exception as error:  # pylint: disable=broad-except
            log('Exception during upgrade: %s' % error)
        return False

    def upgrade_system(self):
        """ Upgrade system

        :return: success of system upgrade
        :rtype: bool
        """
        try:
            log('Upgrading system')
            if self.apt_client.upgrade_system(wait=True) == 'exit-success':
                return True
        except Exception as error:  # pylint: disable=broad-except
            log('Exception during system upgrade: %s' % error)
        return False

    def _apt_trans_started(self):
        """ Apt transfer reply handler
        """

    @staticmethod
    def _apt_error_handler(error):
        """ Apt transfer error handler

        :param error: apt error message
        :type error: str
        """
        log('Apt Error %s' % error)