source: lliurex-up/trunk/fuentes/lliurex-up-cli/usr/sbin/lliurex-upgrade @ 7635

Last change on this file since 7635 was 7635, checked in by jrpelegrina, 18 months ago

Added message when blockages are detected but there is some process running

  • Property svn:executable set to *
File size: 25.2 KB
Line 
1#!/usr/bin/env python
2# -*- coding: utf-8 -*-
3
4from clint import arguments
5from clint.textui import puts, indent, colored
6import lliurex.lliurexup
7import os
8import subprocess
9import multiprocessing
10import sys
11import shutil
12import commands
13import datetime
14import time
15import signal
16from gi.repository import GLib
17signal.signal(signal.SIGINT,signal.SIG_IGN)
18
19class LliurexUpCli(object):
20        def __init__(self):
21
22                self.lliurexcore = lliurex.lliurexup.LliurexUpCore()
23                #log_msg="------------------------------------------\n"+"LLIUREX-UP-CLI STARTING AT: " + datetime.datetime.today().strftime("%d/%m/%y %H:%M:%S") +"\n------------------------------------------"
24                #self.log(log_msg)
25                signal.signal(signal.SIGINT,self.handler_signal)
26                self.checkingBlock=True
27                '''
28                if mode=="sai":
29                        self.mode=mode
30                        self.initActionsArg="initActionsSai"
31                       
32                else:
33                        self.mode="normal"
34                        self.initActionsArg="initActions"       
35
36                self.checkInitialN4dStatus()
37                #self.checkInitialFlavour()
38                '''
39       
40        #def __init__
41       
42        def startLliurexUp(self,mode):
43
44                self.checkingBlock=False
45                self.lliurexcore.startLliurexUp()
46                #signal.signal(signal.SIGINT,self.handler_signal)
47
48                if mode=="sai":
49                        self.mode=mode
50                        self.initActionsArg="initActionsSai"
51                       
52                else:
53                        self.mode="normal"
54                        self.initActionsArg="initActions"       
55
56
57                print("  [Lliurex-Up]: Checking n4d service status")
58                self.checkInitialN4dStatus()
59
60
61        def checkInitialN4dStatus(self):
62
63
64                self.statusN4d=self.lliurexcore.n4dStatus
65               
66                if not self.statusN4d:
67                        print("  [Lliurex-Up]: N4d is not working. Execute 'sudo systemctl restart n4d.service' and try again")
68                        log_msg="N4d is not working"
69                        self.log(log_msg)
70                        self.cleanEnvironment()
71                        '''
72                        self.lliurexcore.cleanEnvironment()
73                        self.lliurexcore.cleanLliurexUpLock()
74                        '''
75                        sys.exit(1)
76                               
77
78        def checkInitialFlavour(self,extra_args=None):
79
80                self.allRepos=False
81
82                if      extra_args["repositories"]:
83                        self.allRepos=True 
84
85                self.targetMetapackage=self.lliurexcore.checkInitialFlavour(self.allRepos)
86                log_msg="Initial check metapackage. Metapackage to install: " + str(self.targetMetapackage)
87                self.log(log_msg)
88                log_msg="Get initial flavours: " + str(self.lliurexcore.previousFlavours)
89                self.log(log_msg)
90               
91        #def checkInitialFlavour       
92               
93
94        def canConnectToLliurexNet(self):
95
96                print("  [Lliurex-Up]: Checking connection to lliurex.net")
97
98                can_connect=self.lliurexcore.canConnectToLliurexNet()
99                if can_connect:
100                                log_msg="Can connect to lliurex.net: True"
101                                self.log(log_msg)
102                                return True
103                else:
104                        log_msg="Can connect to lliurex.net: False"
105                        self.log(log_msg)
106
107                        if "lliurex-meta-server" == self.targetMetapackage or "server" in self.lliurexcore.previousFlavours:
108                                if self.initActionsArg !="initActionsSai":
109                                        '''
110                                        self.cleanEnvironment()
111                                       
112                                        self.lliurexcore.cleanEnvironment()
113                                        self.lliurexcore.cleanLliurexUpLock()
114                                        '''
115                                        return False
116                               
117                        print("  [Lliurex-Up]: Unable to connect to lliurex.net")
118                        return True
119                               
120        #def canConnectToLliurexNet                     
121                               
122        def clientCheckingMirrorIsRunning(self):
123               
124                is_mirror_running_inserver=self.lliurexcore.clientCheckingMirrorIsRunning()
125               
126                if is_mirror_running_inserver['ismirrorrunning'] ==None:
127                        log_msg="Checking if mirror in server is being updated. Error: " + str(is_mirror_running_inserver['exception'])
128                        self.log(log_msg)
129                else:
130                        if is_mirror_running_inserver['ismirrorrunning']:
131                                log_msg="Mirror is being updated in server. Unable to update the system"
132                                self.log(log_msg)
133               
134                return is_mirror_running_inserver['ismirrorrunning']
135               
136                       
137        #def clientCheckingMirrorIsRunning             
138       
139        def initActionsScript(self,extra_args=None):
140
141                print("  [Lliurex-Up]: Checking system")
142
143                if extra_args["unattendend_upgrade"]:
144                        command="DEBIAN_FRONTEND=noninteractive " + self.lliurexcore.initActionsScript(self.initActionsArg)
145               
146                else:
147                        command=self.lliurexcore.initActionsScript(self.initActionsArg)
148               
149                try:
150                       
151                        p=subprocess.Popen(command,shell=True,stderr=subprocess.PIPE)
152                        output=p.communicate()
153                        error=self.readErrorOutput(output[1])
154                        if error:
155                                print("  [Lliurex-Up]: Checking system. Error: " +'\n'+str(output[1]))
156                                log_msg="Exec Init-Actions. Error: %s"%output[1]
157                        else:
158                                log_msg="Exec Init-Actions. OK"
159                       
160                except Exception as e:
161                        log_msg="Exec Init-Actions.Error: " +str(e)
162                        print("  [Lliurex-Up]: Checking system. Error: " +'\n'+str(e))
163
164                       
165                self.log(log_msg)       
166                       
167        #def initActionsScript
168       
169        def checkLliurexUp(self):
170
171                print("  [Lliurex-Up]: Looking for new version of Lliurex Up")
172
173
174                is_lliurexup_updated=self.lliurexcore.isLliurexUpIsUpdated(self.allRepos)
175
176
177                if not is_lliurexup_updated:
178                        print ("  [Lliurex-Up]: Updating Lliurex-Up")
179                        is_lliurexup_installed=self.lliurexcore.installLliurexUp()
180                        log_msg="Installing Lliurex-Up. Returncode: " + str(is_lliurexup_installed['returncode']) + ". Error: " + str(is_lliurexup_installed['stderrs'])
181                        self.log(log_msg)
182                        print ("  [Lliurex-Up]: Lliurex-Up is now update and will be reboot now" )
183                        time.sleep(3)
184                        self.lliurexcore.cleanLliurexUpLock()
185                        os.execv("/usr/sbin/lliurex-upgrade",sys.argv) 
186
187                else:
188                        log_msg="Checking Lliurex-Up. Is Lliurex-Up updated: "+ str(is_lliurexup_updated)
189                        self.log(log_msg)
190                        print ("  [Lliurex-Up]: Lliurex-Up is updated.Nothing to do")   
191                       
192        #def checkLliurexUp             
193
194        def checkMirror(self,extra_args=None):
195
196                print("  [Lliurex-Up]: Checking if mirror is updated")
197
198                try:
199                        is_mirror_updated=self.lliurexcore.lliurexMirrorIsUpdated()
200
201                        if is_mirror_updated !=None:
202                                try:
203                                        is_mirror_running=self.lliurexcore.lliurexMirrorIsRunning()
204                                        if is_mirror_running:
205                                                print("  [Lliurex-Up]: Updating mirror. Wait a moment please")
206                                                command='lliurex-mirror update llx16'
207                                                #os.system(command)
208                                                subprocess.Popen(command,shell=True).communicate()
209
210                                        else:
211                                                if is_mirror_updated['action']=='update':
212                                                        log_msg="Checking mirror. Is mirror update: False"
213                                                        self.log(log_msg)
214                                                        if not is_mirror_running:
215                                                                if not extra_args["unattended_mirror"]:
216                                                                        response=raw_input('  [Lliurex-Up]: Do you want update mirror (yes/no): ').lower()
217                                                                else:
218                                                                        response="yes"
219
220                                                                if response.startswith('y'):
221                                                                        log_msg="Update lliurex-mirror: Yes"
222                                                                        self.log(log_msg)
223                                                                        print("  [Lliurex-Up]: Updating mirror. Wait a moment please")
224                                                                        command='lliurex-mirror update llx16'
225                                                                        #os.system(command)
226                                                                        subprocess.Popen(command,shell=True).communicate()
227
228                                                                else:
229                                                                        log_msg="Update lliurex-mirror: No"
230                                                                        self.log(log_msg)
231                                                                        print("  [Lliurex-Up]: Mirror update.Nothing to do")   
232                               
233                                except Exception as e:
234                                        log_msg="Updating mirror. Error: " + str(e)
235                                        self.log(log_msg)       
236                                        print("  [Lliurex-Up]: Updating mirror. Error: " +str(e))
237                                                                                       
238                        else:
239                                log_msg="Checking mirror. Is mirror update: None"
240                                self.log(log_msg)
241                                print("  [Lliurex-Up]: Nothing to do with mirror")
242               
243                except Exception as e:
244                        log_msg="Checking mirror. Error: " + str(e)
245                        self.log(log_msg)       
246                        print("  [Lliurex-Up]: Checking mirror. Error: " +str(e))       
247                       
248        #def checkMirror               
249
250        def getLliurexVersionLocal(self):
251
252                print("  [Lliurex-Up]: Looking for LliurexVersion from local repository")
253               
254                self.version_update=self.lliurexcore.getLliurexVersionLocal()
255                log_msg="Get LliurexVersion installed: " + str(self.version_update["installed"])
256                self.log(log_msg)
257                log_msg="Get LliurexVersion candidate from Local repository: " + str(self.version_update["candidate"])
258                self.log(log_msg)
259
260        #def getLliurexVersionLocal     
261       
262
263        def getLliurexVersionLliurexNet(self):
264       
265                print("  [Lliurex-Up]: Looking for LliurexVersion from lliurex.net")
266
267                self.version_available=self.lliurexcore.getLliurexVersionLliurexNet()
268                log_msg="Get LliurexVersion candidate from Lliurex Net: " + str(self.version_available["candidate"])
269                self.log(log_msg)
270       
271        #def getLliurexVersionLliurexNet               
272
273        def checkingInitialFlavourToInstall(self):
274
275                print("  [Lliurex-Up]: Checking if installation of metapackage is required")
276
277                self.returncode_initflavour=0
278
279                if self.targetMetapackage == None:
280                       
281                        print "  [Lliurex-Up]: Installation of metapackage is not required"
282                       
283                else:
284                        print "  [Lliurex-Up]: Installation of metapackage is required: " + str(self.targetMetapackage)
285                        is_flavour_installed=self.lliurexcore.installInitialFlavour(self.targetMetapackage)     
286                        self.returncode_initflavour=is_flavour_installed['returncode']
287                        error=is_flavour_installed['stderrs']
288                        log_msg="Install initial metapackage:" + self.targetMetapackage + ": Returncode: " + str(self.returncode_initflavour) + " Error: " + str(error)
289                        self.log(log_msg)
290                        print "  [Lliurex-Up]: Metapackage is now installed: Returncode: " + str(self.returncode_initflavour) + " Error: " + str(error)
291                       
292        #def checkingInitialFlavourToInstall           
293       
294        def getPackagesToUpdate(self):
295
296                print("  [Lliurex-Up]: Looking for new updates")
297                packages=self.lliurexcore.getPackagesToUpdate()
298                log_msg="Get packages to update. Number of packages: "+ str(len(packages))
299                self.log(log_msg)
300
301                self.newpackages=0
302                self.listpackages=""
303                if (len(packages))>0:
304                        for item in packages:
305                                if packages[item]["install"]==None:
306                                                self.newpackages=int(self.newpackages) + 1
307                                self.listpackages=str(self.listpackages) + item +" "           
308
309                return packages
310
311        #def getPackagesToUpdate               
312                       
313        def checkingIncorrectFlavours(self):
314               
315                incorrectFlavours=self.lliurexcore.checkIncorrectFlavours()
316                log_msg="Checking incorrect metapackages. Others metapackages detected: " + str(incorrectFlavours)
317                self.log(log_msg)
318
319                return incorrectFlavours
320       
321        #def checkingIncorrectFlavours         
322               
323        def checkPreviousUpgrade(self):
324               
325                error=False
326                if self.returncode_initflavour!=0:
327                        error=True
328
329                else:
330                        if self.version_update["candidate"]!=None:
331                                if self.version_update["installed"]!=self.version_update["candidate"]:
332                                        error=True
333                        else:
334                                if self.version_update["installed"]!=self.version_available["candidate"]:       
335                                        error=True
336
337                return error
338
339        #def checkPreviousUpgrade               
340
341        def preActionsScript(self,extra_args):
342
343                print("  [Lliurex-Up]: Preparing system to update")
344
345                if extra_args["unattendend_upgrade"]:
346                        command="DEBIAN_FRONTEND=noninteractive " + self.lliurexcore.preActionsScript()
347                else:
348                        command=self.lliurexcore.preActionsScript()             
349               
350                try:
351                        #os.system(command)
352                        p=subprocess.Popen(command,shell=True,stderr=subprocess.PIPE)
353                        output=p.communicate()
354                        error=self.readErrorOutput(output[1])
355                        if error:
356                                print("  [Lliurex-Up]: Preparing system to update. Error: " +'\n'+str(output[1]))
357                                log_msg="Exec Pre-Actions. Error: %s"%output[1]
358                        else:
359                                log_msg="Exec Pre-Actions. OK"
360
361                except Exception as e:
362                        print("  [Lliurex-Up]: Preparing system to update. Error: " +'\n'+str(e))
363                        log_msg="Exec Pre-Actions. Error " +str(e)
364                       
365
366                self.log(log_msg)       
367
368        #def preActionsScript                   
369
370        def distUpgrade(self,extra_args):
371
372                print("  [Lliurex-Up]: Downloading and installing packages")
373
374                if extra_args["unattendend_upgrade"]:
375                        command="DEBIAN_FRONTEND=noninteractive " + self.lliurexcore.distUpgradeProcess()
376                else:
377                        command=self.lliurexcore.distUpgradeProcess()
378
379                try:
380                        #os.system(command)
381                        p=subprocess.Popen(command,shell=True,stderr=subprocess.PIPE)
382                        output=p.communicate()
383                        error=self.readErrorOutput(output[1])
384                        if error:
385                                print("  [Lliurex-Up]: Downloading and installing packages. Error: "+ '\n' +str(output[1]))
386                                log_msg="Exec Dist-upgrade. Error: %s"%output[1]
387                        else:
388                                log_msg="Exec Dist-upgrade. OK"
389               
390                except Exception as e:
391                        print("  [Lliurex-Up]: Downloading and installing packages. Error: " + '\n' +str(e))
392                        log_msg="Exec Dist-uggrade.Error : " +str(e)
393
394                self.log(log_msg)       
395                       
396        #def distUpgrade               
397
398        def postActionsScript(self,extra_args):
399
400                print("  [Lliurex-Up]: Ending the update")
401
402                self.errorpostaction=False
403
404                if extra_args["unattendend_upgrade"]:
405                        command="DEBIAN_FRONTEND=noninteractive " + self.lliurexcore.postActionsScript() 
406                else:
407                        command=self.lliurexcore.postActionsScript()
408       
409                try:
410                        p=subprocess.Popen(command,shell=True,stderr=subprocess.PIPE)
411                        output=p.communicate()
412
413                        error=self.readErrorOutput(output[1])
414                        if error:
415                                print("  [Lliurex-Up]: Ending the update. Error: " +'\n'+str(output[1]))
416                                self.errorpostaction=True
417                                log_msg="Exec Post-Actions. Error: %s"%output[1]
418                        else:
419                                log_msg="Exec Post-Actions.OK"
420
421                       
422                except Exception as e:
423                        self.errorpostaction=True
424                        print("  [Lliurex-Up]: Ending the update. Error: " +'\n'+str(e))
425                        log_msg="Exec Post-Actions.Error:%s"%e
426
427                self.log(log_msg)       
428
429        #def postActionsScript                 
430
431        def readErrorOutput(self,output):
432
433                cont=0
434                lines=output.split("\n")
435                for line in lines:
436                        if "E: " in line:
437                                cont=cont+1
438
439                if cont>0:
440                        return True
441                else:
442                        return False                   
443
444        #def readErrorOutput
445
446        def checkFinalN4dStatus(self):
447
448                print("  [Lliurex-Up]: Checking N4d status")
449
450                self.lliurexcore.checkN4dStatus()
451               
452                if not self.lliurexcore.n4dStatus:
453                        log_msg="N4d is not working"
454                        self.log(log_msg)
455
456        #def checkFinalN4dStatus               
457
458        def checkingFinalFlavourToInstall(self):
459               
460                print("  [Lliurex-Up]: Checking final metapackage")
461                self.errorfinalmetapackage=False
462                #self.flavourToInstall=self.lliurexcore.checkFinalFlavour()
463                self.checkFinalN4dStatus()
464
465                try:
466                        self.flavourToInstall=self.lliurexcore.checkFlavour()
467
468                        log_msg="Final check metapackage. Metapackage to install:%s"%self.flavourToInstall
469                        self.log(log_msg)
470                                                       
471                        if self.flavourToInstall!=None:
472                                print ("  [Lliurex-Up]: Install of metapackage is required:%s"%self.flavourToInstall)
473                       
474                                if extra_args["unattendend_upgrade"]:
475                                        command="DEBIAN_FRONTEND=noninteractive " + self.lliurexcore.installFinalFlavour(self.flavourToInstall)
476                                else:
477                                        command=self.lliurexcore.installFinalFlavour(self.flavourToInstall)
478
479                                try:
480
481                                        p=subprocess.Popen(command,shell=True,stderr=subprocess.PIPE)
482                                        output=p.communicate()
483
484                                        error=self.readErrorOutput(output[1])
485
486                                        if error:
487                                                self.errorfinalmetapackage=True
488                                                print ("  [Lliurex-Up]: Install of metapackage. Error: " +'\n'+str(output[1]))
489                                                log_msg="Final install metapackage. Error %s"%output[1]
490                                        else:
491                                                log_msg="Final install metapackage.OK"
492
493
494                                except Exception as e:
495                                        self.errorfinalmetapackage=True
496                                        print ("  [Lliurex-Up]: Install of metapackage. Error: " +'\n'+str(e))
497                                        log_msg="Install of metapackage. Error:%s"%e
498
499                                self.log(log_msg)       
500                                       
501                                                       
502                        else:
503                                print ("  [Lliurex-Up]: Metapackage is correct. Nothing to do")
504
505                except Exception as e: 
506                        self.errorfinalmetapackage=True
507                        print ("  [Lliurex-Up]: Checking Metapackage. Error:" +'\n'+str(e))
508                        log_msg="Final check metapackage. Error:%s"%e   
509                        self.log(log_msg)       
510                       
511        #def checkingFinalFlavourToInstall             
512                                       
513        def checkFinalUpgrade(self):
514
515
516                print("  [Lliurex-Up]: Checking Dist-upgrade ")
517                error=self.lliurexcore.checkErrorDistUpgrade()
518
519                if error or self.errorfinalmetapackage or self.errorpostaction :
520                        print("  [Lliurex-Up]: The updated process is endend with errors")
521                        log_msg="Dist-upgrade process ending with errors"
522                        self.distUpgrade_OK=False
523               
524                else:                                   
525                        print("  [Lliurex-Up]: The system is now update")       
526                        log_msg="Dist-upgrade process ending OK"
527                        self.distUpgrade_OK=True
528
529               
530                self.log(log_msg)
531               
532        #def checkFinalUpgrade 
533
534        def cleanEnvironment(self):
535
536                self.lliurexcore.cleanEnvironment()
537                self.lliurexcore.cleanLliurexUpLock()
538
539                if self.initActionsArg =="initActionsSai":
540                        origPinningPath="/usr/share/lliurex-up/lliurex-pinning.cfg"
541                        destPinningPath="/etc/apt/preferences.d/lliurex-pinning"
542                        shutil.copy(origPinningPath,destPinningPath)
543
544                return
545
546        #def cleanEnvironment           
547
548        def handler_signal(self,signal,frame):
549               
550                print("\n  [Lliurex-Up]: Cancel process with Ctrl+C signal")
551                log_msg="Cancel process with Ctrl+C signal"
552                self.log(log_msg)
553                if not self.checkingBlock:
554                        self.cleanEnvironment()
555                '''
556                self.lliurexcore.cleanEnvironment()
557                self.lliurexcore.cleanLliurexUpLock()
558                '''
559                sys.exit(0)
560       
561        #def handler_signal
562
563        def log(self,msg):
564               
565                log_file="/var/log/lliurex-up.log"
566                f=open(log_file,"a+")
567                f.write(msg + '\n')
568                f.close()       
569       
570        #def log
571
572
573        def free_space_check():
574               
575                if ((os.statvfs("/").f_bfree * os.statvfs("/").f_bsize) / (1024*1024*1024)) < 2: #less than 2GB available?
576                        print "  [Lliurex-Up]: There's not enough space on disk to upgrade (2 GB needed)"
577                               
578                        sys.exit(1)
579
580#def free_space_check           
581
582        def isLliurexUpLocked(self,extra_args):
583
584                '''
585                if os.path.exists('/var/run/lliurexUp.lock'):
586                        print "  [Lliurex-Up]: Lliurex Up is now running "
587                        sys.exit(1)
588                '''
589                print "  [Lliurex-Up]: Checking if LliureX-Up is running..."
590
591                code=self.lliurexcore.isLliurexUpLocked()
592                log_msg="------------------------------------------\n"+"LLIUREX-UP-CLI STARTING AT: " + datetime.datetime.today().strftime("%d/%m/%y %H:%M:%S") +"\n------------------------------------------"
593
594               
595                if code !=0:
596                        if code!=1:
597                                self.log(log_msg)
598                        self.manageLocker(code,"Lliurex-Up")   
599                else:
600                        self.log(log_msg)
601                                                       
602               
603        #def islliurexup_running       
604
605
606        def isAptLocked(self,extra_args):
607
608                print "  [Lliurex-Up]: Checking if Apt is running..."
609
610                code=self.lliurexcore.isAptLocked()
611               
612                if code !=0:
613                        self.manageLocker(code,"Apt")   
614
615        #def isAptLocked               
616
617       
618        def isDpkgLocked(self,extra_args):
619
620
621                print "  [Lliurex-Up]: Checking if Dpkg is running..."
622
623                code=self.lliurexcore.isDpkgLocked()
624
625                if code !=0:
626                        self.manageLocker(code,"Dpkg") 
627       
628
629        #def isDpkgLocked
630
631        def manageLocker(self,code,action):
632
633                unlocker=True
634                if code==1:
635                        if action!="Lliurex-Up":
636                                log_msg=action+" is running"
637                                self.log(log_msg)
638                        print  "  [Lliurex-Up]: "+action+" is now running. Wait a moment and try again"
639               
640                elif code==3:
641                        log_msg="Apt is running"
642                        self.log(log_msg)
643                        print  "  [Lliurex-Up]: Apt is now running. Wait a moment and try again"
644               
645                elif code==2:
646                        log_msg=action+" is locked"
647                        self.log(log_msg)
648                        if not extra_args["unattendend_upgrade"]:
649                                response=raw_input( '  [Lliurex-Up]: '+action+' seems blocked by a failed previous execution. Lliurex-Up can not continue if this block is maintained.You want to try to unlock it (yes/no)?')
650                                if response.startswith('y'):
651                                        self.pulsate_unlocking_process()
652                                else:
653                                        unlocker=False
654                        else:
655                                unlocker=False
656
657                if not unlocker:
658                        print  "  [Lliurex-Up]: "+action+ " seems blocked by a failed previous execution. Unabled to update de sytem"   
659               
660                sys.exit(1)                     
661
662
663        def pulsate_unlocking_process(self):
664
665                self.endProcess=False
666               
667                result_queue=multiprocessing.Queue()
668                self.unlocking_t=multiprocessing.Process(target=self.unlocking_process,args=(result_queue,))
669                self.unlocking_t.start()
670               
671
672                progressbar= ["[    ]","[=   ]","[==  ]","[=== ]","[====]","[ ===]","[  ==]","[   =]","[    ]","[   =]","[  ==]","[ ===]","[====]","[=== ]","[==  ]","[=   ]"]
673                i=1
674                while self.unlocking_t.is_alive():
675                        time.sleep(0.5)
676                        per=i%16
677                        sys.stdout.write("  [Lliurex-Up]: The unlocking process is running. Wait a moment " + progressbar[per])
678                        sys.stdout.flush()
679                        sys.stdout.write("\r\33[2K")
680                        i+=1
681
682                result=result_queue.get()
683               
684                if result ==0:
685                        sys.stdout.flush()
686                        log_msg="The unlocking process finished successfully"
687                        self.log(log_msg)
688                        os.execv("/usr/sbin/lliurex-upgrade",sys.argv)
689                else:
690                        if result==1:
691                                print  "  [Lliurex-Up]: The unlocking process has failed"
692                                log_msg="The unlocking process has failed"
693                        else:
694                                print  "  [Lliurex-Up]: Some process are running. Wait a moment and try again"
695                                log_msg="Some process are running. Wait a moment and try again"
696       
697                        self.log(log_msg)
698                        sys.exit(1)
699
700
701        #def pulsate_unlocking_process
702
703        def unlocking_process(self,result_queue):
704
705                cmd=self.lliurexcore.unlockerCommand()
706                p=subprocess.call(cmd,shell=True,stdout=subprocess.PIPE)
707                result_queue.put(p)
708
709        #def unlocking_process 
710               
711       
712        def main(self,mode,extra_args=None):
713
714                self.isLliurexUpLocked(extra_args)
715                self.isAptLocked(extra_args)
716                self.isDpkgLocked(extra_args)
717                self.startLliurexUp(mode)
718                self.checkInitialFlavour(extra_args)
719
720                '''
721                if mode=="sai":
722                        self.initActionsArg="initActionsSai"
723                       
724                else:
725                        mode="normal"
726                        self.initActionsArg="initActions"       
727
728                '''
729                log_msg="Mode of execution: " + str(self.mode)
730                self.log(log_msg)
731                log_msg="Extra args: " + str(extra_args)
732                self.log(log_msg)
733                       
734                if not self.canConnectToLliurexNet():
735                        print("  [Lliurex-Up]: Unable to connect to lliurex.net")
736                        self.cleanEnvironment()
737                        '''
738                        self.lliurexcore.cleanEnvironment()
739                        self.lliurexcore.cleanLliurexUpLock()
740                        '''
741                        return 1
742                       
743                clientCheckingMirror=self.clientCheckingMirrorIsRunning()
744               
745                if clientCheckingMirror!=False:
746                        if clientCheckingMirror:
747                                print("  [Lliurex-Up]: Mirror is being updated in server. Unable to update the system")
748                        else:
749                                print("  [Lliurex-Up]: Unable to connect with server")
750
751                        self.cleanEnvironment()
752                        '''
753                        self.lliurexcore.cleanEnvironment()
754                        self.lliurexcore.cleanLliurexUpLock()
755                        '''
756                        return 1
757                       
758                self.initActionsScript(extra_args)
759                self.checkLliurexUp()
760
761                if extra_args["mirror"]:
762                        self.checkMirror(extra_args)
763
764                self.getLliurexVersionLocal()
765                self.getLliurexVersionLliurexNet()
766                self.checkingInitialFlavourToInstall()
767                self.packages=self.getPackagesToUpdate()
768
769                if len(self.packages)>0:
770                        if not self.checkingIncorrectFlavours():
771                                print self.listpackages
772                                print("  [Lliurex-Up]: Number of packages to update: " +  str(len(self.packages)) + " (" + str(self.newpackages) + " news)" )
773                                if not extra_args["unattendend_upgrade"]:
774                                        response=raw_input('  [Lliurex-Up]: Do you want to update the system (yes/no)): ').lower()
775                                else:
776                                        response="yes"
777
778                                if response.startswith('y'):
779                                        self.preActionsScript(extra_args)
780                                        self.distUpgrade(extra_args)
781                                        self.postActionsScript(extra_args)
782                                        time.sleep(5)
783                                        self.checkingFinalFlavourToInstall()   
784                                        self.checkFinalUpgrade()
785                                        self.cleanEnvironment()
786                                        '''
787                                        self.lliurexcore.cleanEnvironment()
788                                        self.lliurexcore.cleanLliurexUpLock()
789                                        '''
790                                        if self.distUpgrade_OK:
791                                                return 0
792                                        else:
793                                                return 1
794
795
796                                else:
797                                        log_msg="Cancel the update"
798                                        self.log(log_msg)
799                                        print("  [Lliurex-Up]: Cancel the update")
800                                        self.cleanEnvironment()
801                                        '''
802                                        self.lliurexcore.cleanEnvironment()
803                                        self.lliurexcore.cleanLliurexUpLock()
804                                        '''     
805                                        return 0
806                        else:
807                                print("[Lliurex-Up]: Updated abort for incorrect flavours detected in new update")
808                                log_msg="Updated abort for incorrect flavours detected in new update"
809                                self.log(log_msg)
810                                self.cleanEnvironment()
811                                '''
812                                self.lliurexcore.cleanEnvironment()
813                                self.lliurexcore.cleanLliurexUpLock()
814                                '''
815                                return 1                       
816                else:
817                        if not self.checkPreviousUpgrade():
818                                print("  [Lliurex-Up]: Your system is updated. Nothing to do")
819                                log_msg="System updated. Nothing to do"
820                                self.log(log_msg)
821                                self.cleanEnvironment()
822                                '''
823                                self.lliurexcore.cleanEnvironment()
824                                self.lliurexcore.cleanLliurexUpLock()
825                                '''
826                                return 0
827                        else:
828                                print("  [Lliurex-Up]: Updated abort. An error occurred checking new updates")
829                                log_msg=" Updated abort. An error occurred checking new updates"
830                                self.log(log_msg)
831                                self.cleanEnvironment()
832                                '''
833                                self.lliurexcore.cleanEnvironment()
834                                self.lliurexcore.cleanLliurexUpLock()
835                                '''
836                                return 1
837        #def main                       
838                                       
839
840def     usage():
841        puts("Usage")
842        with indent(4):
843                puts("lliurex-upgrade [FLAGS...]")
844                puts("Flags")
845                with indent(4):
846                        puts("-h --help:                Show help")
847                        puts("-s --sai:         Update the system without pinning and enable try to update without conection to lliurex.net")   
848                        puts("-u --unattended:  Update the system in unattended mode. Does not require confirmation to update mirror and system")
849                        puts("-n --no-mirror:           Update the system without checking mirror")
850                        puts("-r --repositories:        Update the system adding mirror and lliurex.net repositories (only valid for clients)")
851
852
853        sys.exit(1)             
854
855#def usage
856
857
858'''
859def free_space_check():
860               
861        if ((os.statvfs("/").f_bfree * os.statvfs("/").f_bsize) / (1024*1024*1024)) < 2: #less than 2GB available?
862                print "  [Lliurex-Up]: There's not enough space on disk to upgrade (2 GB needed)"
863                       
864                sys.exit(1)
865
866#def free_space_check           
867
868def islliurexup_running(self):
869
870       
871        #if os.path.exists('/var/run/lliurexUp.lock'):
872        #       print "  [Lliurex-Up]: Lliurex Up is now running "
873        #       sys.exit(1)
874       
875        print "  [Lliurex-Up]: Checking if LliureX-Up is running..."
876
877        code=self.lliurexcore.isLliurexUpLocked()
878
879        if code==1:
880                print  "  [Lliurex-Up]: Lliurex-UP is now running. Wait a moment and try again"
881        elif code==2:
882                print  "  [Lliurex-Up]: Lliurex Up is locked for previous failed execution."
883
884        if code !=0:
885                sys.exit(1)     
886
887#def isllliurexup_running
888'''
889
890
891if __name__ == '__main__':
892       
893        #lliurexupcli = LliurexUpCli()
894
895        if os.geteuid() != 0:
896                print "  [Lliurex-Up]: You need be root!"
897                sys.exit(1)
898
899        '''
900        self.islliurexup_running()
901        self.free_space_check()
902        '''
903        mode=None
904        options=0       
905        extra_args={}
906        extra_args["mirror"]=True
907        extra_args["unattended_mirror"]=False
908        extra_args["unattendend_upgrade"]=False
909        extra_args["repositories"]=False
910
911        args=arguments.Args().copy
912       
913        if args.contains(["-h", "--help"]):
914                usage()
915       
916        if args.contains(["-s", "--sai"]):
917                mode="sai"
918                options=1
919
920        if args.contains(["-u", "--unattended"]):
921                extra_args["unattendend_upgrade"]=True
922                extra_args["unattended_mirror"]=True
923                options=1
924
925        if args.contains(["-r","--repositories"]):
926                extra_args["repositories"]=True
927                options=1
928       
929        if args.contains(["-n", "--no-mirror"]):
930                extra_args["mirror"]=False
931                options=1
932        else:
933                if len(args)>0 and options==0:
934                        usage() 
935       
936        lliurexupcli = LliurexUpCli()   
937        sys.exit(lliurexupcli.main(mode,extra_args))
Note: See TracBrowser for help on using the repository browser.