#! /opt/imh-python/bin/python3
''' Gather important VirtualHost information. '''
from argparse import ArgumentParser
LOGGER = logging.getLogger(__name__)
__email__ = "danielk@inmotionhosting.com"
def get_vhost_list(conf=None):
'''Collect necessary information from VirtualHost entries.'''
conf = envinfo.get_data()['apache_conf']
r'<VirtualHost (?P<ip>[0-9.]+):(?P<port>[0-9]+)( ([0-9.]+):([0-9]+))*>'
with open(conf, encoding='utf-8') as file_handle:
vhost_data['hostnames'] = []
vhost_match = vhost_rx.search(line)
if "/VirtualHost" in line:
vhost_list.append(vhost_data)
vhost_data['hostnames'] = []
elif vhost_match is not None:
vhost_data['ip'] = vhost_match.group('ip')
vhost_data['port'] = vhost_match.group('port')
elif "ServerName" in line:
vhost_data['hostnames'].append(line.split()[1])
elif "ServerAlias" in line:
for host in line.split(" ", 1)[1].split():
vhost_data['hostnames'].append(host)
if 'includes' not in vhost_data:
vhost_data['includes'] = []
vhost_data['includes'].append(line.split()[1])
elif "SSLCertificateFile" in line:
vhost_data['ssl'] = line.split()[1]
elif "SSLCertificateKeyFile" in line:
vhost_data['key'] = line.split()[1]
elif "SSLCertificateChainFile" in line:
vhost_data['ca'] = line.split()[1]
elif "DocumentRoot" in line:
vhost_data['docroot'] = line.split()[1]
LOGGER.error("Error reading file")
def search_vhost_list(vhost_list, host=None, ip_address=None, port=None):
'''Search vhost_list for first matching entry for given information'''
vhost_list = get_vhost_list()
for vhost_data in vhost_list:
if (ip_address is None) or (ip_address in vhost_data['ip']):
if (port is None) or (port in vhost_data['port']):
working_list.append(vhost_data)
if len(working_list) == 0:
for vhost_data in vhost_list:
if (ip_address is None) or (ip_address in vhost_data['ip']):
if '*' in vhost_data['port']:
working_list.append(vhost_data)
if len(working_list) == 0:
for vhost_data in working_list:
if host in vhost_data['hostnames']:
'''Parse command line aruments'''
parser = ArgumentParser(description=__doc__)
output_parser_group = parser.add_argument_group("Output options")
output_group = output_parser_group.add_mutually_exclusive_group()
output_group.add_argument(
help="Output only the document root.",
output_group.add_argument(
help="Output only the document root.",
help="Location of a custom Apache configuration.",
search_group = parser.add_argument_group("Search options")
search_group.add_argument(
"-i", "--ip", type=str, default=None, help="IP to search."
port_group = search_group.add_mutually_exclusive_group()
"-p", "--port", type=str, default=None, help="Port to search."
help="Try port 443 first, and if no entry, try port 80.",
search_group.add_argument("hostname", type=str, help="Hostname to search.")
args = parser.parse_args()
return output, args.ip, args.port, args.hostname, args.config
'''Main function for script'''
(output, ip_address, port, host, conf) = parse_args()
vhost_list = get_vhost_list(conf)
vhost_data = search_vhost_list(vhost_list, host, ip_address, port)
print("No results found")
elif output == "docroot":
print(vhost_data['docroot'])
vhost_data, sort_keys=True, indent=4, separators=(',', ': ')
print("Hostname: %s" % host)
print("IP/port: {}:{}".format(vhost_data['ip'], vhost_data['port']))
print("Document Root: %s" % vhost_data['docroot'])
print("SSL Certificate: %s" % vhost_data['ssl'])
print("SSL Private Key: %s" % vhost_data['key'])
print("SSL CA Bundle: %s" % vhost_data['ca'])
if 'includes' in vhost_data:
for path in vhost_data['includes']:
print("Include: %s" % path)
if __name__ == "__main__":