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

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

Wip in integration with dpkg-unlocker

  • Property svn:executable set to *
File size: 25.0 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                        print  "  [Lliurex-Up]: The unlocking process has failed"
691                        log_msg="The unlocking process has failed"
692                        self.log(log_msg)
693                        sys.exit(1)
694
695
696        #def pulsate_unlocking_process
697
698        def unlocking_process(self,result_queue):
699
700                cmd=self.lliurexcore.unlockerCommand()
701                p=subprocess.call(cmd,shell=True,stdout=subprocess.PIPE)
702                result_queue.put(p)
703
704        #def unlocking_process 
705               
706       
707        def main(self,mode,extra_args=None):
708
709                self.isLliurexUpLocked(extra_args)
710                self.isAptLocked(extra_args)
711                self.isDpkgLocked(extra_args)
712                self.startLliurexUp(mode)
713                self.checkInitialFlavour(extra_args)
714
715                '''
716                if mode=="sai":
717                        self.initActionsArg="initActionsSai"
718                       
719                else:
720                        mode="normal"
721                        self.initActionsArg="initActions"       
722
723                '''
724                log_msg="Mode of execution: " + str(self.mode)
725                self.log(log_msg)
726                log_msg="Extra args: " + str(extra_args)
727                self.log(log_msg)
728                       
729                if not self.canConnectToLliurexNet():
730                        print("  [Lliurex-Up]: Unable to connect to lliurex.net")
731                        self.cleanEnvironment()
732                        '''
733                        self.lliurexcore.cleanEnvironment()
734                        self.lliurexcore.cleanLliurexUpLock()
735                        '''
736                        return 1
737                       
738                clientCheckingMirror=self.clientCheckingMirrorIsRunning()
739               
740                if clientCheckingMirror!=False:
741                        if clientCheckingMirror:
742                                print("  [Lliurex-Up]: Mirror is being updated in server. Unable to update the system")
743                        else:
744                                print("  [Lliurex-Up]: Unable to connect with server")
745
746                        self.cleanEnvironment()
747                        '''
748                        self.lliurexcore.cleanEnvironment()
749                        self.lliurexcore.cleanLliurexUpLock()
750                        '''
751                        return 1
752                       
753                self.initActionsScript(extra_args)
754                self.checkLliurexUp()
755
756                if extra_args["mirror"]:
757                        self.checkMirror(extra_args)
758
759                self.getLliurexVersionLocal()
760                self.getLliurexVersionLliurexNet()
761                self.checkingInitialFlavourToInstall()
762                self.packages=self.getPackagesToUpdate()
763
764                if len(self.packages)>0:
765                        if not self.checkingIncorrectFlavours():
766                                print self.listpackages
767                                print("  [Lliurex-Up]: Number of packages to update: " +  str(len(self.packages)) + " (" + str(self.newpackages) + " news)" )
768                                if not extra_args["unattendend_upgrade"]:
769                                        response=raw_input('  [Lliurex-Up]: Do you want to update the system (yes/no)): ').lower()
770                                else:
771                                        response="yes"
772
773                                if response.startswith('y'):
774                                        self.preActionsScript(extra_args)
775                                        self.distUpgrade(extra_args)
776                                        self.postActionsScript(extra_args)
777                                        time.sleep(5)
778                                        self.checkingFinalFlavourToInstall()   
779                                        self.checkFinalUpgrade()
780                                        self.cleanEnvironment()
781                                        '''
782                                        self.lliurexcore.cleanEnvironment()
783                                        self.lliurexcore.cleanLliurexUpLock()
784                                        '''
785                                        if self.distUpgrade_OK:
786                                                return 0
787                                        else:
788                                                return 1
789
790
791                                else:
792                                        log_msg="Cancel the update"
793                                        self.log(log_msg)
794                                        print("  [Lliurex-Up]: Cancel the update")
795                                        self.cleanEnvironment()
796                                        '''
797                                        self.lliurexcore.cleanEnvironment()
798                                        self.lliurexcore.cleanLliurexUpLock()
799                                        '''     
800                                        return 0
801                        else:
802                                print("[Lliurex-Up]: Updated abort for incorrect flavours detected in new update")
803                                log_msg="Updated abort for incorrect flavours detected in new update"
804                                self.log(log_msg)
805                                self.cleanEnvironment()
806                                '''
807                                self.lliurexcore.cleanEnvironment()
808                                self.lliurexcore.cleanLliurexUpLock()
809                                '''
810                                return 1                       
811                else:
812                        if not self.checkPreviousUpgrade():
813                                print("  [Lliurex-Up]: Your system is updated. Nothing to do")
814                                log_msg="System updated. Nothing to do"
815                                self.log(log_msg)
816                                self.cleanEnvironment()
817                                '''
818                                self.lliurexcore.cleanEnvironment()
819                                self.lliurexcore.cleanLliurexUpLock()
820                                '''
821                                return 0
822                        else:
823                                print("  [Lliurex-Up]: Updated abort. An error occurred checking new updates")
824                                log_msg=" Updated abort. An error occurred checking new updates"
825                                self.log(log_msg)
826                                self.cleanEnvironment()
827                                '''
828                                self.lliurexcore.cleanEnvironment()
829                                self.lliurexcore.cleanLliurexUpLock()
830                                '''
831                                return 1
832        #def main                       
833                                       
834
835def     usage():
836        puts("Usage")
837        with indent(4):
838                puts("lliurex-upgrade [FLAGS...]")
839                puts("Flags")
840                with indent(4):
841                        puts("-h --help:                Show help")
842                        puts("-s --sai:         Update the system without pinning and enable try to update without conection to lliurex.net")   
843                        puts("-u --unattended:  Update the system in unattended mode. Does not require confirmation to update mirror and system")
844                        puts("-n --no-mirror:           Update the system without checking mirror")
845                        puts("-r --repositories:        Update the system adding mirror and lliurex.net repositories (only valid for clients)")
846
847
848        sys.exit(1)             
849
850#def usage
851
852
853'''
854def free_space_check():
855               
856        if ((os.statvfs("/").f_bfree * os.statvfs("/").f_bsize) / (1024*1024*1024)) < 2: #less than 2GB available?
857                print "  [Lliurex-Up]: There's not enough space on disk to upgrade (2 GB needed)"
858                       
859                sys.exit(1)
860
861#def free_space_check           
862
863def islliurexup_running(self):
864
865       
866        #if os.path.exists('/var/run/lliurexUp.lock'):
867        #       print "  [Lliurex-Up]: Lliurex Up is now running "
868        #       sys.exit(1)
869       
870        print "  [Lliurex-Up]: Checking if LliureX-Up is running..."
871
872        code=self.lliurexcore.isLliurexUpLocked()
873
874        if code==1:
875                print  "  [Lliurex-Up]: Lliurex-UP is now running. Wait a moment and try again"
876        elif code==2:
877                print  "  [Lliurex-Up]: Lliurex Up is locked for previous failed execution."
878
879        if code !=0:
880                sys.exit(1)     
881
882#def isllliurexup_running
883'''
884
885
886if __name__ == '__main__':
887       
888        #lliurexupcli = LliurexUpCli()
889
890        if os.geteuid() != 0:
891                print "  [Lliurex-Up]: You need be root!"
892                sys.exit(1)
893
894        '''
895        self.islliurexup_running()
896        self.free_space_check()
897        '''
898        mode=None
899        options=0       
900        extra_args={}
901        extra_args["mirror"]=True
902        extra_args["unattended_mirror"]=False
903        extra_args["unattendend_upgrade"]=False
904        extra_args["repositories"]=False
905
906        args=arguments.Args().copy
907       
908        if args.contains(["-h", "--help"]):
909                usage()
910       
911        if args.contains(["-s", "--sai"]):
912                mode="sai"
913                options=1
914
915        if args.contains(["-u", "--unattended"]):
916                extra_args["unattendend_upgrade"]=True
917                extra_args["unattended_mirror"]=True
918                options=1
919
920        if args.contains(["-r","--repositories"]):
921                extra_args["repositories"]=True
922                options=1
923       
924        if args.contains(["-n", "--no-mirror"]):
925                extra_args["mirror"]=False
926                options=1
927        else:
928                if len(args)>0 and options==0:
929                        usage() 
930       
931        lliurexupcli = LliurexUpCli()   
932        sys.exit(lliurexupcli.main(mode,extra_args))
Note: See TracBrowser for help on using the repository browser.