#!/bin/bash #usbinstall.sh # Arg 1: usb device for installation # Arg 2: boot file # Arg 3: iso file #~ # openmamba-usbinstall è uno script per la generazione automatica di una chiavetta di boot per openmamba snapshot. #~ # Se i file necessari sono presenti sul disco fisso verranno utilizzati quelli altrimenti #~ # scaricherà direttamente la versione attuale dal sito di openmamba. #~ # se il file iso è presente nella home verrà usato direttamente altrimenti si aprirà un dialogo dove sarà possibile cercarlo. #~ # (c) 2009 ercole 'ercolinux' carpanetto - ercole69@gmail.com #~ # (c) 2009-2013 Silvan Calarco - silvan.calarco@mambasoft.it # License: GPL v.3 #%Changelog: # 17/10/11 (michiamophil) # * Script modificato organizzando il codice in funzioni, chiamate dal modulo installazione.py # 06/01/12 (michiamophil) # * "sudo u/mount -> udisks" # * export $1, $2, $3 -> OPENMAMBA_* # 08/01/12 (michiamophil) # * INITIAL-CHECK TEXTDOMAINDIR=/usr/share/locale/ TEXTDOMAIN=usbinstall #=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~ #-------------------------------------(DBUS)----------------------------------------- #=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~ function dbus_properties_get_string() { REPLY=`dbus-send --system --print-reply --dest=$1 $2 \ org.freedesktop.DBus.Properties.Get string:$3 string:"$4"` [ $? -eq 0 ] || return 1 echo $REPLY | sed "s|.*string.*\"\(.*\)\"|\1|" return 0 } function dbus_properties_get_stringlist() { # FIXME: only returns first element REPLY=`dbus-send --system --print-reply --dest=$1 $2 \ org.freedesktop.DBus.Properties.Get string:$3 string:"$4"` [ $? -eq 0 ] || return 1 echo $REPLY | sed "s|.*array.*\[ string \"\(.*\)\" ]|\1|" return 0 } function dbus_properties_get_uint64() { REPLY=`dbus-send --system --print-reply --dest=$1 $2 \ org.freedesktop.DBus.Properties.Get string:$3 string:$4` [ $? -eq 0 ] || return 1 echo $REPLY | sed "s|.*uint64 \(.*\)|\1|" return 0 } function dbus_properties_get_bool() { REPLY=`dbus-send --system --print-reply --dest=$1 $2 org.freedesktop.DBus.Properties.Get string:$3 string:"$4"` [ $? -eq 0 ] || return 1 echo $REPLY | sed "s|.*boolean \(.*\)|\1|" return 0 } # Set progressbar (only if $DBUS_USBINSTALL = 1) # Arg 1: value% set_pbar() { if [ "$DBUS_USBINSTALL" == "1" ]; then dbus-send --system --print-reply --dest=org.openmamba.usbinstall /org/openmamba/usbinstall org.openmamba.usbinstall.Set_progressBar int32:$1 &>/dev/null if [ "$?" != "0" ]; then [ "$CPPID" ] && kill -9 $CPPID exit 1 fi fi } # Set status label (only if $DBUS_USBINSTALL = 1) # Arg 1: string set_status() { if [ "$DBUS_USBINSTALL" == "1" ]; then dbus-send --system --print-reply --dest=org.openmamba.usbinstall /org/openmamba/usbinstall org.openmamba.usbinstall.Set_description "string:$1" &>/dev/null if [ "$?" != "0" ]; then [ "$CPPID" ] && kill -9 $CPPID exit 1 fi fi } # Terminate the frontend (only if $DBUS_USBINSTALL = 1) exit_frontend() { if [ "$DBUS_USBINSTALL" == "1" ]; then dbus-send --system --print-reply --dest=org.openmamba.usbinstall /org/openmamba/usbinstall org.openmamba.usbinstall.Exit "string:$1" &>/dev/null if [ "$?" != "0" ]; then [ "$CPPID" ] && kill -9 $CPPID exit 1 fi fi } ####################################(DBUS)########################################### function errorAndExit() { echo "$1" # Se l'argomento 2 è settato stampa anche l'help if [ -n "$2" ]; then usage fi exit_frontend "$1" # Termina il frontend con codice di errore 1 exit 1 } function usage() { echo $"usbinstall: install openmamba into your usb key!" echo -e "\t"$"Usage: sudo usbinstall Arg1 Arg2 Arg3 [-y]" echo -e "\t"$"Arg 1: Usb device path (e.g. /dev/sdc)" echo -e "\t"$"Arg 2: Cpio.gz file (e.g. ~/openmamba-bootusb-it-milestone2-2.0pre8.i586.cpio.gz)" echo -e "\t"$"Arg 3: ISO file (e.g. ~/openmamba-livecd-it-milestone2-2.0pre8.i586.iso)" echo -e "\t"$"-y: install without asking confirmation [Be careful!]" } #=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~ #--------------------------------(INITIAL-CHECK)------------------------------------- #=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~ # Confirm if [ "$4" = "-y" ]; then CONFIRM=0 elif [ "$4" = "-d" ]; then CONFIRM=0 DBUS_USBINSTALL=1 # First set this else CONFIRM=1 fi # Help if [ "$1" = "-h" -o "$1" = "--help" ]; then usage exit 0 fi # Check if usbinstall have root permission if [ "`id -u`" != 0 ]; then errorAndExit $"Error: usbinstall must be run as root" 1 fi # Check if Arg 1 is valid if [ -b "$1" ]; then # If is a block device ISKEY=`dbus_properties_get_bool org.freedesktop.UDisks /org/freedesktop/UDisks/devices/${1/*\/} \ org.freedesktop.UDisks.Device DeviceIsRemovable` if [ "$ISKEY" = "true" ]; then # If is a usb export SELECT_USB=$1 else # If not, user can choose echo $"Warning: you haven't choosen a removable device ($1). Are you sure to continue? [yes/no]" read KEY case "$KEY" in $yes) export SELECT_USB=$1 ;; *) errorAndExit $"Installation aborted" ;; esac fi else errorAndExit $"Error(Arg 1): \"$1\" isn't a block device" 1 fi # Check if Arg 2 is valid (it can be null) if ["$2" ]; then if [ -r "$2" ]; then # Chek is is readable # Check if Arg 2 is a gz file if [ "${2##*.}" != "gz" ]; then errorAndExit "Error(Arg 2): you must chose a cpio.gz file" 1 fi export SELECT_BOOT=$2 else errorAndExit $"Error(Arg 2): \"$2\" is not readable" 1 fi fi # Check if Arg 3 is valid if [ -r "$3" ]; then # Chek is is readable # Check if Arg 3 is an iso file if [ "${3##*.}" != "iso" ]; then errorAndExit "Error(Arg 3): you must chose a ISO (.iso) file" 1 fi SELECT_ISO=`readlink -f $3` else errorAndExit "Error(Arg 3): \"$3\" is not readable" 1 fi #################################(INITIAL-CHECK)##################################### #=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~ #--------------------------------(INSTALLATION)-------------------------------------- #=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~ export LOGFILE=/var/log/usbinstall.log trap "[ \"$CPPID\" ] && kill -9 $CPPID" HUP INT QUIT ABRT KILL TERM set_status $"Unmount usb device" echo $"Unmount usb device" DEVICEISMOUNTED=`dbus_properties_get_bool org.freedesktop.UDisks /org/freedesktop/UDisks/devices/${SELECT_USB/*\/}1 \ org.freedesktop.UDisks.Device DeviceIsMounted` if [ "$DEVICEISMOUNTED" = "true" ]; then LANG=C udisks --unmount ${SELECT_USB}1 | grep failed && { errorAndExit $"Error: fail to umount the usb key (${SELECT_USB}1)" } fi set_pbar 2 # Prima di formattare :P if [ "$CONFIRM" = "1" ]; then echo $"Warning: You are going to format this device ($1). Are you sure to continue? [yes/no]" read KEY case "$KEY" in $"yes"|"Y"|"y") ;; *) errorAndExit $"Installation aborted" ;; esac fi set_status $"Partitioning $SELECT_USB..." echo $"Partitioning $SELECT_USB..." # Start from a new partition table sudo parted -s $SELECT_USB mktable msdos &>>$LOGFILE if [ "$?" != "0" ]; then errorAndExit $"Error:"" \"parted\" "$"exit with error (see $LOGFILE)" fi # EFI partition sudo parted -s -a optimal -- $SELECT_USB mkpart primary fat32 0 20M &>>$LOGFILE if [ "$?" != "0" ]; then errorAndExit $"Error:"" \"parted\" "$"exit with error (see $LOGFILE)" fi # openmamba partition sudo parted -s -a optimal -- $SELECT_USB mkpart primary ext4 20M -1 &>>$LOGFILE if [ "$?" != "0" ]; then errorAndExit $"Error:"" \"parted\" "$"exit with error (see $LOGFILE)" fi # boot flag on openmamba partition sudo parted -s $SELECT_USB set 2 boot on &>>$LOGFILE if [ "$?" != "0" ]; then errorAndExit $"Error:"" \"parted\" "$"exit with error (see $LOGFILE)" fi set_pbar 5 set_status $"Formatting $SELECT_USB..." echo $"Formatting $SELECT_USB..." sudo mkfs.vfat ${SELECT_USB}1 -n EFI &>>$LOGFILE if [ "$?" != "0" ]; then errorAndExit $"Error:"" \"mkfs.vfat\" "$"exit with error (see $LOGFILE)" fi sudo mkfs.ext4 ${SELECT_USB}2 -L openmamba_live &>>$LOGFILE if [ "$?" != "0" ]; then errorAndExit $"Error:"" \"mkfs.ext4\" "$"exit with error (see $LOGFILE)" fi sleep 1 LANG=C udisks --mount ${SELECT_USB}1 &>>$LOGFILE if [ "$?" != "0" ]; then errorAndExit $"Error:"" \"udisks --mount\" "$"exit with error (see $LOGFILE)" fi LANG=C udisks --mount ${SELECT_USB}2 &>>$LOGFILE if [ "$?" != "0" ]; then errorAndExit $"Error:"" \"udisks --mount\" "$"exit with error (see $LOGFILE)" fi set_pbar 30 # Riceve la mountdir della chiavetta da dbus MOUNTDIR_EFI=`dbus_properties_get_stringlist org.freedesktop.UDisks /org/freedesktop/UDisks/devices/${SELECT_USB/*\/}1 \ org.freedesktop.UDisks.Device DeviceMountPaths` if [ ! -d "$MOUNTDIR_EFI" ]; then errorAndExit $"Error: unable to found usb mount path" fi # create EFI grub 32 and 64 bit images mkdir -p $MOUNTDIR_EFI/EFI/BOOT/ grub-mkimage -o $MOUNTDIR_EFI/EFI/BOOT/bootx64.efi -O x86_64-efi -p /efi/boot \ part_gpt part_msdos ntfs ntfscomp hfsplus fat ext2 normal chain boot linux echo \ help gfxterm gettext png efi_gop efi_uga search search_label search_fs_uuid || { errorAndExit $"Error: unable to create GRUB x86_64-efi image" } # 32bit EFI optional because untested and curently missing in x86_64 arch [ -d /usr/lib/grub/i386-efi ] && \ grub-mkimage -o $MOUNTDIR_EFI/EFI/BOOT/bootia32.efi -O i386-efi -p /efi/boot \ part_gpt part_msdos ntfs ntfscomp hfsplus fat ext2 normal chain boot linux echo \ help gfxterm gettext png efi_gop efi_uga search search_label search_fs_uuid || { errorAndExit $"Error: unable to create GRUB i386-efi image" } # Riceve la mountdir della chiavetta da dbus MOUNTDIR=`dbus_properties_get_stringlist org.freedesktop.UDisks /org/freedesktop/UDisks/devices/${SELECT_USB/*\/}2 \ org.freedesktop.UDisks.Device DeviceMountPaths` if [ ! -d "$MOUNTDIR" ]; then errorAndExit $"Error: unable to found usb mount path" fi pushd $MOUNTDIR >/dev/null set_status $"Copying ISO..." echo $"Copying ISO..." # Copy code ORIG_SIZE=`stat -c %s $SELECT_ISO` cp $SELECT_ISO ./ & export CPPID=$! DEST_SIZE=0 DEST_FILE=./"`basename $SELECT_ISO`" ps $CPPID >/dev/null while [ $? -eq 0 ]; do if [ -e $DEST_FILE ]; then DEST_SIZE=$(stat -c %s $DEST_FILE) percentuale=$((30 + ( 50 * $DEST_SIZE ) / $ORIG_SIZE )) set_pbar $percentuale fi sleep 2 ps $CPPID >/dev/null done ln -fs `basename $SELECT_ISO` ./openmamba-live.iso sudo chmod 777 ./ if [ "$SELECT_BOOT" ]; then set_status $"Extracting bootusb archive..." echo $"Extracting bootusb archive..." gunzip -c $SELECT_BOOT | cpio -i if [ ! -d "./boot" ]; then errorAndExit $"Error: Invalid bootusb archive" fi else set_status $"Extracting bootloader data from ISO image..." echo $"Extracting bootloader data from ISO image..." ISOMOUNTDIR=`mktemp -d --suffix=.usbinstall` mount -o loop $SELECT_ISO $ISOMOUNTDIR || { errorAndExit $"Error: unable to mount ISO image" } mkdir boot cp $ISOMOUNTDIR/boot/{initrd*,vmlinuz*} boot/ cp $ISOMOUNTDIR/boot/isolinux/* boot/ mv boot/isolinux.cfg boot/extlinux.conf sed -i "s|root=[^[:space:]]*|root=live:/openmamba_live/openmamba-live.iso|" boot/extlinux.conf cp /usr/share/syslinux/{libcom32,libutil,vesamenu}.c32 boot/ || { errorAndExit $"Error: can't copy some files to /boot directory" } rm -f boot/isolinux* umount $ISOMOUNTDIR rmdir $ISOMOUNTDIR # basic extlinux.conf -> grub.cfg conversion echo "search --no-floppy --label --set=root openmamba_live" > $MOUNTDIR_EFI/EFI/BOOT/grub.cfg while read line; do case $line in "MENU LABEL "*) [ "$CURR_BRACKET_OPEN" = "1" ] && echo "}" >> $MOUNTDIR_EFI/EFI/BOOT/grub.cfg echo "menuentry \"${line/MENU LABEL }\" {" >> $MOUNTDIR_EFI/EFI/BOOT/grub.cfg CURR_BRACKET_OPEN=1 ;; "kernel "*) CURR_KERNEL="${line/kernel }" echo "echo \"Loading ${CURR_KERNEL}\"" >> $MOUNTDIR_EFI/EFI/BOOT/grub.cfg ;; "append "*) set -- ${line/append initrd=} CURR_INITRD="$1" CURR_CMDLINE="${line/append initrd=$CURR_INITRD}" echo "linux ${CURR_KERNEL} ${CURR_CMDLINE}" >> $MOUNTDIR_EFI/EFI/BOOT/grub.cfg echo "echo \"Loading ${CURR_INITRD}\"" >> $MOUNTDIR_EFI/EFI/BOOT/grub.cfg echo "initrd ${CURR_INITRD}" >> $MOUNTDIR_EFI/EFI/BOOT/grub.cfg echo "}" >> $MOUNTDIR_EFI/EFI/BOOT/grub.cfg CURR_BRACKET_OPEN=0 ;; esac done < boot/extlinux.conf [ "$CURR_BRACKET_OPEN" = "1" ] && echo "}" >> $MOUNTDIR_EFI/EFI/BOOT/grub.cfg fi set_pbar 85 set_status $"Writing bootloader..." echo $"Writing bootloader..." sudo extlinux --install boot set_pbar 90 popd >/dev/null sync set_pbar 95 set_status $"Unmount usb device" echo $"Unmount usb device" LANG=C udisks --unmount ${SELECT_USB}1 | grep failed && { errorAndExit $"Error: fail to umount the usb key (${SELECT_USB}1)" } LANG=C udisks --unmount ${SELECT_USB}2 | grep failed && { errorAndExit $"Error: fail to umount the usb key (${SELECT_USB}2)" } # WARNING: calling install-mbr after unmounting to prevent problems of FAT since EFI partition introduction sudo install-mbr $SELECT_USB set_pbar 100 exit_frontend "" echo $"Done!" #################################(INSTALLATION)######################################