source: lliurex-up/trunk/fuentes/lliurex-up-gui/LliurexUpCore.py @ 2913

Last change on this file since 2913 was 2913, checked in by jrpelegrina, 4 years ago

WIP in new gui

File size: 6.7 KB
Line 
1import xmlrpclib 
2import os
3import shutil
4import subprocess
5import socket
6
7class LliurexUpCore(object):
8        """docstring for LliurexUpCore"""
9        def __init__(self):
10                super(LliurexUpCore, self).__init__()
11                self.defaultMirror = 'llx16'
12                self.defaultVersion = 'xenial'
13                self.processPath = '/var/run/lliurex-up'
14                self.processSourceslist = '/var/run/lliurex-up/sourceslist'
15                self.n4d = xmlrpclib.ServerProxy('https://localhost:9779')
16                self.haveLliurexMirror = False
17                if len(self.n4d.get_methods('MirrorManager')) > 0:
18                        self.haveLliurexMirror = True
19
20                self.prepareEnvironment()
21               
22        def prepareEnvironment(self):
23                '''
24                        This funcion delete all environment and rebuild environment
25                '''
26                if os.path.exists(self.processPath):
27                        shutil.rmtree(os.path.join(self.processPath))
28                os.mkdir(self.processPath)
29                os.mkdir(self.processSourceslist)
30                self.writeDefaultSourceslist()
31
32        def writeDefaultSourceslist(self):
33                f = open(os.path.join(self.processSourceslist,'default'),'w')
34                f.write('deb http://lliurex.net/{version} {version} main\n'.format(version=self.defaultVersion))
35                f.write('deb http://lliurex.net/{version} {version}-updates main\n'.format(version=self.defaultVersion))
36                f.write('deb http://lliurex.net/{version} {version}-security main\n'.format(version=self.defaultVersion))
37                f.close()
38
39        def getPackageVersionAvailable(self,package,auxoptions=""):
40                '''
41                        Args :
42                                package String
43                                options String
44
45                        return dictionary => result
46                        result : {'installed':String,'candidate':String}
47
48                        Options are Apt options
49                '''
50                command = "LANG=C apt-cache policy {package} {options}".format(package=package,options=auxoptions)
51                p = subprocess.Popen(command,shell=True,stdout=subprocess.PIPE)
52                installed = None
53                candidate = None
54                for line in iter(p.stdout.readline,""):
55                        stripedline = line.strip()
56                        if stripedline.startswith("Installed"):
57                                installed = stripedline.replace("Installed: ","")
58                        if stripedline.startswith("Candidate"):
59                                candidate = stripedline.replace("Candidate: ","")
60                return {"installed":installed,"candidate":candidate}
61
62        def isLliurexUpIsUpdated(self):
63                '''
64                        return Boolean
65                '''
66                sourceslistDefaultPath = os.path.join(self.processSourceslist,'default')
67                auxoptions = ""
68                if self.canConnectToLliurexNet():
69                        auxoptions = "-o Dir::Etc::sourcelist={sourceslistOnlyLliurex} -o Dir::Etc::sourceparts=/dev/null".format(sourceslistOnlyLliurex=sourceslistDefaultPath)
70                command = "LANG=C apt-get update {options}".format(options=auxoptions)
71                subprocess.Popen(command,shell=True).communicate()
72                result = self.getPackageVersionAvailable('lliurexup',auxoptions)
73
74                if result['installed'] != result['candidate']:
75                        return False
76                return True
77
78        def installLliurexUp(self,auxoptions=""):
79                '''
80                        Args :
81                                options String
82                        return dictionary => result
83                        result : {'returncode':Int,'stdout':String,'stderr':String}
84
85                        options are Apt options
86                       
87
88                        This function install lliurex-up
89                '''
90                command = "LANG=C apt-get install testdisk {options}".format(options=auxoptions)
91                p = subprocess.Popen(command,shell=True,stdout=subprocess.PIPE)
92                poutput,perror = p.communicate()
93                return {'returncode':p.returncode,'stdout':poutput,'stderrs':perror}
94
95        def lliurexMirrorIsUpdated(self):
96                '''
97                        return None | dictionary => result
98                        result : {'status':Boolean,'msg':String,'action':String}
99                        result.msg : message of status
100                        result.action : Action to launch
101                '''
102                if self.haveLliurexMirror and 'server' in self.flavours :
103                        result = self.n4d.is_update_available('','MirrorManager',self.defaultMirror)
104                        return result
105                return None
106
107        def lliurexMirrorIsRunning(self):
108                '''
109                        return Boolean
110                '''
111                if self.haveLliurexMirror and 'server' in self.flavours :
112                        result = self.n4d.is_alive('','MirrorManager')
113                        return result['status']
114                return False
115
116        def getPercentageLliurexMirror(self):
117                '''
118                        return int | None
119                '''
120                if self.haveLliurexMirror and 'server' in self.flavours:
121                        result = self.n4d.get_percentage('','MirrorManager',self.defaultMirror)
122                        if result['status']:
123                                return result['msg']
124                return None
125       
126        def checkFlavour(self):
127                '''
128                        return None|String
129                        If metapackages has been uninstalled, this function return
130                        package to must install. If return None, you are ok and don't need
131                        install anything.
132                '''
133                targetMetapackage = None
134                if 'None' in self.flavours:
135                        # get last flavour
136                        result = self.n4d.lliurex_version('','LliurexVersion','--history')
137                        if result[0]:
138                                history = [ x.strip().split('\t')[0].strip() for x in result[1].split('\n') ]
139                                history = [ x for x in history if not 'lliurex-meta-live' in x ]
140                                for x in reversed(history):
141                                        if x.startswith('-'):
142                                                targetMetapackage = x[2:]
143                                                break
144                                if targetMetapackage != '':
145                                        return targetMetapackage
146
147        def canConnectToLliurexNet(self):
148                '''
149                        return Boolean
150                '''
151                s =  socket.socket(socket.AF_INET, socket.SOCK_STREAM)
152                host = socket.gethostbyname('lliurex.net')
153                result = s.connect_ex((host, 80))
154                s.close()
155                if result:
156                        return False
157                return True
158
159        def getLliurexVersion(self):
160                '''
161                        return dictionary => result
162                        result : {'installed':String,'candidate':String}
163                '''
164                sourceslistDefaultPath = os.path.join(self.processSourceslist,'default')
165                auxoptions = ""
166                if self.canConnectToLliurexNet():
167                        auxoptions = "-o Dir::Etc::sourcelist={sourceslistOnlyLliurex} -o Dir::Etc::sourceparts=/dev/null".format(sourceslistOnlyLliurex=sourceslistDefaultPath)
168                command = "LANG=C apt-get update {options}".format(options=auxoptions)
169                subprocess.Popen(command,shell=True).communicate()
170                return self.getPackageVersionAvailable('lliurex-version-stamp',auxoptions)
171
172        def getPackagesToUpdate(self):
173                '''
174                        packageInfo definition
175                        {
176                                'PACKAGENAME' : {
177                                                'install' : 'INSTALLEDVERSION',
178                                                'candidate' : 'CANDIDATEVERSION',
179                                                'icon' : 'ICONNAME',
180                                                'changelog' : 'CHANGELOGTEXT'
181                                }
182                        }
183                '''
184                packageInfo = {}
185                subprocess.Popen("LANG=C apt-get update",shell=True).communicate()
186                psimulate = subprocess.Popen('LANG=C apt-get dist-upgrade -sV',shell=True,stdout=subprocess.PIPE)
187                rawoutputpsimulate = psimulate.stdout.readlines()
188                rawpackagestoinstall = [ aux.strip() for aux in rawoutputpsimulate if aux.startswith('Inst') ]
189                r = [ aux.replace('Inst ','') for aux in rawpackagestoinstall ]
190                for allinfo in r :
191                        packageInfo[allinfo.split(' ')[0]] = {}
192                        packageInfo[allinfo.split(' ')[0]]['raw'] = ' '.join(allinfo.split(' ')[1:])
193
194                for package in packageInfo:
195                        raw = packageInfo[package]['raw'].split(' ')
196                        if raw[0].startswith('['):
197                                packageInfo[package]['install'] = raw[0][1:-1]
198                                packageInfo[package]['candidate'] = raw[1][1:]
199                        elif raw[0].startswith('('):
200                                packageInfo[package]['install'] = None
201                                packageInfo[package]['candidate'] = raw[0][1:]
202                        packageInfo[package].pop('raw')
203
204                return packageInfo     
Note: See TracBrowser for help on using the repository browser.