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

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

WIP in new gui. Add some features

File size: 8.9 KB
Line 
1import xmlrpclib 
2import os
3import shutil
4import subprocess
5import socket
6import distutils.dir_util
7
8class LliurexUpCore(object):
9        """docstring for LliurexUpCore"""
10        def __init__(self):
11                super(LliurexUpCore, self).__init__()
12                self.defaultMirror = 'llx16'
13                self.defaultVersion = 'xenial'
14                self.processPath = '/var/run/lliurex-up'
15                self.changelogsPath = os.path.join(self.processPath,'changelogs')
16                self.processSourceslist = os.path.join(self.processPath,'sourceslist')
17                self.targetMetapackagePath=os.path.join(self.processPath,"targetMetapackage")
18                self.previousflavourspath = os.path.join(self.processPath,'previousflavours')
19                self.preActionsPath = '/usr/share/lliurex-up/preActions'
20                self.postActionsPath = '/usr/share/lliurex-up/PostActions'
21
22                self.n4d = xmlrpclib.ServerProxy('https://localhost:9779')
23                self.haveLliurexMirror = False
24                self.metapackageRef=[]
25                self.previuosFlavours = []
26                self.getTargetMetapackage()
27                self.flavours = []
28                self.getPreviuosFlavours()
29                if len(self.n4d.get_methods('MirrorManager')) > 0:
30                        self.haveLliurexMirror = True
31                self.prepareEnvironment()
32
33        def getPreviuosFlavours(self):
34               
35                if os.path.exists(self.previousflavourspath):
36                        aux = open(self.previousflavourspath,'r')
37                        lines = aux.readlines()
38                        for x in lines:
39                                self.previuosFlavours.append(x.strip())
40                        aux.close()
41
42
43        def getTargetMetapackage(self):
44
45                if os.path.exists(self.targetMetapackagePath):
46                        aux = open(self.targetMetapackagePath,'r')
47                        lines = aux.readlines()
48                        for x in lines:
49                                self.metapackageRef.append(x.strip())
50                        aux.close()             
51
52        def saveTargetMetapackage(self,targetMetapackage):
53
54                aux=open(self.targetMetapackagePath,'w')
55                x=targetMetapackage.split("-")[2]
56                aux.write(x+"\n")
57                x="edu"
58                aux.write(x+"\n")
59                aux.close()
60               
61
62        def updateFlavoursList(self):
63                self.flavours = [ x.strip() for x in self.n4d.lliurex_version('','LliurexVersion','-v')[1].split(',') ]
64                if len(self.flavours) > 0:
65                        aux = open(self.previousflavourspath,'w')
66                        for x in self.flavours:
67                                aux.write(x+"\n")
68                        aux.close()
69
70        def writeDefaultSourceslist(self):
71                f = open(os.path.join(self.processSourceslist,'default'),'w')
72                f.write('deb http://lliurex.net/{version} {version} main\n'.format(version=self.defaultVersion))
73                f.write('deb http://lliurex.net/{version} {version}-updates main\n'.format(version=self.defaultVersion))
74                f.write('deb http://lliurex.net/{version} {version}-security main\n'.format(version=self.defaultVersion))
75                f.close()
76
77        def prepareEnvironment(self):
78                '''
79                        This funcion delete all environment and rebuild environment
80                '''
81                if not os.path.exists(self.processPath):
82                        os.mkdir(self.processPath)
83                if not os.path.exists(self.processSourceslist):
84                        os.mkdir(self.processSourceslist)
85                if not os.path.exists(self.changelogsPath):
86                        os.mkdir(self.changelogsPath)
87                self.writeDefaultSourceslist()
88
89        def cleanEnvironment(self):
90                if os.path.exists(self.processPath):
91                        shutil.rmtree(os.path.join(self.processPath))
92
93
94        def updateCacheApt(self,options=""):
95                command = "LANG=C apt-get update {options}".format(options=options)
96                subprocess.Popen(command,shell=True).communicate()
97
98
99        def getPackageVersionAvailable(self,package,options=""):
100                '''
101                        Args :
102                                package String
103                                options String
104
105                        return dictionary => result
106                        result : {'installed':String,'candidate':String}
107
108                        Options are Apt options
109                '''
110                command = "LANG=C apt-cache policy {package} {options}".format(package=package,options=options)
111                p = subprocess.Popen(command,shell=True,stdout=subprocess.PIPE)
112                installed = None
113                candidate = None
114                for line in iter(p.stdout.readline,""):
115                        stripedline = line.strip()
116                        if stripedline.startswith("Installed"):
117                                installed = stripedline.replace("Installed: ","")
118                        if stripedline.startswith("Candidate"):
119                                candidate = stripedline.replace("Candidate: ","")
120                return {"installed":installed,"candidate":candidate}
121
122        def isLliurexUpIsUpdated(self):
123                '''
124                        return Boolean
125                '''
126                sourceslistDefaultPath = os.path.join(self.processSourceslist,'default')
127                options = ""
128                if self.canConnectToLliurexNet():
129                        options = "-o Dir::Etc::sourcelist={sourceslistOnlyLliurex} -o Dir::Etc::sourceparts=/dev/null".format(sourceslistOnlyLliurex=sourceslistDefaultPath)
130               
131                self.updateCacheApt(options)
132                result = self.getPackageVersionAvailable('lliurex-up',options)
133
134                if result['installed'] != result['candidate']:
135                        return False
136                return True
137
138        def installLliurexUp(self,options=""):
139                '''
140                        Args :
141                                options String
142                        return dictionary => result
143                        result : {'returncode':Int,'stdout':String,'stderr':String}
144
145                        options are Apt options
146                       
147
148                        This function install lliurex-up
149                '''
150                command = "LANG=C apt-get install testdisk {options}".format(options=options)
151                p = subprocess.Popen(command,shell=True,stdout=subprocess.PIPE)
152                poutput,perror = p.communicate()
153                return {'returncode':p.returncode,'stdout':poutput,'stderrs':perror}
154
155        def lliurexMirrorIsUpdated(self):
156                '''
157                        return None | dictionary => result
158                        result : {'status':Boolean,'msg':String,'action':String}
159                        result.msg : message of status
160                        result.action : Action to launch
161                '''
162                if self.haveLliurexMirror and 'server' in self.flavours :
163                        result = self.n4d.is_update_available('','MirrorManager',self.defaultMirror)
164                        return result
165                return None
166
167        def lliurexMirrorIsRunning(self):
168                '''
169                        return Boolean
170                '''
171                if self.haveLliurexMirror and 'server' in self.flavours :
172                        result = self.n4d.is_alive('','MirrorManager')
173                        return result['status']
174                return False
175
176        def getPercentageLliurexMirror(self):
177                '''
178                        return int | None
179                '''
180                if self.haveLliurexMirror and 'server' in self.flavours:
181                        result = self.n4d.get_percentage('','MirrorManager',self.defaultMirror)
182                        if result['status']:
183                                return result['msg']
184                return None
185       
186        def checkFlavour(self):
187                '''
188                        return None|String
189                        If metapackages has been uninstalled, this function return
190                        package to must install. If return None, you are ok and don't need
191                        install anything.
192                '''
193                self.updateFlavoursList()
194                targetMetapackage = None
195                if 'None' in self.flavours:
196                        # get last flavour
197                        result = self.n4d.lliurex_version('','LliurexVersion','--history')
198                        if result[0]:
199                                history = [ x.strip().split('\t')[0].strip() for x in result[1].split('\n') ]
200                                history = [ x for x in history if not 'lliurex-meta-live' in x ]
201                                for x in reversed(history):
202                                        if x.startswith('-'):
203                                                targetMetapackage = x[2:]
204                                                break
205
206                if targetMetapackage !=None:
207                        print targetMetapackage
208                        self.saveTargetMetapackage(targetMetapackage)                           
209                return targetMetapackage
210
211        def canConnectToLliurexNet(self):
212                '''
213                        return Boolean
214                '''
215                s =  socket.socket(socket.AF_INET, socket.SOCK_STREAM)
216                host = socket.gethostbyname('lliurex.net')
217                result = s.connect_ex((host, 80))
218                s.close()
219                if result:
220                        return False
221                return True
222
223        def getLliurexVersionLliurexNet(self):
224                '''
225                        return dictionary => result
226                        result : {'installed':String,'candidate':String}
227                '''
228                sourceslistDefaultPath = os.path.join(self.processSourceslist,'default')
229                options = ""
230                if self.canConnectToLliurexNet():
231                        options = "-o Dir::Etc::sourcelist={sourceslistOnlyLliurex} -o Dir::Etc::sourceparts=/dev/null".format(sourceslistOnlyLliurex=sourceslistDefaultPath)
232                self.updateCacheApt(options)
233                return self.getPackageVersionAvailable('lliurex-version-timestamp',options)
234
235        def getLliurexVersionLocal(self):
236                self.updateCacheApt('')
237                return self.getPackageVersionAvailable('lliurex-version-timestamp','')         
238
239        def preActionsScript(self):
240                return 'run-parts --arg="preActions" ' + self.preActionsPath
241
242        def postActionsScript(self):
243                return 'run-parts --arg="postActions" ' + self.postActionsPath
244
245        def getPackagesToUpdate(self):
246                '''
247                        packageInfo definition
248                        {
249                                'PACKAGENAME' : {
250                                                'install' : 'INSTALLEDVERSION',
251                                                'candidate' : 'CANDIDATEVERSION',
252                                                'icon' : 'ICONNAME',
253                                                'changelog' : 'CHANGELOGTEXT'
254                                }
255                        }
256                '''
257                packageInfo = {}
258                self.updateCacheApt("")
259                psimulate = subprocess.Popen('LANG=C apt-get dist-upgrade -sV',shell=True,stdout=subprocess.PIPE)
260                rawoutputpsimulate = psimulate.stdout.readlines()
261                rawpackagestoinstall = [ aux.strip() for aux in rawoutputpsimulate if aux.startswith('Inst') ]
262                r = [ aux.replace('Inst ','') for aux in rawpackagestoinstall ]
263                for allinfo in r :
264                        packageInfo[allinfo.split(' ')[0]] = {}
265                        packageInfo[allinfo.split(' ')[0]]['raw'] = ' '.join(allinfo.split(' ')[1:])
266
267                for package in packageInfo:
268                        raw = packageInfo[package]['raw'].split(' ')
269                        if raw[0].startswith('['):
270                                packageInfo[package]['install'] = raw[0][1:-1]
271                                packageInfo[package]['candidate'] = raw[1][1:]
272                        elif raw[0].startswith('('):
273                                packageInfo[package]['install'] = None
274                                packageInfo[package]['candidate'] = raw[0][1:]
275                        packageInfo[package].pop('raw')
276                        #packageInfo[package]['changelog'] = os.path.join(self.changelogsPath,package)
277                        #os.system('LANG=C apt-get changelog %s > %s%s'%(package,self.changelogsPath,package))
278                        #packageInfo[package]['icon'] =
279                return packageInfo
280
281
282if __name__ == '__main__':
283        x = LliurexUpCore()
Note: See TracBrowser for help on using the repository browser.