# $Id$ adjust_column() { local maxlen="$1" local var="$2" local len local space local i # get len of var len="${#var}" for ((i=len; i < maxlen; i++)) do space+=" " done echo "${var}${space}" } get_list() { :> ${mylist} # print dialog setup echo "--extra-button --extra-label Done --ok-label Edit --colors \\" >> ${mylist} # highlite echo "--default-item \"${highlite}\" \\" >> ${mylist} echo "--menu \"Select a disk or partition:\" \\" >> ${mylist} echo "30 70 25 \\" >> ${mylist} # print header echo "\"$(adjust_column 5 disk) $(adjust_column 10 partition)\" \"\Zb\Z4$(adjust_column 11 size) $(adjust_column 8 fstype) $(adjust_column 4 flag) \Zb\Z6$(adjust_column 10 mountpoint) \Zb\Z6$(adjust_column 8 format)\"" >> ${mylist} echo "\"\" \"\"" >> ${mylist} OLDIFS="${IFS}" IFS="|" declare -i count=0 while read disk partition size fstype boot mount format do # line is a disk if [[ ${disk} = ${partition} ]] then if [[ ${count} -gt 0 ]] then echo "\"\" \"\" ${off}" >> ${mylist} fi echo "\"${disk}\" \"\Zb\Z3[setup partition table]\"" >> ${mylist} # line is a partition else echo "\"$(adjust_column 5 "") $(adjust_column 10 ${partition})\" \"$(adjust_column 11 ${size}) $(adjust_column 8 ${fstype}) $(adjust_column 4 ${boot}) \Zb\Z6$(adjust_column 10 ${mount}) \Zb\Z6$(adjust_column 8 ${format})\"" >> ${mylist} fi ((count++)) done << EOF $(include/read_disk.sh) EOF IFS="${OLDIFS}" } partition_drive_list() { local mylist=$(mktemp) local retval # get partition list and write dialog file get_list # show dialog dialog --stdout --file ${mylist} retval="$?" # remove temp files rm ${mylist} return ${retval} } setup_partition_filesystem() { dialog \ --stdout \ --colors \ --title "${SELECTED_DISK}" \ --backtitle "${TITLE}" \ --ok-label "Next" \ --menu "Select a filesystem:" 20 40 10 \ "keep-as-is" "" \ "ext2" "" \ "ext3" "" \ "reiserfs" "" \ "swap" "" } setup_partition_mountpoint() { dialog \ --stdout \ --colors \ --title "${SELECTED_DISK}" \ --backtitle "${TITLE}" \ --ok-label "Next" \ --menu "Select a mountpoint:" 20 40 10 \ "/" "" \ "/boot" "" \ "/home" "" \ "/tmp" "" \ "/usr" "" \ "/var" "" \ "/svr" "" \ "/opt" "" } setup_partition() { FILESYSTEM="$(setup_partition_filesystem)" case $? in -1) die "Error!" ;; 255) die "aborted by user" ;; 1) partition_drive_list # aborted, delete settings for sure FILESYSTEM="" ;; 0) if [[ ${FILESYSTEM} = swap ]] then MOUNTPOINT="swap" else MOUNTPOINT="$(setup_partition_mountpoint)" case $? in -1) die "Error!" ;; 255) die "aborted by user" ;; 1) partition_drive_list # aborted, delete settings for sure MOUNTPOINT="" ;; 0) true ;; esac fi ;; esac export FILESYSTEM export MOUNTPOINT } query_partition_disk_setup() { local i local partition local filesystem local mountpoint local command="$1" local given_partition="$2" # #--overwrite for i in ${PARTITION_DISK_SETUP} do partition=$(echo ${i} | cut -d: -f1) filesystem=$(echo ${i} | cut -d: -f2) mountpoint=$(echo ${i} | cut -d: -f3) if [[ ${partition} = ${given_partition} ]] then case ${command} in --filesystem) echo "${filesystem}"; return 0;; --mountpoint) echo "${mountpoint}"; return 0;; --delete) export PARTITION_DISK_SETUP="${PARTITION_DISK_SETUP/${i}/}"; return 0;; esac fi done } edit_disk_or_partition() { if [[ ! -z ${SELECTED_DISK} ]] then ${sudo} cfdisk ${SELECTED_DISK} rundialog_partition_drive_list else rundialog_setup_partition fi } rundialog_partition_drive_list() { local retval SELECTED_DISK=$(partition_drive_list) retval=$? # highlite the current item highlite="${SELECTED_DISK}" # fix partitions, remove trailing empty spaces SELECTED_DISK="$(trim ${SELECTED_DISK})" # save given variables in env # they will be shown as default on error export SELECTED_DISK export PARTITION_DISK_SETUP # convert to some useable vars local disk local mount local fs for disk in ${PARTITION_DISK_SETUP} do disk="$(echo ${disk} | cut -d: -f1)" mount=$(query_partition_disk_setup --mountpoint ${disk}) fs=$(query_partition_disk_setup --filesystem ${disk}) case ${mount} in /) export PARTITION_DISK_ROOT="${disk}" export PARTITION_FS_ROOT="${fs}" ;; /boot) export PARTITION_DISK_BOOT="${disk}" export PARTITION_FS_BOOT="${fs}" ;; /home) export PARTITION_DISK_HOME="${disk}" export PARTITION_FS_HOME="${fs}" ;; /tmp) export PARTITION_DISK_TMP="${disk}" export PARTITION_FS_TMP="${fs}" ;; /usr) export PARTITION_DISK_USER="${disk}" export PARTITION_FS_USER="${fs}" ;; /var) export PARTITION_DISK_VAR="${disk}" export PARTITION_FS_VAR="${fs}" ;; /svr) export PARTITION_DISK_SVR="${disk}" export PARTITION_FS_SVR="${fs}" ;; /opt) export PARTITION_DISK_OPT="${disk}" export PARTITION_FS_OPT="${fs}" ;; swap) export PARTITION_DISK_SWAP="${disk}" export PARTITION_FS_SWAP="swap" ;; esac done case ${retval} in -1) die "Error!" ;; 255) die "aborted by user" ;; 1) partition_drive_list ;; 3) if [[ -z ${PARTITION_DISK_ROOT} ]] || [[ -z ${PARTITION_DISK_SWAP} ]] then messagebox "Warning" "You must at least select root (/) and a swap (SWAP) partition!" 10 40 rundialog_partition_drive_list fi ;; 0) # do nothing if header or emptylines where selected if [[ -z ${SELECTED_DISK} ]] || [[ ${SELECTED_DISK} = disk* ]] then rundialog_partition_drive_list # a partition without a number must be the disk elif [[ ${SELECTED_DISK/[0-9]/} = ${SELECTED_DISK} ]] then ${sudo} cfdisk ${SELECTED_DISK} rundialog_partition_drive_list else rundialog_setup_partition fi ;; esac debug "SELECTED_DISK='${SELECTED_DISK}'" } rundialog_setup_partition() { setup_partition # delete stanza query_partition_disk_setup --delete "${SELECTED_DISK}" # set the new export PARTITION_DISK_SETUP="${PARTITION_DISK_SETUP} ${SELECTED_DISK}:${FILESYSTEM}:${MOUNTPOINT}" rundialog_partition_drive_list } main_diskpartition() { rundialog_partition_drive_list }