diff options
author | Michael DeHaan <mdehaan@redhat.com> | 2008-05-02 17:31:46 -0400 |
---|---|---|
committer | Michael DeHaan <mdehaan@redhat.com> | 2008-05-02 17:31:46 -0400 |
commit | ca041e7ed57a4818ed490b9fd9429db20d9d8860 (patch) | |
tree | bb4f8f5a7ddf741fbd65bcdef6b4e6aa6cfa420b /cobbler | |
parent | 35fd760f0fc069906da78aebf4a1ecb3e2414291 (diff) | |
download | third_party-cobbler-ca041e7ed57a4818ed490b9fd9429db20d9d8860.tar.gz third_party-cobbler-ca041e7ed57a4818ed490b9fd9429db20d9d8860.tar.xz third_party-cobbler-ca041e7ed57a4818ed490b9fd9429db20d9d8860.zip |
Various DNS/DHCP work.
Diffstat (limited to 'cobbler')
-rw-r--r-- | cobbler/action_check.py | 16 | ||||
-rw-r--r-- | cobbler/action_litesync.py | 10 | ||||
-rw-r--r-- | cobbler/action_sync.py | 14 | ||||
-rw-r--r-- | cobbler/api.py | 13 | ||||
-rw-r--r-- | cobbler/modules/manage_bind.py | 242 | ||||
-rw-r--r-- | cobbler/modules/manage_isc.py (renamed from cobbler/modules/manage_isc_and_bind.py) | 176 |
6 files changed, 274 insertions, 197 deletions
diff --git a/cobbler/action_check.py b/cobbler/action_check.py index e81e66c..9fe0543 100644 --- a/cobbler/action_check.py +++ b/cobbler/action_check.py @@ -37,23 +37,23 @@ class BootCheck: status = [] self.check_name(status) if self.settings.manage_dhcp: - mode = self.config.api.get_sync().manager.what() - if mode == "isc_and_bind": + mode = self.config.api.get_sync().dhcp.what() + if mode == "isc": self.check_dhcpd_bin(status) self.check_dhcpd_conf(status) self.check_service(status,"dhcpd") elif mode == "dnsmasq": self.check_dnsmasq_bin(status) self.check_service(status,"dnsmasq") - else: - status.append(_("configured management mode in modules.conf is unknown")) - # FIXME: add in checks for bind config + if self.settings.manage_dns: - mode = self.config.api.get_sync().manager.what() - if mode == "isc_and_bind": + mode = self.config.api.get_sync().dns.what() + if mode == "bind": self.check_bind_bin(status) self.check_service(status,"named") - pass + elif mode == "dnsmasq" and not self.settings.manage_dhcp: + self.check_dnsmasq_bin(status) + self.check_service(status,"dnsmasq") self.check_service(status, "cobblerd") diff --git a/cobbler/action_litesync.py b/cobbler/action_litesync.py index 9df99cc..ba3e3ee 100644 --- a/cobbler/action_litesync.py +++ b/cobbler/action_litesync.py @@ -105,8 +105,10 @@ class BootLiteSync: if system is None: raise CX(_("error in system lookup for %s") % name) # rebuild system_list file in webdir - self.sync.manager.regen_ethers() - self.sync.manager.regen_hosts() + if self.settings.manage_dhcp: + self.sync.dns.regen_ethers() + if self.settings.manage_dns: + self.sync.dhcp.regen_hosts() # write the PXE files for the system self.sync.pxegen.write_all_system_files(system) # per system kickstarts @@ -114,7 +116,7 @@ class BootLiteSync: if self.settings.manage_dhcp: if self.settings.omapi_enabled: for (name,interface) in system.interfaces.iteritems(): - self.sync.manager.write_dhcp_lease( + self.sync.dhcp.write_dhcp_lease( self.settings.omapi_port, interface["hostname"], interface["mac_address"], @@ -135,7 +137,7 @@ class BootLiteSync: if self.settings.manage_dhcp: if self.settings.omapi_enabled: for (name,interface) in system_record.interfaces.iteritems(): - self.sync.manager.remove_dhcp_lease( + self.sync.dhcp.remove_dhcp_lease( self.settings.omapi_port, interface["hostname"] ) diff --git a/cobbler/action_sync.py b/cobbler/action_sync.py index fbc9402..55cdad5 100644 --- a/cobbler/action_sync.py +++ b/cobbler/action_sync.py @@ -28,7 +28,6 @@ import utils from cexceptions import * import templar import pxegen -import manage_ctrl import yumgen import item_distro @@ -46,7 +45,7 @@ class BootSync: Handles conversion of internal state to the tftpboot tree layout """ - def __init__(self,config,verbose=False,manage=None): + def __init__(self,config,verbose=False,dhcp=None,dns=None): """ Constructor """ @@ -60,7 +59,8 @@ class BootSync: self.repos = config.repos() self.templar = templar.Templar(config) self.pxegen = pxegen.PXEGen(config) - self.manager = manage + self.dns = dns + self.dhcp = dhcp self.yumgen = yumgen.YumGen(config) self.bootloc = utils.tftpboot_location() @@ -93,11 +93,11 @@ class BootSync: self.pxegen.write_all_system_files(x) self.yumgen.retemplate_all_yum_repos() if self.settings.manage_dhcp: - self.manager.write_dhcp_file() - self.manager.regen_ethers() - self.manager.regen_hosts() + self.dhcp.write_dhcp_file() + self.dhcp.regen_ethers() if self.settings.manage_dns: - self.manager.write_dns_files() + self.dns.regen_hosts() + self.dns.write_dns_files() self.pxegen.make_pxe_menu() # run post-triggers diff --git a/cobbler/api.py b/cobbler/api.py index 1f5a246..20c7364 100644 --- a/cobbler/api.py +++ b/cobbler/api.py @@ -336,12 +336,17 @@ class BootAPI: return sync.run() def get_sync(self): - self.manage = self.get_module_from_file( - "management", + self.dhcp = self.get_module_from_file( + "dhcp", "module", - "manage_isc_and_bind" + "manage_isc" ).get_manager(self._config) - return action_sync.BootSync(self._config,manage=self.manage) + self.dns = self.get_module_from_file( + "dns", + "module", + "manage_bind" + ).get_manager(self._config) + return action_sync.BootSync(self._config,dhcp=self.dhcp,dns=self.dns) def reposync(self, name=None): """ diff --git a/cobbler/modules/manage_bind.py b/cobbler/modules/manage_bind.py new file mode 100644 index 0000000..900a832 --- /dev/null +++ b/cobbler/modules/manage_bind.py @@ -0,0 +1,242 @@ +""" +This is some of the code behind 'cobbler sync'. + +Copyright 2006-2008, Red Hat, Inc +Michael DeHaan <mdehaan@redhat.com> +John Eckersberg <jeckersb@redhat.com> + +This software may be freely redistributed under the terms of the GNU +general public license. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +""" + +import os +import os.path +import shutil +import time +import sub_process +import sys +import glob +import traceback +import errno +import popen2 +from shlex import shlex + + +import utils +from cexceptions import * +import templar + +import item_distro +import item_profile +import item_repo +import item_system + +from utils import _ + + +def register(): + """ + The mandatory cobbler module registration hook. + """ + return "manage" + + +class BindManager: + + def what(self): + return "isc_and_bind" + + def __init__(self,config,verbose=False): + """ + Constructor + """ + self.verbose = verbose + self.config = config + self.api = config.api + self.distros = config.distros() + self.profiles = config.profiles() + self.systems = config.systems() + self.settings = config.settings() + self.repos = config.repos() + self.templar = templar.Templar(config) + + def regen_hosts(self): + pass # not used + + def __forward_zones(self): + """ + Returns ALL forward zones for all systems + """ + zones = {} + for sys in self.systems: + for (name, interface) in sys.interfaces.iteritems(): + host = interface["hostname"] + ip = interface["ip_address"] + if not host or not ip: + # gotsta have some hostname and ip or else! + continue + if host.find(".") == -1: + continue + tokens = host.split('.') + zone = '.'.join(tokens[1:]) + if zones.has_key(zone): + zones[zone].append((host.split('.')[0], ip)) + else: + zones[zone] = [(host.split('.')[0], ip)] + return zones + + def __reverse_zones(self): + """ + Returns ALL reverse zones for all systems + """ + zones = {} + for sys in self.systems: + for (name, interface) in sys.interfaces.iteritems(): + host = interface["hostname"] + ip = interface["ip_address"] + if not host or not ip: + # gotsta have some hostname and ip or else! + continue + tokens = ip.split('.') + zone = '.'.join(tokens[0:3]) + if zones.has_key(zone): + zones[zone].append((tokens[3], host + '.')) + else: + zones[zone] = [(tokens[3], host + '.')] + return zones + + def __config_forward_zones(self): + """ + Returns only the forward zones which have systems and are defined + in the option manage_forward_zones + + Alternatively if manage_forward_zones is empty, return all systems + """ + all = self.__forward_zones() + want = self.settings.manage_forward_zones + if want == []: return all + ret = {} + for zone in all.keys(): + if zone in want: + ret[zone] = all[zone] + return ret + + def __config_reverse_zones(self): + """ + Returns only the reverse zones which have systems and are defined + in the option manage_reverse_zones + + Alternatively if manage_reverse_zones is empty, return all systems + """ + all = self.__reverse_zones() + want = self.settings.manage_reverse_zones + if want == []: return all + ret = {} + for zone in all.keys(): + if zone in want: + ret[zone] = all[zone] + return ret + + def __write_named_conf(self): + """ + Write out the named.conf main config file from the template. + """ + settings_file = self.settings.named_conf + template_file = "/etc/cobbler/named.template" + forward_zones = self.settings.manage_forward_zones + reverse_zones = self.settings.manage_reverse_zones + + metadata = {'zone_include': ''} + for zone in self.__config_forward_zones().keys(): + txt = """ +zone "%(zone)s." { + type master; + file "%(zone)s"; +}; +""" % {'zone': zone} + metadata['zone_include'] = metadata['zone_include'] + txt + + for zone in self.__config_reverse_zones().keys(): + tokens = zone.split('.') + tokens.reverse() + arpa = '.'.join(tokens) + '.in-addr.arpa' + txt = """ +zone "%(arpa)s." { + type master; + file "%(zone)s"; +}; +""" % {'arpa': arpa, 'zone': zone} + metadata['zone_include'] = metadata['zone_include'] + txt + + try: + f2 = open(template_file,"r") + except: + raise CX(_("error reading template from file: %s") % template_file) + template_data = "" + template_data = f2.read() + f2.close() + + self.templar.render(template_data, metadata, settings_file, None) + + def __write_zone_files(self): + """ + Write out the forward and reverse zone files for all the zones + defined in manage_forward_zones and manage_reverse_zones + """ + template_file = "/etc/cobbler/zone.template" + cobbler_server = self.settings.server + serial = int(time.time()) + forward = self.__config_forward_zones() + reverse = self.__config_reverse_zones() + + try: + f2 = open(template_file,"r") + except: + raise CX(_("error reading template from file: %s") % template_file) + template_data = "" + template_data = f2.read() + f2.close() + + for (zone, hosts) in forward.iteritems(): + metadata = { + 'cobbler_server': cobbler_server, + 'serial': serial, + 'host_record': '' + } + + for host in hosts: + txt = '%s\tIN\tA\t%s\n' % host + metadata['host_record'] = metadata['host_record'] + txt + + self.templar.render(template_data, metadata, '/var/named/' + zone, None) + + for (zone, hosts) in reverse.iteritems(): + metadata = { + 'cobbler_server': cobbler_server, + 'serial': serial, + 'host_record': '' + } + + for host in hosts: + txt = '%s\tIN\tPTR\t%s\n' % host + metadata['host_record'] = metadata['host_record'] + txt + + self.templar.render(template_data, metadata, '/var/named/' + zone, None) + + + def write_dns_files(self): + """ + BIND files are written when manage_dns is set in + /var/lib/cobbler/settings. + """ + + self.__write_named_conf() + self.__write_zone_files() + +def get_manager(config): + return BindManager(config) + diff --git a/cobbler/modules/manage_isc_and_bind.py b/cobbler/modules/manage_isc.py index 3927c69..bc88412 100644 --- a/cobbler/modules/manage_isc_and_bind.py +++ b/cobbler/modules/manage_isc.py @@ -45,7 +45,7 @@ def register(): return "manage" -class IscAndBindManager: +class IscManager: def what(self): return "isc_and_bind" @@ -248,178 +248,6 @@ class IscAndBindManager: pass # ISC/BIND do not use this - def regen_hosts(self): - pass # ISC/BIND do not use this - - - def __forward_zones(self): - """ - Returns ALL forward zones for all systems - """ - zones = {} - for sys in self.systems: - for (name, interface) in sys.interfaces.iteritems(): - host = interface["hostname"] - ip = interface["ip_address"] - if not host or not ip: - # gotsta have some hostname and ip or else! - continue - tokens = host.split('.') - zone = '.'.join(tokens[1:]) - if zones.has_key(zone): - zones[zone].append((host.split('.')[0], ip)) - else: - zones[zone] = [(host.split('.')[0], ip)] - return zones - - def __reverse_zones(self): - """ - Returns ALL reverse zones for all systems - """ - zones = {} - for sys in self.systems: - for (name, interface) in sys.interfaces.iteritems(): - host = interface["hostname"] - ip = interface["ip_address"] - if not host or not ip: - # gotsta have some hostname and ip or else! - continue - tokens = ip.split('.') - zone = '.'.join(tokens[0:3]) - if zones.has_key(zone): - zones[zone].append((tokens[3], host + '.')) - else: - zones[zone] = [(tokens[3], host + '.')] - return zones - - def __config_forward_zones(self): - """ - Returns only the forward zones which have systems and are defined - in the option manage_forward_zones - - Alternatively if manage_forward_zones is empty, return all systems - """ - all = self.__forward_zones() - want = self.settings.manage_forward_zones - if want == []: return all - ret = {} - for zone in all.keys(): - if zone in want: - ret[zone] = all[zone] - return ret - - def __config_reverse_zones(self): - """ - Returns only the reverse zones which have systems and are defined - in the option manage_reverse_zones - - Alternatively if manage_reverse_zones is empty, return all systems - """ - all = self.__reverse_zones() - want = self.settings.manage_reverse_zones - if want == []: return all - ret = {} - for zone in all.keys(): - if zone in want: - ret[zone] = all[zone] - return ret - - def __write_named_conf(self): - """ - Write out the named.conf main config file from the template. - """ - settings_file = self.settings.named_conf - template_file = "/etc/cobbler/named.template" - forward_zones = self.settings.manage_forward_zones - reverse_zones = self.settings.manage_reverse_zones - - metadata = {'zone_include': ''} - for zone in self.__config_forward_zones().keys(): - txt = """ -zone "%(zone)s." { - type master; - file "%(zone)s"; -}; -""" % {'zone': zone} - metadata['zone_include'] = metadata['zone_include'] + txt - - for zone in self.__config_reverse_zones().keys(): - tokens = zone.split('.') - tokens.reverse() - arpa = '.'.join(tokens) + '.in-addr.arpa' - txt = """ -zone "%(arpa)s." { - type master; - file "%(zone)s"; -}; -""" % {'arpa': arpa, 'zone': zone} - metadata['zone_include'] = metadata['zone_include'] + txt - - try: - f2 = open(template_file,"r") - except: - raise CX(_("error reading template from file: %s") % template_file) - template_data = "" - template_data = f2.read() - f2.close() - - self.templar.render(template_data, metadata, settings_file, None) - - def __write_zone_files(self): - """ - Write out the forward and reverse zone files for all the zones - defined in manage_forward_zones and manage_reverse_zones - """ - template_file = "/etc/cobbler/zone.template" - cobbler_server = self.settings.server - serial = int(time.time()) - forward = self.__config_forward_zones() - reverse = self.__config_reverse_zones() - - try: - f2 = open(template_file,"r") - except: - raise CX(_("error reading template from file: %s") % template_file) - template_data = "" - template_data = f2.read() - f2.close() - - for (zone, hosts) in forward.iteritems(): - metadata = { - 'cobbler_server': cobbler_server, - 'serial': serial, - 'host_record': '' - } - - for host in hosts: - txt = '%s\tIN\tA\t%s\n' % host - metadata['host_record'] = metadata['host_record'] + txt - - self.templar.render(template_data, metadata, '/var/named/' + zone, None) - - for (zone, hosts) in reverse.iteritems(): - metadata = { - 'cobbler_server': cobbler_server, - 'serial': serial, - 'host_record': '' - } - - for host in hosts: - txt = '%s\tIN\tPTR\t%s\n' % host - metadata['host_record'] = metadata['host_record'] + txt - - self.templar.render(template_data, metadata, '/var/named/' + zone, None) - - - def write_dns_files(self): - """ - BIND files are written when manage_dns is set in - /var/lib/cobbler/settings. - """ - - self.__write_named_conf() - self.__write_zone_files() - def get_manager(config): - return IscAndBindManager(config) + return IscManager(config) |