source: n4d-proxy/trunk/fuentes/install.n4d-proxy/usr/share/n4d/python-plugins/ProxyManager.py @ 1905

Last change on this file since 1905 was 1905, checked in by Juanma, 4 years ago

fix backup restore from trusty

File size: 12.4 KB
Line 
1# npackage example  https://svn.lliurex.net/pandora/n4d-ldap/trunk
2# jinja2 http://jinja.pocoo.org/docs/templates
3
4from jinja2 import Environment
5from jinja2.loaders import FileSystemLoader
6from jinja2 import Template
7import tempfile
8import shutil
9import os
10import subprocess
11import tarfile
12import time
13
14class N4dProxy:
15
16        def __init__(self):
17                #Load template file
18                self.tpl_env = Environment(loader=FileSystemLoader('/usr/share/n4d/templates/squid'))
19                self.proxy_file_list=["/etc/squid/squid.conf","/var/www/proxy.pac","/var/lib/dnsmasq/config/cname-proxy"]
20                self.proxy_dirs=["/etc/squid/lliurex/"]
21               
22        #def init
23       
24        def startup(self,options):
25                # executed when launching n4d
26                pass
27               
28        #def startup
29
30        def apt(self):
31                # executed after apt operations
32                pass
33               
34        #def apt
35       
36        # service test and backup functions #
37       
38        def test(self):
39
40                pass
41               
42        #def test
43
44        def get_time(self):
45               
46                return get_backup_name("ProxyManager")
47               
48        #def get_time
49       
50       
51        def backup(self,dir="/backup"):
52               
53                try:
54               
55                        file_path=dir+"/"+self.get_time()
56               
57                        tar=tarfile.open(file_path,"w:gz")
58                       
59                        for f in self.proxy_file_list:
60                               
61                                tar.add(f)
62                       
63                        for d in self.proxy_dirs:
64                                if os.path.exists(d):
65                                        tar.add(d)
66                       
67                       
68                        tar.close()
69                       
70                        return [True,file_path]
71                       
72                except Exception as e:
73                        return [False,str(e)]
74               
75        #def test
76       
77        def restore(self,file_path=None):
78
79                try:
80
81                        if file_path==None:
82                                for f in sorted(os.listdir("/backup"),reverse=True):
83                                        if "ProxyManager" in f:
84                                                file_path="/backup/"+f
85                                                break                   
86                       
87                        if file_path==None:
88                               
89                                return [False,"Backup file not found"]
90
91                        if os.path.exists(file_path):
92                               
93                                tmp_dir=tempfile.mkdtemp()
94                                tar=tarfile.open(file_path)
95                                tar.extractall(tmp_dir)
96                                tar.close()
97                               
98                                #FIX squid dir from backups <= 15.05
99                                version=objects["ServerBackupManager"].restoring_version
100                                majorBackupVersion=int(version[0:version.find('.')])
101                                for f in self.proxy_file_list:
102                                        auxFile=f
103                                        if auxFile == "/etc/squid/squid.conf" :
104                                                if majorBackupVersion<=15:
105                                                        auxFile='/etc/squid3/squid.conf'
106                                       
107#                                       tmp_path=tmp_dir+f
108                                        tmp_path=tmp_dir+auxFile
109                                        shutil.copy(tmp_path,f)
110                                       
111                                for d in self.proxy_dirs:
112                                        auxDir=d
113                                        if auxDir == "/etc/squid/lliurex/" :
114                                                if majorBackupVersion<=15:
115                                                        auxDir='/etc/squid3/lliurex/'
116                                               
117#                                       tmp_path=tmp_dir+d
118                                        tmp_path=tmp_dir+auxDir
119                                        if os.path.exists(tmp_path):
120                                                cmd="cp -r " + tmp_path +"/* "  + d
121                                                if not os.path.exists(d):
122                                                        os.makedirs(d)
123                                                os.system(cmd)
124                               
125                                try:
126                                        if majorBackupVersion<=15 :
127
128#                                       if objects["ServerBackupManager"].restoring_version=="14.06":
129                                                       
130                                                print("[ProxyManager] Fixing squid.conf ...")
131                                               
132                                                f=open("/etc/squid/squid.conf")
133                                                lines=f.readlines()
134                                                f.close()
135                                               
136                                                f=open("/tmp/squid.conf","w")
137                                                for line in lines:
138                                                        if "acl manager proto cache_object" not in line:
139                                                                #FIX squid dir from backups <= 15.05
140                                                                line=line.replace ("squid3","squid")
141                                                                if "dns_nameservers" in line:
142                                                                        line="dns_nameservers 127.0.0.1\n"
143                                                               
144                                                                f.write(line)
145                                               
146                                                f.close()
147                                               
148                                                shutil.copy("/tmp/squid.conf","/etc/squid/squid.conf")
149                                       
150                                except Exception as llx14_ex:
151                                        print llx14_ex
152                                       
153                                os.system("service squid restart")
154                                               
155                                return [True,""]
156                               
157                        else:
158                                return [False,"Backup file not found"]
159                               
160                except Exception as e:
161                        print e
162                        return [False,str(e)]
163               
164        #def test
165       
166        def calc_longmask(self,bitmask):
167                binario = "1"*bitmask + "0"*(32-bitmask)
168                longmask = longmask = str(int(binario[0:8],2)) + "." + str(int(binario[8:16],2)) + "." + str(int(binario[16:24],2)) + "." + str(int(binario[24:32],2))
169                return longmask
170        #def calc_longmask
171       
172       
173        def load_exports(self):
174                #Get template
175                template = self.tpl_env.get_template("squid.conf")
176                template_dst_domains = self.tpl_env.get_template("allow-dst-domains.conf")
177                template_dst_networks = self.tpl_env.get_template("allow-dst-networks.conf")
178                template_src_networks = self.tpl_env.get_template("allow-src-networks.conf")
179                template_ssl_ports = self.tpl_env.get_template("allow-SSL-ports.conf")
180                template_deny_dst_domain = self.tpl_env.get_template("deny-dst-domains.conf")
181                template_deny_dst_domain_expr = self.tpl_env.get_template("deny-dst-domains-expr.conf")
182                template_deny_dst_networks = self.tpl_env.get_template("deny-dst-networks.conf")
183                template_cache_networks = self.tpl_env.get_template("no_cache_networks.conf")
184                template_proxy_pac = self.tpl_env.get_template("proxy.pac")
185                template_cname = self.tpl_env.get_template("cname")
186                list_variables = {}
187               
188                ###########################
189                #Getting VARS
190                ###########################
191
192                #Obtains SRV_IP
193                list_variables['SRV_IP'] = objects['VariablesManager'].get_variable('SRV_IP')
194                #If variable INTERNAL_IP is not defined returns an error
195                if  list_variables['SRV_IP'] == None:
196                        return {'status':False,'msg':'Variable SRV_IP not defined'}
197                               
198                #Obtains INTERNAL_MASK
199                list_variables['INTERNAL_MASK'] = objects['VariablesManager'].get_variable('INTERNAL_MASK')
200                #If INTERNAL_MASK is not defined returns an error
201                if  list_variables['INTERNAL_MASK'] == None:
202                        return {'status':False,'msg':'Variable INTERNAL_MASK not defined'}
203               
204                #Calculate INTERNAL_LONGMASK
205                list_variables['INTERNAL_LONGMASK'] = self.calc_longmask(list_variables['INTERNAL_MASK'])
206               
207               
208                #Obtains INTERNAL_NETWORK
209                list_variables['INTERNAL_NETWORK'] = objects['VariablesManager'].get_variable('INTERNAL_NETWORK')
210                #If INTERNAL_NETWORK is not defined returns an error
211                if  list_variables['INTERNAL_NETWORK'] == None:
212                        return {'status':False,'msg':'Variable INTERNAL_NETWORK not defined'}
213               
214                #Obtains INTERNAL_DOMAIN
215                list_variables['INTERNAL_DOMAIN'] = objects['VariablesManager'].get_variable('INTERNAL_DOMAIN')
216                #If INTERNAL_DOMAIN is not defined returns an error
217                if  list_variables['INTERNAL_DOMAIN'] == None:
218                        return {'status':False,'msg':'Variable INTERNAL_DOMAIN not defined'}
219                       
220                #Obtains HOSTNAME
221                list_variables['HOSTNAME'] = objects['VariablesManager'].get_variable('HOSTNAME')
222                #If variable SRV_IP is not defined returns an error
223                if  list_variables['HOSTNAME'] == None:
224                        return {'status':False,'msg':'Variable HOSTNAME not defined'}
225                       
226                ###########################
227                #Setting VARS
228                ###########################
229               
230                #Set PROXY_HOST
231                list_variables['PROXY_HOST'] = objects['VariablesManager'].get_variable('PROXY_HOST')
232                #If variable PROXY_HOST is not defined calculate it with args values
233                if  list_variables['PROXY_HOST'] == None:
234                        status,list_variables['PROXY_HOST'] = objects['VariablesManager'].init_variable('PROXY_HOST',{'HOST':"proxy"})
235                               
236                #Set PROXY_HTTP_PORT
237                list_variables['PROXY_HTTP_PORT'] = objects['VariablesManager'].get_variable('PROXY_HTTP_PORT')
238                #If variable PROXY_HTTP_PORT is not defined calculate it with args values
239                if  list_variables['PROXY_HTTP_PORT'] == None:
240                        status,list_variables['PROXY_HTTP_PORT'] = objects['VariablesManager'].init_variable('PROXY_HTTP_PORT',{'PORT':3128})
241               
242                #Set PROXY_ENABLED
243                list_variables['PROXY_ENABLED'] = objects['VariablesManager'].get_variable('PROXY_ENABLED')
244                #If variable PROXY_ENABLED is not defined calculate it with args values
245                if  list_variables['PROXY_ENABLED'] == None:
246                        status,list_variables['PROXY_ENABLED'] = objects['VariablesManager'].init_variable('PROXY_ENABLED',{'ENABLED':True})
247               
248                #Set PROXY_MAX_FILE_SIZE
249                list_variables['PROXY_MAX_FILE_SIZE'] = objects['VariablesManager'].get_variable('PROXY_MAX_FILE_SIZE')
250                #If variable PROXY_ENABLED is not defined calculate it with args values
251                if  list_variables['PROXY_MAX_FILE_SIZE'] == None:
252                        status,list_variables['PROXY_MAX_FILE_SIZE'] = objects['VariablesManager'].init_variable('PROXY_MAX_FILE_SIZE',{'FILE_SIZE':204800})
253               
254                #Encode vars to UTF-8
255                string_template = template.render(list_variables).encode('UTF-8')
256                #Open template file
257                fd, tmpfilepath = tempfile.mkstemp()
258                new_export_file = open(tmpfilepath,'w')
259                new_export_file.write(string_template)
260                new_export_file.close()
261                os.close(fd)
262                #Write template values
263                n4d_mv(tmpfilepath,'/etc/squid/squid.conf',True,'root','root','0644',False )
264               
265                #Encode vars to UTF-8
266                string_template = template_dst_domains.render(list_variables).encode('UTF-8')
267                #Open template file
268                fd, tmpfilepath = tempfile.mkstemp()
269                new_export_file = open(tmpfilepath,'w')
270                new_export_file.write(string_template)
271                new_export_file.close()
272                os.close(fd)
273                #Write template values
274                n4d_mv(tmpfilepath,'/etc/squid/lliurex/allow-dst-domains.conf',True,'root','root','0644',True )
275               
276                #Encode vars to UTF-8
277                string_template = template_dst_networks.render(list_variables).encode('UTF-8')
278                #Open template file
279                fd, tmpfilepath = tempfile.mkstemp()
280                new_export_file = open(tmpfilepath,'w')
281                new_export_file.write(string_template)
282                new_export_file.close()
283                os.close(fd)
284                #Write template values
285                n4d_mv(tmpfilepath,'/etc/squid/lliurex/allow-dst-networks.conf',True,'root','root','0644',True )
286               
287                #Encode vars to UTF-8
288                string_template = template_src_networks.render(list_variables).encode('UTF-8')
289                #Open template file
290                fd, tmpfilepath = tempfile.mkstemp()
291                new_export_file = open(tmpfilepath,'w')
292                new_export_file.write(string_template)
293                new_export_file.close()
294                os.close(fd)
295                #Write template values
296                n4d_mv(tmpfilepath,'/etc/squid/lliurex/allow-src-networks.conf',True,'root','root','0644',True )
297               
298                #Encode vars to UTF-8
299                string_template = template_ssl_ports.render(list_variables).encode('UTF-8')
300                #Open template file
301                fd, tmpfilepath = tempfile.mkstemp()
302                new_export_file = open(tmpfilepath,'w')
303                new_export_file.write(string_template)
304                new_export_file.close()
305                os.close(fd)
306                #Write template values
307                n4d_mv(tmpfilepath,'/etc/squid/lliurex/allow-SSL-ports.conf',True,'root','root','0644',True )
308               
309                #Encode vars to UTF-8
310                string_template = template_cache_networks.render(list_variables).encode('UTF-8')
311                #Open template file
312                fd, tmpfilepath = tempfile.mkstemp()
313                new_export_file = open(tmpfilepath,'w')
314                new_export_file.write(string_template)
315                new_export_file.close()
316                os.close(fd)
317                #Write template values
318                n4d_mv(tmpfilepath,'/etc/squid/lliurex/no_cache_networks.conf',True,'root','root','0644',True )
319               
320                #Encode vars to UTF-8
321                string_template = template_proxy_pac.render(list_variables).encode('UTF-8')
322                #Open template file
323                fd, tmpfilepath = tempfile.mkstemp()
324                new_export_file = open(tmpfilepath,'w')
325                new_export_file.write(string_template)
326                new_export_file.close()
327                os.close(fd)
328                #Write template values
329                n4d_mv(tmpfilepath,'/var/www/proxy.pac',True,'root','root','0644',True )
330               
331                #Encode vars to UTF-8
332                string_template = template_cname.render(list_variables).encode('UTF-8')
333                #Open template file
334                fd, tmpfilepath = tempfile.mkstemp()
335                new_export_file = open(tmpfilepath,'w')
336                new_export_file.write(string_template)
337                new_export_file.close()
338                os.close(fd)
339                #Write template values
340                n4d_mv(tmpfilepath,'/var/lib/dnsmasq/config/cname-proxy',True,'root','root','0644',True )
341               
342                #deny-dst-domains
343                string_template = template_deny_dst_domain.render(list_variables).encode('UTF-8')
344                #Open template file
345                fd, tmpfilepath = tempfile.mkstemp()
346                new_export_file = open(tmpfilepath,'w')
347                new_export_file.write(string_template)
348                new_export_file.close()
349                os.close(fd)
350                #Write template values
351                n4d_mv(tmpfilepath,'/etc/squid/lliurex/deny-dst-domains.conf',True,'root','root','0644',True )
352               
353                #deny-dst-domains-expr
354                string_template = template_deny_dst_domain_expr.render(list_variables).encode('UTF-8')
355                #Open template file
356                fd, tmpfilepath = tempfile.mkstemp()
357                new_export_file = open(tmpfilepath,'w')
358                new_export_file.write(string_template)
359                new_export_file.close()
360                os.close(fd)
361                #Write template values
362                n4d_mv(tmpfilepath,'/etc/squid/lliurex/deny-dst-domains-expr.conf',True,'root','root','0644',True )
363               
364                #deny-dst-networks
365                string_template = template_deny_dst_networks .render(list_variables).encode('UTF-8')
366                #Open template file
367                fd, tmpfilepath = tempfile.mkstemp()
368                new_export_file = open(tmpfilepath,'w')
369                new_export_file.write(string_template)
370                new_export_file.close()
371                os.close(fd)
372                #Write template values
373                n4d_mv(tmpfilepath,'/etc/squid/lliurex/deny-dst-networks.conf',True,'root','root','0644',True )
374               
375               
376                return {'status':True,'msg':'Exports written'}
377        #def load_exports
378
379        def reboot_squid(self):
380                #Restart nfs service
381                subprocess.Popen(['/etc/init.d/squid','restart'],stdout=subprocess.PIPE).communicate()
382                return {'status':True,'msg':'SQUID3 rebooted'}
383        #def reboot_squid
384
385        # ######################### #
386       
387#class N4dProxy
Note: See TracBrowser for help on using the repository browser.