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

Last change on this file since 3651 was 3651, checked in by jrpelegrina, 3 years ago

WIP in capture Ctrl+c in cli

  • Property svn:executable set to *
File size: 11.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       
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).comunicate()
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                        os.execv("/usr/sbin/lliurex-upgrade",sys.argv) 
82
83                else:
84                        log_msg="Checking lliurex-up. Is lliurex-up updated: "+ str(is_lliurexup_updated)
85                        self.log(log_msg)
86                        print ("  [Lliurex-up]: Lliurex-up is updated.Nothing to do")   
87
88
89        def checkMirror(self):
90
91                print("  [Lliurex-up]: Checking if mirror is updated")
92
93                is_mirror_updated=self.lliurexcore.lliurexMirrorIsUpdated()
94
95                if is_mirror_updated !=None:
96                        is_mirror_running=self.lliurexcore.lliurexMirrorIsRunning()
97                        if is_mirror_running:
98                                print("  [Lliurex-up]: Updating mirror. Wait a moment please")
99                                command='lliurex-mirror update llx16'
100                                #os.system(command)
101                                subprocess.Popen(command,shell=True).comunicate()
102
103                        else:
104                                if is_mirror_updated['action']=='update':
105                                        log_msg="Checking mirror. Is mirror update: False"
106                                        self.log(log_msg)
107                                        if not is_mirror_running:
108                                                response=raw_input('  [LLiurex-up]: Do you want update mirror (yes/no): ').lower()
109                                                if response.startswith('y'):
110                                                        log_msg="Update lliurex-mirror: Yes"
111                                                        self.log(log_msg)
112                                                        print("  [Lliurex-up]: Updating mirror. Wait a moment please")
113                                                        command='lliurex-mirror update llx16'
114                                                        #os.system(command)
115                                                        subprocess.Popen(command,shell=True).comunicate()
116
117                                                else:
118                                                        log_msg="Update lliurex-mirror: No"
119                                                        self.log(log_msg)
120                                                        print("  [Lliurex-up]: Mirror update.Nothing to do")           
121                else:
122                        log_msg="Checking mirror. Is mirror update: None"
123                        self.log(log_msg)
124                        print("  [Lliurex-up]: Nothing to do with mirror")
125
126        def getLliurexVersionLocal(self):
127
128                print("  [Lliurex-up]: Looking for LliurexVersion from local repository")
129               
130                self.version_update=self.lliurexcore.getLliurexVersionLocal()
131                log_msg="Get LliurexVersion installed: " + str(self.version_update["installed"])
132                self.log(log_msg)
133                log_msg="Get LliurexVersion candidate from Local repository: " + str(self.version_update["candidate"])
134                self.log(log_msg)               
135       
136
137        def getLliurexVersionLliurexNet(self):
138       
139                print("  [Lliurex-up]: Looking for LliurexVersion from lliurex.net")
140
141                self.version_available=self.lliurexcore.getLliurexVersionLliurexNet()
142                log_msg="Get LliurexVersion candidate from Lliurex Net: " + str(self.version_available["candidate"])
143                self.log(log_msg)
144
145        def checkingInitialFlavourToInstall(self):
146
147                print("  [Lliurex-up]: Checking if installation of metapackage is required")
148
149                self.returncode_initflavour=0
150
151                if self.targetMetapackage == None:
152                       
153                        print "  [Lliurex-up]: Installation of metapackage is not required"
154                       
155                else:
156                        print "  [Lliurex-up]: Installation of metapackage is required: " + str(self.targetMetapackage)
157                        is_flavour_installed=self.lliurexcore.installInitialFlavour(self.targetMetapackage)     
158                        self.returncode_initflavour=is_flavour_installed['returncode']
159                        error=is_flavour_installed['stderrs']
160                        log_msg="Install initial metapackage:" + self.targetMetapackage + ": Returncode: " + str(self.returncode_initflavour) + " Error: " + str(error)
161                        self.log(log_msg)
162                        print "  [Lliurex-up]: Metapackage is now installed: " + str(self.returncode_initflavour) + " Error: " + str(error)
163
164       
165        def getPackagesToUpdate(self):
166
167                print("  [Lliurex-up]: Looking for new updates")
168                packages=self.lliurexcore.getPackagesToUpdate()
169                log_msg="Get packages to update. Number of packages: "+ str(len(packages))
170                self.log(log_msg)
171
172                self.newpackages=0
173                self.listpackages=""
174                if (len(packages))>0:
175                        for item in packages:
176                                if packages[item]["install"]==None:
177                                                self.newpackages=int(self.newpackages) + 1
178                                self.listpackages=str(self.listpackages) + item +" "           
179
180                return packages
181                       
182        def checkingIncorrectFlavours(self):
183               
184                incorrectFlavours=self.lliurexcore.checkIncorrectFlavours()
185                log_msg="Checking incorrect metapackages. Others metapackages detected: " + str(incorrectFlavours)
186                self.log(log_msg)
187
188                return incorrectFlavours
189               
190
191        def checkPreviousUpgrade(self):
192               
193                error=False
194                if self.returncode_initflavour!=0:
195                        error=True
196
197                else:
198                        if self.version_update["candidate"]!=None:
199                                if self.version_update["installed"]!=self.version_update["candidate"]:
200                                        error=True
201                        else:
202                                if self.version_update["installed"]!=self.version_available["candidate"]:       
203                                        error=True
204
205                return error                   
206
207        def preActionsScript(self):
208
209                print("  [Lliurex-up]: Preparing system to update")
210
211                command=self.lliurexcore.preActionsScript()
212                try:
213                        #os.system(command)
214                        subprocess.Popen(command,shell=True).comunicate()
215                        log_msg="Exec Pre-Actions"
216                        self.log(log_msg)
217
218                except Exception as e:
219                        log_msg="Exec Pre-Actions. Error " +str(e)
220                        self.log(log_msg)
221                        print e
222
223        def distUpgrade(self):
224
225                print("  [Lliurex-up]: Downloading and installing packages")
226
227                command=self.lliurexcore.distUpgradeProcess()
228                try:
229                        #os.system(command)
230                        subprocess.Popen(command,shell=True).comunicate()
231                        log_msg="Exec Dist-uggrade"
232                        self.log(log_msg)
233                except Exception as e:
234                        log_msg="Exec Dist-uggrade.Error : " +str(e)
235                        self.log(log_msg)
236                        print e
237
238        def postActionsScript(self):
239
240                print("  [Lliurex-up]: Ending the update")
241                command=self.lliurexcore.postActionsScript()+'| tee ' + self.lliurexcore.errorpostaction_token
242                try:
243                        subprocess.Popen(command,shell=True).comunicate()
244                        #os.system(command)
245                        log_msg="Exec Post-Actions"
246                        self.log(log_msg)
247                except Exception as e:
248                        print e                         
249
250
251        def checkingFinalFlavourToInstall(self):
252               
253                print("  [Lliurex-up]: Checking final metapackage")
254
255                #self.flavourToInstall=self.lliurexcore.checkFinalFlavour()
256                self.flavourToInstall=self.lliurexcore.checkFlavour()
257
258                log_msg="Final check metapackage. Metapackage to install: " + str(self.flavourToInstall)
259                self.log(log_msg)
260               
261                if self.flavourToInstall!=None:
262                        print ("  [Lliurex-up]: Install of metapackage is required: " + str(self.flavourToInstall))
263                       
264                        command=self.lliurexcore.installFinalFlavour(self.flavourToInstall)
265                        try:
266                                #os.system(command)
267                                subprocess.Popen(command,shell=True).comunicate()
268
269                        except Exception as e:
270                                print e
271                else:
272                        print ("  [Lliurex-up]: Metapackage is correct. Nothing to do")
273                                       
274        def checkFinalUpgrade(self):
275
276                print("  [Lliurex-up]: Checking Dist-upgrade ")
277                error=self.lliurexcore.checkErrorDistUpgrade()
278
279                if error:
280                        print("  [Lliurex-up]: The updated process is endend with errors")
281                        log_msg="Dist-upgrade process ending with errors"
282               
283                else:                                   
284                        print("  [Lliurex-up]: The system is now update")       
285                        log_msg="Dist-upgrade process ending OK"
286               
287                self.log(log_msg)
288
289        def log(self,msg):
290               
291                log_file="/var/log/lliurex-up.log"
292                f=open(log_file,"a+")
293                f.write(msg + '\n')
294                f.close()       
295
296       
297        def main(self,mode):
298
299                if mode=="sai":
300                        self.initActionsArg="initActionsSai"
301                       
302                else:
303                        mode="nomal"
304                        self.initActionsArg="initActions"       
305
306                log_msg="Mode of execution: " + str(mode)
307                self.log(log_msg)
308                       
309                if not self.canConnectToLliurexNet():
310                        print("  [Lliurex-up]: Unable to connect to lliurex.net")
311                        return 1
312
313                self.initActionsScript()
314                self.checkLliurexUp()
315                self.checkMirror()
316                self.getLliurexVersionLocal()
317                self.getLliurexVersionLliurexNet()
318                self.checkingInitialFlavourToInstall()
319                self.packages=self.getPackagesToUpdate()
320
321                if len(self.packages)>0:
322                        if not self.checkingIncorrectFlavours():
323                                print self.listpackages
324                                print("  [Lliurex-up]: Number of packages to update: " +  str(len(self.packages)) + " (" + str(self.newpackages) + " news)" )
325
326                                response=raw_input('  [LLiurex-up]: Do you want to update the system (yes/no)): ').lower()
327                                if response.startswith('y'):
328                                        self.preActionsScript()
329                                        self.distUpgrade()
330                                        self.postActionsScript()
331                                        self.checkingFinalFlavourToInstall()   
332                                        self.checkFinalUpgrade()
333                                        self.lliurexcore.cleanEnvironment()
334
335                                else:
336                                        log_msg="Cancel the update"
337                                        self.log(log_msg)
338                                        print("  [Lliurex-up]: Cancel the update")
339                                        self.lliurexcore.cleanEnvironment()
340                                        return 0
341                        else:
342                                print("[Lliurex-up]: Updated abort for incorrect flavours detected in new update")
343                                self.lliurexcore.cleanEnvironment()
344                                return 1                       
345                else:
346                        if not self.checkPreviousUpgrade():
347                                print("  [Lliurex-up]: Your systems is updated. Nothing to do")
348                                self.lliurexcore.cleanEnvironment()
349                                return 0
350                        else:
351                                print("  [Lliurex-up]: Updated abort. An error occurred checking new updates")
352                                self.lliurexcore.cleanEnvironment()
353                                return 1
354                                       
355
356def     usage():
357        puts("Usage")
358        with indent(4):
359                puts("lliurex-upgrade [FLAGS...]")
360                puts("Flags")
361                with indent(4):
362                        puts("-h --help: Show help")
363                        puts("-s --sai: Update the system without pinning")     
364
365        sys.exit(1)             
366
367
368def free_space_check():
369               
370                if ((os.statvfs("/").f_bfree * os.statvfs("/").f_bsize) / (1024*1024*1024)) < 2: #less than 2GB available?
371                        print "  [Lliurex-up]: There's not enough space on disk to upgrade (2 GB needed)"
372                       
373                        sys.exit(1)
374
375if __name__ == '__main__':
376        if os.geteuid() != 0:
377                print "  [Lliurex-up]: You need be root!"
378                sys.exit(1)
379
380        free_space_check()     
381        mode=None       
382        args=arguments.Args().copy
383       
384        if args.contains(["-h", "--help"]):
385                usage()
386       
387        if args.contains(["-s", "--sai"]):
388                mode="sai"
389        else:
390                if len(args)>0:
391                        usage() 
392       
393        lliurexupcli = LliurexUpCli()   
394        sys.exit(lliurexupcli.main(mode))
Note: See TracBrowser for help on using the repository browser.