#!/usr/bin/env python3 # File: generate-pihole-dns-dhcp.py # # Description: This file generates the DNS and DHCP files for pihole. # # Package: AniNIX/Ubiqtorate # Copyright: WTFPL # # Author: DarkFeather import os import subprocess import sys import yaml rolepath='../roles/Nazara/files' dnsfilepath=rolepath+"/dns" dhcpfilepath=rolepath+"/dhcp" def WriteDHCPEntry(content,hosttype,hostclass): ### Create the DHCP entry # param content: the yaml content to parse # param hosttype: managed or unmanaged # param hostclass: the type of host as classified in the yaml global dhcpfile with open(dhcpfilepath,'a') as dhcpfile: for host in content['all']['children'][hosttype]['children'][hostclass]['hosts']: try: dhcpfile.write('dhcp-host=' + content['all']['children'][hosttype]['children'][hostclass]['hosts'][host]['mac'] + ',' + content['all']['children'][hosttype]['children'][hostclass]['hosts'][host]['ip'] + ',' + host + '.' + content['all']['vars']['replica_domain'] + '\n') except: print(host + ' is not complete for DHCP.') def WriteDNSEntry(content,hosttype,hostclass): ### Create the DNS entry # param content: the yaml content to parse # param hosttype: managed or unmanaged # param hostclass: the type of host as classified in the yaml global dnsfile with open(dnsfilepath,'a') as dnsfile: # Write host entries for host in content['all']['children'][hosttype]['children'][hostclass]['hosts']: try: dnsfile.write(content['all']['children'][hosttype]['children'][hostclass]['hosts'][host]['ip'] + ' ' + host + '.' + content['all']['vars']['replica_domain'] + ' ' + host + '\n') except: print(host + ' is not complete for DNS.') def GenerateFiles(file): ### Open the file and parse it # param file: the file to work on global dnsfile if not os.path.isdir(rolepath): os.mkdir(rolepath) # Parse the yaml with open(file, 'r') as stream: content = yaml.safe_load(stream) # Clear the DNS file with open(dhcpfilepath,'w') as dhcpfile: dhcpfile.write('dhcp-range='+content['all']['vars']['dhcprange']+'\n') dhcpfile.write('dhcp-option=option:dns-server,'+content['all']['vars']['dns']+'\n\n') dhcpfile.write('dhcp-range='+content['all']['vars']['staticrange']+'\n') with open(dnsfilepath,'w') as dnsfile: vips=subprocess.run(["/bin/bash", "-c", "echo | openssl s_client -connect "+content['all']['vars']['external_domain']+":443 | openssl x509 -text -noout | grep DNS: | tr ',' '\n' | sed 's/\s\+DNS://' | egrep -iv ^"+content['all']['vars']['external_domain']+" | tr '\n' ' '"], capture_output=True).stdout.decode("utf-8") dnsfile.write(content['all']['vars']['webfront']+' '+content['all']['vars']['external_domain']+' '+vips+"\n") # Add DNS entries for each host hosttype = 'managed' for hostclass in ['physical','virtual','geth_hubs']: WriteDNSEntry(content,hosttype,hostclass) WriteDHCPEntry(content,hosttype,hostclass) hosttype = 'unmanaged' for hostclass in ['ovas','appliances','iot']: WriteDNSEntry(content,hosttype,hostclass) WriteDHCPEntry(content,hosttype,hostclass) if __name__ == '__main__': if len(sys.argv) != 2: print("You need to supply an inventory file.") sys.exit(1) GenerateFiles(sys.argv[1]) sys.exit(0)