[Tutor] While until the end of a list
Toni Fuente
tonifuente at yahoo.co.uk
Mon Mar 13 11:54:57 EDT 2017
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 hostmaster at 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 "hostmaster at 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>
More information about the Tutor
mailing list