source: n4d-apache/trunk/fuentes/install-apache/usr/share/n4d/python-plugins/ApacheManager.py @ 5330

Last change on this file since 5330 was 5330, checked in by Juanma, 3 years ago

no write proxypass info if it's already present

File size: 8.7 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
13import glob
14
15
16class ApacheManager:
17
18        def __init__(self):
19                #Load template file
20                self.tpl_env = Environment(loader=FileSystemLoader('/usr/share/n4d/templates/apache'))
21                self.backup_files=[]
22                self.backup_dirs=["/etc/apache2/","/var/www/","/net/server-sync/easy-sites"]
23
24        #def init
25       
26        def startup(self,options):
27                # executed when launching n4d
28                pass
29               
30        #def startup
31
32        def apt(self):
33                # executed after apt operations
34                pass
35               
36        #def apt
37       
38        # service test and backup functions #
39        def test(self):
40
41                pass
42
43        #def makedir
44        def makedir(self,dir=None):
45
46                if not os.path.isdir(dir):
47                        os.makedirs(dir)
48                return [True]
49
50        #def timestamp backup
51        def get_time(self):
52                return get_backup_name("ApacheManager")
53
54        #def backup
55        def backup(self,dir="/backup"):
56               
57                try:
58               
59                        self.makedir(dir)
60                        file_path=dir+"/"+self.get_time()
61                        tar=tarfile.open(file_path,"w:gz")
62                               
63                        for f in self.backup_files:
64                                if os.path.exists(f):
65                                        tar.add(f)
66
67                        for d in self.backup_dirs:
68                                if os.path.exists(d):
69                                        tar.add(d)
70                       
71                        self.list_easy_sites = glob.glob('/var/www/srv/'+'easy-'+'*') + glob.glob("/var/www/srv/links/easy-*")
72                        for j in self.list_easy_sites:
73                                if os.path.exists(j):
74                                        tar.add(j)
75                       
76                        dir="/net/server-sync/easy-sites"
77                        if os.path.exists(dir):
78                                cmd="getfacl -pR %s > /tmp/easy-sites.acl"%dir
79                                os.system(cmd)
80                                tar.add("/tmp/easy-sites.acl",arcname="easy-sites.acl")
81                                os.remove("/tmp/easy-sites.acl")
82                               
83                               
84                        os.system("a2query -m > /tmp/mods_available")
85                       
86                        tar.add("/tmp/mods_available",arcname="llx-backup_mods_available")
87                        tar.close()
88
89                        return [True,file_path]
90
91                except Exception as e:
92                        return [False,str(e)]
93
94        #def restore backup
95        def restore(self,file_path=None):
96
97
98                if file_path==None:
99                        dir="/backup"
100                        for f in sorted(os.listdir(dir),reverse=True):
101                                if "ApacheManager" in f:
102                                        file_path=dir+"/"+f
103                                        break
104
105
106                try:
107                        if os.path.exists(file_path):
108                                tmp_dir=tempfile.mkdtemp()
109                                tar=tarfile.open(file_path)
110                                tar.extractall(tmp_dir)
111                                tar.close()
112
113                                os.system("rm -rf %s"%tmp_dir+"/etc/apache2/mods-available")
114                                os.system("rm -rf %s"%tmp_dir+"/etc/apache2/mods-enabled")
115                               
116
117                                try:
118                                        if objects["ServerBackupManager"].restoring_version=="14.06":
119                                               
120                                                print "[ApacheManager] Removing old apache conf files..."
121                                               
122                                                files_to_remove=["/etc/apache2/apache2.conf","/etc/apache2/envvars","/etc/apache2/magic","/etc/apache2/ports.conf","/etc/apache2/httpd.conf","/var/www/index.html"]
123                                               
124                                                for f in files_to_remove:
125                                                        print tmp_dir+f,os.path.exists(tmp_dir+f)
126                                                        if os.path.exists(tmp_dir+f):
127                                                                os.remove(tmp_dir+f)
128                                                os.system("rm -rf %s"%tmp_dir+"/etc/apache2/conf.d")
129                                                os.system("ls -la %s"%tmp_dir+"/etc/apache2/")
130                                               
131                                               
132                                except Exception as llx1406e:
133                                        print llx1406e
134                       
135
136
137                                for f in self.backup_files:
138                                        tmp_path=tmp_dir+f
139                                        if os.path.exists(tmp_path):
140                                                shutil.copy(tmp_path,f)
141
142                                for d in self.backup_dirs:
143                                        tmp_path=tmp_dir+d
144                                        if os.path.exists(tmp_path):
145                                                self.makedir(d)
146                                                cmd="cp -r " + tmp_path +"/* "  + d
147                                                os.system(cmd)
148                                               
149                                #Add pmb redirection to port 800 (apache2-lliurex)
150                                sw_loadProxyMods=False
151                                for confFile in ["/etc/apache2/sites-enabled/pmb.conf","/etc/apache2/sites-enabled/opac.conf"]:
152                                        if os.path.exists(confFile):
153                                                sw_loadProxyMods=True
154                                                site=confFile.split('/')[-1]
155                                                site=site.replace('.conf','')
156                                                confF=open(confFile,'r')
157                                                contentF=confF.readlines()
158                                                confF.close()
159                                                pos=0
160                                                aliasPos=0
161                                                for line in contentF:
162                                                        pos=pos+1
163                                                        if "Alias " in line:
164                                                                aliasPos=pos
165                                                        if "ProxyPass" in line:
166                                                                aliasPos=-1
167                                                                break
168
169                                                if aliasPos>0:
170                                                        contentF.insert(aliasPos,"\n\tProxyPass / http://"+site+":800/\n\tProxyPassReverse / http://"+site+":800/\n")
171                                                        confF=open(confFile,'w')
172                                                        confF.writelines(contentF)
173                                                        confF.close()
174
175                                if sw_loadProxyMods:   
176                                        #Ensure that proxy mods are enabled
177                                        cmd="/usr/sbin/a2enmod proxy proxy_http"
178                                        os.system(cmd)
179
180                                if os.path.exists("/net/server-sync/easy-sites") and os.path.exists(tmp_dir+"/easy-sites.acl"):
181                                        os.system("setfacl -R --restore=%s/easy-sites.acl"%tmp_dir)
182                                       
183                               
184                               
185                                # # 14.06 -> 15.05 CASE #############################
186                               
187                                try:
188                                        if objects["ServerBackupManager"].restoring_version=="14.06":
189                                               
190                                                print("[ApacheManager] Fixing files ...")
191                                               
192                                                dir="/etc/apache2/sites-available/"
193                                               
194                                                for item in os.walk(dir):
195                                                        path,data,files=item
196                                               
197                                                for f in files:
198                                                        path=dir+f
199                                                        if not os.path.exists(path):
200                                                                continue
201                                                        if f=="default":
202                                                                os.remove(path)
203                                                                continue
204                                                                if os.path.exists(dir+"000-default.conf"):
205                                                                        os.remove(dir+"000-default.conf")
206                                                                os.symlink("/etc/apache2/sites-available/llx-default.conf",dir+"000-default.conf")
207                                                        elif f=="default.lliurex":
208                                                                os.remove(path)
209                                                                continue
210                                                        elif f=="000-default.orig":
211                                                                pass
212                                                        elif not f.endswith(".conf"):
213                                                                shutil.move(path,path+".conf")
214
215                                                print dir,"DONE"
216
217                                                dir="/etc/apache2/sites-enabled/"
218                                                files=[]
219                                               
220                                                for item in os.walk(dir):
221                                                        path,data,files=item
222
223                                               
224                                                for f in files:
225                                                        path=dir+f
226                                                        link=os.readlink(path)
227                                                        if link.startswith("../"):
228                                                                link=link.replace("../","/etc/apache2/")
229                                                       
230                                                        if f=="000-default":
231                                                                os.remove(path)
232                                                                if os.path.exists("/etc/apache2/sites-enabled/000-default.conf"):
233                                                                        os.remove("/etc/apache2/sites-enabled/000-default.conf")
234                                                                os.symlink("/etc/apache2/sites-available/000-default.conf","/etc/apache2/sites-enabled/000-default.conf")
235                                                                continue
236                                                       
237
238                                                       
239                                                        if not path.endswith(".conf"):
240                                                                os.remove(path)
241                                                                if not os.path.exists(link):
242                                                                        link+=".conf"
243                                                               
244                                                                if not os.path.exists(link):
245                                                                        continue
246                                                                if os.path.exists(path+".conf"):
247                                                                        os.remove(path+".conf")
248                                                                os.symlink(link,path+".conf")
249                                                               
250                                                        else:
251                                                                if not os.path.exists(link):
252                                                                        os.remove(path)
253                                                               
254                                               
255                                except Exception as llx14_ex:
256                                        print llx14_ex
257                                       
258                                # #END OF 14.06->15.05 CASE # ############
259                               
260                                os.system("service apache2 restart")
261
262                                return [True,""]
263
264                        else:
265                                return [False,"Backup file not found"]
266
267                except Exception as e:
268
269                        return [False,str(e)]
270
271
272        #def restore
273
274        def load_exports(self):
275                #Get template
276                template_server = self.tpl_env.get_template("server")
277                list_variables = {}
278               
279                #Inicialize INTERNAL_DOMAIN
280                list_variables['INTERNAL_DOMAIN'] = objects['VariablesManager'].get_variable('INTERNAL_DOMAIN')
281                #If INT_DOMAIN is not defined calculate it with args values
282                if  list_variables['INTERNAL_DOMAIN'] == None:
283                        return {'status':False,'msg':'Variable INTERNAL_DOMAIN not defined'}
284               
285                #Inicialize INTERNAL_DOMAIN
286                list_variables['HOSTNAME'] = objects['VariablesManager'].get_variable('HOSTNAME')
287                #If INT_DOMAIN is not defined calculate it with args values
288                if  list_variables['HOSTNAME'] == None:
289                        return {'status':False,'msg':'Variable HOSTNAME not defined'}
290               
291                ###########################
292                #Setting VARS
293                ###########################
294               
295                #Set HTTP_PATH
296                list_variables['HTTP_PATH'] = objects['VariablesManager'].get_variable('HTTP_PATH')
297                #If variable PROXY_ENABLED is not defined calculate it with args values
298                if  list_variables['HTTP_PATH'] == None:
299                        status,list_variables['HTTP_PATH'] = objects['VariablesManager'].init_variable('HTTP_PATH',{'PATH':'/var/www/'})
300               
301                #Encode vars to UTF-8
302                string_template = template_server.render(list_variables).encode('UTF-8')
303                #Open template file
304                fd, tmpfilepath = tempfile.mkstemp()
305                new_export_file = open(tmpfilepath,'w')
306                new_export_file.write(string_template)
307                new_export_file.close()
308                os.close(fd)
309                #Write template values
310                n4d_mv(tmpfilepath,'/etc/apache2/sites-available/server',True,'root','root','0644',False )
311                #Restart service
312                subprocess.Popen(['a2ensite','server.conf'],stdout=subprocess.PIPE).communicate()
313                subprocess.Popen(['/etc/init.d/apache2','reload'],stdout=subprocess.PIPE).communicate()
314                return {'status':True,'msg':'Exports written'}
315        #def load_exports
316
317        def reboot_apache(self):
318                #Restart apache service
319                subprocess.Popen(['/etc/init.d/apache2','restart'],stdout=subprocess.PIPE).communicate()
320                return {'status':True,'msg':'apache2 rebooted'}
321        #def reboot_squid
322
323        # ######################### #
324       
325#class ApacheManager
Note: See TracBrowser for help on using the repository browser.