--- ./cobbler/field_info.py 2010-07-28 17:48:48.000000000 +0200 +++ ./cobbler/field_info.py 2012-01-26 13:43:04.000000000 +0100 @@ -58,6 +58,7 @@ USES_CHECKBOX = [ "*netboot_enabled", "netboot_enabled", "*static", + "ipv6_autoconfiguration", "keep_updated", "mirror_locally", "virt_auto_boot" @@ -101,6 +102,7 @@ BLOCK_MAPPINGS = { "broadcast" : "Networking", # .. "reserved" : "Networking", # .. "*mac_address" : "Networking", + "*mtu" : "Networking", "*ip_address" : "Networking", "*dhcp_tag" : "Networking", "*static" : "Networking", @@ -110,17 +112,24 @@ BLOCK_MAPPINGS = { "*dns_name" : "Networking", "*static_routes" : "Networking", "*subnet" : "Networking", - "hostname" : "Networking (Global)", - "gateway" : "Networking (Global)", - "name_servers" : "Networking (Global)", - "name_servers_search" : "Networking (Global)", - "repos" : "General", - "dhcp_tag" : "Advanced", - "mgmt_classes" : "Management", - "template_files" : "Management", - "network_widget_a" : "Networking", - "network_widget_b" : "Networking", - "server" : "Advanced", + "*ipv6_address" : "Networking", + "*ipv6_secondaries" : "Networking", + "*ipv6_mtu" : "Networking", + "*ipv6_static_routes" : "Networking", + "*ipv6_default_gateway" : "Networking", + "hostname" : "Networking (Global)", + "gateway" : "Networking (Global)", + "name_servers" : "Networking (Global)", + "name_servers_search" : "Networking (Global)", + "ipv6_default_device" : "Networking (Global)", + "ipv6_autoconfiguration" : "Networking (Global)", + "repos" : "General", + "dhcp_tag" : "Advanced", + "mgmt_classes" : "Management", + "template_files" : "Management", + "network_widget_a" : "Networking", + "network_widget_b" : "Networking", + "server" : "Advanced", "redhat_management_key" : "Management", "redhat_management_server" : "Management", "createrepo_flags" : "Advanced", --- ./cobbler/item_system.py 2010-07-28 17:48:48.000000000 +0200 +++ ./cobbler/item_system.py 2012-01-26 13:43:04.000000000 +0100 @@ -59,9 +59,12 @@ FIELDS = [ ["gateway","",0,"Gateway",True,"",0,"str"], ["name_servers",[],0,"Name Servers",True,"space delimited",0,"list"], ["name_servers_search",[],0,"Name Servers Search Path",True,"space delimited",0,"list"], + ["ipv6_default_device","",0,"IPv6 Default Device",True,"",0,"str"], + ["ipv6_autoconfiguration",False,0,"IPv6 Autoconfiguration",True,"",0,"bool"], ["network_widget_a","",0,"Add Interface",True,"",0,"str"], # not a real field, a marker for the web app ["network_widget_b","",0,"Edit Interface",True,"",0,"str"], # not a real field, a marker for the web app ["*mac_address","",0,"MAC Address",True,"(Place \"random\" in this field for a random MAC Address.)",0,"str"], + ["*mtu","",0,"MTU",True,"",0,"str"], ["*ip_address","",0,"IP Address",True,"",0,"str"], ["*bonding","na",0,"Bonding Mode",True,"",["na","master","slave"],"str"], ["*bonding_master","",0,"Bonding Master",True,"",0,"str"], @@ -72,6 +75,11 @@ FIELDS = [ ["*dns_name","",0,"DNS Name",True,"",0,"str"], ["*static_routes",[],0,"Static Routes",True,"",0,"list"], ["*virt_bridge","",0,"Virt Bridge",True,"",0,"str"], + ["*ipv6_address","",0,"IPv6 Address",True,"",0,"str"], + ["*ipv6_secondaries",[],0,"IPv6 Secondaries",True,"space delimited",0,"list"], + ["*ipv6_mtu","",0,"IPv6 MTU",True,"",0,"str"], + ["*ipv6_static_routes",[],0,"IPv6 Static Routes",True,"",0,"list"], + ["*ipv6_default_gateway","",0,"IPv6 Default Gateway",True,"",0,"str"], ["mgmt_classes",[],0,"Management Classes",True,"For external config management",0,"list"], ["template_files",{},0,"Template Files",True,"File mappings for built-in configuration management",0,"dict"], ["redhat_management_key","<>",0,"Red Hat Management Key",True,"Registration key for RHN, Satellite, or Spacewalk",0,"str"], @@ -114,6 +122,7 @@ class System(item.Item): if not self.interfaces.has_key(name): self.interfaces[name] = { "mac_address" : "", + "mtu" : "", "ip_address" : "", "dhcp_tag" : "", "subnet" : "", @@ -124,6 +133,11 @@ class System(item.Item): "bonding_opts" : "", "dns_name" : "", "static_routes" : [], + "ipv6_address" : "", + "ipv6_secondaries" : [], + "ipv6_mtu" : "", + "ipv6_static_routes" : [], + "ipv6_default_gateway" : "", } return self.interfaces[name] @@ -364,6 +378,65 @@ class System(item.Item): intf["bonding_opts"] = bonding_opts return True + def set_ipv6_autoconfiguration(self,truthiness): + self.ipv6_autoconfiguration = utils.input_boolean(truthiness) + return True + + def set_ipv6_default_device(self,interface_name): + if interface_name is None: + interface_name = "" + self.ipv6_default_device = interface_name + return True + + def set_ipv6_address(self,address,interface): + """ + Assign a IP or hostname in DHCP when this MAC boots. + Only works if manage_dhcp is set in /etc/cobbler/settings + """ + intf = self.__get_interface(interface) + if address == "" or utils.is_ip(address): + intf["ipv6_address"] = address.strip() + return True + raise CX(_("invalid format for IPv6 IP address (%s)") % address) + + def set_ipv6_secondaries(self,addresses,interface): + intf = self.__get_interface(interface) + data = utils.input_string_or_list(addresses) + secondaries = [] + for address in data: + if address == "" or utils.is_ip(address): + secondaries.append(address) + else: + raise CX(_("invalid format for IPv6 IP address (%s)") % address) + + intf["ipv6_secondaries"] = secondaries + return True + + def set_ipv6_default_gateway(self,address,interface): + intf = self.__get_interface(interface) + if address == "" or utils.is_ip(address): + intf["ipv6_default_gateway"] = address.strip() + return True + raise CX(_("invalid format for IPv6 IP address (%s)") % address) + + def set_ipv6_static_routes(self,routes,interface): + intf = self.__get_interface(interface) + data = utils.input_string_or_list(routes) + intf["ipv6_static_routes"] = data + return True + + def set_ipv6_mtu(self,mtu,interface): + intf = self.__get_interface(interface) + intf["ipv6_mtu"] = mtu + return True + + def set_mtu(self,mtu,interface): + intf = self.__get_interface(interface) + intf["mtu"] = mtu + return True + + + def set_profile(self,profile_name): """ Set the system to use a certain named profile. The profile @@ -503,17 +576,23 @@ class System(item.Item): for (key,value) in hash.iteritems(): (field,interface) = key.split("-") field = field.replace("_","").replace("-","") - if field == "macaddress" : self.set_mac_address(value, interface) - if field == "ipaddress" : self.set_ip_address(value, interface) - if field == "dnsname" : self.set_dns_name(value, interface) - if field == "static" : self.set_static(value, interface) - if field == "dhcptag" : self.set_dhcp_tag(value, interface) - if field == "subnet" : self.set_subnet(value, interface) - if field == "virtbridge" : self.set_virt_bridge(value, interface) - if field == "bonding" : self.set_bonding(value, interface) - if field == "bondingmaster" : self.set_bonding_master(value, interface) - if field == "bondingopts" : self.set_bonding_opts(value, interface) - if field == "staticroutes" : self.set_static_routes(value, interface) + if field == "macaddress" : self.set_mac_address(value, interface) + if field == "mtu" : self.set_mtu(value, interface) + if field == "ipaddress" : self.set_ip_address(value, interface) + if field == "dnsname" : self.set_dns_name(value, interface) + if field == "static" : self.set_static(value, interface) + if field == "dhcptag" : self.set_dhcp_tag(value, interface) + if field == "subnet" : self.set_subnet(value, interface) + if field == "virtbridge" : self.set_virt_bridge(value, interface) + if field == "bonding" : self.set_bonding(value, interface) + if field == "bondingmaster" : self.set_bonding_master(value, interface) + if field == "bondingopts" : self.set_bonding_opts(value, interface) + if field == "staticroutes" : self.set_static_routes(value, interface) + if field == "ipv6address" : self.set_ipv6_address(value, interface) + if field == "ipv6secondaries" : self.set_ipv6_secondaries(value, interface) + if field == "ipv6mtu" : self.set_ipv6_mtu(value, interface) + if field == "ipv6staticroutes" : self.set_ipv6_static_routes(value, interface) + if field == "ipv6defaultgateway" : self.set_ipv6_default_gateway(value, interface) return True def check_if_valid(self): --- ./snippets/post_install_network_config 2010-07-28 17:48:48.000000000 +0200 +++ ./snippets/post_install_network_config 2012-01-26 15:53:46.000000000 +0100 @@ -14,6 +14,7 @@ # #set $configbymac = True #set $numbondingdevs = 0 + #set $enableipv6 = False ## ============================================================================= #for $iname in $ikeys ## look at the interface hash data for the specific interface @@ -29,6 +30,12 @@ #if $idata["bonding"].lower() == "master" #set $numbondingdevs += 1 #end if + + ## enable IPv6 networking if we set an ipv6 address or turn on autoconfiguration + #if $idata["ipv6_address"] != "" or $ipv6_autoconfiguration == True + #set $enableipv6 = True + #end if + #end for ## end looping through the interfaces to see which ones we need to configure. ## ============================================================================= @@ -64,22 +71,56 @@ mv /etc/sysconfig/network.cobbler /etc/s # connecting to Puppet before a reboot). /bin/hostname $hostname #end if + + #if $enableipv6 == True +grep -v NETWORKING_IPV6 /etc/sysconfig/network > /etc/sysconfig/network.cobbler +echo "NETWORKING_IPV6=yes" >> /etc/sysconfig/network.cobbler +rm -f /etc/sysconfig/network +mv /etc/sysconfig/network.cobbler /etc/sysconfig/network + + #if $ipv6_autoconfiguration != "" +grep -v IPV6_AUTOCONF /etc/sysconfig/network > /etc/sysconfig/network.cobbler + #if $ipv6_autoconfiguration == True +echo "IPV6_AUTOCONF=yes" >> /etc/sysconfig/network.cobbler + #else +echo "IPV6_AUTOCONF=no" >> /etc/sysconfig/network.cobbler + #end if +rm -f /etc/sysconfig/network +mv /etc/sysconfig/network.cobbler /etc/sysconfig/network + #end if + + #if $ipv6_default_device != "" +grep -v IPV6_DEFAULTDEV /etc/sysconfig/network > /etc/sysconfig/network.cobbler +echo "IPV6_DEFAULTDEV=$ipv6_default_device" >> /etc/sysconfig/network.cobbler +rm -f /etc/sysconfig/network +mv /etc/sysconfig/network.cobbler /etc/sysconfig/network + #end if + + #end if + ## ============================================================================= ## now create the config file for each interface #for $iname in $ikeys # Start configuration for $iname ## create lots of variables to use later - #set $idata = $interfaces[$iname] - #set $mac = $idata["mac_address"].upper() - #set $static = $idata["static"] - #set $ip = $idata["ip_address"] - #set $netmask = $idata["subnet"] - #set $static_routes = $idata["static_routes"] - #set $bonding = $idata["bonding"] - #set $bonding_master = $idata["bonding_master"] - #set $bonding_opts = $idata["bonding_opts"] - #set $devfile = "/etc/sysconfig/network-scripts/cobbler/ifcfg-" + $iname - #set $routesfile = "/etc/sysconfig/network-scripts/cobbler/route-" + $iname + #set $idata = $interfaces[$iname] + #set $mac = $idata["mac_address"].upper() + #set $mtu = $idata["mtu"] + #set $static = $idata["static"] + #set $ip = $idata["ip_address"] + #set $netmask = $idata["subnet"] + #set $static_routes = $idata["static_routes"] + #set $bonding = $idata["bonding"] + #set $bonding_master = $idata["bonding_master"] + #set $bonding_opts = $idata["bonding_opts"] + #set $ipv6_address = $idata["ipv6_address"] + #set $ipv6_secondaries = $idata["ipv6_secondaries"] + #set $ipv6_mtu = $idata["ipv6_mtu"] + #set $ipv6_default_gateway = $idata["ipv6_default_gateway"] + #set $ipv6_static_routes = $idata["ipv6_static_routes"] + #set $devfile = "/etc/sysconfig/network-scripts/cobbler/ifcfg-" + $iname + #set $routesfile = "/etc/sysconfig/network-scripts/cobbler/route-" + $iname + #set $ipv6_routesfile = "/etc/sysconfig/network-scripts/cobbler/route6-" + $iname ## determine if this interface is for a VLAN #if $vlanpattern.match($iname) ## If this is a VLAN interface, skip it, anaconda doesn't know @@ -140,9 +181,37 @@ echo "NETMASK=$netmask" >> $devfile ## we don't have enough info for static configuration echo "BOOTPROTO=none" >> $devfile #end if + #if $enableipv6 == True and $ipv6_address == "" and $ipv6_secondaries == "" +echo "IPV6INIT=no" >> $devfile + #end if + #if $enableipv6 == True and $ipv6_autoconfiguration == False + #if $ipv6_address != "" +echo "IPV6INIT=yes" >> $devfile +echo "IPV6ADDR=$ipv6_address" >> $devfile + #end if + #if $ipv6_secondaries != "" + #set ipv6_secondaries = ' '.join(ipv6_secondaries) + ## The quotes around the ipv6 ip's need to be here +echo 'IPV6ADDR_SECONDARIES="$ipv6_secondaries"' >> $devfile + #end if + #if $ipv6_mtu != "" +echo "IPV6MTU=$ipv6_mtu" >> $devfile + #end if + #if $ipv6_default_gateway != "" +echo "IPV6_DEFAULTGW=$ipv6_default_gateway" >> $devfile + #end if + #end if #else + #if $ip == "" + ## this interface has no IPv4 address set +echo "BOOTPROTO=none" >> $devfile + #else ## this is a DHCP interface, much less work to do echo "BOOTPROTO=dhcp" >> $devfile + #end if + #end if + #if $mtu != "" +echo "MTU=$mtu" >> $devfile #end if #else if $is_vlan == "true" or $bonding.lower() == "master" ## Handle non-physical interfaces with special care. :) @@ -178,6 +247,9 @@ echo "BOOTPROTO=none" >> $devfile #else echo "BOOTPROTO=dhcp" >> $devfile #end if + #if $mtu != "" +echo "MTU=$mtu" >> $devfile + #end if #else if $configbymac == False ## We'll end up here when not all physical interfaces present for ## this system have MAC-addresses configured for them. We don't @@ -214,6 +286,9 @@ echo "BOOTPROTO=none" >> $devfile ## this is a DHCP interface, much less work to do echo "BOOTPROTO=dhcp" >> $devfile #end if + #if $mtu != "" +echo "MTU=$mtu" >> $devfile + #end if #else # If you end up here, please mail the list... This shouldn't # happen. ;-) -- jcapel @@ -225,19 +300,32 @@ echo "BOOTPROTO=dhcp" >> $devfile #set $nct = $nct + 1 echo "DNS$nct=$nameserver" >> $devfile #end for - #end if - #for $route in $static_routes - #set routepattern = $re.compile("[0-9/.]+:[0-9.]+") - #if $routepattern.match($route) - #set $routebits = $route.split(":") - #set [$network, $router] = $route.split(":") + #end if + #for $route in $static_routes + #set routepattern = $re.compile("[0-9/.]+:[0-9.]+") + #if $routepattern.match($route) + #set $routebits = $route.split(":") + #set [$network, $router] = $route.split(":") echo "$network via $router" >> $routesfile - #else + #else + # Warning: invalid route "$route" + #end if + #end for + #if $enableipv6 == True + #for $route in $ipv6_static_routes + #set routepattern = $re.compile("[0-9a-fA-F:/]+,[0-9a-fA-F:]+") + #if $routepattern.match($route) + #set $routebits = $route.split(",") + #set [$network, $router] = $route.split(",") +echo "$network via $router dev $iname" >> $ipv6_routesfile + #else # Warning: invalid route "$route" #end if #end for + #end if #set $i = $i + 1 # End configuration for $iname + #end for ## ============================================================================= ## Configure name server search path in /etc/resolv.conf