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, 2 years ago

Improve n4d checking and fix function to show changelogs

File size: 13.7 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 checkInitialN4dStatus(self):
49
50                self.statusN4d=self.llxUpCore.n4dStatus
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
59        def checkInitialFlavour(self):
60
61                self.targetMetapackage=self.llxUpCore.checkInitialFlavour()
62                log_msg="Initial check metapackage. Metapackage to install: " + str(self.targetMetapackage)
63                self.log(log_msg)
64                self.previousFlavours=self.llxUpCore.previousFlavours
65                log_msg="Get initial metapackage: " + str(self.previousFlavours)
66                self.log(log_msg)
67                return self.targetMetapackage
68
69        #def checkFlavoour
70
71
72        def canConnectToLliurexNet(self):
73
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)
84                        if "lliurex-meta-server" == self.targetMetapackage or "server" in self.llxUpCore.previousFlavours:
85                                return False
86                        else:
87                                return True             
88
89        #def canConnectToLliurexNet
90
91
92        def initActionsScript(self):
93
94                #self.checkInitialFlavour()
95                arg="initActions"
96                command="DEBIAN_FRONTEND=gnome DEBIAN_PRIORITY=high " + self.llxUpCore.initActionsScript(arg)
97               
98                try:
99                        os.system(command)
100                        log_msg="Exec Init-Actions"
101                        self.log(log_msg)
102                        return True
103
104                except Exception as e:
105                        log_msg="Exec Init-Actions.Error: " +str(e)
106                        self.log(log_msg)
107                        return False           
108
109        #def initActionsScript 
110
111        def clientCheckingMirrorIsRunning(self):
112
113                is_mirror_running_inserver=self.llxUpCore.clientCheckingMirrorIsRunning()
114               
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'])
117                        self.log(log_msg)
118
119                else:
120                        if is_mirror_running_inserver['ismirrorrunning']==True:
121                                log_msg="Mirror is being udpated in server. Unable to update the system"
122                                self.log(log_msg)
123                               
124               
125                return is_mirror_running_inserver['ismirrorrunning']
126
127        #def clientCheckingMirrorIsRunning
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:
147                        is_lliurexup_installed=self.llxUpCore.installLliurexUp()
148                        returncode=is_lliurexup_installed['returncode']
149                        error=is_lliurexup_installed['stderrs']
150                        log_msg="Installing lliurex-up. Returncode: " + str(returncode) + ". Error: " + str(error)
151                        self.log(log_msg)
152                        return returncode
153                       
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()
223                        log_msg="Get LliurexVersion installed: " + str(self.lliurexVersionLocal["installed"])
224                        self.log(log_msg)
225                        log_msg="Get LliurexVersion candidate from Local repository: " + str(self.lliurexVersionLocal["candidate"])
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)
232                        self.lliurexVersionLocal={"installed":None,"candidate":None}
233
234                return self.lliurexVersionLocal
235
236        #def getLliurexVersionLocal(
237       
238        def getLliurexVersionNet(self):
239               
240                try:
241                        self.lliurexVersionNet=self.llxUpCore.getLliurexVersionLliurexNet()["candidate"]
242                        log_msg="Get LliurexVersion candidate from Lliurex Net: " + str(self.lliurexVersionNet)
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)
259                        returncode=is_flavour_installed['returncode']
260                        error=is_flavour_installed['stderrs']
261                        log_msg="Install initial metapackage:" + flavourToInstall + ": Returncode: " + str(returncode) + " Error: " + str(error)
262                        self.log(log_msg)
263                        return returncode
264
265                except Exception as e:
266                        print str(e)
267                        log_msg="Install initial metapackage: " + flavourToInstall + ". Error: " + str(e)
268                        self.log(log_msg)
269                        return 1
270                       
271        #def installInitialFlavour
272
273        def getPackagesToUpdate(self):
274               
275                #ref_flavour=["lliurex-meta-server","lliurex-meta-client", "lliurex-meta-desktop", "lliurex-meta-music", "lliurex-meta-pyme", "lliurex-meta-infantil"]
276                packages_parse=[]
277                self.total_size=0
278                #self.incorrect_flavours=[]
279               
280                try:
281                        packages=self.llxUpCore.getPackagesToUpdate()
282                        if len(packages)>0:
283                                for item in packages:
284                                        version=packages[item]['candidate']
285                                        size=self.getSizePackagesToUpdate(item)
286                                        install=str(packages[item]['install'])
287                                        packages_parse.append(item+";"+version+";"+size+";"+install)
288                                       
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
296                self.total_size=self.convert_size(self.total_size)     
297                return packages_parse,self.total_size
298                       
299        #def getPackagesToUpdate
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
310
311                except Exception as e:
312                        print e
313                        return self.convert_size(size) 
314       
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
329       
330        def checkIncorrectFlavours(self):
331
332                incorrectFlavours=self.llxUpCore.checkIncorrectFlavours()
333
334                if incorrectFlavours:
335                        log_msg="Checking incorrect metapackages. Others metapackages detected: " + str(incorrectFlavours)
336                        self.log(log_msg)
337                else:
338                        log_msg="Checking incorrect metapackages. Others metapackages not detected"
339                        self.log(log_msg)
340
341                return incorrectFlavours       
342
343        #def checkIncorrectFlavours     
344
345        def getPackageChangelog(self,package):
346
347                changelog_file=os.path.join(self.llxUpCore.changelogsPath,package)
348                changelog="Changelog not found"
349
350                if not os.path.exists(changelog_file):
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()
355
356                        if len(perror)>0:
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()
365                                                               
366                except Exception as e:
367                        changelog="Changelog not found" 
368
369                return changelog       
370
371        #def getPackageChangelog               
372
373        def preActionsScript(self):
374
375                self.preActions=self.llxUpCore.preActionsScript()
376                self.preActions='DEBIAN_FRONTEND=gnome DEBIAN_PRIORITY=high ' +self.preActions + ' ;touch ' + self.preactions_token + '\n'
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()   
386                self.distupgrade='DEBIAN_FRONTEND=gnome DEBIAN_PRIORITY=high ' +self.distupgrade + ' ;touch ' + self.upgrade_token + '\n'
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
395                error=False
396                try:
397                        errorDistUpgrade=self.llxUpCore.checkErrorDistUpgrade()
398                        if errorDistUpgrade or self.errorCheckFlavour:
399                                error=True
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)
405
406                except Exception as e:
407                        print e
408                        log_msg="Error checking distupgrade. Error: " + str(e)
409                        self.log(log_msg)
410                        error=True
411
412                return error   
413                               
414
415        #def checkErrorDistUpgrade
416       
417        def getStatusPackage(self):
418
419                command='dpkg -l |grep "^i[i]"'
420                packages_status=[]
421                try:
422                        p = subprocess.Popen(command,shell=True,stdout=subprocess.PIPE)
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
427                except Exception as e:
428                        print str(e)
429
430                return packages_status                                         
431
432        def checkFinalFlavour(self):
433
434                self.errorCheckFlavour=False
435                flavourToInstall=None
436               
437                self.checkFinalN4dStatus()
438
439                try:
440                        #flavourToInstall=self.llxUpCore.checkFinalFlavour()
441                        flavourToInstall=self.llxUpCore.checkFlavour()
442                        log_msg="Final check metapackage. Metapackage to install: " + str(flavourToInstall)
443                        self.log(log_msg)
444
445                except Exception as e:
446                        self.errorCheckFlavour=True
447                        log_msg="Final check metapackage. Error: " + str(e)
448                        self.log(log_msg)
449
450               
451                return flavourToInstall
452
453       
454        #def checkFinalFlavour
455       
456        def installFinalFlavour(self,flavourToInstall):
457
458                self.command=self.llxUpCore.installFinalFlavour(flavourToInstall)
459                self.command='DEBIAN_FRONTEND=gnome DEBIAN_PRIORITY=high ' +self.command + ' 2> >(tee ' + self.errorfinalmetapackage_token + ');touch ' + self.installflavour_token + ' ; exit'+' \n'
460                log_msg="Install final metapackage"
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()
469                self.postActions='DEBIAN_FRONTEND=gnome DEBIAN_PRIORITY=high '+self.postActions + ' 2> >(tee ' + self.errorpostaction_token + ') ;touch ' + self.postactions_token + ' \n'
470                #self.postActions=self.postActions + ' ;touch ' + self.postactions_token + ' \n'
471
472                log_msg="Exec Post-Actions"
473                self.log(log_msg)
474                return self.postActions
475
476        #def postActionsScript
477
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
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
502
503        def cleanLliurexUpLock(self):
504
505                try:
506                        self.llxUpCore.cleanLliurexUpLock()
507               
508                except Exception as e:
509                        print e
510       
511        #def cleanLliurexUpLock                 
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
520        #def log                       
Note: See TracBrowser for help on using the repository browser.