Hi, This patch will create a small GUI in PyQt for the tool diff --git a/livecd-iso-to-usb.py b/livecd-iso-to-usb.py index 8a06090..4e940f0 100644 --- a/livecd-iso-to-usb.py +++ b/livecd-iso-to-usb.py @@ -1,130 +1,174 @@ -# This tool installs a Fedora Live ISO (F7+) on to a USB stick, from Windows. -# For information regarding the installation of Fedora on USB drives, see -# the wiki: http://fedoraproject.org/wiki/FedoraLiveCD/USBHowTo -# -# Copyright 2008 Red Hat, Inc. -# Authors: Luke Macken <lmacken@xxxxxxxxxx> -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; version 2 of the License. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Library General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -import win32file -import win32api -import shutil -import os -import re - -class LiveUSBCreator: - - iso = None # Fedora-8-Live-i686.iso - drive = None # F:\ - label = "FEDORA" # if one doesn't already exist - - def detectRemovableDrives(self): - """ - Detect all removable drives. If we find more than one, ask the user - which they would like to use. - """ - drives = [] - for drive in [l.upper() + ':' for l in 'abcdefghijklmnopqrstuvwxyz']: - if win32file.GetDriveType(drive) == win32file.DRIVE_REMOVABLE: - drives.append(drive) - if not len(drives): - raise Exception("Sorry, I couldn't find any devices") - elif len(drives) > 1: - drives[0] = raw_input("Which drive do you want to put Fedora on: " - "%s ? " % drives) - drives[0] = drives[0].upper() - if not drives[0].endswith(":"): - drives[0] += ":" - self.drive = drives[0] + os.sep - - def verifyFilesystem(self): - """ - Verify our filesystem type, and set the volume label if necessary - """ - try: - vol = win32api.GetVolumeInformation(self.drive[:-1]) - except: - raise Exception("Make sure your USB key is plugged in and formatted" - " using the FAT filesystem") - if vol[-1] not in ('FAT32', 'FAT'): - raise Exception("Unsupported filesystem: %s\nPlease backup and " - "format your USB key with the FAT filesystem." % - vol[-1]) - if vol[0] == '': - win32file.SetVolumeLabel(self.drive[:-1], self.label) - else: - self.label = vol[0] - - def findISO(self): - """ - Look in the current directory for our ISO image. - """ - isos = [item for item in os.listdir(".") if item.endswith(".iso")] - if not len(isos): - raise Exception("Cannot find ISO file. Please drag it into this " - "directory. If you haven't downloaded Fedora yet, " - "please visit: http://fedoraproject.org/get-fedora") - if len(isos) > 1: - print "I found the following ISOs:" - for i, iso in enumerate(isos): - print " [ %d ] %s" % (i + 1, iso) - choice = raw_input("Which image do you want use: %s ? " % - range(1, i + 2)) - isos[0] = isos[int(choice) - 1] - self.iso = isos[0] - - def extractISO(self): - """ Extract our ISO with 7-zip directly to the USB key """ - if os.path.isdir(os.path.join(self.drive, "LiveOS")): - print "Your device already contains a LiveOS!" - os.system("7-Zip%s7z.exe x %s -x![BOOT] -o%s" % (os.sep, self.iso, - self.drive)) - if not os.path.isdir(os.path.join(self.drive, "LiveOS")): - raise Exception("ISO extraction failed? Cannot find LiveOS") - - def updateConfigs(self): - """ Generate our syslinux.cfg """ - isolinux = file(os.path.join(self.drive,"isolinux","isolinux.cfg"),'r') - syslinux = file(os.path.join(self.drive,"isolinux","syslinux.cfg"),'w') - for line in isolinux.readlines(): - if "CDLABEL" in line: - line = re.sub("CDLABEL=[^ ]*", "LABEL=" + self.label, line) - line = re.sub("rootfstype=[^ ]*", "rootfstype=vfat", line) - syslinux.write(line) - isolinux.close() - syslinux.close() - - def installBootloader(self): - print "Installing bootloader" - shutil.move(os.path.join(self.drive, "isolinux"), - os.path.join(self.drive, "syslinux")) - os.unlink(os.path.join(self.drive, "syslinux", "isolinux.cfg")) - os.system("syslinux -d %s %s" % (os.path.join(self.drive, "syslinux"), - self.drive[:-1])) - -if __name__ == '__main__': - try: - live = LiveUSBCreator() - live.detectRemovableDrives() - live.verifyFilesystem() - live.findISO() - live.extractISO() - live.updateConfigs() - live.installBootloader() - except Exception, e: - print "Oops! Something went wrong:" - print str(e) - - x = raw_input("\nDone!") +# This tool installs a Fedora Live ISO (F7+) on to a USB stick, from Windows. +# For information regarding the installation of Fedora on USB drives, see +# the wiki: http://fedoraproject.org/wiki/FedoraLiveCD/USBHowTo +# +# Copyright 2008 Red Hat, Inc. +# Authors: Luke Macken <lmacken@xxxxxxxxxx> +# Copyright 2008 Kushal Das <kushal@xxxxxxxxxxxxxxxxx> +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; version 2 of the License. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Library General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +from luDialog import Ui_luDialog +from PyQt4 import QtCore, QtGui +import sys +import win32file +import win32api +import shutil +import os +import re + +class LiveUSBCreator: + + iso = None # Fedora-8-Live-i686.iso + drive = None # F:\ + label = "FEDORA" # if one doesn't already exist + + def detectRemovableDrives(self): + """ + Detect all removable drives. If we find more than one, ask the user + which they would like to use. + """ + drives = [] + for drive in [l.upper() + ':' for l in 'abcdefghijklmnopqrstuvwxyz']: + if win32file.GetDriveType(drive) == win32file.DRIVE_REMOVABLE: + drives.append(drive) + if not len(drives): + raise Exception("Sorry, I couldn't find any devices") + elif len(drives) > 1: + drives[0] = raw_input("Which drive do you want to put Fedora on: " + "%s ? " % drives) + drives[0] = drives[0].upper() + if not drives[0].endswith(":"): + drives[0] += ":" + self.drive = drives[0] + os.sep + + def verifyFilesystem(self): + """ + Verify our filesystem type, and set the volume label if necessary + """ + try: + vol = win32api.GetVolumeInformation(self.drive[:-1]) + except: + raise Exception("Make sure your USB key is plugged in and formatted" + " using the FAT filesystem" + self.drive) + if vol[-1] not in ('FAT32', 'FAT'): + raise Exception("Unsupported filesystem: %s\nPlease backup and " + "format your USB key with the FAT filesystem." % + vol[-1]) + if vol[0] == '': + win32file.SetVolumeLabel(self.drive[:-1], self.label) + else: + self.label = vol[0] + + def findISO(self): + """ + Look in the current directory for our ISO image. + """ + isos = [item for item in os.listdir(".") if item.endswith(".iso")] + if not len(isos): + raise Exception("Cannot find ISO file. Please drag it into this " + "directory. If you haven't downloaded Fedora yet, " + "please visit: http://fedoraproject.org/get-fedora") + if len(isos) > 1: + print "I found the following ISOs:" + for i, iso in enumerate(isos): + print " [ %d ] %s" % (i + 1, iso) + choice = raw_input("Which image do you want use: %s ? " % + range(1, i + 2)) + isos[0] = isos[int(choice) - 1] + self.iso = isos[0] + + def extractISO(self): + """ Extract our ISO with 7-zip directly to the USB key """ + if os.path.isdir(os.path.join(self.drive, "LiveOS")): + print "Your device already contains a LiveOS!" + os.system("7-Zip%s7z.exe x %s -x![BOOT] -o%s" % (os.sep, self.iso, + self.drive)) + if not os.path.isdir(os.path.join(self.drive, "LiveOS")): + raise Exception("ISO extraction failed? Cannot find LiveOS" +self.iso) + + def updateConfigs(self): + """ Generate our syslinux.cfg """ + isolinux = file(os.path.join(self.drive,"isolinux","isolinux.cfg"),'r') + syslinux = file(os.path.join(self.drive,"isolinux","syslinux.cfg"),'w') + for line in isolinux.readlines(): + if "CDLABEL" in line: + line = re.sub("CDLABEL=[^ ]*", "LABEL=" + self.label, line) + line = re.sub("rootfstype=[^ ]*", "rootfstype=vfat", line) + syslinux.write(line) + isolinux.close() + syslinux.close() + + def installBootloader(self): + print "Installing bootloader" + shutil.move(os.path.join(self.drive, "isolinux"), + os.path.join(self.drive, "syslinux")) + os.unlink(os.path.join(self.drive, "syslinux", "isolinux.cfg")) + os.system("syslinux -d %s %s" % (os.path.join(self.drive, "syslinux"), + self.drive[:-1])) + + + + +class luApp(QtGui.QApplication): + """Main application class""" + def __init__(self,args=None): + QtGui.QApplication.__init__(self,args) + self.mywindow = lsUI() + self.mywindow.show() + self.exec_() + + +class lsUI(Ui_luDialog, QtGui.QDialog): + """My class for the UI""" + def __init__(self): + QtGui.QDialog.__init__(self) + self.setupUi(self) + for drive in [l.upper() + ':' for l in 'abcdefghijklmnopqrstuvwxyz']: + if win32file.GetDriveType(drive) == win32file.DRIVE_REMOVABLE: + self.driveBox.addItem(drive + os.sep) + if self.driveBox.count < 0: + raise Exception("Sorry, I couldn't find any devices") + try: + self.live = LiveUSBCreator() + except Exception , e: + self.textEdit.setPlainText(str(e)) + self.connectslots() + + def connectslots(self): + self.connect(self.isoBttn,QtCore.SIGNAL("clicked()"),self.selectfile) + self.connect(self.burnBttn,QtCore.SIGNAL("clicked()"),self.burn) + + def burn(self): + self.live.drive = str(self.driveBox.currentText()) + if self.live.iso == None: + self.textEdit.setPlainText("Please select an ISO first") + return + try: + self.live.verifyFilesystem() + self.live.extractISO() + self.live.updateConfigs() + self.live.installBootloader() + self.textEdit.setPlainText("Done :)") + except Exception, e: + self.textEdit.setPlainText(str(e)) + + def selectfile(self): + isofile = QtGui.QFileDialog.getOpenFileName(self, "Select Live ISO", ".", "ISO (*.iso)" ) + self.live.iso = str(isofile) + + + +if __name__ == '__main__': + luApp = luApp(sys.argv) diff --git a/luDialog.py b/luDialog.py new file mode 100755 index 0000000..96a2e8a --- /dev/null +++ b/luDialog.py @@ -0,0 +1,68 @@ +# -*- coding: utf-8 -*- + +# Form implementation generated from reading ui file 'luDialog.ui' +# +# Created: Mon Feb 04 15:41:02 2008 +# by: PyQt4 UI code generator 4.3.3 +# +# WARNING! All changes made in this file will be lost! + +from PyQt4 import QtCore, QtGui + +class Ui_luDialog(object): + def setupUi(self, luDialog): + luDialog.setObjectName("luDialog") + luDialog.resize(QtCore.QSize(QtCore.QRect(0,0,384,359).size()).expandedTo(luDialog.minimumSizeHint())) + + self.gridlayout = QtGui.QGridLayout(luDialog) + self.gridlayout.setObjectName("gridlayout") + + self.hboxlayout = QtGui.QHBoxLayout() + self.hboxlayout.setObjectName("hboxlayout") + + self.isoBttn = QtGui.QPushButton(luDialog) + self.isoBttn.setObjectName("isoBttn") + self.hboxlayout.addWidget(self.isoBttn) + + self.label = QtGui.QLabel(luDialog) + self.label.setObjectName("label") + self.hboxlayout.addWidget(self.label) + + self.driveBox = QtGui.QComboBox(luDialog) + self.driveBox.setObjectName("driveBox") + self.hboxlayout.addWidget(self.driveBox) + self.gridlayout.addLayout(self.hboxlayout,0,0,1,1) + + spacerItem = QtGui.QSpacerItem(20,40,QtGui.QSizePolicy.Minimum,QtGui.QSizePolicy.Expanding) + self.gridlayout.addItem(spacerItem,1,0,1,1) + + self.hboxlayout1 = QtGui.QHBoxLayout() + self.hboxlayout1.setObjectName("hboxlayout1") + + spacerItem1 = QtGui.QSpacerItem(40,20,QtGui.QSizePolicy.Expanding,QtGui.QSizePolicy.Minimum) + self.hboxlayout1.addItem(spacerItem1) + + self.burnBttn = QtGui.QPushButton(luDialog) + self.burnBttn.setObjectName("burnBttn") + self.hboxlayout1.addWidget(self.burnBttn) + + spacerItem2 = QtGui.QSpacerItem(40,20,QtGui.QSizePolicy.Expanding,QtGui.QSizePolicy.Minimum) + self.hboxlayout1.addItem(spacerItem2) + self.gridlayout.addLayout(self.hboxlayout1,2,0,1,1) + + spacerItem3 = QtGui.QSpacerItem(20,16,QtGui.QSizePolicy.Minimum,QtGui.QSizePolicy.Expanding) + self.gridlayout.addItem(spacerItem3,3,0,1,1) + + self.textEdit = QtGui.QTextEdit(luDialog) + self.textEdit.setObjectName("textEdit") + self.gridlayout.addWidget(self.textEdit,4,0,1,1) + + self.retranslateUi(luDialog) + QtCore.QMetaObject.connectSlotsByName(luDialog) + + def retranslateUi(self, luDialog): + luDialog.setWindowTitle(QtGui.QApplication.translate("luDialog", "Fedora Live ISO to USB ", None, QtGui.QApplication.UnicodeUTF8)) + self.isoBttn.setText(QtGui.QApplication.translate("luDialog", "Select The ISO", None, QtGui.QApplication.UnicodeUTF8)) + self.label.setText(QtGui.QApplication.translate("luDialog", "Select Drive to Install", None, QtGui.QApplication.UnicodeUTF8)) + self.burnBttn.setText(QtGui.QApplication.translate("luDialog", "BURN", None, QtGui.QApplication.UnicodeUTF8)) + diff --git a/setup.py b/setup.py index a4f0b36..d4a734f 100644 --- a/setup.py +++ b/setup.py @@ -1,16 +1,18 @@ -from distutils.core import setup -import py2exe - -setup( - console = [ - { - "script" : "livecd-iso-to-usb.py", - "icon_resources" : [(0, "fedora.ico")], - } - ], - data_files = [ - "syslinux.exe", - ("7-Zip", ["7-Zip/7z.exe", "7-Zip/7z.dll", "7-Zip/7zCon.sfx", - "7-Zip/License.txt", "7-Zip/copying.txt"]), - ], -) +from distutils.core import setup +import py2exe + +setup( + windows = [ + { + "script" : "livecd-iso-to-usb.py", + "icon_resources" : [(0, "fedora.ico")], + + } + ], + options={"py2exe" : {"includes" : ["sip", "PyQt4._qt"]}}, + data_files = [ + "syslinux.exe", + ("7-Zip", ["7-Zip/7z.exe", "7-Zip/7z.dll", "7-Zip/7zCon.sfx", + "7-Zip/License.txt", "7-Zip/copying.txt"]), + ], +) Kushal -- Fedora Ambassador, India http://kushaldas.in http://dgplug.org (Linux User Group of Durgapur) -- fedora-devel-list mailing list fedora-devel-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/fedora-devel-list