#!/bin/bash #usbinstall.sh # Arg 1: usb device for installation # Arg 2: iso file # Arg 3: option #~ # 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-2014 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 # 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 if [ "${SELECT_USB1}" ]; then udisksctl unmount -b ${SELECT_USB1} >/dev/null fi if [ "${SELECT_USB2}" ]; then udisksctl unmount -b ${SELECT_USB2} >/dev/null fi if [ "${SELECT_USB3}" ]; then udisksctl unmount -b ${SELECT_USB3} >/dev/null 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: ISO file (e.g. ~/openmamba-livecd-it-milestone2-2.0pre8.i586.iso)" echo -e "\t"$"Arg 3: "$"-d: pass message through dbus (when invoked by GUI)" echo -e "\t "$"-y: install without asking confirmation [Be careful!]" } #=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~ #--------------------------------(INITIAL-CHECK)------------------------------------- #=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~ # Confirm if [ "$3" = "-y" ]; then CONFIRM=0 elif [ "$3" = "-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=`udisksctl info -b $1 | grep HintSystem | sed "s|.*[[:space:]]||"` if [ "$ISKEY" = "true" -o "$CONFIRM" = "0" ]; 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 if [ "${SELECT_USB:0:9}" = "/dev/loop" ]; then SELECT_USB1=${SELECT_USB}p1 SELECT_USB2=${SELECT_USB}p2 SELECT_USB3=${SELECT_USB}p3 else SELECT_USB1=${SELECT_USB}1 SELECT_USB2=${SELECT_USB}2 SELECT_USB3=${SELECT_USB}3 fi # Check if Arg 2 is valid if [ -r "$2" ]; then # Check it is readable # Check if Arg 2 is an iso file if [ "${2##*.}" != "iso" ]; then errorAndExit "Error(Arg 2): you must chose a ISO (.iso) file" 1 fi SELECT_ISO=`readlink -f $2` else errorAndExit "Error(Arg 2): \"$2\" is not readable" 1 fi # Check if Arg 3 is valid if [ "$3" ]; then if [ "$3" != "-d" -a "$3" != "-y" ]; then # Check it is readable errorAndExit $"Error(Arg 3): \"$3\" is not -d nor -y" 1 fi 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" DEVICEMOUNTPOINTS=`udisksctl info -b ${SELECT_USB2} | grep MountPoints: | sed "s|.*[[:space:]]||"` if [ "$DEVICEMOUNTPOINTS" ]; then LANG=C udiskctl unmount -b ${SELECT_USB2} || { errorAndExit $"Error: fail to umount the usb key (${SELECT_USB2})" } 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 hfs+ 0 20M &>>$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 20M 40M &>>$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 40M -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 3 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.hfsplus ${SELECT_USB1} -v EFI_MAC &>>$LOGFILE if [ "$?" != "0" ]; then errorAndExit $"Error:"" \"mkfs.hfsplus\" "$"exit with error (see $LOGFILE)" fi sudo mkfs.vfat ${SELECT_USB2} -n EFI &>>$LOGFILE if [ "$?" != "0" ]; then errorAndExit $"Error:"" \"mkfs.vfat\" "$"exit with error (see $LOGFILE)" fi sudo mkfs.ext4 ${SELECT_USB3} -L openmamba_live &>>$LOGFILE if [ "$?" != "0" ]; then errorAndExit $"Error:"" \"mkfs.ext4\" "$"exit with error (see $LOGFILE)" fi sleep 1 LANG=C udisksctl mount -b ${SELECT_USB1} &>>$LOGFILE if [ "$?" != "0" ]; then errorAndExit $"Error:"" \"udisks --mount\" "$"exit with error (see $LOGFILE)" fi LANG=C udisksctl mount -b ${SELECT_USB2} &>>$LOGFILE if [ "$?" != "0" ]; then errorAndExit $"Error:"" \"udisks --mount\" "$"exit with error (see $LOGFILE)" fi LANG=C udisksctl mount -b ${SELECT_USB3} &>>$LOGFILE if [ "$?" != "0" ]; then errorAndExit $"Error:"" \"udisks --mount\" "$"exit with error (see $LOGFILE)" fi set_pbar 30 MOUNTDIR_EFI_MAC=`udisksctl info -b ${SELECT_USB1} | grep -m1 MountPoints: | sed "s|.*[[:space:]]||"` if [ ! -d "$MOUNTDIR_EFI_MAC" ]; then errorAndExit $"Error: unable to found usb mount path" fi MOUNTDIR_EFI=`udisksctl info -b ${SELECT_USB2} | grep -m1 MountPoints: | sed "s|.*[[:space:]]||"` 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 if [ -d /usr/lib/grub/i386-efi ]; then 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" } fi MOUNTDIR=`udisksctl info -b ${SELECT_USB3} | grep -m1 MountPoints: | sed "s|.*[[:space:]]||"` 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 for f in /usr/share/syslinux/{libcom32,libutil,vesamenu}.c32; do if [ -r $f ]; then cp $f boot/ || errorAndExit $"Error: can't copy bootloader file(s) to /boot directory" fi done 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 cp -a $MOUNTDIR_EFI/EFI $MOUNTDIR_EFI_MAC TARGET_ARCH=`cat $MOUNTDIR/etc/openmamba-release | sed "s|.*for \(.*\) .*|\1|"` [ "$TARGET_ARCH" ] || ARCH=i586 if [ "$TARGET_ARCH" = "x86_64" ]; then hfs-bless $MOUNTDIR_EFI_MAC/EFI/BOOT/bootia32.efi else hfs-bless $MOUNTDIR_EFI_MAC/EFI/BOOT/bootx64.efi fi 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 udisksctl unmount -b ${SELECT_USB1} || { errorAndExit $"Error: fail to umount the usb key (${SELECT_USB1})" } LANG=C udisksctl unmount -b ${SELECT_USB2} || { errorAndExit $"Error: fail to umount the usb key (${SELECT_USB2})" } LANG=C udisksctl unmount -b ${SELECT_USB3} || { errorAndExit $"Error: fail to umount the usb key (${SELECT_USB3})" } # 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)######################################