RHEL 6 Kickstart with interactive part does not work

"Simon Reber" <[email protected]>
Newsgroups gmane.linux.redhat.kickstart.general
Message-ID <[email protected]>
Hi all,

I'm currently trying to make my RHEL 5 kickstart environment working for
RHEL 6.
So far everything looks OK - but when I use the special kickstart file,
that takes some arguments from the user it fails.

The problem is that I have to change the tty (chvt) to get the
interactive stuff working - but for some reason doesn't it have the same
behavior as we had in RHEL 5.
It still changes the tty but after that, the script doesn't process
further. I personally think that it has something to-do with the tty
change (but I also can be wrong).

So if somebody has a working example, I would be really grateful as I've
tried almost everything without luck.

My kickstart file is build as follow:
# Test Kickstart

# Installation specification
install
# url --url http://url_to_repo
cdrom
text
key --skip
lang en_US.UTF-8
keyboard sg-latin1
%include /tmp/network-include
rootpw --iscrypted xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
firewall --disabled
authconfig --enableshadow --enablemd5
selinux --disabled
timezone --utc Europe/Zurich
firstboot --disabled
logging --level=debug

# Partition specification
%include /tmp/part-include

reboot

%packages --excludedocs --nobase
kernel
yum
openssh-server
openssh-clients
audit
man
logrotate
tmpwatch
vixie-cron
crontabs
ksh
ntp
perl
bind-utils
sudo
bc
-sysstat
which
sendmail
wget
xinetd
redhat-lsb
dhclient
-kexec-tools
-firstboot
-rhnsd
-tftp-server
-system-config-soundcard
-squashfs-tools
-device-mapper-multipath
-aspell-en
-aspell
-rdate
-dhcpv6-client
-NetworkManager
-rsh
-sysreport
-irda-utils
-rdist
-anacron
-bluez-utils
-talk
-system-config-lvm
-wireless-tools
-setroubleshoot-server
-setroubleshoot-plugins
-setroubleshoot
-ppp
-GConf2
-dhcpv6-client
-iptables-ipv6
-libselinux-python
-setools
-selinux-policy
-libselinux-utils
-chkfontpath
-urw-fonts
-xorg-x11-xfs
-policycoreutils
-selinux-policy-targeted
-ypbind
-yp-tools
-smartmontools
-pcsc-lite
-trousers
-oddjob
-yum-updatesd
-rhnsd
-readahead
-pcsc-lite
-gpm
-at
-cpuspeed
-conman
-system-config-securitylevel-tui
-tcsh
-firstboot-tui
-ppp
-rp-pppoe
-system-config-network-tui
-syslinux
-pcsc-lite-libs
-pcmciautils
-pam_smb
-mkbootdisk
-jwhois
-ipsec-tools
-ed
-authconfig
-crash
-Deployment_Guide-en-US
-hal
-pm-utils
-dbus
-dbus-glib


%pre --interpreter python
import os
import sys
import re
import os.path
import time
os.system('chvt 3')
os.system('exec < /dev/tty3 > /dev/tty3')
os.system('clear')

# Defining file name and location
file_network = '/tmp/network-include'
file_part = '/tmp/part-include'
file_lcsetup = '/tmp/LCSetup'

# Default Host and DNS domain
hostname = 'localhost'
dns = 'localdomain'

# Get current date/time
localtime = time.asctime( time.localtime(time.time()) )

# Function definition

def ipFormatChk(ip_addr):
        pattern =
r"\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0
-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]
|[01]?[0-9][0-9]?)\b"
        if re.match(pattern, ip_addr):
                return True
        else:
                return False

def ProtoChk(proto):
        if proto == 'dhcp' or proto == 'static':
                return True
        else:
                return False

def GetSerial(dmi):
        if re.search('Serial Number', dmi):
                return True
        else:
                return False

def CheckLayout(val):
        if val == 'cmp' or val == 'db' or val == 'opt':
                return True
        else:
                return False

def GetPartition(val1,val2):
        # split disk information toto device and
        # size
        part_size_mb = 0
        dev, size_mb = val2.split(";")
        dev = re.sub('\/dev\/','',dev)

        array = list()
        array.append('bootloader --location=mbr --driveorder=%s
--append=\"audit=1 crashkernel=auto\"' % dev)
        array.append('clearpart --linux --drives=%s' % dev)
        array.append('part /boot --fstype ext4 --size=150 --ondisk=%s' %
dev)

        # Enter swap size
        swap = raw_input('Swap size in MB: ')
        while not re.match("^[0-9]+$", swap):
                swap = raw_input('Invalide argument, please try again in
MB [numeric]: ')

        # Write swap into integer for calcultion
        swap_int = int(swap)
        array.append('part swap --size=%s --ondisk=%s' % (swap, dev))
        array.append('part pv.01 --grow --size=1 --ondisk=%s' % dev)
        array.append('volgroup vgroot pv.01')
        if val1 == 'cmp':
                array.append('logvol  /  --vgname=vgroot  --size=3072
--name=lvroot --fstype=ext4')
                array.append('logvol  /var  --vgname=vgroot  --size=2096
--name=lvvar --fstype=ext4')
                array.append('logvol  /tmp  --vgname=vgroot  --size=1024
--name=lvtmp --fstype=ext4')
                array.append('logvol  /home  --vgname=vgroot
--size=1024  --name=lvhome --fstype=ext4')
                array.append('logvol  /opt/spare  --vgname=vgroot
--size=1  --grow  --name=lvspare --fstype=ext4')
                part_size_mb = swap_int + 7264
        elif val1 == 'db':
                array.append('logvol  /  --vgname=vgroot  --size=3072
--name=lvroot --fstype=ext4')
                array.append('logvol  /var  --vgname=vgroot  --size=2096
--name=lvvar --fstype=ext4')
                array.append('logvol  /tmp  --vgname=vgroot  --size=1024
--name=lvtmp --fstype=ext4')
                array.append('logvol  /home  --vgname=vgroot
--size=1024  --name=lvhome --fstype=ext4')
                array.append('logvol  /opt/oracle  --vgname=vgroot
--size=1  --grow  --name=lvoracle --fstype=ext4')
                part_size_mb = swap_int + 7264
        elif val1 == 'opt':
                array.append('logvol  /  --vgname=vgroot  --size=3072
--name=lvroot --fstype=ext4')
                array.append('logvol  /var  --vgname=vgroot  --size=2096
--name=lvvar --fstype=ext4')
                array.append('logvol  /opt  --vgname=vgroot  --size=3072
--name=lvopt --fstype=ext4')
                array.append('logvol  /tmp  --vgname=vgroot  --size=1024
--name=lvtmp --fstype=ext4')
                array.append('logvol  /home  --vgname=vgroot
--size=1024  --name=lvhome --fstype=ext4')
                array.append('logvol  /opt/spare  --vgname=vgroot
--size=1  --grow  --name=lvspare --fstype=ext4')
                part_size_mb = swap_int + 10336

        part_size_mb = int(part_size_mb)
        size_mb = int(size_mb)
        if part_size_mb > size_mb:
                return (array,False)
        else:
                return (array,True)


# Main Part

print ('Welcome to LCSetup\n')

# Trying to get serial number using
# dmidecode
demidecode = os.popen("/usr/sbin/dmidecode")
sysinfo = demidecode.readlines()
err = demidecode.close()

# Get first Serial Number information
# since this usually is the serial number of
# the computer
c = 1
b = ''
for line in sysinfo:
        i = GetSerial(line)
        if i == True and c == 1:
                a, b = line.split(":")
                b = b.strip()
                c+=1

if b:
        serial = raw_input('Serial number [%s]: ' % b)
else:
        serial = raw_input('Serial number: ')

if not serial and b:
        serial = b
else:
        while not serial:
                serial = raw_input('Invalide serial number, try again:
')

# Ask for the hostname
hostname = raw_input('Hostname of Machine [%s]: ' % hostname)
if hostname == '':
        hostname = 'localhost'

# Write information into LCSetup file
lcs = open(file_lcsetup, 'w')
lcs.write('### LCSetup kickstart installation (%s)\n' % localtime)
lcs.write('###\n')
lcs.write('SERIAL: %s\n' % serial)
lcs.write('HOSTNAME: %s\n' % hostname)
lcs.close

# Network configuration
ifconfig = os.popen("/usr/sbin/ifconfig")
nic = ifconfig.readlines()
err = ifconfig.close()

eth = ''
for n in nic:
        n = n.strip()
        if re.search('^eth', n):
                devif, t = n.split("Link")
                devif = devif.strip()
                net_if = raw_input('Configure interface %s [- to skip]:
' % devif)
                if net_if != '-':
                        eth = devif
                        break
                else:
                        continue

if net_if == '-' or net_if == '':
        net_if = 'localhost'

if eth != '':
        proto = raw_input('DHCP or Static [dhcp|static]: ')
        while not ProtoChk(proto):
                proto = raw_input('Please enter [dhcp] or [static]: ')

        if proto == 'dhcp':
                dns =  raw_input('DNS domain [%s]: ' % dns)
                if dns == '':
                        dns = 'localdomain'

        elif proto == 'static':
                ip_addr = raw_input('IP address: ')
                while not ipFormatChk(ip_addr):
                        ip_addr = raw_input('Invalide IP address, try
again: ')

                subnet_addr = raw_input('Subnet address: ')
                while not ipFormatChk(subnet_addr):
                        subnet_addr = raw_input('Invalide subnet
address, try again: ')

                default_gw = raw_input('Default gateway: ')
                while not ipFormatChk(default_gw):
                        default_gw = raw_input('Invalide default
gateway, try again: ')

                dns =  raw_input('DNS domain [%s]: ' % dns)
                if dns == '':
                        dns = 'localdomain'

        else:
                print "Unknown error...\n"
                sys.exit(1)

        # Write information to file
        if proto == 'dhcp':
                file = open(file_network, 'w')
                file.write('network --device %s --bootproto %s\n' %
(eth, proto))
                file.close
        elif proto == 'static':
                file = open(file_network, 'w')
                file.write('network --device=%s --bootproto=%s --ip=%s
--netmask=%s --gateway=%s --nameserver=xxxxxxxxx --hostname=%s' % (eth,
proto, ip_addr, subnet_addr, default_gw, hostname))
                file.close
        else:
                print "Unknown error..."
                sys.exit(1)

        # Write information into LCSetup file
        lcs = open(file_lcsetup, 'a')
        lcs.write('DNS_DOMAIN: %s\n' % dns)
        lcs.write('NETWORKING=yes\n')
        lcs.write('NET_DEVICE_%s: %s\n' % (eth, eth))
        lcs.write('NET_PROTOCOL_%s: %s\n' % (eth, proto))
        if proto == 'static':
                lcs.write('NET_IP_ADDR_%s: %s\n' % (eth, ip_addr))
                lcs.write('NET_SUB_ADDR_%s: %s\n' % (eth, subnet_addr))
                lcs.write('NET_DEFAULT_GW: %s\n' % default_gw)

        lcs.close
else:
        lcs = open(file_lcsetup, 'a')
        lcs.write('NETWORKING=no')
        lcs.close
        file = open(file_network, 'w')
        file.close

# Get boot parameter and select the apropriate
# partition layout
disk_size = 0
sfdisk = os.popen("/usr/sbin/sfdisk -s")
disk = sfdisk.readlines()
err = sfdisk.close()

c = 0
counter = 1
for count in disk:
        if re.search('\/dev\/',count):
                c += 1

disk_array = list()
for line in disk:
        if re.search('\/dev\/',line):
                if c <= 1:
                        dev, size = line.split(':')
                        dev = dev.strip()
                        size = size.strip()
                        size = int(size)
                        size_mb = size / 1024
                        size_mb = str(size_mb)
                        tmp = dev + ";" + size_mb
                        # print ("%s and %s MB" % (dev, size_mb))
                        disk_size = tmp
                else:
                        dev, size = line.split(':')
                        dev = dev.strip()
                        size = size.strip()
                        size = int(size)
                        size_mb = size / 1024
                        if counter == 1:
                                print "The following disks are available
for usage:\n"

                        print "\t[%s] %s with size %s MB" % (counter,
dev, size_mb)
                        size_mb = str(size_mb)
                        tmp = dev + ";" + size_mb
                        disk_array.append(tmp)
                        counter += 1

if c >= 2:
        disk_selection = raw_input('\nEnter ID of disk to take: ')
        disk_selection = int(disk_selection)
        disk_selection -= 1
        disk_size = disk_array[disk_selection]

# Special workaround is required to refuse
# not size-able partition layout
hd_size = False
part_layout =  raw_input('\nEnter partition layout [cmp|db|opt]: ')
while not CheckLayout(part_layout):
        part_layout =  raw_input('Invalide partition layout, try again
[cmp|db|opt]: ')

part, hd_size = GetPartition(part_layout, disk_size)
while not hd_size:
        part_layout =  raw_input('Size of partition layout does not fit,
choose an other [cmp|db|opt]: ')
        while not CheckLayout(part_layout):
                part_layout =  raw_input('Invalide partition layout, try
again [cmp|db|opt]: ')

        part, hd_size = GetPartition(part_layout, disk_size)

# Write partition table to file
file = open(file_part, 'w')
for l in part:
        l = l.strip()
        file.write("%s\n" % l)

file.close

# Write partition information to LCSetup
# information
disk_dev, disk_dev_sz = disk_size.split(";")
lcs = open(file_lcsetup, 'a')
lcs.write('PART_LAYOUT: %s\n' %  part_layout)
lcs.write('ROOT_DISK: %s\n' % disk_dev)
lcs.close

os.system('chvt 1')
os.system('exec < /dev/tty1 > /dev/tty1')


%post --nochroot
chvt 2
exec < /dev/tty2 > /dev/tty2
mkdir -p /mnt/sysimage/usr/local/host/etc
chmod -R 750 /mnt/sysimage/usr/local/host
cp /tmp/LCSetup /mnt/sysimage/usr/local/host/etc
# chroot /mnt/sysimage /usr/local/host/bin/LCSetup
# rm -rf /mnt/sysimage/usr/local/host/tools/*
chvt 1
exec < /dev/tty1 > /dev/tty1

%end


Thanks and all the best,
Simon Reber
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.