#!/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-2010 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 if [ -f "$2" ]; then # Check if is a file if [ -r "$2" ]; then # Chek is is readable export SELECT_BOOT=$2 else errorAndExit $"Error(Arg 2): \"$2\" is not readable" 1 fi else errorAndExit $"Error(Arg 2): \"$2\" isn't a regular file" 1 fi # 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 # Check if Arg 3 is valid if [ -f "$3" ]; then # Check if is a file if [ -r "$3" ]; then # Chek is is readable SELECT_ISO=`readlink -f $3` else errorAndExit "Error(Arg 3): \"$3\" is not readable" 1 fi else errorAndExit "Error(Arg 3): \"$3\" isn't a regular file" 1 fi # Check if Arg 3 is an iso file if [ "${3##*.}" != "iso" ]; then errorAndExit "Error(Arg 3): you must chose a iso file" 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 -- $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 -- $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}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=`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 set_status $"Extracting bootusb archive..." echo $"Extracting bootusb archive..." pushd $MOUNTDIR >/dev/null sudo chmod 777 ./ gunzip -c $SELECT_BOOT | cpio -i if [ ! -d "./boot" ]; then errorAndExit $"Error: Invalid bootusb archive" fi set_pbar 38 set_status $"Writing bootloader..." echo $"Writing bootloader..." sudo extlinux --install boot sudo install-mbr -e 1 $SELECT_USB set_pbar 45 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=$((45 + ( 50 * $DEST_SIZE ) / $ORIG_SIZE )) set_pbar $percentuale fi sleep 2 ps $CPPID >/dev/null done ln -fs `basename $SELECT_ISO` ./openmamba-live.iso popd >/dev/null sync set_pbar 98 set_status $"Unmount usb device" echo $"Unmount usb device" LANG=C udisks --unmount ${SELECT_USB}2 | grep failed && { errorAndExit $"Error: fail to umount the usb key (${SELECT_USB}2)" } set_pbar 100 exit_frontend "" echo $"Done!" #################################(INSTALLATION)######################################