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

Last change on this file since 3018 was 3018, checked in by kbut, 4 years ago

prepare scripts to lliurex-up

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