Hi, I've got this script that goes through an httpd conf file, and gets the related bits of it for a site, and writes a new config with values that I am interested. The problem is that it finds the first chunk and returns it, but I need to go to the end of all chunks list, because there are also some chunks related to the same site that I need to collect (virtualhost *:80 and virtualhost:443). I was
I was thinking in a while loop in the find_chunk function that will go through all chunks and return the chunks that site is on, but I don't know how to construct it. Thank you in advance for any suggestion. Toni. cat sites_user: foo.com bar [...] #!/usr/bin/python import sys, re, os token = '\n' chunks = [] current_chunk = [] def find_chunk(site, chunks): for chunk in chunks: if any(site in line for line in chunk): return chunk return None # no appropriate chunk found def new_chunk(chunk, user, site): config = [] for item in chunk: if "DocumentRoot" in item: root_dir = item.rsplit('/', 1)[-1] root_dir = root_dir.strip('\n') config.append(re.sub('/home/httpd/vhosts/[a-zA-Z\d-]{,63}(\.[a-zA-Z\d-]{,63})*/[a-zA-Z\d-]{,63}', '/websites/' + user.rstrip() + '/' + site + '/' + root_dir, item)) elif re.match('<VirtualHost \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}:\d{1,2}>', item) is not None: config.append(re.sub('<VirtualHost \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}:\d{1,2}>', '<VirtualHost *:80>', item)) elif re.match('<VirtualHost \d{3}\.\d{1,3}\.\d{1,3}\.\d{1,3}:\d{1,3}>', item) is not None: config.append(re.sub('<VirtualHost \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}:\d{1,3}>', '<VirtualHost *:443>', item)) elif "</VirtualHost>" in item: config.append(item) elif "Log" in item: config.append(re.sub('/home/httpd/vhosts/[a-zA-Z\d-]{,63}(\.[a-zA-Z\d-]{,63})*/statistics/logs/*', '/websites/' + user.rstrip() + '/logs/' + site + '/', item)) elif "cgi-bin" in item: config.append(re.sub('/home/httpd/vhosts/[a-zA-Z\d-]{,63}(\.[a-zA-Z\d-]{,63})*/cgi-bin/', '/websites/' + user.rstrip() + '/cgi-bin/' + site + '/', item)) elif "ServerAlias" in item: config.append(item) elif "ServerAdmin" in item: config.append(item) else: print "DO NOTHING" return config #for line in open('work/total.configs.txt'): with open('work/total.configs.txt') as openfileobject: for line in openfileobject: if line.startswith(token) and current_chunk: # if line starts with token and the current chunk is not empty chunks.append(current_chunk[:]) # add not empty chunk to chunks current_chunk = [] # make current chunk blank # just append a line to the current chunk on each iteration current_chunk.append(line) chunks.append(current_chunk) # append the last chunk outside the loop for line in open("sites_user.txt"): site, user = line.split(' ', 1) chunk = find_chunk(site, chunks) #chunk.pop(0) print site if chunk is not None: #chunk.pop(0) new_config = new_chunk(chunk, user, site) with open("/tmp/afm/etc/httpd/conf.d/vhosts.inc/%s.conf" % site, "a") as cfile: cfile.write("".join(new_config)) with open("/tmp/afm/etc/httpd/conf.d/vhosts.conf", "a") as vfile: vfile.write("Include conf.d/vhosts.inc/%s.conf\n" % site) else: print >> sys.stderr, "no configuration for site", site EXAMPLE of total.configs.txt: <Another virtual host> ... </Another virtual host> <IfModule mod_ssl.c> <VirtualHost [IP]:443> ServerName foo.com:443 ServerAlias www.foo.com UseCanonicalName Off <IfModule mod_suexec.c> SuexecUserGroup katz psacln </IfModule> ServerAdmin hostmas...@foo.com DocumentRoot /home/httpd/vhosts/foo.com/httpsdocs CustomLog /home/httpd/vhosts/foo.com/statistics/logs/access_ssl_log combined ErrorLog /home/httpd/vhosts/foo.com/statistics/logs/error_ssl_log <IfModule mod_userdir.c> UserDir /home/httpd/vhosts/foo.com/web_users </IfModule> ScriptAlias /cgi-bin/ /home/httpd/vhosts/foo.com/cgi-bin/ Alias /webstat /home/httpd/vhosts/foo.com/statistics/webstat/ Alias /webstat-ssl /home/httpd/vhosts/foo.com/statistics/webstat-ssl/ Alias /ftpstat /home/httpd/vhosts/foo.com/statistics/ftpstat/ SSLEngine on SSLVerifyClient none SSLCertificateFile /usr/local/psa/var/certificates/sMJq9Q <Directory /home/httpd/vhosts/foo.com/httpsdocs> <IfModule sapi_apache2.c> php_admin_flag engine on php_admin_value open_basedir "/home/httpd/vhosts/foo.com/httpsdocs:/tmp" </IfModule> SSLRequireSSL Options +Includes +ExecCGI </Directory> Alias "/error_docs" "/home/httpd/vhosts/foo.com/error_docs" ErrorDocument 400 /error_docs/bad_request.html ErrorDocument 403 /error_docs/forbidden.html ErrorDocument 404 /error_docs/not_found.html ErrorDocument 500 /error_docs/internal_server_error.html </VirtualHost> </IfModule> <VirtualHost [IP]:80> ServerName foo.com:80 ServerAlias www.foo.com UseCanonicalName Off SuexecUserGroup katz psacln ServerAdmin "hostmas...@foo.com" DocumentRoot /home/httpd/vhosts/foo.com/httpdocs CustomLog /home/httpd/vhosts/foo.com/statistics/logs/access_log combined ErrorLog /home/httpd/vhosts/foo.com/statistics/logs/error_log <IfModule mod_userdir.c> UserDir /home/httpd/vhosts/foo.com/web_users </IfModule> ScriptAlias /cgi-bin/ /home/httpd/vhosts/foo.com/cgi-bin/ <IfModule mod_ssl.c> SSLEngine off </IfModule> <Directory /home/httpd/vhosts/foo.com/httpdocs> <IfModule sapi_apache2.c> php_admin_flag engine on php_admin_value open_basedir "/home/httpd/vhosts/foo.com/httpdocs:/tmp" </IfModule> Options +Includes +ExecCGI </Directory> Alias "/error_docs" "/home/httpd/vhosts/foo.com/error_docs" ErrorDocument 400 /error_docs/bad_request.html ErrorDocument 403 /error_docs/forbidden.html ErrorDocument 404 /error_docs/not_found.html ErrorDocument 500 /error_docs/internal_server_error.html </VirtualHost> _______________________________________________ Tutor maillist - Tutor@python.org To unsubscribe or change subscription options: https://mail.python.org/mailman/listinfo/tutor