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

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

Fix code

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