diff --git a/xCAT-server/share/xcat/install/sles/custom.sles11.s390x.tmpl b/xCAT-server/share/xcat/install/sles/custom.sles11.s390x.tmpl
new file mode 100644
index 000000000..6e86316ff
--- /dev/null
+++ b/xCAT-server/share/xcat/install/sles/custom.sles11.s390x.tmpl
@@ -0,0 +1,663 @@
+
+
+
+
+
+
+
+ insert_devices
+
+
+
+
+
+
+ false
+
+
+ none
+
+
+
+
+
+
+
+
+ users
+
+
+
+ floppy
+
+
+
+ bin
+ daemon
+
+
+ xok
+
+
+
+ nobody
+
+
+
+ modem
+
+
+
+ lp
+
+
+
+ tty
+
+
+
+ !
+ postfix
+
+
+
+ !
+ gdm
+
+
+
+ nogroup
+ nobody
+
+
+ !
+ maildrop
+
+
+
+ !
+ messagebus
+
+
+
+ video
+
+
+
+ sys
+
+
+
+ shadow
+
+
+
+ console
+
+
+
+ cdrom
+
+
+
+ !
+ haldaemon
+
+
+
+ trusted
+
+
+
+ dialout
+
+
+
+ !
+ ts-shell
+
+
+
+ wheel
+
+
+
+ www
+
+
+
+ games
+
+
+
+ disk
+
+
+
+ audio
+
+
+
+ !
+ suse-ncc
+
+
+
+ ftp
+
+
+
+ !
+ at
+
+
+
+ kmem
+
+
+
+ public
+
+
+
+ root
+
+
+
+ mail
+
+
+
+ daemon
+
+
+
+ !
+ ntp
+
+
+
+ uucp
+
+
+
+ !
+ ntadmin
+
+
+
+ man
+
+
+
+ utmp
+
+
+
+ news
+
+
+
+ !
+ sshd
+
+
+
+
+
+
+
+
+ insert_hosts
+
+
+
+
+
+
+
+ 1.0
+
+
+
+
+
+ en_US
+
+
+
+
+
+
+
+
+
+ AUTO
+
+
+ insert_dns
+
+
+ insert_interfaces
+
+ false
+
+
+
+
+ insert_modules
+
+
+ false
+
+ insert_routes
+
+
+
+
+
+
+ false
+ false
+ false
+
+ false
+
+
+
+
+ false
+ false
+
+
+
+
+
+ insert_partitioning_drives
+
+
+
+
+ false
+
+
+
+ localhost, 127.0.0.1
+
+
+
+
+
+
+
+ true
+ true
+ 0
+
+
+ true
+ true
+ 0
+
+
+ true
+ true
+ 0
+
+
+ true
+ true
+ 0
+
+
+
+
+
+ 5
+
+
+
+
+
+
+ insert_software_pattern
+
+
+
+
+
+
+ UTC
+ US/Eastern
+
+
+
+
+
+ 100
+ video,dialout
+ /home
+ -1
+ /bin/bash
+ /etc/skel
+
+
+
+
+
+
+ true
+ Games account
+ 100
+ /var/games
+
+
+
+
+
+
+
+
+ /bin/bash
+ 12
+ *
+ games
+
+
+ true
+ bin
+ 1
+ /bin
+
+
+
+
+
+
+
+
+ /bin/bash
+ 1
+ *
+ bin
+
+
+ true
+ nobody
+ 65533
+ /var/lib/nobody
+
+
+
+
+
+
+
+
+ /bin/bash
+ 65534
+ *
+ nobody
+
+
+ true
+ Printing daemon
+ 7
+ /var/spool/lpd
+
+
+
+
+
+
+
+
+ /bin/bash
+ 4
+ *
+ lp
+
+
+ true
+ Postfix Daemon
+ 51
+ /var/spool/postfix
+
+
+
+
+ 99999
+ 0
+ 7
+
+ /bin/false
+ 51
+ !
+ postfix
+
+
+ true
+ Novell Customer Center User
+ 106
+ /var/lib/YaST2/suse-ncc-fakehome
+
+
+
+
+ 99999
+ 0
+ 7
+
+ /bin/bash
+ 102
+ !
+ suse-ncc
+
+
+ true
+ FTP account
+ 49
+ /srv/ftp
+
+
+
+
+
+
+
+
+ /bin/bash
+ 40
+ *
+ ftp
+
+
+ false
+ root
+ 0
+ /root
+
+
+
+
+
+
+
+
+ /bin/bash
+ 0
+ insert_root_password
+ root
+
+
+ true
+ Mailer daemon
+ 12
+ /var/spool/clientmqueue
+
+
+
+
+
+
+
+
+ /bin/false
+ 8
+ *
+ mail
+
+
+ true
+ Daemon
+ 2
+ /sbin
+
+
+
+
+
+
+
+
+ /bin/bash
+ 2
+ *
+ daemon
+
+
+ true
+ NTP daemon
+ 103
+ /var/lib/ntp
+
+
+
+
+ 99999
+ 0
+ 7
+
+ /bin/false
+ 74
+ !
+ ntp
+
+
+ true
+ Unix-to-Unix CoPy system
+ 14
+ /etc/uucp
+
+
+
+
+
+
+
+
+ /bin/bash
+ 10
+ *
+ uucp
+
+
+ User for D-BUS
+ 101
+ /var/run/dbus
+ /bin/false
+ 100
+
+
+ User for haldaemon
+ 102
+ /var/run/hal
+ /bin/false
+ 101
+
+
+ true
+ WWW daemon apache
+ 8
+ /var/lib/wwwrun
+
+
+
+
+
+
+
+
+ /bin/false
+ 30
+ *
+ wwwrun
+
+
+ true
+ Manual pages viewer
+ 62
+ /var/cache/man
+
+
+
+
+
+
+
+
+ /bin/bash
+ 13
+ *
+ man
+
+
+ true
+ News system
+ 13
+ /etc/news
+
+
+
+
+
+
+
+
+ /bin/bash
+ 9
+ *
+ news
+
+
+ true
+ SSH daemon
+ 65
+ /var/lib/sshd
+
+
+
+
+ 99999
+ 0
+ 7
+
+ /bin/false
+ 71
+ !
+ sshd
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/xCAT-server/share/xcat/tools/mkay4z b/xCAT-server/share/xcat/tools/mkay4z
new file mode 100644
index 000000000..e4b2f5084
--- /dev/null
+++ b/xCAT-server/share/xcat/tools/mkay4z
@@ -0,0 +1,1163 @@
+#!/usr/bin/perl
+# IBM(c) 2010 EPL license http://www.eclipse.org/legal/epl-v10.html
+#-------------------------------------------------------
+
+=head1 mkay4z
+
+ Description: Create an autoyast template for Linux on System z.
+ Only supported on SLES 11 at this time.
+ Author: Thang Pham (thang.pham@us.ibm.com)
+ Returns: Autoyast template
+
+ Usage: mkay4z [conf file] [ref template], where
+ [conf file]: File containing Linux configuration
+ [ref template]: Reference autoyast template to build off of
+ Example: # ./mkay4z conf.txt sles11.tmpl > myautoyast.tmpl
+
+=cut
+
+#-------------------------------------------------------
+use strict;
+use warnings;
+
+# Check arguments
+if(@ARGV != 2) {
+ print < myautoyast.tmpl
+END
+ exit();
+}
+
+# Get conf file and reference template
+my $file = $ARGV[0];
+my $tmpl = $ARGV[1];
+
+# Create parameters to search for
+my @search = ('dasd', 'partitions', 'software');
+# Get parameters from conf file
+my %parms = getParms($file);
+# Set parameters for networking and root password
+$parms{'hosts'} = '[host_address=replace_host_address,name=replace_long_name replace_short_name]';
+$parms{'dns'} = '[hostname=replace_hostname,dhcp_hostname=true,dhcp_resolv=true,domain=replace_domain,nameserver=replace_nameserver]';
+$parms{'interfaces'} = '[device=replace_device,bootproto=dhcp,lladdr=replace_lladdr,chanids=replace_ccw_chan_ids]';
+$parms{'root_password'} = 'replace_root_password';
+
+# Check that all parameters are given
+my $missing = '';
+foreach(@search) {
+ if(!$parms{$_}) {
+ $missing .= "$_ ";
+ }
+}
+
+# If there are missing paramters
+if($missing) {
+ print "Please supply the following parameters in $file: $missing";
+ exit();
+}
+
+# Create section
+my $dasdSection = createDasd($parms{'dasd'});
+
+# Create section
+my $hostsSection = createHosts($parms{'hosts'});
+
+# Create section
+my $dnsSection = createDns($parms{'dns'});
+
+# Create section
+my ($interfacesSection, %interface) = createInterfaces($parms{'interfaces'});
+
+# Create section
+my $dasdModulesSection = createDasdModules($parms{'dasd'});
+my $nicModulesSection = createNicModules(%interface);
+
+# Create section
+my $partitionsSection = createPartitions($parms{'partitions'});
+
+# Create software section
+my $softwareSection = createSoftware($parms{'software'});
+
+# Create password section
+my $passwordSection = <$parms{'root_password'}
+END
+
+# Create routes section
+my $routesSection = createRoutes($parms{'interfaces'});
+
+# Create scripts section
+my $scriptsSection = createScripts(%interface);
+
+# Begin to build template
+
+# Edit template by replacing place holders:
+# insert_devices
+# insert_hosts
+# insert_dns
+# insert_interfaces
+# insert_modules
+# insert_partitioning_drives
+# insert_software_pattern
+# insert_root_password
+# insert_routes
+
+# Read in autoyast template
+open(FILE, $tmpl);
+# Go through each line
+while(my $ln = ) {
+ # If the line matches the pattern to replace, print replacement
+ if($ln =~ 'insert_devices') {
+ print $dasdSection;
+ } elsif($ln =~ 'insert_hosts') {
+ print $hostsSection;
+ } elsif($ln =~ 'insert_dns') {
+ print $dnsSection;
+ } elsif($ln =~ 'insert_interfaces') {
+ print $interfacesSection;
+ } elsif($ln =~ 'insert_modules') {
+ print $dasdModulesSection;
+ print $nicModulesSection;
+ } elsif($ln =~ 'insert_partitioning_drives') {
+ print $partitionsSection;
+ } elsif($ln =~ 'insert_software_pattern') {
+ print $softwareSection;
+ } elsif($ln =~ 'insert_root_password') {
+ print $passwordSection;
+ } elsif($ln =~ 'insert_routes') {
+ print $routesSection;
+ } elsif($ln =~ '') {
+ # Print line
+ $ln =~ s/\r//g; # Remove return carriage
+ print $ln;
+
+ print $scriptsSection;
+ } else {
+ # Print line
+ $ln =~ s/\r//g; # Remove return carriage
+ print $ln;
+ }
+}
+close(FILE);
+
+#-------------------------------------------------------
+
+=head3 getParms
+
+ Description : Get the parameters in the conf file
+ Arguments : Conf file
+ Returns : Hash table of parameters
+ Example : my %parms = getParms($file);
+
+=cut
+
+#-------------------------------------------------------
+sub getParms {
+ my ($file) = @_;
+
+ # Read in file
+ open(FILE, $file);
+
+ # Go through line in the file
+ my %parms;
+ my $name = '';
+ my $tmp = '';
+ while(my $ln = ) {
+ # If the line contains ={, get the parameter name
+ if ($ln =~ /={/) {
+ ($name, $tmp) = split(/={/, $ln, 2);
+ $parms{$name} = '';
+ }
+
+ if ($name) {
+ # Append line to parameter
+ $parms{$name} = $parms{$name} . trim($ln);
+ }
+ }
+ close(FILE);
+
+ # Remove curly brackets
+ foreach my $key(keys %parms) {
+ $parms{$key} =~ s/(.*=\{|\})//g;
+ }
+
+ return %parms;
+}
+
+#-------------------------------------------------------
+
+=head3 trim
+
+ Description : Trim the whitespaces in a string
+ Arguments : String
+ Returns : Trimmed string
+ Example : my $str = trim($str);
+
+=cut
+
+#-------------------------------------------------------
+sub trim {
+
+ # Get string
+ my ($str) = @_;
+
+ # Trim right
+ $str =~ s/\s*$//;
+ # Trim left
+ $str =~ s/^\s*//;
+
+ return ($str);
+}
+
+#-------------------------------------------------------
+
+=head3 createDasd
+
+ Description : Create the section
+ Arguments : Dasd attached to server
+ Returns : section
+ Example : my $section = createDasd($dasd);
+
+=cut
+
+#-------------------------------------------------------
+sub createDasd {
+ # Get string
+ my ($str) = @_;
+
+ # Split the dasd
+ my @args = split(/\],/, $str);
+
+ # Remove square brackets
+ my $i;
+ for($i = 0; $i < @args; $i++) {
+ $args[$i] =~ s/(\[|\])//g;
+ $args[$i] = trim($args[$i]);
+ }
+
+ # Create hash table for each dasd
+ my %dasd;
+ my @tmp;
+ my $pos;
+ my $length;
+ foreach(@args) {
+ # Split the arguments
+ # e.g. 0.0.0100,dasd_eckd_mod,(/dev/dasda,/dev/dasdb)
+ @tmp = split(/,/,$_,4);
+ $tmp[0] = trim($tmp[0]);
+ $dasd{$tmp[0]}{'channel'} = $tmp[0];
+ $dasd{$tmp[0]}{'modules'} = trim($tmp[1]);
+ $dasd{$tmp[0]}{'dev_name'} = trim($tmp[2]);
+
+ # Remove brackets
+ $tmp[3] = trim($tmp[3]);
+ $dasd{$tmp[0]}{'partition_info'} = substr($tmp[3], 1, length($tmp[3])-2);
+ }
+
+ # Create section
+ #
+ #
+ # None
+ # none
+ # 0.0.0100
+ # true
+ # /dev/dasda
+ #
+ # /dev/dasda
+ # /dev/disk/by-path/ccw-0.0.0100
+ #
+ # DASD
+ # io_subchannel
+ #
+ #
+ # true
+ # true
+ #
+ #
+ # dasd_eckd_mod
+ #
+ #
+ #
+ #
+ #
+ # false
+ # /dev/dasda1 (Linux native)
+ #
+ #
+ #
+ # true
+ # 1
+ # rw
+ #
+ #
+ #
+ # 0.0.0100
+ #
+ my $xml = '';
+
+ my @partInfo;
+ foreach my $id(sort (keys %dasd)){
+ # If this dasd is to be used for Linux
+ if ($dasd{$id}{'partition_info'} =~ 'Linux native') {
+ $xml .= <
+ None
+ none
+ $id
+ true
+ $dasd{$id}{'dev_name'}
+
+ $dasd{$id}{'dev_name'}
+ /dev/disk/by-path/ccw-$id
+
+ DASD
+ io_subchannel
+
+
+ true
+ true
+
+
+ $dasd{$id}{'modules'}
+
+
+
+
+
+ false
+ $dasd{$id}{'partition_info'}
+
+
+
+ true
+ 1
+ rw
+
+
+
+ $id
+
+END
+ } else {
+ $xml .= <
+ None
+ none
+ $id
+ $dasd{$id}{'dev_name'}
+
+ $dasd{$id}{'dev_name'}
+ /dev/disk/by-path/ccw-$id
+
+ DASD
+ io_subchannel
+
+
+ true
+ true
+
+
+ $dasd{$id}{'modules'}
+
+
+
+
+
+ true
+ $dasd{$id}{'partition_info'}
+
+
+
+ 16
+ 128
+
+
+
+ $id
+
+END
+ }
+ }
+
+ return $xml;
+}
+
+#-------------------------------------------------------
+
+=head3 createInterfaces
+
+ Description : Create the section
+ Arguments : Interfaces attached to server
+ Returns : section
+ Example : my $section = createInterfaces($interfaces);
+
+=cut
+
+#-------------------------------------------------------
+sub createInterfaces {
+ # Get string
+ my ($str) = @_;
+
+ # Split the interfaces
+ my @device = split(/\],/,$str);
+
+ # Remove square brackets
+ my $i;
+ for($i = 0; $i < @device; $i++) {
+ $device[$i] =~ s/(\[|\])//g;
+ $device[$i] = trim($device[$i]);
+ }
+
+ # Create hash table for each interface
+ my %interface;
+ my @args;
+
+ my $id;
+ my $name;
+ my $value;
+
+ # Loop through each interface
+ foreach(@device) {
+ # Split the arguments
+ # e.g. device=eth0,bootproto=static,broadcast=10.1.100.255,...
+ @args = split(/,/,$_);
+
+ # Device name should always be the first index
+ $args[0] =~ s/device=//g;
+ $id = trim($args[0]);
+
+ # Go through each attribute and set hash table
+ for($i = 1; $i < @args; $i++) {
+ # Get the attribute name value pair
+ ($name, $value) = split(/=/, $args[$i], 2);
+ $name = trim($name);
+ $value = trim($value);
+
+ $interface{$id}{$name} = $value;
+ }
+ }
+
+ # Create section
+ #
+ # static
+ # 10.1.100.255
+ # eth0
+ # 10.1.100.100
+ # OSA Express Network card (0.0.0800)
+ # 255.255.255.0
+ # 25
+ # auto
+ #
+ #
+ # The layout is different for DHCP:
+ #
+ # dhcp
+ # eth0
+ # 02:00:00:FF:FF:FF
+ # auto
+ # no
+ #
+ my $xml = '';
+ foreach my $id(keys %interface){
+ # Create static interface
+ if($interface{$id}{'bootproto'} eq 'static') {
+ $xml .= <
+ $interface{$id}{'bootproto'}
+ $interface{$id}{'broadcast'}
+ $id
+ $interface{$id}{'ipaddr'}
+ $interface{$id}{'name'}
+ $interface{$id}{'netmask'}
+ 25
+ auto
+
+END
+ }
+
+ # Create DHCP interface
+ else {
+ $xml .= <
+ $interface{$id}{'bootproto'}
+ $id
+ $interface{$id}{'lladdr'}
+ auto
+ no
+
+END
+ }
+ }
+
+ return ($xml, %interface);
+}
+
+#-------------------------------------------------------
+
+=head3 createPartitions
+
+ Description : Create the section
+ Arguments : Partitions to create on server
+ Returns : section
+ Example : my $section = createPartitions($partitions);
+
+=cut
+
+#-------------------------------------------------------
+sub createPartitions {
+ # Get string
+ my ($str) = @_;
+
+ # Split the interfaces
+ my @device = split(/\],/,$str);
+
+ # Remove square brackets
+ my $i;
+ for($i = 0; $i < @device; $i++) {
+ $device[$i] =~ s/(\[|\])//g;
+ $device[$i] = trim($device[$i]);
+ }
+
+ # Create hash table for each partitions
+ my %partitions;
+ my @args;
+ my $id;
+
+ # Loop through each partitions
+ foreach(@device) {
+ # Split the arguments
+ # e.g. device=/dev/dasda,filesystem=ext3,(mount=/;size=4G),(lvm_group=VG;size=max)
+ # device=/dev/VG,(lv_name=LV_home;filesystenm=ext3;mount=/home;size=3G),(lv_name=LV_opt;filesystem=ext3;mount=/opt;size=3G)
+ @args = split(/,/,$_,2);
+
+ # Device name should always be the first index
+ $args[0] =~ s/device=//g;
+ $id = trim($args[0]);
+
+ # Partition setup should always be the second index
+ $partitions{$id}{'partition'} = trim($args[1]);
+ }
+
+ # Create section
+ #
+ # /dev/dasda
+ #
+ #
+ # true
+ # ext3
+ # true
+ # /
+ # path
+ # 131
+ # 1
+ # primary
+ # max
+ #
+ #
+ #
+ #
+ #
+ # The layout is different for LVM:
+ #
+ # /dev/dasdb
+ # true
+ #
+ #
+ # true
+ # false
+ # ext3
+ # false
+ # false
+ # VG
+ # path
+ # false
+ # max
+ #
+ #
+ #
+ #
+ my $xml = '';
+ my %layoutAttr;
+ my @layout;
+
+ my @attrs;
+ my $name;
+ my $value;
+
+ # Go through each partition
+ foreach my $id(sort (keys %partitions)){
+ # Split partition layout
+ @layout = split(/,/, $partitions{$id}{'partition'});
+ %layoutAttr = ();
+
+ # Go through each layout
+ for($i = 0; $i < @layout; $i++) {
+ # Remove parenthesis
+ $layout[$i] =~ s/(\(|\))//g;
+ $layout[$i] = trim($layout[$i]);
+
+ # Split layout attributes
+ @attrs = split(/;/, $layout[$i]);
+ foreach(@attrs) {
+ ($name, $value) = split(/=/, $_, 2);
+ $name = trim($name);
+ $value = trim($value);
+ $layoutAttr{$i}{$name} = $value;
+ }
+ }
+
+ # Create head
+ $xml .= <
+ $id
+
+END
+
+ # Go through each layout and create section(s)
+ my $isLvm;
+ foreach my $p(keys %layoutAttr){
+ $isLvm = 0;
+
+ # If this partition is an LVM group
+ if($layoutAttr{$p}{'lvm_group'}) {
+ $xml .= <
+ true
+ false
+ $layoutAttr{$p}{'filesystem'}
+ false
+ false
+ $layoutAttr{$p}{'lvm_group'}
+ path
+ 142
+ 1
+ false
+ $layoutAttr{$p}{'size'}
+
+END
+ }
+
+ # If this partition is an LVM volume
+ elsif($layoutAttr{$p}{'lv_name'}) {
+ $isLvm = 1;
+ $xml .= <
+ true
+ false
+ $layoutAttr{$p}{'filesystem'}
+ true
+ acl,user_xattr
+ $layoutAttr{$p}{'lv_name'}
+ $layoutAttr{$p}{'mount'}
+ path
+ 131
+
+ false
+ $layoutAttr{$p}{'size'}
+
+END
+ }
+
+ # Not an LVM
+ else {
+ $xml .= <
+ true
+ $layoutAttr{$p}{'filesystem'}
+ true
+ $layoutAttr{$p}{'mount'}
+ path
+ 131
+ 1
+ primary
+ $layoutAttr{$p}{'size'}
+
+END
+ }
+ }
+
+ # Create tail
+ if(!$isLvm) {
+ $xml .= <
+
+
+END
+ } else {
+ $xml .= <
+ 4M
+ CT_LVM
+
+
+END
+ }
+ }
+
+ return $xml;
+}
+
+#-------------------------------------------------------
+
+=head3 createHosts
+
+ Description : Create the section
+ Arguments : Hosts to be created on server
+ Returns : section
+ Example : my $section = createHosts($hosts);
+
+=cut
+
+#-------------------------------------------------------
+sub createHosts {
+ # Get string
+ my ($str) = @_;
+
+ # Split the hosts
+ my @hosts = split(/\],/,$str);
+
+ # Remove square brackets
+ my $i;
+ for($i = 0; $i < @hosts; $i++) {
+ $hosts[$i] =~ s/(\[|\])//g;
+ $hosts[$i] = trim($hosts[$i]);
+ }
+
+ # Create hash table for each host
+ my %host;
+ my @args;
+
+ my $id;
+ my $name;
+ my $value;
+
+ # Loop through each host
+ foreach(@hosts) {
+ # Split the arguments
+ # e.g. host_address=10.1.100.100,name=gpok100.endicott.ibm.com gpok100
+ @args = split(/,/,$_);
+
+ # Host address should always be the first index
+ $args[0] =~ s/host_address=//g;
+ $id = trim($args[0]);
+
+ # Go through each attribute and set hash table
+ for($i = 1; $i < @args; $i++) {
+ # Get the attribute name value pair
+ ($name, $value) = split(/=/, $args[$i], 2);
+ $name = trim($name);
+ $value = trim($value);
+
+ $host{$id}{$name} = $value;
+ }
+ }
+
+ # Create section
+ # e.g.
+ #
+ # 10.1.100.100
+ #
+ # gpok100.endicott.ibm.com gpok100
+ #
+ #
+ my $xml = '';
+
+ # Create standard localhost entry
+ $xml .= <
+ 127.0.0.1
+
+ localhost
+
+
+END
+
+ # Create host entries
+ foreach my $id(keys %host){
+ $xml .= <
+ $id
+
+ $host{$id}{'name'}
+
+
+END
+ }
+
+ return $xml;
+}
+
+#-------------------------------------------------------
+
+=head3 createDns
+
+ Description : Create the section
+ Arguments : DNS to use
+ Returns : section
+ Example : my $section = createDns($dns);
+
+=cut
+
+#-------------------------------------------------------
+sub createDns {
+ # Get string
+ my ($str) = @_;
+
+ # Split the hosts
+ my @dns = split(/\],/,$str);
+
+ # Remove square brackets
+ my $i;
+ for($i = 0; $i < @dns; $i++) {
+ $dns[$i] =~ s/(\[|\])//g;
+ $dns[$i] = trim($dns[$i]);
+ }
+
+ # Create hash table for each DNS
+ my %dn;
+ my @args;
+
+ my $id;
+ my $name;
+ my $value;
+
+ # Loop through each host
+ foreach(@dns) {
+ # Split the arguments
+ # e.g. hostname=gpok100,domain=endicott.ibm.com,nameserver=10.1.100.1
+ @args = split(/,/,$_);
+
+ # Hostname should always be the first index
+ $args[0] =~ s/hostname=//g;
+ $id = trim($args[0]);
+
+ # Go through each attribute and set hash table
+ for($i = 1; $i < @args; $i++) {
+ # Get the attribute name value pair
+ ($name, $value) = split(/=/, $args[$i], 2);
+ $name = trim($name);
+ $value = trim($value);
+
+ $dn{$id}{$name} = $value;
+ }
+ }
+
+ # Create section
+ # false
+ # false
+ # endicott.ibm.com
+ # gpok100
+ #
+ # 10.1.100.100
+ #
+ my $xml = '';
+ foreach my $id(keys %dn){
+ $xml .= <$dn{$id}{'dhcp_hostname'}
+$dn{$id}{'dhcp_resolv'}
+$dn{$id}{'domain'}
+$id
+
+ $dn{$id}{'nameserver'}
+
+END
+ }
+
+ return $xml;
+}
+
+#-------------------------------------------------------
+
+=head3 createDasdModules
+
+ Description : Create the section for each dasd attached
+ Arguments : Dasd attached to server
+ Returns : section
+ Example : my $section = createDasdModules($modules);
+
+=cut
+
+#-------------------------------------------------------
+sub createDasdModules {
+ # Get string
+ my ($str) = @_;
+
+ # Split the dasd
+ my @args = split(/\],/,$str);
+
+ # Remove square brackets
+ my $i;
+ for($i = 0; $i < @args; $i++) {
+ $args[$i] =~ s/(\[|\])//g;
+ $args[$i] = trim($args[$i]);
+ }
+
+ # Create hash table for each dasd
+ my %modules;
+ my @tmp;
+ foreach(@args) {
+ # Split the arguments
+ # e.g. 0.0.0100,dasd_eckd_mod,/dev/dasda,(/dev/dasda1;/dev/dasda2)
+ @tmp = split(/,/,$_,4);
+ $tmp[0] = trim($tmp[0]);
+ $modules{$tmp[0]}{'channel'} = $tmp[0];
+ $modules{$tmp[0]}{'module'} = trim($tmp[1]);
+ }
+
+ # Create section
+ #
+ # dasd-bus-ccw-0.0.0100
+ # dasd_eckd_mod
+ #
+ #
+
+ my $xml = '';
+ foreach my $id(keys %modules){
+ $xml .= <
+ dasd-bus-ccw-$id
+ $modules{$id}{'module'}
+
+
+END
+ }
+
+ return $xml;
+}
+
+#-------------------------------------------------------
+
+=head3 createNicModules
+
+ Description : Create the section for each interface attached
+ Arguments : Hash table of interfaces
+ Returns : section
+ Example : my $section = createNicModules(%interfaces);
+
+=cut
+
+#-------------------------------------------------------
+sub createNicModules {
+ # Get hash table
+ my (%interface) = @_;
+
+ # Create section
+ #
+ # 0.0.0800 0.0.0801 0.0.0802
+ # FOOBAR
+ # 3
+ # eth0
+ # qeth
+ #
+ #
+ my $xml = '';
+ my $script = '';
+ foreach my $id(sort (keys %interface)){
+ $xml .= <
+ $interface{$id}{'chanids'}
+ FOOBAR
+ 3
+ $id
+ qeth
+
+
+END
+ }
+
+ return $xml;
+}
+
+#-------------------------------------------------------
+
+=head3 createSoftware
+
+ Description : Create the section
+ Arguments : Software to be installed
+ Returns : section
+ Example : my $section = createSoftware($dns);
+
+=cut
+
+#-------------------------------------------------------
+sub createSoftware {
+ # Get string
+ my ($str) = @_;
+
+ # Split the software
+ # e.g. base,gnome
+ my @software = split(/,/,$str);
+
+ # Create section
+ # Basis-Devel
+ # Minimal
+ # base
+ # documentation
+ # file_server
+ # gnome
+ # print_server
+ # x11
+ my $xml = '';
+ foreach (@software){
+ $xml .= <$_
+END
+ }
+
+ return $xml;
+}
+
+#-------------------------------------------------------
+
+=head3 createRoutes
+
+ Description : Create the section
+ Arguments : Routing configuration
+ Returns : section
+ Example : my $section = createRoutes($route);
+
+=cut
+
+#-------------------------------------------------------
+sub createRoutes {
+ # Get string
+ my ($str) = @_;
+
+ # Split the interfaces
+ my @device = split(/\],/,$str);
+
+ # Remove square brackets
+ my $i;
+ for($i = 0; $i < @device; $i++) {
+ $device[$i] =~ s/(\[|\])//g;
+ $device[$i] = trim($device[$i]);
+ }
+
+ # Create hash table for each interface
+ my %interface;
+ my @args;
+
+ my $id;
+ my $name;
+ my $value;
+
+ # Loop through each interface
+ foreach(@device) {
+ # Split the arguments
+ # e.g. device=eth0,bootproto=static,broadcast=10.1.100.255,...
+ @args = split(/,/,$_);
+
+ # Device name should always be the first index
+ $args[0] =~ s/device=//g;
+ $id = trim($args[0]);
+
+ # Go through each attribute and set hash table
+ for($i = 1; $i < @args; $i++) {
+ # Get the attribute name value pair
+ ($name, $value) = split(/=/, $args[$i], 2);
+ $name = trim($name);
+ $value = trim($value);
+
+ $interface{$id}{$name} = $value;
+ }
+ }
+
+ # Create section
+ # false
+ #
+ #
+ # default
+ # eth0
+ # 10.1.100.1
+ # -
+ #
+ #
+
+ my $xml = '';
+ my $dest = '';
+ foreach my $id(sort (keys %interface)){
+ if(!$dest) {
+ # The first interface is the default route
+ $dest = 'default';
+ } else {
+ # Get network
+ $dest = substr($interface{$id}{'ipaddr'}, 0, rindex($interface{$id}{'ipaddr'}, '.'));
+ $dest .= ".0";
+ }
+
+ # Do not set route for DHCP interface
+ if(!($interface{$id}{'bootproto'} eq 'dhcp')) {
+ $xml .= <
+ $dest
+ $id
+
+ $interface{$id}{'netmask'}
+
+END
+ }
+ }
+
+ return $xml;
+}
+
+#-------------------------------------------------------
+
+=head3 createScripts
+
+ Description : Create the section to configure interfaces
+ Arguments : Hash table of interfaces to configure with post-scripts
+ Returns : section
+ Example : my $section = createScripts(%interfaces);
+
+=cut
+
+#-------------------------------------------------------
+sub createScripts {
+ # Get hash table
+ my (%interface) = @_;
+
+ # Default route is being added by autoyast (bug)
+ # Setting default route in post-script
+ my $xml = '';
+ my $script = '';
+ foreach my $id(sort (keys %interface)){
+ # Set the default route for the firs interface
+ # Do not set default route for DHCP interface
+ if(!$script && !($interface{$id}{'bootproto'} eq 'dhcp')) {
+ $script .= < /etc/sysconfig/network/routes
+END
+ last;
+ }
+ }
+
+ # Create section
+ if($script) {
+ $xml .= <
+
+
+END
+ }
+
+ return $xml;
+}
\ No newline at end of file