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

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

wip

File size: 7.0 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.changelogsPath = '/var/run/lliurex-up/changelogs'
15                self.processSourceslist = '/var/run/lliurex-up/sourceslist'
16                self.n4d = xmlrpclib.ServerProxy('https://localhost:9779')
17                self.haveLliurexMirror = False
18                self.flavours = [ x.strip() for x in self.n4d.lliurex_version('','LliurexVersion','-v')[1].split(',') ]
19                if len(self.n4d.get_methods('MirrorManager')) > 0:
20                        self.haveLliurexMirror = True
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                os.mkdir(self.changelogsPath)
32                self.writeDefaultSourceslist()
33
34        def writeDefaultSourceslist(self):
35                f = open(os.path.join(self.processSourceslist,'default'),'w')
36                f.write('deb http://lliurex.net/{version} {version} main'.format(version=self.defaultVersion))
37                f.write('deb http://lliurex.net/{version} {version}-updates main'.format(version=self.defaultVersion))
38                f.write('deb http://lliurex.net/{version} {version}-security main'.format(version=self.defaultVersion))
39                f.close()
40
41        def getPackageVersionAvailable(self,package,options=""):
42                '''
43                        Args :
44                                package String
45                                options String
46
47                        return dictionary => result
48                        result : {'installed':String,'candidate':String}
49
50                        Options are Apt options
51                '''
52                command = "LANG=C apt-cache policy {package} {options}".format(package=package,options=options)
53                p = subprocess.Popen(command,shell=True,stdout=subprocess.PIPE)
54                installed = None
55                candidate = None
56                for line in iter(p.stdout.readline,""):
57                        stripedline = line.strip()
58                        if stripedline.startswith("Installed"):
59                                installed = stripedline.replace("Installed: ","")
60                        if stripedline.startswith("Candidate"):
61                                candidate = stripedline.replace("Candidate: ","")
62                return {"installed":installed,"candidate":candidate}
63
64        def isLliurexUpIsUpdated(self):
65                '''
66                        return Boolean
67                '''
68                sourceslistDefaultPath = os.path.join(self.processSourceslist,'default')
69                options = ""
70                if self.canConnectToLliurexNet():
71                        options = "-o Dir::Etc::sourcelist={sourceslistOnlyLliurex} -o Dir::Etc::sourceparts=/dev/null".format(sourceslistOnlyLliurex=sourceslistDefaultPath)
72                command = "LANG=C apt-get update {options}".format(options=options)
73                subprocess.Popen(command,shell=True).communicate()
74                result = self.getPackageVersionAvailable('lliurex-up',options)
75
76                if result['installed'] != result['candidate']:
77                        return False
78                return True
79
80        def installLliurexUp(self,options=""):
81                '''
82                        Args :
83                                options String
84                        return dictionary => result
85                        result : {'returncode':Int,'stdout':String,'stderr':String}
86
87                        options are Apt options
88                       
89
90                        This function install lliurex-up
91                '''
92                command = "LANG=C apt-get install lliurex-up {options}".format(options=options)
93                p = subprocess.Popen(command,shell=True,stdout=subprocess.PIPE)
94                poutput,perror = p.communicate()
95                return {'returncode':p.returncode,'stdout':poutput,'stderrs':perror}
96
97        def lliurexMirrorIsUpdated(self):
98                '''
99                        return None | dictionary => result
100                        result : {'status':Boolean,'msg':String,'action':String}
101                        result.msg : message of status
102                        result.action : Action to launch
103                '''
104                if self.haveLliurexMirror and 'server' in self.flavours :
105                        result = self.n4d.is_update_available('','MirrorManager',self.defaultMirror)
106                        return result
107                return None
108
109        def lliurexMirrorIsRunning(self):
110                '''
111                        return Boolean
112                '''
113                if self.haveLliurexMirror and 'server' in self.flavours :
114                        result = self.n4d.is_alive('','MirrorManager')
115                        return result['status']
116                return False
117
118        def getPercentageLliurexMirror(self):
119                '''
120                        return int | None
121                '''
122                if self.haveLliurexMirror and 'server' in self.flavours:
123                        result = self.n4d.get_percentage('','MirrorManager',self.defaultMirror)
124                        if result['status']:
125                                return result['msg']
126                return None
127       
128        def checkFlavour(self):
129                '''
130                        return None|String
131                        If metapackages has been uninstalled, this function return
132                        package to must install. If return None, you are ok and don't need
133                        install anything.
134                '''
135                targetMetapackage = None
136                if 'None' in self.flavours:
137                        # get last flavour
138                        result = self.n4d.lliurex_version('','LliurexVersion','--history')
139                        if result[0]:
140                                history = [ x.strip().split('\t')[0].strip() for x in result[1].split('\n') ]
141                                history = [ x for x in history if not 'lliurex-meta-live' in x ]
142                                for x in reversed(history):
143                                        if x.startswith('-'):
144                                                targetMetapackage = x[2:]
145                                                break
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')
204                        packageInfo[package]['changelog'] = os.path.join(self.changelogsPath,package)
205                        os.system('LANG=C apt-get changelog %s > %s%s'%(package,self.changelogsPath,package))
206                        packageInfo[package]['icon'] = 
207                return packageInfo
208
209if __name__ == '__main__':
210        x = LliurexUpCore()
Note: See TracBrowser for help on using the repository browser.