[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