source: lliurex-up/trunk/fuentes/LliurexUpCore.py @ 2902

Last change on this file since 2902 was 2902, checked in by kbut, 3 years ago

add documentation

File size: 6.7 KB
Line 
1import xmlrpclib 
2import os
3import shutil
4import subprocess
5import socket
6
7class LliurexUpCore(object):
8        """docstring for LliurexUpCore"""
9        def __init__(self):
10                super(LliurexUpCore, self).__init__()
11                self.defaultMirror = 'llx16'
12                self.defaultVersion = 'xenial'
13                self.processPath = '/var/run/lliurex-up'
14                self.processSourceslist = '/var/run/lliurex-up/sourceslist'
15                self.n4d = xmlrpclib.ServerProxy('https://localhost:9779')
16                self.haveLliurexMirror = False
17                self.flavours = self.n4d.lliurex_version('','LliurexVersion','-v')[1].split(',')
18                if len(self.n4d.get_methods('MirrorManager')) > 0:
19                        self.haveLliurexMirror = True
20
21                self.prepareEnvironment()
22               
23        def prepareEnvironment(self):
24                '''
25                        This funcion delete all environment and rebuild environment
26                '''
27                if os.path.exists(self.processPath):
28                        shutil.rmtree(os.path.join(self.processPath))
29                os.mkdir(self.processPath)
30                os.mkdir(self.processSourceslist)
31                self.writeDefaultSourceslist()
32
33        def writeDefaultSourceslist(self):
34                f = open(os.path.join(self.processSourceslist,'default'),'w')
35                f.write('deb http://lliurex.net/{version} {version} main'.format(version=self.defaultVersion))
36                f.write('deb http://lliurex.net/{version} {version}-updates main'.format(version=self.defaultVersion))
37                f.write('deb http://lliurex.net/{version} {version}-security main'.format(version=self.defaultVersion))
38                f.close()
39
40        def getPackageVersionAvailable(self,package,options=""):
41                '''
42                        Args :
43                                package String
44                                options String
45
46                        return dictionary => result
47                        result : {'installed':String,'candidate':String}
48
49                        Options are Apt options
50                '''
51                command = "LANG=C apt-cache policy {package} {options}".format(package=package,options=options)
52                p = subprocess.Popen(command,shell=True,stdout=subprocess.PIPE)
53                installed = None
54                candidate = None
55                for line in iter(p.stdout.readline,""):
56                        stripedline = line.strip()
57                        if stripedline.startswith("Installed")
58                                installed = stripedline.replace("Installed: ")
59                        if stripedline.startswith("Candidate")
60                                candidate = stripedline.replace("Candidate: ")
61                return {"installed":installed,"candidate":candidate}
62
63        def isLliurexUpIsUpdated(self):
64                '''
65                        return Boolean
66                '''
67                sourceslistDefaultPath = os.path.join(self.processSourceslist,'default')
68                options = ""
69                if self.canConnectToLliurexNet():
70                        options = "-o Dir::Etc::sourcelist={sourceslistOnlyLliurex} -o Dir::Etc::sourceparts=/dev/null".format(sourceslistOnlyLliurex=sourceslistDefaultPath)
71                command = "LANG=C apt-get update {options}".format(options=options)
72                subprocess.Popen(command,shell=True).communicate()
73                result = self.getPackageVersionAvailable('lliurex-up',options)
74
75                if result['installed'] != result['candidate']:
76                        return False
77                return True
78
79        def installLliurexUp(self,options=""):
80                '''
81                        Args :
82                                options String
83                        return dictionary => result
84                        result : {'returncode':Int,'stdout':String,'stderr':String}
85
86                        options are Apt options
87                       
88
89                        This function install lliurex-up
90                '''
91                command = "LANG=C apt-get install lliurex-up {options}".format(options=options)
92                p = subprocess.Popen(command,shell=True,stdout=subprocess.PIPE)
93                poutput,perror = p.communicate()
94                return {'returncode':p.returncode,'stdout':poutput,'stderrs':perror}
95
96        def lliurexMirrorIsUpdated(self):
97                '''
98                        return None | dictionary => result
99                        result : {'status':Boolean,'msg':String,'action':String}
100                        result.msg : message of status
101                        result.action : Action to launch
102                '''
103                if self.haveLliurexMirror and 'server' in self.flavours :
104                        result = self.n4d.is_update_available('','MirrorManager',self.defaultMirror)
105                        return result
106                return None
107
108        def lliurexMirrorIsRunning(self):
109                '''
110                        return Boolean
111                '''
112                if self.haveLliurexMirror and 'server' in self.flavours :
113                        result = self.n4d.is_alive('','MirrorManager')
114                        return result['status']
115                return False
116
117        def getPercentageLliurexMirror(self):
118                '''
119                        return int | None
120                '''
121                if self.haveLliurexMirror and 'server' in self.flavours:
122                        result = self.n4d.get_percentage('','MirrorManager',self.defaultMirror)
123                        if result['status']:
124                                return result['msg']
125                return None
126       
127        def checkFlavour(self):
128                '''
129                        return None|String
130                        If metapackages has been uninstalled, this function return
131                        package to must install. If return None, you are ok and don't need
132                        install anything.
133                '''
134                targetMetapackage = None
135                if 'None' in self.flavours:
136                        # get last flavour
137                        result = self.n4d.lliurex_version('','LliurexVersion','--history')
138                        if result[0]:
139                                history = [ x.strip().split('\t')[0].strip() for x in result[1].split('\n') ]
140                                history = [ x for x in history if not 'lliurex-meta-live' in x ]
141                                for x in reversed(history):
142                                        if x.startswith('-'):
143                                                targetMetapackage = x[2:]
144                                                break
145                                if targetMetapackage != '':
146                return targetMetapackage
147
148        def canConnectToLliurexNet(self):
149                '''
150                        return Boolean
151                '''
152                s =  socket.socket(socket.AF_INET, socket.SOCK_STREAM)
153                host = socket.gethostbyname('lliurex.net')
154                result = s.connect_ex((host, 80))
155                s.close()
156                if result:
157                        return False
158                return True
159
160        def getLliurexVersion(self):
161                '''
162                        return dictionary => result
163                        result : {'installed':String,'candidate':String}
164                '''
165                sourceslistDefaultPath = os.path.join(self.processSourceslist,'default')
166                options = ""
167                if self.canConnectToLliurexNet():
168                        options = "-o Dir::Etc::sourcelist={sourceslistOnlyLliurex} -o Dir::Etc::sourceparts=/dev/null".format(sourceslistOnlyLliurex=sourceslistDefaultPath)
169                command = "LANG=C apt-get update {options}".format(options=options)
170                subprocess.Popen(command,shell=True).communicate()
171                return self.getPackageVersionAvailable('lliurex-version-stamp',options)
172
173        def getPackagesToUpdate(self):
174                '''
175                        packageInfo definition
176                        {
177                                'PACKAGENAME' : {
178                                                'install' : 'INSTALLEDVERSION',
179                                                'candidate' : 'CANDIDATEVERSION',
180                                                'icon' : 'ICONNAME',
181                                                'changelog' : 'CHANGELOGTEXT'
182                                }
183                        }
184                '''
185                packageInfo = {}
186                subprocess.Popen("LANG=C apt-get update",shell=True).communicate()
187                psimulate = subprocess.Popen('LANG=C apt-get dist-upgrade -sV',shell=True,stdout=subprocess.PIPE)
188                rawoutputpsimulate = psimulate.stdout.readlines()
189                rawpackagestoinstall = [ aux.strip() for aux in rawoutputpsimulate if aux.startswith('Inst') ]
190                r = [ aux.replace('Inst ','') for aux in rawpackagestoinstall ]
191                for allinfo in r :
192                        packageInfo[allinfo.split(' ')[0]] = {}
193                        packageInfo[allinfo.split(' ')[0]]['raw'] = ' '.join(allinfo.split(' ')[1:])
194
195                for package in packageInfo:
196                        raw = packageInfo[package]['raw'].split(' ')
197                        if raw[0].startswith('['):
198                                packageInfo[package]['install'] = raw[0][1:-1]
199                                packageInfo[package]['candidate'] = raw[1][1:]
200                        elif raw[0].startswith('('):
201                                packageInfo[package]['install'] = None
202                                packageInfo[package]['candidate'] = raw[0][1:]
203                        packageInfo[package].pop('raw')
Note: See TracBrowser for help on using the repository browser.