diff options
author | Michael DeHaan <mdehaan@redhat.com> | 2009-03-04 14:09:02 -0500 |
---|---|---|
committer | Michael DeHaan <mdehaan@redhat.com> | 2009-03-04 14:09:02 -0500 |
commit | ad1e9cefafbdb8f63cab54cf244ad04d67272e45 (patch) | |
tree | 3de48d49c47995842650b7340c5feec057211383 | |
parent | d3e583015e5c149e3804303136a799f500d6b10d (diff) | |
download | cobbler-ad1e9cefafbdb8f63cab54cf244ad04d67272e45.tar.gz cobbler-ad1e9cefafbdb8f63cab54cf244ad04d67272e45.tar.xz cobbler-ad1e9cefafbdb8f63cab54cf244ad04d67272e45.zip |
Some changes to cobbler registration
-rw-r--r-- | CHANGELOG | 1 | ||||
-rw-r--r-- | cobbler/remote.py | 99 | ||||
-rw-r--r-- | snippets/cobbler_register | 2 |
3 files changed, 67 insertions, 35 deletions
@@ -15,6 +15,7 @@ Cobbler CHANGELOG - (BUGF) fix for RHEL3 ppc imports - (FEAT) use nameserver variable in network config in Anaconda when set - (BUGF) sleep 5 seconds between power cycling systems +- (FEAT) support for /usr/bin/cobbler-register - Tue Mar 3 2009 - 1.4.3 - (BUGF) fix OMAPI support's (note: deprecated) usage of subprocess diff --git a/cobbler/remote.py b/cobbler/remote.py index 87d8bad4..54befcb1 100644 --- a/cobbler/remote.py +++ b/cobbler/remote.py @@ -292,10 +292,6 @@ class CobblerXMLRPCInterface: def generate_kickstart(self,profile=None,system=None,REMOTE_ADDR=None,REMOTE_MAC=None,**rest): self._log("generate_kickstart") - - if profile and not system: - regrc = self.register_mac(REMOTE_MAC,profile) - return self.api.generate_kickstart(profile,system) def get_settings(self,token=None,**rest): @@ -347,43 +343,78 @@ class CobblerXMLRPCInterface: return "# object not found: %s" % system_name return self.api.get_template_file_for_system(obj,path) - def register_mac(self,mac,profile,token=None,**rest): + def register_new_system(self,info,token=None,**rest): """ If register_new_installs is enabled in settings, this allows - kickstarts to add new system records for per-profile-provisioned - systems automatically via a wget in %post. This has security - implications. - READ: https://fedorahosted.org/cobbler/wiki/AutoRegistration + /usr/bin/cobbler-register (part of the koan package) to add + new system records remotely if they don't already exist. + There is a cobbler_register snippet that helps with doing + this automatically for new installs but it can also be used + for existing installs. See "AutoRegistration" on the Wiki. """ - - if mac is None: - # don't go further if not being called by anaconda - return 1 - - if not self.api.settings().register_new_installs: - # must be enabled in settings - return 2 - - system = self.api.find_system(mac_address=mac) - if system is not None: - # do not allow overwrites - return 3 - - # the MAC probably looks like "eth0 AA:BB:CC:DD:EE:FF" now, fix it - if mac.find(" ") != -1: - mac = mac.split()[-1] - - dup = self.api.find_system(mac_address=mac) - if dup is not None: - return 4 - - self._log("register mac for profile %s" % profile,token=token,name=mac) + + enabled = self.api.settings().register_new_installs + if not str(enabled) in [ "1", "y", "yes", "true" ]: + raise CX("registration is disabled in cobbler settings") + + # validate input + name = info.get("name","") + profile = info.get("profile","") + hostname = info.get("hostname","") + interfaces = info.get("interfaces",{}) + ilen = len(interfaces.keys()) + + if name == "": + raise CX("no system name submitted") + if profile == "": + raise CX("profile not submitted") + if ilen == 0: + raise CX("no interfaces submitted") + if ilen >= 64: + raise CX("too many interfaces submitted") + + # validate things first + name = info.get("name","") + inames = interfaces.keys() + if self.api.find_system(name=name): + raise CX("system name conflicts") + if hostname != "" and self.api.find_system(hostname=hostname): + raise CX("hostname conflicts") + + for iname in inames: + mac = info["interfaces"][iname].get("mac_address","") + ip = info["interfaces"][iname].get("ip_address","") + if ip.find("/") != -1: + raise CX("no CIDR ips are allowed") + if mac == "": + raise CX("missing MAC address for interface %s" % iname) + if mac != "": + system = self.api.find_system(mac_address=mac) + if system is not None: + raise CX("mac conflict: %s" % mac) + if ip != "": + system = self.api.find_system(ip_address=ip) + if system is not None: + raise CX("ip conflict: %s"% ip) + + # looks like we can go ahead and create a system now obj = self.api.new_system() obj.set_profile(profile) - name = mac.replace(":","_") obj.set_name(name) - obj.set_mac_address(mac, "eth0") + if hostname != "": + obj.set_hostname(hostname) obj.set_netboot_enabled(False) + for iname in inames: + mac = info["interfaces"][iname].get("mac_address","") + ip = info["interfaces"][iname].get("ip_address","") + netmask = info["interfaces"][iname].get("netmask","") + obj.set_mac_address(mac, iname) + if hostname != "": + obj.set_dns_name(hostname, iname) + if ip != "": + obj.set_ip_address(ip, iname) + if netmask != "": + obj.set_subnet(netmask, iname) self.api.add_system(obj) return 0 diff --git a/snippets/cobbler_register b/snippets/cobbler_register index ea2b99af..87dbb370 100644 --- a/snippets/cobbler_register +++ b/snippets/cobbler_register @@ -2,7 +2,7 @@ #if $getVar('system_name','') == '' #if $str($getVar('register_new_installs','')) in [ "1", "true", "yes", "y" ] if [ -f "/usr/bin/cobbler-register" ]; then - cobbler-register --server=$server --fqdn '*AUTO*' --profile=$profile_name + cobbler-register --server=$server --fqdn '*AUTO*' --profile=$profile_name --batch fi #else # cobbler registration is disabled in /etc/cobbler/settings |