[Tutor] Subdividing config file by matching line from a file

Peter Otten __peter__ at web.de
Wed Oct 19 10:52:50 EDT 2016


Toni Fuente via Tutor wrote:

> Hello everybody,
> 
> I am trying to divide a configuration file (configs) in the form of:
> 
> <VirtualHost xxx.xxx.xxx.xxx>
> ServerAdmin webmaster at foo.com
> ServerName www.foo.com
> DocumentRoot /home/public/web/htdocs/foo.com
>    ScriptAlias /cgi-bin/ /home/public/web/htdocs/foo.com/cgi-bin/
> </VirtualHost>
> 
> [...]
> 
> <VirtualHost xxx.xxx.xxx.xxx>
> ServerAdmin webmaster at bar.com
> ServerName www.bar.com
> DocumentRoot /home/public/web/htdocs/bar.com/
> </VirtualHost>
> 
> [...]
> 
> 
> into different individual config files for the different domains.
> 
> In a different file (sites), I've got a list of domains.
> 
> foo.com
> example.com
> blabla.com
> [...]
> 
> I've approached this problem by creating first a list of all the config
> "chunks" with this piece of code:
> 
> 
> #!/usr/bin/python
> 
> token = '\n'
> chunks = []
> current_chunk = []
> 
> 
> for line in open('configs'):
>    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
> 
> 
> Dividing the chunks of confg by blank line: token='\n' into a list of
> lists.
> 
> And now I am stuck trying to iterate through the chunks list, and iterate
> through the sites file trying to find the "site" string and if found,
> print the entire "chunk", which will be send to a personal site
> configuration file. Like so:
> 
> for item in chunks:
>     #print item
>     for line in open('sites'):
>         #print line
>         for i in item:
>             if line not in i:
>                 continue
>             else:
>                 print item
>                 break
> 
> I don't get the results that I am expecting. Is is the right way to
> approach this problem? Any direction will be very helpful.
> 
> Thank you in advance,
> 

You have to search all chunks for a specific site, i. e. you need the outer 
loop to iterate over the sites and the inner loops (repeatedly) over the 
chunks. It is easier to see the structure when you factor the site-search 
into its own function:

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 
                # (you might instead raise an Exception)


for line in open("sites"):
    site = line.strip()
    chunk = find_chunk(site, chunks)
    if chunk is not None:
        print "Site:", site
        print "Config:"
        print "".join(chunk)
    else:
        print >> sys.stderr, "no configuration for site", site
    print "---"

(If the number of chunks were huge you'd build some kind of lookup table 
mapping site to chunk, but in your case this is hardly worthwile)



More information about the Tutor mailing list