#!/bin/bash ### Konstanten ### declare -A GUIDS="" GUIDS=([ESP]="c12a7328-f81f-11d2-ba4b-00a0c93ec93b" [USR]="8484680c-9521-48c6-9c11-b0720656f69e" [USRHASH]="77ff5f63-e7b6-4633-acf4-1565b864c0e6" [ROOT]="4f68bce3-e8cd-4db1-96e7-fbcaf984b709" [SWAP]="0657fd6d-a4ab-43c4-84e5-0933c84b4f4f") ### DEFAULTS ### DEFAULT_DEVICE="/dev/sda" DEFAULT_NAME="ArchOS" DEFAULT_VERSION="0.1" DEFAULT_ESP_SIZE="512M" DEFAULT_ESP_LABEL="EFI System Partition" DEFAULT_SWAP_SIZE="1G" DEFAULT_ROOT_SIZE="5G" DEFAULT_USR_SIZE="10G" DEFAULT_USRHASH_SIZE="1G" ### Helper ### # shellcheck disable=SC2059 # $1 and $2 can contain the printf modifiers out() { printf "$1 $2\n" "${@:3}"; } error() { out "==> ERROR:" "$@"; } >&2 warning() { out "==> WARNING:" "$@"; } >&2 msg() { out "==>" "$@"; } die() { error "${@:2}"; exit "$1"; } ### Funktionen ### help () { echo "Aufruf:" echo " ${0##*/} [Optionen]" echo "" echo "Erstellen eines Systems mit Read-Only /usr-Baum" echo "" echo "Optionen:" echo " -f Partitionen erstellen, auch wenn sie vorhanden sind" echo " -d Dieses Gerät als Basis verwenden [${DEFAULT_DEVICE}]" echo " -v Version des neuen Systemes [${DEFAULT_VERSION}]" echo " -n Name des neuen Systems [${DEFAULT_NAME}]" echo " -r Größe der Root-Partition [${DEFAULT_ROOT_SIZE}]" echo " -s Größe der Swap-Partition [${DEFAULT_SWAP_SIZE}]" echo " -u Größe der Usr-Partition [${DEFAULT_USR_SIZE}]" echo " -h Diese Hilfe anzeigen" echo "" echo "Exit-Code:" echo " 1: Ein Fehler ist aufgetreten" echo " 2: Üngültiges Argument" echo " 3: Gerät existiert nicht" echo " 10: Noch nicht implementiert" echo "" exit 0 } # erase erase () { if [[ "$#" -eq 1 ]]; then echo "dd if=/dev/zero of=$1 status=progress" #dd if=/dev/zero of="$1" status=progress echo "sgdisk -og $1" #sgdisk -og "$1" else die 1 "Kein Gerät zum Löschen angegeben" fi } # create create () { local TYPE="$1" local DEVICE="$2" case ${TYPE} in "USR") echo "sgdisk -n 0:0:+${USR_SIZE} -t 0:${GUIDS[USR]} -c 0:${USR_LABEL} ${DEVICE}" #sgdisk -n 0:0:+"${USR_SIZE}" -t 0:"${GUIDS[USR]}" -c 0:"${USR_LABEL}" "${DEVICE}" ;; "ROOT") echo "sgdisk -n 0:0:+${ROOT_SIZE} -t 0:${GUIDS[ROOT]} -c 0:${ROOT_LABEL} ${DEVICE}" #sgdisk -n 0:0:+"${ROOT_SIZE}" -t 0:"${GUIDS[ROOT]}" -c 0:"${ROOT_LABEL}" "${DEVICE}" ;; "USRHASH") echo "sgdisk -n 0:0:+${USRHASH_SIZE} -t 0:${GUIDS[USRHASH]} -c 0:${USRHASH_LABEL} ${DEVICE}" #sgdisk -n 0:0:+"${USRHASH_SIZE}" -t 0:"${GUIDS[USRHASH]}" -c 0:"${USRHASH_LABEL}" "${DEVICE}" ;; "ESP") echo "sgdisk -n 0:0:+${ESP_SIZE} -t 0:${GUIDS[ESP]} -c 0:${ESP_LABEL} ${DEVICE}" #sgdisk -n 0:0:+"${ESP_SIZE}" -t 0:"${GUIDS[ESP]}" -c 0:"${ESP_LABEL}" "${DEVICE}" ;; "SWAP") echo "sgdisk -n 0:0:+${SWAP_SIZE} -t 0:${GUIDS[SWAP]} -c 0:${SWAP_LABEL} ${DEVICE}" #sgdisk -n 0:0:+"${SWAP_SIZE}" -t 0:"${GUIDS[SWAP]}" -c 0:"${SWAP_LABEL}" "${DEVICE}" ;; "TABLE") echo "sgdisk -og ${DEVICE}" #sgdisk -og "${DEVICE}" ;; *) die 1 "Unbekannte Partition zum Erstellen angegeben" ;; esac } # existing_partitions [] existing_partitions () { local DEVICE="$1" local TYPE="$2" if [[ $# -eq 1 ]] # Genereller test auf Partitionen then ANZAHL_PARTITIONEN_VORHANDEN=$(lsblk -pl "${DEVICE}" | grep -ic "${DEVICE}[0-9]") if [[ ${ANZAHL_PARTITIONEN_VORHANDEN} != 0 ]] then echo "yes" # Partitionen vorhanden else echo "no" # Partitionen nicht vorhanden fi elif [[ $# -eq 2 ]] # Test auf eine bestimmte Partition then local PARTUUID="${GUIDS[${TYPE}]}" # Hier ist ein Problem echo "PARTUUID: ${PARTUUID}" >> temp.log SPEZIFISCHE_PARTITION_VORHANDEN=$(lsblk -o PARTTYPE "${DEVICE}" | grep -ic "${PARTUUID}") if [[ "${SPEZIFISCHE_PARTITION_VORHANDEN}" == 1 ]] then echo "yes" # bestimmte Partition vorhanden else echo "no" # bestimmte Partition nicht vorhanden fi else die 1 "Kein Gerät zur Prüfung auf Partitionen angegeben" fi } # find_uuid_for_partition find_uuid_for_partition () { local DEVICE="$1" local TYPE="$2" if [[ "$(existing_partitions "${DEVICE}" "${TYPE}")" == "yes" ]] then uuid=$(lsblk -lo PARTTYPE,PARTUUID "${DEVICE}" | grep "${GUIDS[${TYPE}]}" | awk '{ print $2 }') echo "${uuid}" else echo "null" fi } # partitions_analyse partitions_analyse () { local DEVICE="$1" local RESULT="" declare -i index="" index=0 for type in "${!GUIDS[@]}" do index+=1 uuid=$(find_uuid_for_partition "${DEVICE}" "${type}") RESULT+="${type}=${uuid}" if [[ "$index" != "${#GUIDS[@]}" ]] then RESULT+=" " fi done echo "${RESULT}" } # print print () { local ANALYSE_STRING="$1" # TYPE=([a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}) TYPE=null echo "Typ UUID Geräte-Pfad" | awk '{ printf "| %-10s| %-40s| %-20s|\n", $1, $2, $3 }' awk 'BEGIN { for(f=1; f<= 77; f++) { if( f==1 || f==13 || f==55 || f==77) { printf "|" } else { printf "-" } } printf "\n" }' until [[ "${ANALYSE_STRING}" == "" ]] do local CURRENT_RESULT=$(echo "${ANALYSE_STRING}" | awk '{ print $1 }') local CURRENT_TYPE=$(echo "${CURRENT_RESULT}" | awk 'BEGIN { FS="=" } { print $1 }') local CURRENT_UUID=$(echo "${CURRENT_RESULT}" | awk 'BEGIN { FS="=" } { print $2 }') local CURRENT_PATH=$(lsblk -plo NAME /dev/disk/by-partuuid/"${CURRENT_UUID}" 2> /dev/null | tail -n +2) local CURRENT_REST=${ANALYSE_STRING//${CURRENT_RESULT}} CURRENT_REST=${CURRENT_REST# } echo "${CURRENT_TYPE} ${CURRENT_UUID} ${CURRENT_PATH}" | awk '{ printf "| %-10s| %-40s| %-20s|\n" , $1, $2 , $3 }' ANALYSE_STRING="${CURRENT_REST# }" done echo "" } # print_todo print_todo () { local DEVICE="$1" local ANALYSE_STRING="$2" echo "Bitte Partitionen mit dem folgenden Eigenschaften anlegen:" echo "" echo "Typ Partiton-UUID Label Size" | awk '{ printf "| %-10s| %-40s| %-20s| %-5s|\n", $1, $2, $3, $4 }' awk 'BEGIN { for(f=1; f<= 84; f++) { if( f==1 || f==13 || f==55 || f==77 || f==84) { printf "|" } else { printf "-" } } printf "\n" }' until [[ "${ANALYSE_STRING}" == "" ]] do local CURRENT_RESULT=$(echo "${ANALYSE_STRING}" | awk '{ print $1}') local CURRENT_TYPE=$(echo "${CURRENT_RESULT}" | awk 'BEGIN { FS="=" } { print $1 }') local CURRENT_UUID=$(echo "${CURRENT_RESULT}" | awk 'BEGIN { FS="=" } { print $2 }') if [[ "${CURRENT_UUID}" == "null" ]] then CURRENT_UUID="${GUIDS[${CURRENT_TYPE}]}" case ${CURRENT_TYPE} in "USR") CURRENT_LABEL="${USR_LABEL}" CURRENT_SIZE="${USR_SIZE}" ;; "USRHASH") CURRENT_LABEL="${USRHASH_LABEL}" CURRENT_SIZE="${USRHASH_SIZE}" ;; "ROOT") CURRENT_LABEL="${ROOT_LABEL}" CURRENT_SIZE="${ROOT_SIZE}" ;; "SWAP") CURRENT_LABEL="${SWAP_LABEL}" CURRENT_SIZE="${SWAP_SIZE}" ;; "ESP") CURRENT_LABEL="${ESP_LABEL}" CURRENT_SIZE="${ESP_SIZE}" ;; *) die 1 "Unbekannter Partitionstyp" ;; esac echo "${CURRENT_TYPE}=${CURRENT_UUID}=${CURRENT_LABEL}=${CURRENT_SIZE}" | awk 'BEGIN { FS="=" } { printf "| %-10s| %-40s| %-20s| %-5s|\n", $1, $2, $3, $4 }' fi local CURRENT_REST=${ANALYSE_STRING//${CURRENT_RESULT}} ANALYSE_STRING="${CURRENT_REST# }" done echo "" echo -e "z.B. mit dem Kommando:\n# gdisk -n 0:0:+ -t 0: -c 0: