aboutsummaryrefslogtreecommitdiff
path: root/addons/service.xbmc.versioncheck/resources/lib/version_check/shell_handler_apt.py
blob: 1f7307c3e7717801897f94bd35ed0db3c2894b62 (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
121
122
123
124
125
126
127
128
129
130
131
132
# -*- 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 sys

from .common import log
from .handler import Handler

try:
    from subprocess import check_output
except ImportError:
    check_output = None
    log('ImportError: subprocess')


class ShellHandlerApt(Handler):
    """ Apt shell handler
    """

    def __init__(self, use_sudo=False):
        Handler.__init__(self)
        self.sudo = use_sudo
        self._update = False
        installed, _ = self._check_versions('kodi')
        if not installed:
            # there is no package installed via repo, so we exit here
            log('No installed package found, exiting')
            sys.exit(0)
        self._update = True

    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
        """
        _cmd = 'apt-cache policy ' + package

        if self.update and not self._update_cache():
            return False, False

        try:
            result = check_output([_cmd], shell=True).split('\n')
        except Exception as error:  # pylint: disable=broad-except
            log('ShellHandlerApt: exception while executing shell command %s: %s' % (_cmd, error))
            return False, False

        if result[0].replace(':', '') == package:
            installed = result[1].split()[1]
            candidate = result[2].split()[1]
            if installed == '(none)':
                installed = False
            if candidate == '(none)':
                candidate = False
            return installed, candidate

        log('ShellHandlerApt: error during version check')
        return False, False

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

        :return: success of updating apt cache
        :rtype: bool
        """
        _cmd = 'apt-get update'
        try:
            if self.sudo:
                _ = check_output('echo \'%s\' | sudo -S %s' %
                                 (self._get_password(), _cmd), shell=True)
            else:
                _ = check_output(_cmd.split())
        except Exception as error:  # pylint: disable=broad-except
            log('Exception while executing shell command %s: %s' % (_cmd, error))
            return False

        return True

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

        :param package: package to upgrade
        :type package: str
        :return: success of apt package upgrade
        :rtype: bool
        """
        _cmd = 'apt-get install -y ' + package
        try:
            if self.sudo:
                _ = check_output('echo \'%s\' | sudo -S %s' %
                                 (self._get_password(), _cmd), shell=True)
            else:
                _ = check_output(_cmd.split())
            log('Upgrade successful')
        except Exception as error:  # pylint: disable=broad-except
            log('Exception while executing shell command %s: %s' % (_cmd, error))
            return False

        return True

    def upgrade_system(self):
        """ Upgrade system

        :return: success of system upgrade
        :rtype: bool
        """
        _cmd = 'apt-get upgrade -y'
        try:
            log('Upgrading system')
            if self.sudo:
                _ = check_output('echo \'%s\' | sudo -S %s' %
                                 (self._get_password(), _cmd), shell=True)
            else:
                _ = check_output(_cmd.split())
        except Exception as error:  # pylint: disable=broad-except
            log('Exception while executing shell command %s: %s' % (_cmd, error))
            return False

        return True