#!/usr/bin/python

import os
import sys
import rpm
import subprocess
import tempfile
import shutil
import re

def main():

    def usage():
        print >> sys.stdout, "mkbiarch.py <i686 Live Image> <x86_64 Live image> <Target Bi-Arch image>"

    def cleanup():
        try:
            args = ("/bin/umount", tmpdir)
            rc = subprocess.call(args)
        
            args = ("/sbin/losetup", "-d", lodev2)
            rc = subprocess.call(args)

            args = ("/sbin/losetup", "-d", lodev)
            rc = subprocess.call(args)

            args = ("/bin/rm", tmpfile)
            rc = subprocess.call(args)

            args = ("/bin/rmdir", tmpdir)
            rc = subprocess.call(args)
        except:
            print >> sys.stderr, "cleanup() failed."
             

    def error(rc):
        cleanup() 
        print >> sys.stderr, "error() %s" %rc
        sys.exit(1)

 
    def bootconfig(config, **args):
        contents = """
		default vesamenu.c32
		timeout 100

		menu background splash.jpg
		menu title %(name)s 
		menu color border 0 #ffffffff #00000000
		menu color sel 7 #ffffffff #ff000000
		menu color title 0 #ffffffff #00000000
		menu color tabmsg 0 #ffffffff #00000000
		menu color unsel 0 #ffffffff #00000000
		menu color hotsel 0 #ff000000 #ffffffff
		menu color hotkey 7 #ffffffff #ff000000
		menu color timeout_msg 0 #ffffffff #00000000
			menu color timeout 0 #ffffffff #00000000
		menu color cmdline 0 #ffffffff #00000000
		menu hidden
		menu hiddenrow 5
		label detect
		  menu label Autoselect x86_64 / i686 Boot
		  kernel ifcpu64.c32
		  append linux0 -- linux1
		menu default
		label linux0
		  menu label Boot x86_64
		  kernel vmlinuz0
		  append initrd=initrd0.img root=live:%(uuid1)s rootfstype=vfat ro liveimg live_dir=%(basedirx64)s quiet  rhgb rd_NO_LUKS rd_NO_MD noiswmd 
		label check0
		  menu label Verify and Boot x86_64
		  kernel vmlinuz0
		  append initrd=initrd0.img root=live:%(uuid1)s rootfstype=vfat ro liveimg live_dir=%(basedirx64)s quiet  rhgb check
		label linux1
		  menu label Boot i686
		  kernel vmlinuz1
		  append initrd=initrd1.img root=live:%(uuid0)s rootfstype=vfat ro liveimg live_dir=%(basedirx86)s quiet  rhgb rd_NO_LUKS rd_NO_MD noiswmd 
		label check1
		  menu label Verify and Boot i686
		  kernel vmlinuz1
		  append initrd=initrd1.img root=live:%(uuid0)s rootfstype=vfat ro liveimg live_dir=%(basedirx86)s quiet  rhgb check
		label memtest
		  menu label Memory Test
		  kernel memtest
		label local
		  menu label Boot from local drive
		  localboot 0xffff
		""" %args

        fd = open(config, "w")
        fd.write(contents)
        fd.close()
                



    try:
        x86=sys.argv[1]
        x64=sys.argv[2]
        biarch=sys.argv[3]
    except IndexError:
        self.usage()


    try:
        if os.stat(x86):
            pass
        if os.stat(x64):
            pass
    except OSError, e:
            print >> sys.stdout, "One or more files do not exist: %s" %e


    try:
        tmpdir = tempfile.mkdtemp()
    except OSError, e:
        print >> sys.stdout, "Could not create temporary directory: %s" %(e)



    try:
        x86size = os.stat(x86).st_size
        x64size = os.stat(x64).st_size
        baseimg = x86size + x64size

        pad = 1200
        offset = 17408
        realimg = baseimg - offset
        bs = 4096
        count = baseimg / bs + pad

        tmpfile = tempfile.mkstemp()

        args = ("/bin/dd", "if=/dev/zero", "of=%s" %tmpfile[1], "bs=%s" %bs, "count=%s" %count)
        rc = subprocess.call(args)
    except OSError, e:
        print >> sys.stdout, "Could not create temporary file: %s" %(e)

    

    args = ("/sbin/losetup", "-f")
    rc = subprocess.call(args, stdout=open('/dev/null', 'w'), stderr=subprocess.STDOUT)
    if rc > 0:
        error(rc)
    else:
        lodev = subprocess.Popen(args, stdout=subprocess.PIPE).communicate()[0].rstrip()


    args = ("/sbin/losetup", lodev, tmpfile[1])
    rc = subprocess.call(args)
    if rc:
        error(rc)


    args = ("livecd-iso-to-disk", "--unencrypted-home", "--livedir", "Fedora-x86", "--format", "--reset-mbr", x86, lodev)
    rc = subprocess.call(args, stdin=open("/bin/true", "r"), stderr=subprocess.STDOUT)
    if rc > 0:
         error(rc)



    args = ("/sbin/losetup", "-d", lodev)
    rc = subprocess.call(args)


    args = ("/bin/mount", "-o", "loop", tmpfile[1], tmpdir)
    rc = subprocess.call(args)


    try:
        shutil.move(tmpdir + "/syslinux/initrd0.img", tmpdir + "/syslinux/initrd1.img")
        shutil.move(tmpdir + "/syslinux/vmlinuz0", tmpdir + "/syslinux/vmlinuz1")
    except:
        rc = "shutil.move failed"
        error(rc)


    config = tmpdir + "/syslinux/syslinux.cfg"
    fd = open(config, "r")
    lines = fd.readlines()
    for line in lines:
        uuid1 = re.search(r"UUID=[-0-9A-Za-z]+", line, 10)
        if uuid1:
            break

    fd.close()
    uuid1 = uuid1.group()

    fd = open(config, "r")
    lines = fd.readlines()
    for line in lines:
        name = re.search(r"Welcome to ", line, 10)
        if name:
            break
    #basedirx86 = name.split("Welcome to")[1] + "x86"
    #basedirx64 = name.split("Welcome to")[1] + "x64"
    basedirx86 = "Fedora-x86"
    basedirx64 = "Fedora-x64"
    fd.close()

    args = ("/bin/umount", tmpdir)
    rc = subprocess.call(args)

    args = ("/sbin/losetup", "-j", tmpfile[1])
    lodata = subprocess.Popen(args, stdout=subprocess.PIPE).communicate()[0]
    lodev2 = lodata.split(":")[0]
   
 
    args = ("/sbin/losetup", "-f")
    rc = subprocess.call(args, stdout=open('/dev/null', 'w'), stderr=subprocess.STDOUT)
    if rc > 0:
        error(rc)
    else:
        lodev2 = subprocess.Popen(args, stdout=subprocess.PIPE).communicate()[0].rstrip()


    args = ("/sbin/losetup", lodev2, tmpfile[1])
    rc = subprocess.call(args)


    args = ("livecd-iso-to-disk", "--unencrypted-home", "--livedir", "Fedora-x64", x64, lodev2)
    rc = subprocess.call(args)

   
    args = ("/bin/mount", lodev2, tmpdir)
    rc = subprocess.call(args)

    config = tmpdir + "/syslinux/syslinux.cfg"
    fd = open(config, "r")
    lines = fd.readlines()
    for line in lines:
        uuid0 = re.search(r"UUID=[-0-9A-Za-z]+", line, 10)
        if uuid0:
            break

    fd.close()
    uuid0 = uuid0.group()

  
    ifcpu64c32 = "/usr/share/syslinux/ifcpu64.c32"
    shutil.copy(ifcpu64c32, tmpdir + "/syslinux/")


    try: 
        config = tmpdir + "/syslinux/syslinux.cfg"
        bootconfig(config, 
                   uuid0 = uuid0,
                   uuid1 = uuid1,
                   name = name,
                   basedirx86 = basedirx86,
                   basedirx64 = basedirx64)
    except:
        rc = "bootconfig() failed."
        error(rc)


    args = ("/bin/umount", tmpdir)
    rc = subprocess.call(args)
    
    args = ("/sbin/losetup", "-d", lodev2)
    rc = subprocess.call(args)

    shutil.move(tmpfile[1], biarch)
    print >> sys.stdout, " Multiple architecture Image file is: %s" %biarch

if __name__ == "__main__":
    sys.exit(main())
