[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