summaryrefslogtreecommitdiffstats
path: root/cobbler
diff options
context:
space:
mode:
authorMichael DeHaan <mdehaan@redhat.com>2008-05-02 17:31:46 -0400
committerMichael DeHaan <mdehaan@redhat.com>2008-05-02 17:31:46 -0400
commitca041e7ed57a4818ed490b9fd9429db20d9d8860 (patch)
treebb4f8f5a7ddf741fbd65bcdef6b4e6aa6cfa420b /cobbler
parent35fd760f0fc069906da78aebf4a1ecb3e2414291 (diff)
downloadthird_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.py16
-rw-r--r--cobbler/action_litesync.py10
-rw-r--r--cobbler/action_sync.py14
-rw-r--r--cobbler/api.py13
-rw-r--r--cobbler/modules/manage_bind.py242
-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)