source: lliurex-up/trunk/fuentes/lliurex-up/usr/share/lliurex-up/LliurexUpConnect.py @ 4506

Last change on this file since 4506 was 4506, checked in by jrpelegrina, 3 years ago

Improve n4d checking and fix function to show changelogs

File size: 13.7 KB
RevLine 
[3208]1import xmlrpclib 
2import os
3import shutil
4import subprocess
5import socket
6import threading
7import datetime
[3493]8import math
9#from math import pi
[3208]10
[3258]11import lliurex.lliurexup as LliurexUpCore
[3208]12
13from gi.repository import Gtk, Gdk, GObject, GLib, PangoCairo, Pango
14
15import signal
16signal.signal(signal.SIGINT, signal.SIG_DFL)
17
18
19class LliurexUpConnect():
20
21        def __init__(self):
22
23                self.llxUpCore=LliurexUpCore.LliurexUpCore()
24                GObject.threads_init()
[3493]25                log_msg="------------------------------------------\n"+"LLIUREX-UP-GUI STARTING AT: " + datetime.datetime.today().strftime("%d/%m/%y %H:%M:%S") +"\n------------------------------------------"
[3208]26                self.log(log_msg)
[3449]27               
28
29
[3208]30                #self.saveTargetMetapackagePath=os.path.join(self.llxUpCore.processPath,"targetMetapackage")
31                self.preactions_token=os.path.join(self.llxUpCore.processPath,'preactions_token')
32                self.upgrade_token=os.path.join(self.llxUpCore.processPath,'upgrade_token')
33                self.installflavour_token=os.path.join(self.llxUpCore.processPath,'installflavour_token')
34                self.postactions_token=os.path.join(self.llxUpCore.processPath,'postactions_token')
[4072]35                #self.errorpostaction_token=os.path.join(self.llxUpCore.processPath,'errorpostaction_token')
36                self.errorpostaction_token=self.llxUpCore.errorpostaction_token
37                self.errorupgrade_token=self.llxUpCore.errorupgrade_token
38                self.errorfinalmetapackage_token=self.llxUpCore.errorfinalmetapackage_token
39                self.finalupgrade_token=self.llxUpCore.finalupgrade_token
40                #self.errorupgrade_token=os.path.join(self.llxUpCore.processPath,'errorupgrade_token')
41                #self.finalupgrade_token=os.path.join(self.llxUpCore.processPath,'finalupgrade_token')
[4461]42                #self.checkInitialFlavour()
[3208]43
44
45        #def __init__   
46
47
[4506]48        def checkInitialN4dStatus(self):
[4468]49
[4506]50                self.statusN4d=self.llxUpCore.n4dStatus
[4468]51
52                if not self.statusN4d:
53                        log_msg="N4d is not working"
54                        self.log(log_msg)
55
56                return self.statusN4d   
57
58
[3208]59        def checkInitialFlavour(self):
60
[3449]61                self.targetMetapackage=self.llxUpCore.checkInitialFlavour()
[3493]62                log_msg="Initial check metapackage. Metapackage to install: " + str(self.targetMetapackage)
[3449]63                self.log(log_msg)
[3542]64                self.previousFlavours=self.llxUpCore.previousFlavours
65                log_msg="Get initial metapackage: " + str(self.previousFlavours)
[3449]66                self.log(log_msg)
67                return self.targetMetapackage
[3208]68
69        #def checkFlavoour
70
71
72        def canConnectToLliurexNet(self):
73
[3532]74                can_connect=self.llxUpCore.canConnectToLliurexNet()
75
76                if can_connect:
77                        log_msg="Can connect to lliurex.net: True"
78                        self.log(log_msg)
79                        return True
80
81                else:
82                        log_msg="Can connect to lliurex.net: False"
83                        self.log(log_msg)
[3542]84                        if "lliurex-meta-server" == self.targetMetapackage or "server" in self.llxUpCore.previousFlavours:
[3532]85                                return False
[3208]86                        else:
[3532]87                                return True             
[3208]88
89        #def canConnectToLliurexNet
90
91
92        def initActionsScript(self):
[4461]93
94                #self.checkInitialFlavour()
[3449]95                arg="initActions"
[4053]96                command="DEBIAN_FRONTEND=gnome DEBIAN_PRIORITY=high " + self.llxUpCore.initActionsScript(arg)
[3449]97               
[3399]98                try:
99                        os.system(command)
100                        log_msg="Exec Init-Actions"
101                        self.log(log_msg)
102                        return True
[3208]103
[3399]104                except Exception as e:
105                        log_msg="Exec Init-Actions.Error: " +str(e)
106                        self.log(log_msg)
107                        return False           
[3208]108
[3399]109        #def initActionsScript 
[3690]110
111        def clientCheckingMirrorIsRunning(self):
112
113                is_mirror_running_inserver=self.llxUpCore.clientCheckingMirrorIsRunning()
[3693]114               
[3703]115                if is_mirror_running_inserver['ismirrorrunning'] ==None:
116                        log_msg="Checking if mirror in server is being updated. Error: " + str(is_mirror_running_inserver['exception'])
[3693]117                        self.log(log_msg)
[3703]118
[3693]119                else:
[3703]120                        if is_mirror_running_inserver['ismirrorrunning']==True:
[3693]121                                log_msg="Mirror is being udpated in server. Unable to update the system"
122                                self.log(log_msg)
[3703]123                               
[3693]124               
125                return is_mirror_running_inserver['ismirrorrunning']
[3690]126
[3693]127        #def clientCheckingMirrorIsRunning
[3208]128               
129        def isLliurexUpIsUpdated(self):
130
131                try:
132                        is_lliurexup_updated=self.llxUpCore.isLliurexUpIsUpdated()
133                        log_msg="Checking lliurex-up. Is lliurex-up updated: "+ str(is_lliurexup_updated)
134                        self.log(log_msg)
135                        return is_lliurexup_updated
136               
137                except Exception as e:
138                        log_msg="Checking lliurex-up. Error: " + str(e)
139                        self.log(log_msg)
140                        return True
141
142        #def isLliurexUpIsUpdated
143
144        def installLliurexUp(self):
145
146                try:
[3232]147                        is_lliurexup_installed=self.llxUpCore.installLliurexUp()
[3247]148                        returncode=is_lliurexup_installed['returncode']
149                        error=is_lliurexup_installed['stderrs']
[3231]150                        log_msg="Installing lliurex-up. Returncode: " + str(returncode) + ". Error: " + str(error)
[3208]151                        self.log(log_msg)
[3231]152                        return returncode
153                       
[3208]154                except Exception as e:
155                        log_msg="Installing lliurex-up. Error: " + str(e)
156                        self.log(log_msg)
157                        return True
158
159        #def installLliurexUp   
160
161       
162        def lliurexMirrorIsUpdated(self):
163
164                try:
165                        is_mirror_updated=self.llxUpCore.lliurexMirrorIsUpdated()
166
167                        if is_mirror_updated !=None:
168                       
169                                if is_mirror_updated['action']=='update':
170                                        log_msg="Checking mirror. Is mirror update: False"
171                                        self.log(log_msg)
172                                        return False
173                                else: 
174                                        log_msg="Checking mirror. Is mirror update: " + is_mirror_updated['action']
175                                        self.log(log_msg)
176                                        return True
177                        else:
178                                log_msg="Checking mirror. Is mirror update: None"
179                                self.log(log_msg)
180                                return True
181               
182               
183                except Exception as e:
184                        log_msg="Checking mirror. Error: " + str(e)
185                        self.log(log_msg)
186                        return True     
187
188        #def lliurexMirrorIsUpdated             
189
190        def lliurexMirrorIsRunning(self):
191
192                try:
193                        is_lliurexmirror_running=self.llxUpCore.lliurexMirrorIsRunning()
194                        return is_lliurexmirror_running
195
196                except Exception as e:
197                        log_msg="Updating mirror. Error: " + str(e)
198                        self.log(log_msg)
199                        return False
200
201        #def lliurexMirrorIsRunning             
202
203        def getPercentageLliurexMirror(self):
204
205                try:
206                        percentage_mirror=self.llxUpCore.getPercentageLliurexMirror()
207                        if percentage_mirror != None:
208                                return percentage_mirror
209                        else:
210                                return 0       
211               
212                except Exception as e:
213                        return 0       
214
215
216        #def getPercentageLliurexMirror
217
218        def getLliurexVersionLocal(self):
219               
220                try:
221                       
222                        self.lliurexVersionLocal=self.llxUpCore.getLliurexVersionLocal()
[3389]223                        log_msg="Get LliurexVersion installed: " + str(self.lliurexVersionLocal["installed"])
[3208]224                        self.log(log_msg)
[3389]225                        log_msg="Get LliurexVersion candidate from Local repository: " + str(self.lliurexVersionLocal["candidate"])
[3208]226                        self.log(log_msg)
227                        #self.lliurexVersionLocal=self.lliurexVersionLocal["candidate"]
228
229                except Exception as e:
230                        log_msg="Get LliurexVersion from Local repository. Error: " + str(e)
231                        self.log(log_msg)
[3389]232                        self.lliurexVersionLocal={"installed":None,"candidate":None}
[3208]233
234                return self.lliurexVersionLocal
235
236        #def getLliurexVersionLocal(
237       
238        def getLliurexVersionNet(self):
239               
240                try:
241                        self.lliurexVersionNet=self.llxUpCore.getLliurexVersionLliurexNet()["candidate"]
[3389]242                        log_msg="Get LliurexVersion candidate from Lliurex Net: " + str(self.lliurexVersionNet)
[3208]243                        self.log(log_msg)
244                       
245
246                except Exception as e:
247                        log_msg="Get LliurexVersion from Lliurex Net. Error: " + str(e)
248                        self.log(log_msg)
249                        self.lliurexVersionNet=None
250
251                return self.lliurexVersionNet   
252
253        #def getLliurexVersionNet
254       
255        def installInitialFlavour(self,flavourToInstall):
256
257                try:
258                        is_flavour_installed=self.llxUpCore.installInitialFlavour(flavourToInstall)
[3231]259                        returncode=is_flavour_installed['returncode']
260                        error=is_flavour_installed['stderrs']
[3514]261                        log_msg="Install initial metapackage:" + flavourToInstall + ": Returncode: " + str(returncode) + " Error: " + str(error)
[3231]262                        self.log(log_msg)
263                        return returncode
[3208]264
265                except Exception as e:
266                        print str(e)
[3514]267                        log_msg="Install initial metapackage: " + flavourToInstall + ". Error: " + str(e)
[3231]268                        self.log(log_msg)
[3542]269                        return 1
[3231]270                       
[3208]271        #def installInitialFlavour
272
273        def getPackagesToUpdate(self):
274               
[3449]275                #ref_flavour=["lliurex-meta-server","lliurex-meta-client", "lliurex-meta-desktop", "lliurex-meta-music", "lliurex-meta-pyme", "lliurex-meta-infantil"]
[3208]276                packages_parse=[]
[3493]277                self.total_size=0
[3449]278                #self.incorrect_flavours=[]
[3208]279               
280                try:
281                        packages=self.llxUpCore.getPackagesToUpdate()
282                        if len(packages)>0:
283                                for item in packages:
[3493]284                                        version=packages[item]['candidate']
285                                        size=self.getSizePackagesToUpdate(item)
286                                        install=str(packages[item]['install'])
287                                        packages_parse.append(item+";"+version+";"+size+";"+install)
[3449]288                                       
[3208]289                        log_msg="Get packages to update. Number of packages: " + str(len(packages)) 
290                        self.log(log_msg)               
291
292                except Exception as e:
293                        log_msg="Get packages to update. Error: " + str(e)
294                        self.log(log_msg)
295
[3493]296                self.total_size=self.convert_size(self.total_size)     
297                return packages_parse,self.total_size
[3208]298                       
299        #def getPackagesToUpdate
[3493]300       
301        def getSizePackagesToUpdate(self,pkg):
302                size=0
303                try:
304                        command='apt-cache show ' + pkg + ' |grep "^Size:" |cut -d " " -f2 |head -1'
305                        p=subprocess.Popen(command,shell=True,stdout=subprocess.PIPE)
306                        size=p.stdout.readline().strip()
307                        self.total_size=(self.total_size)+int(size)
308                        size=self.convert_size(size)
309                        return size
[3208]310
[3493]311                except Exception as e:
312                        print e
313                        return self.convert_size(size) 
[3449]314       
[3493]315
316        def convert_size(self,size_bytes):
317
318                size_bytes=float(size_bytes)
319                if (size_bytes == 0):
320                        return '0B'
321
322                size_name = ("B", "KB", "MB", "GB")
323                i = int(math.floor(math.log(size_bytes, 1024)))
324                p = math.pow(1024, i)
325                s = round(size_bytes/p,)
326                s=int(s)
327                return '%s %s' % (s, size_name[i])
328
[3449]329       
[3208]330        def checkIncorrectFlavours(self):
331
[3449]332                incorrectFlavours=self.llxUpCore.checkIncorrectFlavours()
[3208]333
[3449]334                if incorrectFlavours:
[3514]335                        log_msg="Checking incorrect metapackages. Others metapackages detected: " + str(incorrectFlavours)
[3208]336                        self.log(log_msg)
337                else:
[3514]338                        log_msg="Checking incorrect metapackages. Others metapackages not detected"
[3208]339                        self.log(log_msg)
340
[3449]341                return incorrectFlavours       
342
343        #def checkIncorrectFlavours     
344
[3606]345        def getPackageChangelog(self,package):
346
347                changelog_file=os.path.join(self.llxUpCore.changelogsPath,package)
[4054]348                changelog="Changelog not found"
[3606]349
350                if not os.path.exists(changelog_file):
[4054]351                        #os.system('LANG=C LANGUAGE=en apt-get changelog %s > %s'%(package,changelog_file))
352                        cmd='LANG=C LANGUAGE=en apt-get changelog %s > %s'%(package,changelog_file)
353                        p=subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
354                        poutput,perror=p.communicate()
[3606]355
[4054]356                        if len(perror)>0:
[4506]357                                return changelog
358                       
359                try:
360                        cmd="sed -i '/Get:1 http\|Fetched/d' " + str(changelog_file)
361                        os.system(cmd)
362                        f=open(changelog_file,"r")
363                        changelog=f.readlines()
364                        f.close()
[4054]365                                                               
[4506]366                except Exception as e:
367                        changelog="Changelog not found" 
[4054]368
[3606]369                return changelog       
370
371        #def getPackageChangelog               
372
[3208]373        def preActionsScript(self):
374
375                self.preActions=self.llxUpCore.preActionsScript()
[3692]376                self.preActions='DEBIAN_FRONTEND=gnome DEBIAN_PRIORITY=high ' +self.preActions + ' ;touch ' + self.preactions_token + '\n'
[3208]377                log_msg="Exec Pre-Actions"
378                self.log(log_msg)
379                return self.preActions
380
381        #def preActionsScript   
382
383        def distUpgradeProcess(self):
384               
385                self.distupgrade=self.llxUpCore.distUpgradeProcess()   
[3396]386                self.distupgrade='DEBIAN_FRONTEND=gnome DEBIAN_PRIORITY=high ' +self.distupgrade + ' ;touch ' + self.upgrade_token + '\n'
[3208]387                log_msg="Exec Dist-uggrade"
388                self.log(log_msg)
389                return self.distupgrade
390
391        #def distUpgradeProcess
392       
393        def checkErrorDistUpgrade(self):
394
[4506]395                error=False
[3449]396                try:
[4506]397                        errorDistUpgrade=self.llxUpCore.checkErrorDistUpgrade()
398                        if errorDistUpgrade or self.errorCheckFlavour:
399                                error=True
[3449]400                                log_msg="Dist-upgrade process ending with errors"
401                                self.log(log_msg)
402                        else:                   
403                                log_msg="Dist-upgrade process ending OK"
404                                self.log(log_msg)
[3208]405
[3449]406                except Exception as e:
407                        print e
408                        log_msg="Error checking distupgrade. Error: " + str(e)
[3493]409                        self.log(log_msg)
[3449]410                        error=True
[3208]411
[3449]412                return error   
[3542]413                               
[3449]414
[3208]415        #def checkErrorDistUpgrade
416       
[3396]417        def getStatusPackage(self):
[3389]418
[3396]419                command='dpkg -l |grep "^i[i]"'
420                packages_status=[]
[3389]421                try:
422                        p = subprocess.Popen(command,shell=True,stdout=subprocess.PIPE)
[3396]423                        for line in iter(p.stdout.readline,""):
424                                tmp=str(line.strip().split()[1].split(":")[0])+"_"+str(line.strip().split()[2])
425                                packages_status.append(tmp)
426
[3389]427                except Exception as e:
[3396]428                        print str(e)
429
430                return packages_status                                         
[3693]431
[3208]432        def checkFinalFlavour(self):
[3449]433
[4506]434                self.errorCheckFlavour=False
[3208]435                flavourToInstall=None
[4506]436               
437                self.checkFinalN4dStatus()
438
[3449]439                try:
[4506]440                        #flavourToInstall=self.llxUpCore.checkFinalFlavour()
441                        flavourToInstall=self.llxUpCore.checkFlavour()
[3449]442                        log_msg="Final check metapackage. Metapackage to install: " + str(flavourToInstall)
[3208]443                        self.log(log_msg)
444
445                except Exception as e:
[4506]446                        self.errorCheckFlavour=True
[3208]447                        log_msg="Final check metapackage. Error: " + str(e)
448                        self.log(log_msg)
449
[4506]450               
[3208]451                return flavourToInstall
452
453       
454        #def checkFinalFlavour
455       
456        def installFinalFlavour(self,flavourToInstall):
457
458                self.command=self.llxUpCore.installFinalFlavour(flavourToInstall)
[4072]459                self.command='DEBIAN_FRONTEND=gnome DEBIAN_PRIORITY=high ' +self.command + ' 2> >(tee ' + self.errorfinalmetapackage_token + ');touch ' + self.installflavour_token + ' ; exit'+' \n'
[3514]460                log_msg="Install final metapackage"
[3208]461                self.log(log_msg)
462                return self.command
463
464        #def installFinalFlavour
465
466        def postActionsScript(self):
467
468                self.postActions=self.llxUpCore.postActionsScript()
[4072]469                self.postActions='DEBIAN_FRONTEND=gnome DEBIAN_PRIORITY=high '+self.postActions + ' 2> >(tee ' + self.errorpostaction_token + ') ;touch ' + self.postactions_token + ' \n'
[3449]470                #self.postActions=self.postActions + ' ;touch ' + self.postactions_token + ' \n'
471
[3208]472                log_msg="Exec Post-Actions"
473                self.log(log_msg)
474                return self.postActions
475
476        #def postActionsScript
477
[4506]478        def checkFinalN4dStatus(self):
479
480                self.llxUpCore.checkN4dStatus()
481
482                if not self.llxUpCore.n4dStatus:
483                        log_msg="N4d is not working"
484
485                        self.log(log_msg)
486
487        #def checkFinalN4dStatus               
488
489
[3208]490        def cleanEnvironment(self):
491               
492                try:
493                        self.llxUpCore.cleanEnvironment()
494                        log_msg="Clean environment: OK"
495                        self.log(log_msg)
496
497                except Exception as e:
498                        log_msg="Clean environment. Error :" + str(e)
499                        self.log(log_msg)                               
500
501        #def cleanEnvironment
[3690]502
503        def cleanLliurexUpLock(self):
504
505                try:
506                        self.llxUpCore.cleanLliurexUpLock()
507               
508                except Exception as e:
509                        print e
[3693]510       
511        #def cleanLliurexUpLock                 
[3208]512                       
513        def log(self,msg):
514               
515                log_file="/var/log/lliurex-up.log"
516                f=open(log_file,"a+")
517                f.write(msg + '\n')
518                f.close()
519
[3256]520        #def log                       
Note: See TracBrowser for help on using the repository browser.