source: export-web-sites/trunk/fuentes/export-web-sites-server.install/usr/share/n4d/python-plugins/ExportWebSites.py @ 8252

Last change on this file since 8252 was 8252, checked in by daduve, 4 months ago

Fix Bug to export web sites

File size: 13.9 KB
Line 
1import os
2import pwd
3import logging
4import shutil
5import commands
6
7class ExportWebSites:
8       
9        logging.basicConfig(format = '%(asctime)s %(message)s',datefmt = '%m/%d/%Y %I:%M:%S %p',filename = '/var/log/export-web-sites.log',level=logging.DEBUG)
10       
11        DEBUG=True
12       
13        moodle="moodle"
14        pmb="pmb"
15        jclic="jclic"
16        dir_export="/etc/apache2/lliurex-location"
17        mod_files=["proxy","proxy_http","rewrite","ext_filter"]
18        mod_available="/etc/apache2/mods-available/"
19        mod_enabled="/etc/apache2/mods-enabled/"
20        file_sites_configuration="/etc/apache2/sites-enabled/000-default.conf"
21       
22        #web_sites=[moodle,jclic,pmb]
23       
24       
25        def create_dict(self,web_sites_vector):
26               
27                try:
28                        self.dprint("Creating dictionary for web sites....")
29                        resume={}
30                        for sites in web_sites_vector:
31                                resume[sites]={}
32                                suffix='.conf'
33                                site_path=os.path.join(self.dir_export, sites + suffix)
34                                resume[sites]["file"]=site_path
35                                resume[sites]["install"]=False
36                                self.dprint("%s : %s"%(sites,resume[sites]))
37                        self.dprint("Creating dictionary for web sites: %s"%resume)
38                        return [True,resume]
39               
40                except Exception as e:
41                        print ("[ExportWebSitesServer] %s"%e)
42                        self.dprint(e)
43                        return [False,e]
44               
45        #def create_dict
46       
47        def lprint(self,arg):
48               
49                logging.debug(arg)
50               
51        #def_lprint
52       
53        def dprint(self,arg):
54               
55                self.lprint("[ExportWebSitesServer] %s"%arg)
56                if ExportWebSites.DEBUG:
57                        print("[ExportWebSitesServer] %s"%arg)
58               
59        #def dprint
60       
61        def export_moodle(self):
62               
63                try:
64                        self.dprint("Moodle is exporting....")
65                       
66                        # Exporting lliurex-location/moodle.conf file to external netcard
67                       
68                        if self.directory_exist(self.dir_export):
69                                suffix='.conf'
70                                site_path=os.path.join(self.dir_export, "moodle" + suffix)
71                                if not os.path.isfile(site_path):
72                                        os.mknod(site_path)
73                                        os.system('chmod 644 %s'%site_path)
74                                        with open(site_path,'w') as file:
75                                               
76                                                file.write('RewriteEngine on\n')
77                                                file.write('RewriteCond "%{REQUEST_URI}" "^/moodle$"\n')
78                                                file.write('RewriteRule ".*" http://%{HTTP_HOST}/moodle/ [R=permament]\n')
79
80                                                file.write('ExtFilterDefine rewrite_ews mode=output cmd=/usr/bin/rewrite_ews\n')
81
82                                                file.write('<Location /moodle>\n')
83
84                                                file.write('SetOutputFilter inflate;rewrite_ews;deflate\n')
85
86                                                file.write('RewriteCond "%{REQUEST_URI}" "^/moodle/(.+)"\n')
87                                                file.write('RewriteRule ".*" "http://moodle/%1" [P,QSA,L]\n')
88
89                                                file.write('RewriteCond "%{REQUEST_URI}" "^/moodle/$"\n')
90                                                file.write('RewriteRule ".*" "http://moodle/" [P]\n')
91
92                                                file.write('RewriteRule ".*" "http:/%{REQUEST_URI}" [P]\n')
93
94                                                file.write('ProxyPassReverse http://moodle\n')
95                                                file.write('</Location>\n')
96
97                                                file.write('RewriteCond %{REQUEST_URI} ^/theme/.*$\n')
98                                                file.write('RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_URI} !-f\n')
99                                                file.write('RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_URI} !-d\n')
100                                                file.write('RewriteRule "^(.*)$" "http://%{HTTP_HOST}/moodle/%{REQUEST_URI}" [P,QSA]\n')
101                               
102                                site_path2="/usr/bin/rewrite_ews"
103                                if not os.path.isfile(site_path2):
104                                        print ("[ExportWebSitesServer] Writing /usr/bin/rewrite_ews....")
105                                        os.mknod(site_path2)
106                                os.system('chmod 755 %s'%site_path2)
107                                with open(site_path2,'w') as file:
108                                        file.write('#!/usr/bin/python\n')
109                                        file.write('import sys,time\n')
110                                        file.write('from subprocess import check_output\n')
111                                        file.write('textchars = bytearray({7,8,9,10,12,13,27}|set(range(0x20,0x100))-{0x7f})\n')
112                                        file.write('is_bin = lambda bytes: bool(bytes.translate(None,textchars))\n')
113
114                                        file.write('def get_ip():\n')
115                                        file.write('    ipstr=check_output(["/sbin/ip","-o","route","get","8.8.8.8"])\n')
116                                        file.write('    iplist=ipstr.split()\n')
117                                        file.write('    ip=None\n')
118                                        file.write('    for i in range(len(iplist)):\n')
119                                        file.write("            if iplist[i] == 'src':\n")
120                                        file.write('                    ip = iplist[i+1]\n')
121                                        file.write('                    break\n')
122                                        file.write('    return ip\n')
123
124                                        file.write('ip=get_ip()\n')
125
126                                        file.write("pattern = { 'http://moodle' : 'http://'+ip+'/moodle', 'http:\/\/moodle' : 'http:\/\/'+ip+'\/moodle', 'http%3F%2F%2Fmoodle': 'http%3F%2F%2F'+ip+'%2Fmoodle'}\n")
127                                        file.write('replace=True\n')
128                                        file.write('for line in sys.stdin:\n')
129                                        file.write('    if is_bin(line):\n')
130                                        file.write('            replace=False\n')
131                                        file.write('    if replace:\n')
132                                        file.write('            for p in pattern.keys():\n')
133                                        file.write('                    line=line.replace(p,pattern[p])\n')
134                                        file.write('    sys.stdout.write(line)\n')
135                                               
136                                        print ("[ExportWebSitesServer] File writed.")
137                                               
138                                self.dprint("/etc/apache2/lliurex-location/moodle.conf file is created to exported....")
139                       
140                       
141                        # Modify sites-avaiable/moodle.conf in internal netcard
142                       
143                        '''modify=True
144                        suffix='.conf'
145                        moodle_site_available=os.path.join(self.site_available, "moodle" + suffix)
146                        if os.path.isfile(moodle_site_available):
147                                with open(moodle_site_available, "r") as in_file:
148                                                        buf = in_file.readlines()
149                                with open(moodle_site_available, "w") as out_file:
150                                        for line in buf:
151                                                if  "RewriteEngine" in line:
152                                                        modify=False
153                                                else:
154                                                        if ( "Alias /moodle" in line ) & (modify):
155                                                                line = 'RewriteEngine on\nRewriteCond "%{REQUEST_URI}" "^/moodle/(.*)$"\nRewriteRule ".*" "http://moodle/%1" [P]\n' + line
156                                                out_file.write(line)
157                                       
158                                self.dprint("/etc/apache2/sites-available/moodle.conf file modified to integer moodle in export netcard....")'''
159                       
160                        '''modify=True
161                        moodle_config="/usr/share/moodle/config.php"
162                        if os.path.isfile(moodle_config):
163                                with open(moodle_config, "r") as in_file:
164                                                        buf = in_file.readlines()
165                                with open(moodle_config, "w") as out_file:
166                                        for line in buf:
167                                                if  "reverseproxy" in line:
168                                                        modify=False
169                                                else:
170                                                        if ( "$CFG->admin" in line ) & (modify):
171                                                                line = line + ' $CFG->reverseproxy = 1;\n'
172                                                out_file.write(line)
173                                       
174                                self.dprint("/usr/share/moodle/config.conf file modified to integer moodle in export netcard....")'''
175                               
176                        return [True]
177               
178                except Exception as e:
179                        print ("[ExportWebSitesServer] %s"%e)
180                        self.dprint(e)
181                        return [False,str(e)]
182               
183        #def export_moodle
184       
185        def export_jclic(self):
186               
187                try:
188                        self.dprint("JCLIC is exporting....")
189                        if self.directory_exist(self.dir_export):
190                                suffix='.conf'
191                                site_path=os.path.join(self.dir_export, "jclic" + suffix)
192                                if not os.path.isfile(site_path):
193                                        os.mknod(site_path)
194                                        os.system('chmod 644 %s'%site_path)
195                                        with open(site_path,'w') as file:
196                                               
197                                                file.write('RewriteEngine on\n')
198                                                file.write('RewriteCond "%{REQUEST_URI}" "^/jclic-aula$"\n')
199                                                file.write('RewriteRule ".*" http://%{SERVER_NAME}/jclic-aula/index.php [R=permament]\n')
200                                                file.write('RewriteRule ^ - [E=server_jclic:%{SERVER_NAME}]\n')
201
202                                                file.write('<Location /jclic-aula>\n')
203
204                                                file.write('RewriteCond "%{REQUEST_URI}" "^/jclic-aula/(.+)"\n')
205                                                file.write('RewriteRule ".*" "http://jclic-aula/%1" [P,QSA,L]\n')
206                                                file.write('RewriteCond "%{REQUEST_URI}" "^/jclic-aula/$"\n')
207                                                file.write('RewriteRule ".*" "http://jclic-aula/" [P]\n')
208                                                file.write('RewriteRule ".*" "http:/%{REQUEST_URI}" [P]\n')
209
210                                                file.write('SetOutputFilter INFLATE;proxy-html;DEFLATE\n')
211                                                file.write('ProxyHTMLExtended On\n')
212                                                file.write('ProxyHTMLInterp On\n')
213                                               
214                                                file.write('ProxyHTMLURLMap "http://server/jclic-aula" "http://${server_jclic}/jclic-aula" V\n')
215                                                file.write('ProxyHTMLURLMap "http://jclic-aula" "http://${server_jclic}/jclic-aula" V\n')
216                                                file.write('ProxyHTMLURLMap "http://jclic-aula/" "http://${server_jclic}/jclic-aula/" V\n')
217                                                file.write('ProxyHTMLURLMap "http:\/\/jclic-aula" "http:\/\/${server_jclic}/jclic-aula" x,V\n')
218                                                file.write('ProxyHTMLURLMap "http:\/\/jclic-aula\/" "http:\/\/${server_jclic}\/jclic-aula" x,V\n')
219                                                file.write('ProxyPassReverse http://jclic-aula\n')
220
221                                                file.write('</Location>\n')
222
223
224                                self.dprint("Jclic file is created to exported....")
225                        return [True]
226               
227                except Exception as e:
228                        print ("[ExportWebSitesServer] %s"%e)
229                        self.dprint(e)
230                        return [False,str(e)]
231               
232        #def export_jclic
233       
234        def export_pmb(self):
235               
236                try:
237                        self.dprint("PMB is exporting....")
238                        if self.directory_exist(self.dir_export):
239                                suffix='.conf'
240                                site_path=os.path.join(self.dir_export, "pmb" + suffix)
241                                if not os.path.isfile(site_path):
242                                        os.mknod(site_path)
243                                        os.system('chmod 644 %s'%site_path)
244                                        with open(site_path,'w') as file:
245                                                file.write('<Location /pmb/>\n')
246                                                file.write('    ProxyPass http://pmb:800/\n')
247                                                file.write('    ProxyPassReverse http://pmb:800/\n')
248                                                file.write('</Location>\n')
249                                site_path=os.path.join(self.dir_export, "opac" + suffix)
250                                if not os.path.isfile(site_path):
251                                        os.mknod(site_path)
252                                        os.system('chmod 644 %s'%site_path)
253                                        with open(site_path,'w') as file:
254                                                file.write('<Location /opac/>\n')
255                                                file.write('    ProxyPass http://opac:800/\n')
256                                                file.write('    ProxyPassReverse http://opac:800/\n')
257                                                file.write('</Location>\n')
258                                self.dprint("PMB file is created to exported....")
259                        return [True]
260               
261                except Exception as e:
262                        print ("[ExportWebSitesServer] %s"%e)
263                        self.dprint(e)
264                        return [False,str(e)]
265               
266        #def export_pmb
267       
268        def un_export_moodle(self):
269               
270                try:
271                        self.dprint("Moodle is cancelling the exportation....")
272                        if self.directory_exist(self.dir_export):
273                                suffix='.conf'
274                                site_path=os.path.join(self.dir_export, "moodle" + suffix)
275                                if os.path.isfile(site_path):
276                                        os.remove(site_path)
277                                self.dprint("Moodle removed !!!")
278                       
279                        # Modify sites-avaiable/moodle.conf in internal netcard
280                       
281                        modify=True
282                        suffix='.conf'
283                        moodle_site_available=os.path.join(self.site_available, "moodle" + suffix)
284                        if os.path.isfile(moodle_site_available):
285                                with open(moodle_site_available, "r") as in_file:
286                                                        buf = in_file.readlines()
287                                with open(moodle_site_available, "w") as out_file:
288                                        for line in buf:
289                                                if  not "Rewrite" in line:
290                                                        out_file.write(line)
291                                       
292                                self.dprint("/etc/apache2/sites-available/moodle.conf file modified to cancel moodle in export netcard....")
293                       
294                       
295                        return [True]
296               
297                except Exception as e:
298                        print ("[ExportWebSitesServer] %s"%e)
299                        self.dprint(e)
300                        return [False,str(e)]
301               
302        #def un_export_moodle
303       
304        def un_export_jclic(self):
305               
306                try:
307                        self.dprint("JCLIC is cancelling the exportation....")
308                        if self.directory_exist(self.dir_export):
309                                suffix='.conf'
310                                site_path=os.path.join(self.dir_export, "jclic" + suffix)
311                                if os.path.isfile(site_path):
312                                        os.remove(site_path)
313                                self.dprint("Jclic removed !!!")
314                        return [True]
315               
316                except Exception as e:
317                        print ("[ExportWebSitesServer] %s"%e)
318                        self.dprint(e)
319                        return [False,str(e)]
320               
321        #def un_export_jclic
322       
323        def un_export_pmb(self):
324               
325                try:
326                        self.dprint("PMB is cancelling the exportation....")
327                        if self.directory_exist(self.dir_export):
328                                suffix='.conf'
329                                site_path=os.path.join(self.dir_export, "pmb" + suffix)
330                                if os.path.isfile(site_path):
331                                        os.remove(site_path)
332                                site_path=os.path.join(self.dir_export, "opac" + suffix)
333                                if os.path.isfile(site_path):
334                                        os.remove(site_path)
335                                self.dprint("Pmb removed !!!")
336                        return [True]
337               
338                except Exception as e:
339                        print ("[ExportWebSitesServer] %s"%e)
340                        self.dprint(e)
341                        return [False,str(e)]
342               
343        #def un_export_pmb
344       
345        def read_export_sites(self,web_sites):
346               
347                try:
348                        self.dprint("READING export sites: %s"%web_sites)
349                        resume=self.create_dict(web_sites)
350                        if resume[0]:
351                                resume=resume[1]
352                                for service in resume:
353                                        if os.path.exists(resume[service]["file"]):
354                                                resume[service]["install"]=True
355                                self.dprint(resume)             
356                                return [True,resume]
357                        else:
358                                return [False]
359               
360                except Exception as e:
361                        print ("[ExportWebSitesServer] %s"%e)
362                        self.dprint(e)
363                        return [False,str(e)]
364               
365        #def read_export_sites
366       
367       
368        def directory_exist(self,directory):
369                try:
370                        self.dprint("Testing directory: %s"%directory)
371                        if not os.path.exists(directory):
372                                os.makedirs(directory)
373                        return [True]
374               
375                except Exception as e:
376                        print ("[ExportWebSitesServer] %s"%e)
377                        self.dprint(e)
378                        return [False,str(e)]
379               
380        #def directory_exist
381       
382        def export_active(self):
383                try:
384                        self.dprint("Activating Exportation.....")
385                        for filename in self.mod_files:
386                                os.system('a2enmod %s'%filename)
387                        return [True]
388               
389                except Exception as e:
390                        print ("[ExportWebSitesServer] %s"%e)
391                        self.dprint(e)
392                        return [False,str(e)]
393        #def export_active
394       
395        def apache2_restart(self):
396                try:
397                        status, output = commands.getstatusoutput("systemctl restart apache2")
398                        self.dprint("*** APACHE2 Service ***")
399                        self.dprint("Status: %s"%status)
400                        self.dprint("Output: %s"%output)
401                        return [True,status,output]
402               
403                except Exception as e:
404                        print ("[ExportWebSitesServer] %s"%e)
405                        self.dprint(e)
406                        return [False,str(e)]
407        # def apache2_restart
408       
409        def sites_configuration(self):
410                try:
411                        modify=True
412                        path, dirs, files = next(os.walk(self.dir_export))
413                        number_files=len(files)
414                        self.dprint("*** Configuration File ***")
415                        if ( number_files > 0 ):
416                                self.dprint("Adding configuration line.....")
417                                if os.path.isfile(self.file_sites_configuration):
418                                        with open(self.file_sites_configuration, "r") as in_file:
419                                                buf = in_file.readlines()
420                                        with open(self.file_sites_configuration, "w") as out_file:
421                                                for line in buf:
422                                                        if  "lliurex-location" in line:
423                                                                modify=False
424                                                        else:
425                                                                if ( "<Directory /var/www/admin-center>" in line ) & (modify):
426                                                                        line = "include /etc/apache2/lliurex-location/*.conf\n" + line
427                                                        out_file.write(line)
428                        else:
429                                if os.path.isfile(self.file_sites_configuration):
430                                        self.dprint("Deleting configuration line.....")
431                                        self.dprint("Compare this lines:")
432                                        with open(self.file_sites_configuration, "r") as in_file:
433                                                buf = in_file.readlines()
434                                        with open(self.file_sites_configuration, "w") as out_file:
435                                                for line in buf:
436                                                        self.dprint(line)
437                                                        if "lliurex-location" in line:
438                                                                self.dprint("Deleting.......!!!!!!!!!!!!")
439                                                                line = "\n"
440                                                        out_file.write(line)
441                               
442                        return [True]
443               
444                except Exception as e:
445                        print ("[ExportWebSitesServer] %s"%e)
446                        self.dprint(e)
447                        return [False,str(e)]
448        #def sites_configuration
Note: See TracBrowser for help on using the repository browser.