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

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

Add Ctr+c handler signal to cli

  • Property svn:executable set to *
File size: 14.6 KB
Line 
1#!/usr/bin/env python
2
3from clint import arguments
4from clint.textui import puts, indent, colored
5import lliurex.lliurexup
6import os
7import subprocess
8import sys
9import commands
10import datetime
11import time
12import signal
13signal.signal(signal.SIGINT,signal.SIG_IGN)
14
15class LliurexUpCli(object):
16        def __init__(self):
17
18               
19                self.lliurexcore = lliurex.lliurexup.LliurexUpCore()
20                log_msg="------------------------------------------\n"+"LLIUREX-UP-CLI STARTING AT: " + datetime.datetime.today().strftime("%d/%m/%y %H:%M:%S") +"\n------------------------------------------"
21                self.log(log_msg)
22                signal.signal(signal.SIGINT,self.handler_signal)
23                self.checkInitialFlavour()
24       
25        #def __init__
26       
27        def checkInitialFlavour(self):
28
29                self.targetMetapackage=self.lliurexcore.checkInitialFlavour()
30                log_msg="Initial check metapackage. Metapackage to install: " + str(self.targetMetapackage)
31                self.log(log_msg)
32                log_msg="Get initial flavours: " + str(self.lliurexcore.previousFlavours)
33                self.log(log_msg)
34               
35        #def checkInitialFlavour       
36               
37
38        def canConnectToLliurexNet(self):
39
40                print("  [Lliurex-up]: Checking connection to lliurex.net")
41                can_connect=self.lliurexcore.canConnectToLliurexNet()
42                if can_connect:
43                                log_msg="Can connect to lliurex.net: True"
44                                self.log(log_msg)
45                                return True
46                else:
47                        log_msg="Can connect to lliurex.net: False"
48                        self.log(log_msg)
49
50                        if "lliurex-meta-server" == self.targetMetapackage or "server" in self.lliurexcore.previousFlavours:
51                                self.lliurexcore.cleanEnvironment()
52                                self.lliurexcore.cleanLliurexUpLock()
53                                return False
54                        else:
55                                return True
56                               
57        #def canConnectToLliurexNet                     
58                               
59        def clientCheckingMirrorIsRunning(self):
60               
61                is_mirror_running_inserver=self.lliurexcore.clientCheckingMirrorIsRunning()
62               
63                if is_mirror_running_inserver['ismirrorrunning'] ==None:
64                        log_msg="Checking if mirror in server is being updated. Error: " + str(is_mirror_running_inserver['exception'])
65                        self.log(log_msg)
66                else:
67                        if is_mirror_running_inserver['ismirrorrunning']:
68                                log_msg="Mirror is being udpated in server. Unable to update the system"
69                                self.log(log_msg)
70               
71                return is_mirror_running_inserver['ismirrorrunning']
72               
73                       
74        #def clientCheckingMirrorIsRunning             
75       
76        def initActionsScript(self):
77
78                print("  [Lliurex-up]: Checking system")
79               
80                command=self.lliurexcore.initActionsScript(self.initActionsArg)
81               
82                try:
83                        #os.system(command)
84                        subprocess.Popen(command,shell=True).communicate()
85                        log_msg="Exec Init-Actions"
86                        self.log(log_msg)       
87                except Exception as e:
88                        log_msg="Exec Init-Actions.Error: " +str(e)
89                        self.log(log_msg)
90                        print e
91                       
92        #def initActionsScript
93       
94        def checkLliurexUp(self):
95
96                print("  [Lliurex-up]: Looking for new version of Lliurex Up")
97
98                is_lliurexup_updated=self.lliurexcore.isLliurexUpIsUpdated()
99
100
101                if not is_lliurexup_updated:
102                        print ("  [Lliurex-up]: Updating Lliurex Up")
103                        is_lliurexup_installed=self.lliurexcore.installLliurexUp()
104                        log_msg="Installing lliurex-up. Returncode: " + str(is_lliurexup_installed['returncode']) + ". Error: " + str(is_lliurexup_installed['stderrs'])
105                        self.log(log_msg)
106                        print ("  [Lliurex-up]: Lliurex Up is now udpate and will be reboot now" )
107                        time.sleep(3)
108                        self.lliurexcore.cleanLliurexUpLock()
109                        os.execv("/usr/sbin/lliurex-upgrade",sys.argv) 
110
111                else:
112                        log_msg="Checking lliurex-up. Is lliurex-up updated: "+ str(is_lliurexup_updated)
113                        self.log(log_msg)
114                        print ("  [Lliurex-up]: Lliurex Up is updated.Nothing to do")   
115                       
116        #def checkLliurexUp             
117
118        def checkMirror(self,extra_args=None):
119
120                print("  [Lliurex-up]: Checking if mirror is updated")
121
122                is_mirror_updated=self.lliurexcore.lliurexMirrorIsUpdated()
123
124                if is_mirror_updated !=None:
125                        is_mirror_running=self.lliurexcore.lliurexMirrorIsRunning()
126                        if is_mirror_running:
127                                print("  [Lliurex-up]: Updating mirror. Wait a moment please")
128                                command='lliurex-mirror update llx16'
129                                #os.system(command)
130                                subprocess.Popen(command,shell=True).communicate()
131
132                        else:
133                                if is_mirror_updated['action']=='update':
134                                        log_msg="Checking mirror. Is mirror update: False"
135                                        self.log(log_msg)
136                                        if not is_mirror_running:
137                                                if not extra_args["unattended_mirror"]:
138                                                        response=raw_input('  [LLiurex-up]: Do you want update mirror (yes/no): ').lower()
139                                                else:
140                                                        response="yes"
141
142                                                if response.startswith('y'):
143                                                        log_msg="Update lliurex-mirror: Yes"
144                                                        self.log(log_msg)
145                                                        print("  [Lliurex-up]: Updating mirror. Wait a moment please")
146                                                        command='lliurex-mirror update llx16'
147                                                        #os.system(command)
148                                                        subprocess.Popen(command,shell=True).communicate()
149
150                                                else:
151                                                        log_msg="Update lliurex-mirror: No"
152                                                        self.log(log_msg)
153                                                        print("  [Lliurex-up]: Mirror update.Nothing to do")           
154                else:
155                        log_msg="Checking mirror. Is mirror update: None"
156                        self.log(log_msg)
157                        print("  [Lliurex-up]: Nothing to do with mirror")
158                       
159        #def checkMirror               
160
161        def getLliurexVersionLocal(self):
162
163                print("  [Lliurex-up]: Looking for LliurexVersion from local repository")
164               
165                self.version_update=self.lliurexcore.getLliurexVersionLocal()
166                log_msg="Get LliurexVersion installed: " + str(self.version_update["installed"])
167                self.log(log_msg)
168                log_msg="Get LliurexVersion candidate from Local repository: " + str(self.version_update["candidate"])
169                self.log(log_msg)
170
171        #def getLliurexVersionLocal     
172       
173
174        def getLliurexVersionLliurexNet(self):
175       
176                print("  [Lliurex-up]: Looking for LliurexVersion from lliurex.net")
177
178                self.version_available=self.lliurexcore.getLliurexVersionLliurexNet()
179                log_msg="Get LliurexVersion candidate from Lliurex Net: " + str(self.version_available["candidate"])
180                self.log(log_msg)
181       
182        #def getLliurexVersionLliurexNet               
183
184        def checkingInitialFlavourToInstall(self):
185
186                print("  [Lliurex-up]: Checking if installation of metapackage is required")
187
188                self.returncode_initflavour=0
189
190                if self.targetMetapackage == None:
191                       
192                        print "  [Lliurex-up]: Installation of metapackage is not required"
193                       
194                else:
195                        print "  [Lliurex-up]: Installation of metapackage is required: " + str(self.targetMetapackage)
196                        is_flavour_installed=self.lliurexcore.installInitialFlavour(self.targetMetapackage)     
197                        self.returncode_initflavour=is_flavour_installed['returncode']
198                        error=is_flavour_installed['stderrs']
199                        log_msg="Install initial metapackage:" + self.targetMetapackage + ": Returncode: " + str(self.returncode_initflavour) + " Error: " + str(error)
200                        self.log(log_msg)
201                        print "  [Lliurex-up]: Metapackage is now installed: " + str(self.returncode_initflavour) + " Error: " + str(error)
202                       
203        #def checkingInitialFlavourToInstall           
204       
205        def getPackagesToUpdate(self):
206
207                print("  [Lliurex-up]: Looking for new updates")
208                packages=self.lliurexcore.getPackagesToUpdate()
209                log_msg="Get packages to update. Number of packages: "+ str(len(packages))
210                self.log(log_msg)
211
212                self.newpackages=0
213                self.listpackages=""
214                if (len(packages))>0:
215                        for item in packages:
216                                if packages[item]["install"]==None:
217                                                self.newpackages=int(self.newpackages) + 1
218                                self.listpackages=str(self.listpackages) + item +" "           
219
220                return packages
221
222        #def getPackagesToUpdate               
223                       
224        def checkingIncorrectFlavours(self):
225               
226                incorrectFlavours=self.lliurexcore.checkIncorrectFlavours()
227                log_msg="Checking incorrect metapackages. Others metapackages detected: " + str(incorrectFlavours)
228                self.log(log_msg)
229
230                return incorrectFlavours
231       
232        #def checkingIncorrectFlavours         
233               
234        def checkPreviousUpgrade(self):
235               
236                error=False
237                if self.returncode_initflavour!=0:
238                        error=True
239
240                else:
241                        if self.version_update["candidate"]!=None:
242                                if self.version_update["installed"]!=self.version_update["candidate"]:
243                                        error=True
244                        else:
245                                if self.version_update["installed"]!=self.version_available["candidate"]:       
246                                        error=True
247
248                return error
249
250        #def checkPreviousUpgrade               
251
252        def preActionsScript(self):
253
254                print("  [Lliurex-up]: Preparing system to update")
255
256                command=self.lliurexcore.preActionsScript()
257                try:
258                        #os.system(command)
259                        subprocess.Popen(command,shell=True).communicate()
260                        log_msg="Exec Pre-Actions"
261                        self.log(log_msg)
262
263                except Exception as e:
264                        log_msg="Exec Pre-Actions. Error " +str(e)
265                        self.log(log_msg)
266                        print e
267
268        #def preActionsScript                   
269
270        def distUpgrade(self):
271
272                print("  [Lliurex-up]: Downloading and installing packages")
273
274                command=self.lliurexcore.distUpgradeProcess()
275                try:
276                        #os.system(command)
277                        subprocess.Popen(command,shell=True).communicate()
278                        log_msg="Exec Dist-uggrade"
279                        self.log(log_msg)
280                except Exception as e:
281                        log_msg="Exec Dist-uggrade.Error : " +str(e)
282                        self.log(log_msg)
283                        print e
284                       
285        #def distUpgrade               
286
287        def postActionsScript(self):
288
289                print("  [Lliurex-up]: Ending the update")
290                command=self.lliurexcore.postActionsScript()+'| tee ' + self.lliurexcore.errorpostaction_token
291                try:
292                        subprocess.Popen(command,shell=True).communicate()
293                        #os.system(command)
294                        log_msg="Exec Post-Actions"
295                        self.log(log_msg)
296                except Exception as e:
297                        print e
298
299        #def postActionsScript                 
300
301
302        def checkingFinalFlavourToInstall(self):
303               
304                print("  [Lliurex-up]: Checking final metapackage")
305
306                #self.flavourToInstall=self.lliurexcore.checkFinalFlavour()
307                self.flavourToInstall=self.lliurexcore.checkFlavour()
308
309                log_msg="Final check metapackage. Metapackage to install: " + str(self.flavourToInstall)
310                self.log(log_msg)
311               
312                if self.flavourToInstall!=None:
313                        print ("  [Lliurex-up]: Install of metapackage is required: " + str(self.flavourToInstall))
314                       
315                        command=self.lliurexcore.installFinalFlavour(self.flavourToInstall)
316                        try:
317                                #os.system(command)
318                                subprocess.Popen(command,shell=True).communicate()
319
320                        except Exception as e:
321                                print e
322                else:
323                        print ("  [Lliurex-up]: Metapackage is correct. Nothing to do")
324                       
325        #def checkingFinalFlavourToInstall             
326                                       
327        def checkFinalUpgrade(self):
328
329                print("  [Lliurex-up]: Checking Dist-upgrade ")
330                error=self.lliurexcore.checkErrorDistUpgrade()
331
332                if error:
333                        print("  [Lliurex-up]: The updated process is endend with errors")
334                        log_msg="Dist-upgrade process ending with errors"
335               
336                else:                                   
337                        print("  [Lliurex-up]: The system is now update")       
338                        log_msg="Dist-upgrade process ending OK"
339               
340                self.log(log_msg)
341               
342        #def checkFinalUpgrade 
343
344        def handler_signal(self,signal,frame):
345               
346                print("\n  [Lliurex-up]: Cancel process with Ctr+c signal")
347                log_msg="Cancel process with Ctr+c signal"
348                self.log(log_msg)
349                self.lliurexcore.cleanEnvironment()
350                self.lliurexcore.cleanLliurexUpLock()
351                sys.exit(1)
352       
353        #def handler_signal
354
355        def log(self,msg):
356               
357                log_file="/var/log/lliurex-up.log"
358                f=open(log_file,"a+")
359                f.write(msg + '\n')
360                f.close()       
361       
362        #def log
363
364       
365        def main(self,mode,extra_args=None):
366
367                if mode=="sai":
368                        self.initActionsArg="initActionsSai"
369                       
370                else:
371                        mode="nomal"
372                        self.initActionsArg="initActions"       
373
374                log_msg="Mode of execution: " + str(mode)
375                self.log(log_msg)
376                log_msg="Extra args: " + str(extra_args)
377                self.log(log_msg)
378                       
379                if not self.canConnectToLliurexNet():
380                        print("  [Lliurex-up]: Unable to connect to lliurex.net")
381                        self.lliurexcore.cleanEnvironment()
382                        self.lliurexcore.cleanLliurexUpLock()
383                        return 1
384                       
385                clientCheckingMirror=self.clientCheckingMirrorIsRunning()
386                if clientCheckingMirror!=False:
387                        if clientCheckingMirror:
388                                print("  [Lliurex-up]: Mirror is being udpated in server. Unable to update the system")
389                        else:
390                                print("  [Lliurex-up]: Unable to connect with server")
391
392                        self.lliurexcore.cleanEnvironment()
393                        self.lliurexcore.cleanLliurexUpLock()
394                        return 1
395                       
396                self.initActionsScript()
397                self.checkLliurexUp()
398
399                if extra_args["mirror"]:
400                        self.checkMirror(extra_args)
401
402                self.getLliurexVersionLocal()
403                self.getLliurexVersionLliurexNet()
404                self.checkingInitialFlavourToInstall()
405                self.packages=self.getPackagesToUpdate()
406
407                if len(self.packages)>0:
408                        if not self.checkingIncorrectFlavours():
409                                print self.listpackages
410                                print("  [Lliurex-up]: Number of packages to update: " +  str(len(self.packages)) + " (" + str(self.newpackages) + " news)" )
411                                if not extra_args["unattendend_upgrade"]:
412                                        response=raw_input('  [LLiurex-up]: Do you want to update the system (yes/no)): ').lower()
413                                else:
414                                        response="yes"
415
416                                if response.startswith('y'):
417                                        self.preActionsScript()
418                                        self.distUpgrade()
419                                        self.postActionsScript()
420                                        self.checkingFinalFlavourToInstall()   
421                                        self.checkFinalUpgrade()
422                                        self.lliurexcore.cleanEnvironment()
423                                        self.lliurexcore.cleanLliurexUpLock()
424
425
426                                else:
427                                        log_msg="Cancel the update"
428                                        self.log(log_msg)
429                                        print("  [Lliurex-up]: Cancel the update")
430                                        self.lliurexcore.cleanEnvironment()
431                                        self.lliurexcore.cleanLliurexUpLock()
432
433                                        return 0
434                        else:
435                                print("[Lliurex-up]: Updated abort for incorrect flavours detected in new update")
436                                self.lliurexcore.cleanEnvironment()
437                                self.lliurexcore.cleanLliurexUpLock()
438
439                                return 1                       
440                else:
441                        if not self.checkPreviousUpgrade():
442                                print("  [Lliurex-up]: Your systems is updated. Nothing to do")
443                                self.lliurexcore.cleanEnvironment()
444                                self.lliurexcore.cleanLliurexUpLock()
445
446                                return 0
447                        else:
448                                print("  [Lliurex-up]: Updated abort. An error occurred checking new updates")
449                                self.lliurexcore.cleanEnvironment()
450                                self.lliurexcore.cleanLliurexUpLock()
451
452                                return 1
453        #def main                       
454                                       
455
456def     usage():
457        puts("Usage")
458        with indent(4):
459                puts("lliurex-upgrade [FLAGS...]")
460                puts("Flags")
461                with indent(4):
462                        puts("-h --help:                Show help")
463                        puts("-s --sai:         Update the system without pinning")     
464                        puts("-u --unattended:  Update the system in unattended mode. Does not require confirmation to update mirror and system")
465                        puts("-n --no-mirror:           Update the system without checking mirror")
466
467        sys.exit(1)             
468
469#def usage
470
471def free_space_check():
472               
473        if ((os.statvfs("/").f_bfree * os.statvfs("/").f_bsize) / (1024*1024*1024)) < 2: #less than 2GB available?
474                print "  [Lliurex-up]: There's not enough space on disk to upgrade (2 GB needed)"
475                       
476                sys.exit(1)
477
478#def free_space_check           
479
480def islliurexup_running():
481
482        if os.path.exists('/var/run/lliurexUp.lock'):
483                print "  [Lliurex-up]: Lliurex Up is now running "
484                sys.exit(1)
485
486#def isllliurexup_running
487
488
489if __name__ == '__main__':
490        if os.geteuid() != 0:
491                print "  [Lliurex-up]: You need be root!"
492                sys.exit(1)
493
494        islliurexup_running()
495        free_space_check()     
496        mode=None
497        options=0       
498        extra_args={}
499        extra_args["mirror"]=True
500        extra_args["unattended_mirror"]=False
501        extra_args["unattendend_upgrade"]=False
502
503        args=arguments.Args().copy
504       
505        if args.contains(["-h", "--help"]):
506                usage()
507       
508        if args.contains(["-s", "--sai"]):
509                mode="sai"
510                options=1
511
512        if args.contains(["-u", "--unattended"]):
513                extra_args["unattendend_upgrade"]=True
514                extra_args["unattended_mirror"]=True
515                options=1
516       
517        if args.contains(["-n", "--no-mirror"]):
518                extra_args["mirror"]=False
519                options=1
520        else:
521                if len(args)>0 and options==0:
522                        usage() 
523       
524        lliurexupcli = LliurexUpCli()   
525        sys.exit(lliurexupcli.main(mode,extra_args))
Note: See TracBrowser for help on using the repository browser.