#!/usr/bin/env python # Copyright (c) 2012 Wind River Systems, Inc. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation. # # 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 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 os import sys sys.path.insert(0, os.path.join(os.path.dirname(os.path.dirname( \ os.path.abspath(__file__))), 'lib')) try: import bb except RuntimeError as exc: sys.exit(str(exc)) import gtk import optparse import pygtk from bb.ui.crumbs.hobwidget import HobAltButton, HobButton from bb.ui.crumbs.hig.crumbsmessagedialog import CrumbsMessageDialog from bb.ui.crumbs.hig.deployimagedialog import DeployImageDialog from bb.ui.crumbs.hig.imageselectiondialog import ImageSelectionDialog # I put all the fs bitbake supported here. Need more test. DEPLOYABLE_IMAGE_TYPES = ["jffs2", "cramfs", "ext2", "ext3", "btrfs", "squashfs", "ubi", "vmdk"] Title = "USB Image Writer" class DeployWindow(gtk.Window): def __init__(self, image_path=''): super(DeployWindow, self).__init__() if len(image_path) > 0: valid = True if not os.path.exists(image_path): valid = False lbl = "Invalid image file path: %s.\nPress Select Image to select an image." % image_path else: image_path = os.path.abspath(image_path) extend_name = os.path.splitext(image_path)[1][1:] if extend_name not in DEPLOYABLE_IMAGE_TYPES: valid = False lbl = "Undeployable imge type: %s\nPress Select Image to select an image." % extend_name if not valid: image_path = '' crumbs_dialog = CrumbsMessageDialog(self, lbl, gtk.STOCK_DIALOG_INFO) button = crumbs_dialog.add_button("Close", gtk.RESPONSE_OK) HobButton.style_button(button) crumbs_dialog.run() crumbs_dialog.destroy() self.deploy_dialog = DeployImageDialog(Title, image_path, self, gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT | gtk.DIALOG_NO_SEPARATOR, None, standalone=True) close_button = self.deploy_dialog.add_button("Close", gtk.RESPONSE_NO) HobAltButton.style_button(close_button) close_button.connect('clicked', gtk.main_quit) write_button = self.deploy_dialog.add_button("Write USB image", gtk.RESPONSE_YES) HobAltButton.style_button(write_button) self.deploy_dialog.connect('select_image_clicked', self.select_image_clicked_cb) self.deploy_dialog.connect('destroy', gtk.main_quit) response = self.deploy_dialog.show() def select_image_clicked_cb(self, dialog): cwd = os.getcwd() dialog = ImageSelectionDialog(cwd, DEPLOYABLE_IMAGE_TYPES, Title, self, gtk.FILE_CHOOSER_ACTION_SAVE ) button = dialog.add_button("Cancel", gtk.RESPONSE_NO) HobAltButton.style_button(button) button = dialog.add_button("Open", gtk.RESPONSE_YES) HobAltButton.style_button(button) response = dialog.run() if response == gtk.RESPONSE_YES: if not dialog.image_names: lbl = "No selections made\nClicked the radio button to select a image." crumbs_dialog = CrumbsMessageDialog(self, lbl, gtk.STOCK_DIALOG_INFO) button = crumbs_dialog.add_button("Close", gtk.RESPONSE_OK) HobButton.style_button(button) crumbs_dialog.run() crumbs_dialog.destroy() dialog.destroy() return # get the full path of image image_path = os.path.join(dialog.image_folder, dialog.image_names[0]) self.deploy_dialog.set_image_text_buffer(image_path) self.deploy_dialog.set_image_path(image_path) dialog.destroy() def main(): parser = optparse.OptionParser( usage = """%prog [-h] [image_file] %prog writes bootable images to USB devices. You can provide the image file on the command line or select it using the GUI.""") options, args = parser.parse_args(sys.argv) image_file = args[1] if len(args) > 1 else '' dw = DeployWindow(image_file) if __name__ == '__main__': try: main() gtk.main() except Exception: import traceback traceback.print_exc(3)