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

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

WIP in clients checks

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