source: lliurex-mirror/trunk/fuentes/MirrorManager.py @ 1881

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

add new files

File size: 7.6 KB
Line 
1from jinja2 import Environment
2from jinja2.loaders import FileSystemLoader
3from jinja2 import Template
4
5import tempfile
6import shutil
7import subprocess
8
9import os
10import threading
11import datetime
12import ConfigParser
13import pexpect
14import re
15import json
16
17import SimpleHTTPServer
18import multiprocessing
19
20class LliurexMirror:
21
22
23        def __init__(self):
24                #Default values
25                self.defaultpath = '/etc/lliurex-mirror/'
26                self.debmirrorconfpath = os.path.join(self.defaultpath,'debmirror')
27                self.configpath = os.path.join(self.defaultpath,'conf')
28                self.distro="llx16"
29
30                self.tpl_env = Environment(loader=FileSystemLoader('/usr/share/n4d/templates/lliurex-mirror'))
31                self.config = ConfigParser.ConfigParser()
32                self.update_thread=threading.Thread()
33                self.percentage=(0,None)
34               
35               
36        #def init
37       
38        def startup(self,options):
39                self.n4d_vars=objects["VariablesManager"]
40                self.variable=objects["VariablesManager"].get_variable("LLIUREXMIRROR")
41               
42               
43                if self.variable==None:
44                        try:
45                                self.n4d_vars.add_variable("LLIUREXMIRROR",{"internal":{}},"","Lliurex Mirror info variable","lliurex-mirror-core")
46                        except Exception as e:
47                                pass
48                       
49                if type(self.variable)!=type({}):
50                        self.variable={}
51                        self.variable["internal"]={}
52               
53        #def startup
54
55        def apt(self):
56                # executed after apt operations
57                pass
58               
59        #def apt
60       
61        # service test and backup functions #
62       
63        def test(self):
64
65                pass
66               
67        #def test
68       
69        def backup(self):
70
71                pass
72               
73        #def backup
74
75        def restore(self):
76                pass
77        #def restore
78
79        def set_cname(self):
80                #Get template
81                template = self.tpl_env.get_template("cname")
82                list_variables = {}
83               
84                list_variables = objects['VariablesManager'].get_variable_list(['INTERNAL_DOMAIN','HOSTNAME'])
85                for x in list_variables.keys():
86                        if list_variables[x] == None:
87                                return {'status':False,'msg':'Variable ' + x + ' not defined'}
88                       
89                #Encode vars to UTF-8
90                string_template = template.render(list_variables).encode('UTF-8')
91                #Open template file
92                fd, tmpfilepath = tempfile.mkstemp()
93                new_export_file = open(tmpfilepath,'w')
94                new_export_file.write(string_template)
95                new_export_file.close()
96                os.close(fd)
97                #Write template values
98                n4d_mv(tmpfilepath,'/var/lib/dnsmasq/config/cname-mirror',True,'root','root','0644',False )
99               
100                return {'status':True,'msg':'Set mirror cname'}
101        #def set_cname
102       
103        def update(self,distro=None):
104
105                if distro==None:
106                        distro=self.distro
107       
108                if self.update_thread.is_alive():
109                        return {'status':False,'msg':'Lliurex-mirror (n4d instance) is running'}
110               
111                self.percentage=(0,None)
112                self.update_thread=threading.Thread(target=self._update,args=(distro,))
113                self.update_thread.daemon=True
114                self.update_thread.start()
115               
116                return {'status':True,'msg':'running'}
117
118        #def update
119       
120        def _update(self,distro):
121
122                # link config debmirror to correct path with distro name
123                self.build_debmirror_config(distro)
124                os.remove('/etc/debmirror.conf')
125                os.symlink(os.path.join(self.debmirrorconfpath,distro),'/etc/debmirror.conf')
126                child=pexpect.spawn("/usr/bin/debmirror")
127                try:
128                        objects["ZCenterVariables"].add_pulsating_color("lliurexmirror")
129                except:
130                        pass
131                while True:
132                        try:
133                                child.expect('\n')
134                                line =child.before
135                                print(line)
136                                line1=line.strip("\n")
137                                if line1.startswith("[") and line1[5] == "]":
138                                        self.percentage=(int(line1[1:4].strip()),child.exitstatus)
139                        except pexpect.EOF:
140                                        line1 = child.before
141                                        if line1 != "" and line1.startswith("[") and line1[5] == "]":
142                                                        self.percentage=(int(line1[1:4].strip()),child.exitstatus)
143
144                                        child.close()
145                                        self.percentage=(self.percentage[0],child.exitstatus)
146                                        break
147                        except Exception as e:
148                                        break
149                               
150                self.set_mirror_info(distro)
151
152                try:
153                        objects["ZCenterVariables"].remove_pulsating_color("lliurexmirror")
154                except:
155                        pass
156
157        #def _update
158       
159        def is_alive(self):
160                return self.update_thread.is_alive()
161        #def is_alive
162
163        def set_mirror_info(self,distro=None):
164               
165                if distro!=None:
166                        distro=distro
167                else:
168                        distro=self.distro
169               
170               
171                #self.n4d_vars.set_variable("ZEROCENTERINTERNAL",self.internal_variable)
172               
173                MIRROR_DATE=datetime.date.today().strftime("%d/%m/%Y")
174                MIRROR_SIZE=self.get_size("/net/mirror/"+distro)
175               
176                self.variable["internal"]["last_mirror_date"]=MIRROR_DATE
177                self.variable["internal"]["mirror_size"]=str(MIRROR_SIZE)
178               
179                print self.n4d_vars.set_variable("LLIUREXMIRROR",self.variable)
180               
181                #set_custom_text(self,app,text):
182                txt="Updated on: " + str(MIRROR_DATE)
183                txt+=" # Size: %.2fGB"%MIRROR_SIZE
184                try:
185                        objects["ZCenterVariables"].set_custom_text("lliurexmirror",txt)
186                        abstract=open('/var/log/lliurex/lliurex-mirror.log','w')
187                        abstract.write(txt+"\n")
188                        abstract.close()
189                except Exception as e:
190                        pass
191
192        #def set_mirror_info(self):
193
194        def get_size(self,start_path = '.'):
195       
196                total_size = 0
197                try:
198                        for dirpath, dirnames, filenames in os.walk(start_path):
199                                for f in filenames:
200                                        fp = os.path.join(dirpath, f)
201                                        total_size += os.path.getsize(fp)
202                                       
203                        total_size/=1024*1024*1024.0
204                        return total_size
205                except:
206                        return 0
207       
208        #def get_size(start_path = '.'):
209       
210        def search_field(self,filepath,fieldname):
211                try:
212                        f = open(filepath,'r')
213                        needle = None
214                        lines = f.readlines()
215                        for x in lines:
216                                        if re.match('\s*'+fieldname,x):
217                                                        needle = x.strip()
218                        return needle
219                except:
220                        return None
221        # def search_field
222       
223        def check_mirror(self):
224                pass
225        #def check_mirror
226       
227        def get_mirror_architecture(self,distro):
228                filepath = os.path.join(self.debmirrorconfpath,distro)
229                if not os.path.exists(filepath):
230                        return {'status':False,'msg':'not exists debmirror.conf to '+ distro }
231                archs = self.search_field(filepath,'@arches')
232                if archs != None:
233                        archs = archs.split("=")[1]
234                        if archs.endswith(";"):
235                                archs = archs[:-1]
236                        archs = eval(archs)
237                        return {'status':True,'msg':archs }
238                return {'status':False,'msg':"debmirror.conf hasn't architecture variable" }
239        #def get_mirror_architecture
240       
241        def set_mirror_architecture(self,distro,archs):
242                configpath = os.path.join(self.configpath,distro + ".json")
243               
244                config = json.load(open(configpath,'r'))
245               
246                config['ARCHITECTURES'] = archs
247
248
249                f=open(configpath,"w")
250
251                data=unicode(json.dumps(config,indent=4,encoding="utf-8",ensure_ascii=False)).encode("utf-8")
252                f.write(data)
253                f.close()
254
255                self.build_debmirror_config(distro)
256                return {'status':True,'msg':'set architecture'}
257               
258        #def set_mirror_architecture
259       
260        def get_mirror_orig(self,distro):
261                filepath = os.path.join(self.debmirrorconfpath,distro)
262                if not os.path.exists(filepath):
263                        return {'status':False,'msg':'not exists debmirror.conf to '+ distro }
264                origfrom = self.search_field(filepath,'\$host')
265                if origfrom != None:
266                        origfrom = origfrom.split("=")[1]
267                        if origfrom.endswith(";"):
268                                origfrom = origfrom[:-1]
269                        origfrom = eval(origfrom)
270                        return origfrom
271                        return {'status':True,'msg':origfrom }
272                return {'status':False,'msg':"debmirror.conf hasn't orig variable" }                   
273        #def get_mirror_from
274
275        def set_mirror_orig(self,distro,url):
276                configpath = os.path.join(self.configpath, distro + ".json")
277                config = json.load(open(configpath,'r'))
278                config['URL'] = url
279
280                f=open(configpath,"w")
281                data=unicode(json.dumps(config,indent=4,encoding="utf-8",ensure_ascii=False)).encode("utf-8")
282                f.write(data)
283                f.close()
284
285                self.build_debmirror_config(distro)
286                return {'status':True,'msg':'set orig'}
287        #def set_mirror_architecture
288
289        def get_percentage(self):
290                return self.percentage
291
292        def build_debmirror_config(self,distro):
293                template = self.tpl_env.get_template('debmirror.conf')
294                configpath = os.path.join(self.configpath,distro + ".json")
295                config = json.load(open(configpath,'r'))
296                string_template = template.render(config).encode('utf-8')
297                f = open(os.path.join(self.debmirrorconfpath,distro),'w')
298                f.write(string_template)
299                f.close()
300        #def build_debmirror_config
Note: See TracBrowser for help on using the repository browser.