Show the complete apache config file
In the Apache config file, you can use "Include" or "IncludeOptional" to include other config files. A lot of the Linux variants take advantage of that to organize the config files. For example, the default congif file of Ubuntu is in /etc/apache2/apache.conf, and it includes enabled modules, enabled sites, and configuration files this way:
IncludeOptional mods-enabled/*.conf
IncludeOptional conf-enabled/*.conf
IncludeOptional sites-enabled/*.conf
If you really want to see all the complete config settings, there is no existing tool for that. This Stack Overflow page answered this question pretty well: You can use apachectl -S to see the settings of Virtual Host, or apachectl -M to see the loaded modules, but to see all settings, there is no such tool, you will have to go through all the files , starting from familiar yourself with the general structure of the httpd config files.
So I created this python program to generate the complete apache config file:
#!/usr/bin/python2.7 # CombineApacheConfig.py
#!/usr/bin/python2.7 # CombineApacheConfig.py __author__ = 'ben' import sys, os, os.path, logging, fnmatch, re def Help(): print("Usage: python CombineApacheConfig.py inputfile[default:/etc/apache2/apache2.conf] outputfile[default:/tmp/apache2.combined.conf") def InputParameter(): if len(sys.argv) <> 3: Help() return "/etc/apache2/apache2.conf", "/tmp/apache2.combined.conf" return sys.argv[1], sys.argv[2] def ProcessMultipleFiles(InputFiles): if InputFiles.endswith('/'): #Updated as Pierrick's comment InputFiles = InputFiles + "*" Content = '' LocalFolder = os.path.dirname(InputFiles) basenamePattern = os.path.basename(InputFiles) for root, dirs, files in os.walk(LocalFolder): for filename in fnmatch.filter(files, basenamePattern): Content += ProcessInput(os.path.join(root, filename)) return Content def RemoveExcessiveLinebreak(s): Length = len(s) s = s.replace(os.linesep + os.linesep + os.linesep, os.linesep + os.linesep) NewLength = len(s) if NewLength < Length: s = RemoveExcessiveLinebreak(s) return s def ProcessInput(InputFile): global ServerRoot Content = '' if logging.root.isEnabledFor(logging.DEBUG): Content = '# Start of ' + InputFile + os.linesep with open(InputFile, 'r') as infile: for line in infile: stripline = line.strip(' \t') if stripline.startswith('#'): continue searchroot = re.search(r'ServerRoot\s+(\S+)', stripline, re.I) #search for ServerRoot if searchroot: ServerRoot = searchroot.group(1).strip('"') logging.info("ServerRoot: " + ServerRoot) if stripline.lower().startswith('include'): match = stripline.split() if len(match) == 2: IncludeFiles = match[1] IncludeFiles = IncludeFiles.strip('"') #Inserted according to V's comment. if not IncludeFiles.startswith('/'): IncludeFiles = os.path.join(ServerRoot, IncludeFiles) Content += ProcessMultipleFiles(IncludeFiles) + os.linesep else: Content += line # if it is not pattern of 'include(optional) path', then continue. else: Content += line Content = RemoveExcessiveLinebreak(Content) if logging.root.isEnabledFor(logging.DEBUG): Content += '# End of ' + InputFile + os.linesep + os.linesep return Content if __name__ == "__main__": logging.basicConfig(level=logging.DEBUG, format='[%(asctime)s][%(levelname)s]:%(message)s') InputFile, OutputFile = InputParameter() try: ServerRoot = os.path.dirname(InputFile) Content = ProcessInput(InputFile) except Exception as e: logging.error("Failed to process " + InputFile, exc_info=True) exit(1) try: with open(OutputFile, 'w') as outfile: outfile.write(Content) except Exception as e: logging.error("Failed to write to " + outfile, exc_info=True) exit(1) logging.info("Done writing " + OutputFile)
The usage is simple: Run it as "python CombineApacheConfig.py ". Since there is no additional parameters given, it will retrieve the default Ubuntu apache config file from /etc/apache2/apache2.conf and generate the result complete config file in /tmp/apache2.combined.conf. If your config file is in different location, then give the input file and output file location. For example, RHEL has the config file in /etc/httpd/conf/httpd.conf, then you can run "python CombineApacheConfig.py /etc/httpd/conf/httpd.conf /tmp/apache2.combined.conf ".
Note: Apache server-info page http://127.0.0.1/server-info also provide similar information, but not in the config file format. It is in human readable format. The page works only when it is open from the same computer.
Note: Apache server-info page http://127.0.0.1/server-info also provide similar information, but not in the config file format. It is in human readable format. The page works only when it is open from the same computer.
Labels: Programming
It's a nice looking idea, but doesn't seem to be including any included files... is this working for other people? |
Inserted one line "IncludeFiles = IncludeFiles.strip('"')" to deal with the config file with quotation marks according to V's comment. Thanks, V. |