diff options
author | Seth Vidal <skvidal@fedoraproject.org> | 2013-05-02 18:52:07 +0000 |
---|---|---|
committer | Seth Vidal <skvidal@fedoraproject.org> | 2013-05-02 18:52:07 +0000 |
commit | e6603b3f7f0476502e84a1f35480dafa1ccddda5 (patch) | |
tree | 081349dd1cb84a19eb3361feae62b5b7ac20f436 /files/common-scripts | |
parent | 977f3b2d38be619f6fa1f5220e83691923fe387b (diff) | |
download | ansible-e6603b3f7f0476502e84a1f35480dafa1ccddda5.tar.gz ansible-e6603b3f7f0476502e84a1f35480dafa1ccddda5.tar.xz ansible-e6603b3f7f0476502e84a1f35480dafa1ccddda5.zip |
move of the koji builders creation from builders repo to ansible public
Diffstat (limited to 'files/common-scripts')
-rwxr-xr-x | files/common-scripts/hardware-reinstall | 228 |
1 files changed, 228 insertions, 0 deletions
diff --git a/files/common-scripts/hardware-reinstall b/files/common-scripts/hardware-reinstall new file mode 100755 index 000000000..794be0215 --- /dev/null +++ b/files/common-scripts/hardware-reinstall @@ -0,0 +1,228 @@ +#!/usr/bin/env python +# hardware-reinstall - Prepare a physical box in FI for re-install. +# (c) 2012 Red Hat, Inc. +# Ricky Elrod <codeblock@fedoraproject.org> +# GPLv2+ + +import os +import sys +import urllib +import socket +import subprocess +import shlex +import platform +from optparse import OptionParser + +parser = OptionParser( + description='Prepare a physical box in FI for re-install.') +parser.add_option('-n', + '--noop', + action='store_true', + help="Don't actually modify/download anything, just " + "output stuff.") +parser.add_option('-y', + '--yes', + action='store_true', + default=False, + dest="yes", + help="Don't prompt to confirm, just do it.") +parser.add_option('--ip', + help="Override the IP of the box (passed to Grubby)") +parser.add_option('--gw', + help="Override the Gateway of the box (passed to Grubby)", + dest='gateway') +parser.add_option('--nm', + help="Override the Netmask of the box (passed to Grubby)", + dest='netmask') +parser.add_option('--dns', + help="Comma-delimited list of DNS resolvers (passed to " + "Grubby)", + dest='dns_resolvers') +parser.add_option('--ks-file', + help="Set the kickstart file to use (default:" + "hardware-rhel-6-nohd)", + default='hardware-rhel-6-nohd', + dest='ks_file') +(options, args) = parser.parse_args() + +if options.yes and options.noop: + print "Don't ask AND don't do anything? Cmon" + sys.exit(1) + +# 0. Get our hostname/primary ip +# Get our primary IP by resolving our hostname. +if options.ip: + if not options.netmask: + print 'You gave a custom IP and should specify a custom netmask too.' + sys.exit(1) + primary_ip = options.ip +else: + primary_ip = socket.gethostbyname(socket.gethostname()) + +# so - anaconda sometimes doesn't seem to listen to our dns +# when fetching kickstarts, etc - so if we give the ip of the host +# if we're in 10.5.X network (phx2) then things just work. +if primary_ip.startswith('10.5.'): + basehost = "http://10.5.126.23/" +else: + basehost = "http://infrastructure.fedoraproject.org/" + +arch = platform.machine() +VMLINUZ_URL = '%srepo/rhel/RHEL6-%s/images/pxeboot/vmlinuz' % (basehost, arch) +INITRD_URL = '%srepo/rhel/RHEL6-%s/images/pxeboot/initrd.img' % (basehost, + arch) + +# 1. Grab initrd and vmlinuz and throw them in /boot +# FIXME - more error catching here +if not options.noop: + print 'Fetching vmlinuz' + urllib.urlretrieve(VMLINUZ_URL, "/boot/vmlinuz-install") + + print 'Fetching initrd' + urllib.urlretrieve(INITRD_URL, "/boot/initrd-install.img") + + +# 2. Find our network info. +if options.netmask: + primary_netmask = options.netmask + +# We still have to get the MAC address, of the primary NIC +# even if we specify a custom IP/NM. +cmd = subprocess.Popen('/sbin/ifconfig', stdout=subprocess.PIPE) +stdout = cmd.communicate()[0] +i = 0 +lines = stdout.split("\n") +for line in lines: + if socket.gethostbyname(socket.gethostname()) in line: + # Somewhere between EL6 and F17, ifconfig output has changed. + # We accommodate for both. + if ':' in line: + # We are EL6 + if not options.netmask: + # inet addr:10.5.127.51 Bcast:10.5.127.255 Mask:255.255.255.0 + primary_netmask = line.split('Mask:')[1] + + # On EL6 MAC addr is always one line before the IP address line + primary_mac = lines[i - 1].split('HWaddr ')[1] + else: + # We are likely something newer + if not options.netmask: + # inet 10.10.10.113 netmask 255.255.255.0 broadcast + # 10.10.10.255 # (cont. from above comment) + primary_netmask = line.split('netmask ')[1].split(' ')[0] + + # On newer things, life gets harder. We have to continue + # parsing lines until we get one with 'ether ' in it. + # The range is the line we're on now -> the last line. + for y in xrange(i, len(lines) - 1): + if 'ether ' in lines[y]: + primary_mac = lines[y].split('ether ')[1].split(' ')[0] + break + break + i += 1 + +# Gateway +if options.gateway: + primary_gateway = options.gateway +else: + cmd = subprocess.Popen(['/sbin/ip', 'route'], stdout=subprocess.PIPE) + stdout = cmd.communicate()[0] + for line in stdout.split("\n"): + if 'default' in line: + # default via 10.10.10.1 dev wlan0 proto static + primary_gateway = line.split('via ')[1].split(' ')[0] + break + +# And DNS servers +if options.dns_resolvers: + dns_resolvers = options.dns_resolvers +else: + dns_servers = [] + with open('/etc/resolv.conf', 'r') as f: + for line in f.readlines(): + if 'nameserver' in line: + dns = line.split(' ') + if len(dns) == 2: + dns_servers.append(dns[1].strip()) + dns_resolvers = ','.join(dns_servers) + +print '-' * 30 +print 'Primary IP: ' + primary_ip +print 'Primary Netmask: ' + primary_netmask +print 'Primary Gateway: ' + primary_gateway +print 'Primary MAC Address: ' + primary_mac +print 'DNS Resolvers: ' + dns_resolvers +print '-' * 30 + +# 3. Construct the grubby line. +# grubby --add-kernel=/boot/vmlinuz-install \ +# --args="ks=http://infrastructure.fedoraproject.org/\ +# repo/rhel/ks/hardware-rhel-6-nohd \ +# repo=http://infrastructure.fedoraproject.org/repo/rhel/RHEL6-x86_64/ \ +# ksdevice=link ip=$IP gateway=$GATEWAY netmask=$NETMASK dns=$DNS" \ +# --title="install el6" --initrd=/boot/initrd-install.img +grubby_command = '/sbin/grubby --add-kernel=/boot/vmlinuz-install ' \ + '--args="ks=%srepo/rhel/ks/%s ksdevice=%s ' \ + 'ip=%s gateway=%s netmask=%s dns=%s repo=%srepo/rhel/RHEL6-x86_64/" ' \ + '--title="install el6" --initrd=/boot/initrd-install.img' % (basehost, + options.ks_file, + primary_mac, + primary_ip, + primary_gateway, + primary_netmask, + dns_resolvers, + basehost) + +print 'This grubby command seems like it will work:' +print '-' * 30 +print grubby_command +print '-' * 30 +print 'Check the command and be sure that it looks correct.' + +if not options.noop: + if not options.yes: + print 'Type yes to continue, anything else to abort.' + print 'By continuing, I will run the above command.' + if raw_input('> ') != 'yes': + print 'Removing downloaded files.' + os.unlink('/boot/vmlinuz-install') + os.unlink('/boot/initrd-install.img') + print 'Aborting.' + sys.exit(1) + + cmd = subprocess.Popen(shlex.split(grubby_command), + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + stdout, stderr = cmd.communicate() + if stdout: + print stdout + if stderr: + print "[STDERR output]" + print stderr + + if not options.yes: + raw_input( + 'Examine the above output, if it looks sane, press enter to ' + 'continue.') +print 'The next command I will run is:' +print 'echo "savedefault --default=0 --once" | grub --batch' + +if not options.noop: + cmd = subprocess.Popen(['/sbin/grub', '--batch'], + stdin=subprocess.PIPE, + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT) + stdout = cmd.communicate(input='savedefault --default=0 --once\n') + print stdout[0] + +print 'Done.' +print 'When you are ready, run: `shutdown -r now` to reboot.' +print 'Go here:' +print 'http://infrastructure.fedoraproject.org/infra/docs/kickstarts.txt' +print 'And control-f for "Installation" (no quotes). Continue from there.' + +if options.noop: + print '-' * 30 + print 'Script was run in "no-op" mode - none of the above commands ' \ + 'actually ran.' + print '-' * 30 |