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

Last change on this file since 4797 was 4797, checked in by jrpelegrina, 2 years ago

Restore pinning file when lliurex-upgrade -s mode ends

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