#!/usr/bin/perl # IBM(c) 2012 EPL license http://www.eclipse.org/legal/epl-v10.html #------------------------------------------------------- =head1 mkay4z Description: Create an autoyast template for Linux on System z. Author: Thang Pham (thang.pham@us.ibm.com) Returns: Autoyast template Usage: mkay4z Example: # ./mkay4z =cut #------------------------------------------------------- use strict; use warnings; # Show help if (@ARGV > 0) { print < { 'device_name' => '/dev/dasda', 'type' => 'dasd_eckd_mod' }, '0.0.0101' => { 'device_name' => '/dev/dasda', 'type' => 'dasd_eckd_mod' } ); my %partitions_default = ( '/dev/dasda' => { 'device_fs' => 'ext4', 'device_size' => '4g', 'device_mount' => '', 'device_lvm' => 'VG' }, '/dev/dasdb' => { 'device_fs' => 'ext4', 'device_size' => 'max', 'device_mount' => '', 'device_lvm' => 'VG' }, '/dev/VG' => { 'lvm' => { 'lv_root' => { 'name' => 'lv_root', 'fs' => 'ext4', 'mount' => '/', 'size' => '4g' }, 'lv_opt' => { 'name' => 'lv_opt', 'fs' => 'ext4', 'mount' => '/opt', 'size' => 'max' } } } ); # Set default parameters for networking and root password my %parms = ( 'hosts' => { 'localhost' => { 'host_address' => '127.0.0.1', 'name' => 'localhost' }, 'xcat' => { 'host_address' => 'replace_host_address', 'name' => 'replace_long_name replace_short_name' } }, 'dns' => { 'xcat' => { 'hostname' => 'replace_hostname', 'dhcp_hostname' => 'true', 'dhcp_resolv' => 'true', 'domain' => 'replace_domain', 'nameserver' => 'replace_nameserver' } }, 'interfaces' => { 'xcat' => { 'bootproto' => 'dhcp', 'device' => 'replace_device', 'lladdr' => 'replace_lladdr', 'chanids' => 'replace_ccw_chan_ids' } }, 'root_password' => 'replace_root_password', 'software' => 'Minimal' ); # Use DHCP? my $dhcp = ''; while (!($dhcp eq 'Y' || $dhcp eq 'y' || $dhcp eq 'Yes' || $dhcp eq 'yes' || $dhcp eq 'N' || $dhcp eq 'n' || $dhcp eq 'No' || $dhcp eq 'no')) { $dhcp = ask(" Do you want to use DHCP? (yes or no) "); if ($dhcp eq 'Y' || $dhcp eq 'y' || $dhcp eq 'Yes' || $dhcp eq 'yes') { $parms{'interfaces'} = { 'xcat' => { 'bootproto' => 'dhcp', 'device' => 'replace_device', 'lladdr' => 'replace_lladdr', 'chanids' => 'replace_ccw_chan_ids' } }; } elsif ($dhcp eq 'N' || $dhcp eq 'n' || $dhcp eq 'No' || $dhcp eq 'no') { $parms{'interfaces'} = { 'xcat' => { 'bootproto' => 'static', 'device' => 'replace_device', 'lladdr' => 'replace_lladdr', 'ipaddr' => 'replace_ipaddr', 'netmask' => 'replace_netmask', 'broadcast' => 'replace_broadcast', 'network' => 'replace_network', 'chanids' => 'replace_ccw_chan_ids' } }; } else { print " Unknown value!\n"; } } # Hash array containing autoyast configuration my %dasd; my %partitions; my %lvm; # Prompts user for input? my $ask = 0; # Configure dasd my $dasd_option = 0; my $addr; my $dasd_type; my $device_name; my $device_type; my $tmp; my $i = 0; print <; $dasd_option = trim($dasd_option); while (!($dasd_option eq '1' || $dasd_option eq '2' || $dasd_option eq '3' || $dasd_option eq '4')) { print " Unknown value!\n"; $dasd_option = <>; $dasd_option = trim($dasd_option); } # Add dasd to template if ($dasd_option == '1') { # Get virtual address $addr = ask(" What is the virtual address? "); while (length($addr) < 4) { # Address length must be 4 $addr = '0' . $addr; } $addr = '0.0.' . $addr; # Get dasd type $ask = 1; while ($ask) { $dasd_type = ask(" What is the type? (eckd or fba) "); if ($dasd_type eq 'eckd') { $dasd_type = 'dasd_eckd_mod'; $ask = 0; } elsif ($dasd_type eq 'fba') { $dasd_type = 'dasd_fba_mod'; $ask = 0; } else { print " Unknown value!\n"; } } # Save dasd in hash $dasd{$addr}{'type'} = $dasd_type; } # Remove dasd from template elsif ($dasd_option == '2') { $addr = ask(" What is the virtual address to remove? "); while (length($addr) < 4) { # Address length must be 4 $addr = '0' . $addr; } $addr = '0.0.' . $addr; # Remove from hash delete $dasd{$addr}; } elsif ($dasd_option == '3') { # Show configuration print < @device_list) { print " Unknown value!\n"; redo; } # Only configure if a device is selected if (length($selected)) { $selected = int($selected); @args = split(' ', $device_list[$selected]); $device_name = $args[0]; # Get device filesystem $device_fs = ''; while (!($device_fs eq 'ext2' || $device_fs eq 'ext3' || $device_fs eq 'ext4' || $device_fs eq 'swap')) { $device_fs = ask(" What is the filesystem for $device_name? (ext2, ext3, ext4, or swap) "); if (!($device_fs eq 'ext2' || $device_fs eq 'ext3' || $device_fs eq 'ext4' || $device_fs eq 'swap')) { print " Unknown value!\n"; } } # Get partition size $device_size = ''; while (!$device_size) { $device_size = ask(" What is the partition size? (e.g. 1g, 2g, or max) "); if (!$device_size) { print " Please give a partition size!"; } } # Is partition an LVM $lvm = ''; while (!($lvm eq 'Y' || $lvm eq 'y' || $lvm eq 'Yes' || $lvm eq 'yes' || $lvm eq 'N' || $lvm eq 'n' || $lvm eq 'No' || $lvm eq 'no')) { $lvm = ask(" Do you want to assign it to an LVM group? (yes or no) "); $lvm_group = ""; $device_mount = ""; if ($lvm eq 'Y' || $lvm eq 'y' || $lvm eq 'Yes' || $lvm eq 'yes') { # Get partition LVM group $lvm_group = ask(" What is the LVM group? "); $ask_lvm = 1; # Create new entry for volume group $tmp = '/dev/' . $lvm_group; $partitions{$tmp}{'device_lvm'} = $lvm_group; } elsif ($lvm eq 'N' || $lvm eq 'n' || $lvm eq 'No' || $lvm eq 'no') { # Get partition mount point $device_mount = ask(" What is the mount point? "); } else { print " Unknown value!\n"; } } # Save dasd in hash $partitions{$device_name}{'device_fs'} = $device_fs; $partitions{$device_name}{'device_size'} = $device_size; $partitions{$device_name}{'device_mount'} = $device_mount; $partitions{$device_name}{'device_lvm'} = $lvm_group; } else { $ask = 0; } } # Configure LVM partitions my @lvm_list; if ($ask_lvm) { print <; # Add an LVM volume to template if ($lvm_option == '1') { # Get dasd virtual address $lvm_vol_name = ask(" What is the LVM volume name? "); # Get device filesystem $lvm_vol_fs = ''; while (!($lvm_vol_fs eq 'ext2' || $lvm_vol_fs eq 'ext3' || $lvm_vol_fs eq 'ext4' || $lvm_vol_fs eq 'swap')) { $lvm_vol_fs = ask(" What is the LVM volume filesystem? (ext2, ext3, ext4, or swap) "); if (!($lvm_vol_fs eq 'ext2' || $lvm_vol_fs eq 'ext3' || $lvm_vol_fs eq 'ext4' || $lvm_vol_fs eq 'swap')) { print " Unknown value!\n"; } } # Get partition mount point $lvm_vol_mount = ask(" what is the Mount point? "); # Get partition size $lvm_vol_size = ask(" What is the LVM volume size? (e.g. 1g, 2g, or max) "); # Save dasd in hash $partitions{$device_name}{'lvm'}{$lvm_vol_name} = { 'fs' => $lvm_vol_fs, 'name' => $lvm_vol_name, 'mount' => $lvm_vol_mount, 'size' => $lvm_vol_size }; } # Remove an LVM volume from template elsif ($lvm_option == '2') { my $name = ask(" What is the LVM volume to remove? "); # Remove from hash delete $partitions{$device_name}{'lvm'}{$name}; } elsif ($lvm_option == '3') { # Show configuration print < section my $dasdSection = createDasd(\%dasd, \%partitions); # Create section my $partitionsSection = createPartitions(\%dasd, \%partitions); # Create section my $dasdModulesSection = createDasdModules(\%dasd); my $nicModulesSection = createNicModules($parms{'interfaces'}); # Create section my $hostsSection = createHosts($parms{'hosts'}); # Create section my $dnsSection = createDns($parms{'dns'}); # Create section my ($interfacesSection) = createInterfaces($parms{'interfaces'}); # 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($parms{'interfaces'}); # 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 # Generate autoyast template my $tmpl = ''; if ($version eq '10') { $tmpl = genSles10Tmpl(); } elsif ($version eq '11') { $tmpl = genSles11Tmpl(); } # Print out template `echo "$tmpl" > $template_path`; open(FILE, $template_path); # Go through each line my $mod_tmpl = ''; while(my $ln = ) { # If the line matches the pattern to replace, print replacement if($ln =~ 'insert_devices') { $mod_tmpl .= $dasdSection; } elsif($ln =~ 'insert_hosts') { $mod_tmpl .= $hostsSection; } elsif($ln =~ 'insert_dns') { $mod_tmpl .= $dnsSection; } elsif($ln =~ 'insert_interfaces') { $mod_tmpl .= $interfacesSection; } elsif($ln =~ 'insert_modules') { $mod_tmpl .= $dasdModulesSection; $mod_tmpl .= $nicModulesSection; } elsif($ln =~ 'insert_partitioning_drives') { $mod_tmpl .= $partitionsSection; } elsif($ln =~ 'insert_software_pattern') { $mod_tmpl .= $softwareSection; } elsif($ln =~ 'insert_root_password') { $mod_tmpl .= $passwordSection; } elsif($ln =~ 'insert_routes') { $mod_tmpl .= $routesSection; } elsif($ln =~ '') { # Print line $ln =~ s/\r//g; # Remove return carriage $mod_tmpl .= $ln; $mod_tmpl .= $scriptsSection; } else { # Print line $ln =~ s/\r//g; # Remove return carriage $mod_tmpl .= $ln; } } close(FILE); # Print out modified template `echo "$mod_tmpl" > $template_path`; # Done print "Done! See autoyast template under $template_path\n"; exit(); #------------------------------------------------------- =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 and partition hash Returns : section Example : my $section = createDasd($dasd_ref, $partition_ref); =cut #------------------------------------------------------- sub createDasd { # Get inputs my ($dasd_ref, $partition_ref) = @_; my %dasd = %$dasd_ref; my %partition = %$partition_ref; # dasd hash should include: # $dasd{$addr}{'device_name'} = $device_name; # $dasd{$addr}{'type'} = $dasd_type; # partition hash should include: # $partitions{$device_name}{'device_fs'} = ''; # $partitions{$device_name}{'device_size'} = ''; # $partitions{$device_name}{'device_mount'} = ''; # $partitions{$device_name}{'device_lvm'} = ''; # $partitions{$device_name}{'lvm'}{$lvm_vol_name} = { # 'name' => $lvm_vol_name, # 'mount' => $lvm_vol_mount, # 'size' => $lvm_vol_size # }; # 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 $device_name; my $device_type; my $partition_info; foreach my $addr(sort keys %dasd){ $device_name = $dasd{$addr}{'device_name'}; $device_type = $dasd{$addr}{'type'}; # If this dasd is to be used for Linux if ($partitions{$device_name}{'device_mount'} || $partitions{$device_name}{'device_lvm'}) { $partition_info = $device_name . "1 (Linux native)"; $xml .= < None none $addr true $device_name $device_name /dev/disk/by-path/ccw-$addr DASD io_subchannel true true $device_type false $partition_info true 1 rw $addr END } else { $partition_info = $device_name; $xml .= < None none $addr $device_name $device_name /dev/disk/by-path/ccw-$addr DASD io_subchannel true true $device_type true $partition_info 16 128 $addr END } } return $xml; } #------------------------------------------------------- =head3 createInterfaces Description : Create the section Arguments : Interfaces attached to server Returns : section Example : my $section = createInterfaces($interfaces_ref); =cut #------------------------------------------------------- sub createInterfaces { # Get string my ($interfaces_ref) = @_; my %interfaces = %$interfaces_ref; # 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 $i(keys %interfaces){ # Create static interface if($interfaces{$i}{'bootproto'} eq 'static') { $xml .= < $interfaces{$i}{'bootproto'} $interfaces{$i}{'broadcast'} $interfaces{$i}{'device'} $interfaces{$i}{'ipaddr'} $interfaces{$i}{'lladdr'} $interfaces{$i}{'netmask'} $interfaces{$i}{'network'} auto END } # Create DHCP interface else { $xml .= < $interfaces{$i}{'bootproto'} $interfaces{$i}{'device'} $interfaces{$i}{'lladdr'} auto no END } } return ($xml); } #------------------------------------------------------- =head3 createPartitions Description : Create the section Arguments : Dasds and partition hash Returns : section Example : my $section = createPartitions($dasd_ref, $partition_ref); =cut #------------------------------------------------------- sub createPartitions { # Get inputs my ($dasd_ref, $partition_ref) = @_; my %dasd = %$dasd_ref; my %partitions = %$partition_ref; # Create section # # /dev/dasda # # # true # ext3 # true # / # path # 131 # 1 # primary # max # # # all # # # The layout is different for LVM: # # /dev/dasdb # true # # # true # false # ext3 # false # false # VG # path # false # max # # # all # my $xml = ''; # Go through each partition foreach my $device_name(sort keys %partitions) { # Create head $xml .= < $device_name END if (exists $partitions{$device_name}{'lvm'}) { my %lvm_vols = %{ $partitions{$device_name}{'lvm'} }; foreach my $vol(sort keys %lvm_vols) { # Create section for LVM volume $xml .= < true false $lvm_vols{$vol}{'fs'} true acl,user_xattr $lvm_vols{$vol}{'name'} $lvm_vols{$vol}{'mount'} path 131 false $lvm_vols{$vol}{'size'} END } } elsif (exists $partitions{$device_name}{'device_lvm'}) { # Create section for LVM group $xml .= < true false $partitions{$device_name}{'device_fs'} false false $partitions{$device_name}{'device_lvm'} path 142 1 false $partitions{$device_name}{'device_size'} END } else { # Not an LVM group or volume $xml .= < true $partitions{$device_name}{'device_fs'} true $partitions{$device_name}{'device_mount'} path 131 1 primary $partitions{$device_name}{'device_size'} END } # Create tail if (exists $partitions{$device_name}{'device_lvm'}) { $xml .= < 4M CT_LVM all END } else { $xml .= < all END } } return $xml; } #------------------------------------------------------- =head3 createHosts Description : Create the section Arguments : Hosts to be created Returns : section Example : my $section = createHosts($hosts); =cut #------------------------------------------------------- sub createHosts { my ($hosts_ref) = @_; my %hosts = %$hosts_ref; # Create section # e.g. # # 10.1.100.100 # # gpok100.endicott.ibm.com gpok100 # # my $xml = ''; # Create host entries foreach my $i(keys %hosts){ $xml .= < $hosts{$i}{'host_address'} $hosts{$i}{'name'} END } return $xml; } #------------------------------------------------------- =head3 createDns Description : Create the section Arguments : DNS Returns : section Example : my $section = createDns($dns); =cut #------------------------------------------------------- sub createDns { # Get string my ($dns_ref) = @_; my %dns = %$dns_ref; # Create section # false # false # endicott.ibm.com # gpok100 # # 10.1.100.100 # my $xml = ''; foreach my $i(keys %dns){ $xml .= <$dns{$i}{'dhcp_hostname'} $dns{$i}{'dhcp_resolv'} $dns{$i}{'domain'} $dns{$i}{'hostname'} $dns{$i}{'nameserver'} END } return $xml; } #------------------------------------------------------- =head3 createDasdModules Description : Create the section for each dasd attached Arguments : Dasd hash Returns : section Example : my $section = createDasdModules($dasd_ref); =cut #------------------------------------------------------- sub createDasdModules { # Get string my ($dasd_ref) = @_; my %dasd = %$dasd_ref; # Create section # # dasd-bus-ccw-0.0.0100 # dasd_eckd_mod # # my $xml = ''; foreach my $addr(keys %dasd){ $xml .= < dasd-bus-ccw-$addr $dasd{$addr}{'type'} 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 ($interfaces_ref) = @_; my %interfaces = %$interfaces_ref; # Create section # # 0.0.0800 0.0.0801 0.0.0802 # FOOBAR # 3 # eth0 # qeth # # my $xml = ''; foreach my $i(sort (keys %interfaces)){ $xml .= < $interfaces{$i}{'chanids'} FOOBAR 3 $interfaces{$i}{'device'} 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 hash table my ($interfaces_ref) = @_; my %interfaces = %$interfaces_ref; # Create section # false # # # default # eth0 # 10.1.100.1 # - # # my $xml = ''; my $dest = ''; foreach my $i(sort (keys %interfaces)){ if(!$dest) { # The first interface is the default route $dest = 'default'; } else { # Get network $dest = substr($interfaces{$i}{'ipaddr'}, 0, rindex($interfaces{$i}{'ipaddr'}, '.')); $dest .= ".0"; } # Do not set gateway for DHCP interface if(!($interfaces{$i}{'bootproto'} eq 'dhcp')) { $xml .= < $dest $interfaces{$i}{'device'} $interfaces{$i}{'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 ($interfaces_ref) = @_; my %interfaces = %$interfaces_ref; # Default route is being added by autoyast (bug) # Setting default route in post-script my $xml = ''; my $script = ''; foreach my $i(sort (keys %interfaces)){ # Set the default route for the firs interface # Do not set default route for DHCP interface if(!$script && !($interfaces{$i}{'bootproto'} eq 'dhcp')) { $script .= < /etc/sysconfig/network/routes END last; } } # Create section if($script) { $xml .= < END } return $xml; } #------------------------------------------------------- =head3 ask Description : Prompt user for input Arguments : Question Returns : Answer Example : my $answer = ask("What day is today?"); =cut #------------------------------------------------------- sub ask { my ($question) = @_; print "$question"; my $answer = <>; return trim($answer); } #------------------------------------------------------- =head3 pad Description : Pad a string to a given length Arguments : String and size Returns : Padded string Example : my $str = pad($str, 12); =cut #------------------------------------------------------- sub pad { my ($str, $size) = @_; while (length($str) < $size) { $str = "$str "; } return $str; } #------------------------------------------------------- =head3 genSles11Tmpl Description : Generate SLES 11 autoyast template Arguments : Nothing Returns : SLES 11 autoyast template Example : my $tmpl = genSles11Tmpl(); =cut #------------------------------------------------------- sub genSles11Tmpl { my $tmpl = < 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 replace_software_patterns replace_software_packages UTC US/Eastern 100 video,dialout /home -1 /bin/bash /etc/skel AUTOYASTEND # Handle second half $tmpl .= < 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 AUTOYASTEND return $tmpl; } #------------------------------------------------------- =head3 genSles10Tmpl Description : Generate SLES 10 autoyast template Arguments : Nothing Returns : SLES 10 autoyast template Example : my $tmpl = genSles10Tmpl(); =cut #------------------------------------------------------- sub genSles10Tmpl { my $tmpl = < 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 replace_software_patterns replace_software_packages UTC US/Eastern 100 video,dialout /home -1 /bin/bash /etc/skel AUTOYASTEND $tmpl .= < 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 AUTOYASTEND return $tmpl; }