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 _______________________________________________ Kickstart-list mailing list Kickstart-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/kickstart-list