hob2: create a standalone deploy image tool
[Yocto 2388] Create a deploy image tool using the existing dialog including DeployImageDialog and ImageSelectionDialog. This tool writes bootable images to USB devices, and it can be run directly without hob. Signed-off-by: Kang Kai <kai.kang@windriver.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
parent
7828e9eee2
commit
0612cf3fcb
|
@ -0,0 +1,120 @@
|
||||||
|
#!/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.hig import DeployImageDialog, ImageSelectionDialog, CrumbsMessageDialog
|
||||||
|
from bb.ui.crumbs.hobwidget import HobAltButton, HobButton
|
||||||
|
|
||||||
|
# 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 Maker"
|
||||||
|
|
||||||
|
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 = "<b>Invalid image file path: %s.</b>\nPress <b>Select Image</b> button 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 = "<b>Undeployable imge type: %s</b>\nPress <b>Select Image</b> button 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)
|
||||||
|
|
||||||
|
make_button = self.deploy_dialog.add_button("Make USB image", gtk.RESPONSE_YES)
|
||||||
|
HobAltButton.style_button(make_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 = "<b>No selections made</b>\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)
|
Loading…
Reference in New Issue