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

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

Fix code

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