#!/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 #=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~ #-------------------------------------(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 "\tUsage: sudo usbinstall Arg1 Arg2 Arg3 [-y]" echo -e "\tArg 1: Usb device path (e.g. /dev/sdc)" echo -e "\tArg 2: Cpio.gz file (e.g. ~/openmamba-bootusb-it-milestone2-2.0pre8.i586.cpio.gz)" echo -e "\tArg 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 usb key ($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=$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 "Smonto la chiavetta" 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) ;; *) errorAndExit "Installation aborted" ;; esac fi set_status "Partizionamento della chiavetta in corso..." echo "Partitioning $SELECT_USB..." sudo fdisk $SELECT_USB < /usr/share/openmamba/usbinstall/fdisk_template &>$LOGFILE if [ "$?" != "0" ]; then errorAndExit "Error: \"fdisk\" exit with error (see $LOGFILE)" fi set_pbar 5 set_status "Formattazione della chiavetta in corso..." echo "Formatting..." sudo mkfs.ext3 ${SELECT_USB}1 -L openmamba_live &>>$LOGFILE if [ "$?" != "0" ]; then errorAndExit "Error: \"mkfs.ext3\" 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 set_pbar 30 # Riceve la mountdir della chiavetta da dbus MOUNTDIR=`dbus_properties_get_stringlist org.freedesktop.UDisks /org/freedesktop/UDisks/devices/${SELECT_USB/*\/}1 \ org.freedesktop.UDisks.Device DeviceMountPaths` if [ ! -d "$MOUNTDIR" ]; then errorAndExit "Error: unable to find usb mount path" fi set_status "Estrazione del file di boot in corso..." 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 "Scrittura del bootloader in corso..." sudo extlinux --install boot sudo install-mbr -e 1 $SELECT_USB set_pbar 45 set_status "Copia del file iso di openmamba in corso..." 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`" CPSTATE=`ps $CPPID | grep "cp"` while [ "$CPSTATE" != "" ]; 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 CPSTATE=`ps $CPPID | grep "cp"` done ln -fs `basename $SELECT_ISO` ./openmamba-live.iso popd >/dev/null set_pbar 98 set_status "Smonto la chiavetta" LANG=C udisks --unmount ${SELECT_USB}1 | grep failed && { errorAndExit "Error: fail to umount the usb key (${SELECT_USB}1)" } set_pbar 100 exit_frontend "" echo "Done." #################################(INSTALLATION)######################################