From a1910546a68052a1757eeffb62681cf567978f57 Mon Sep 17 00:00:00 2001 From: Kroese Date: Mon, 6 Jul 2026 07:44:41 +0200 Subject: [PATCH] feat: Check file operation results (#1212) --- src/disk.sh | 47 ++++++++++++++++++++++------------------------- src/network.sh | 38 ++++++++++++++++++++++++++++---------- 2 files changed, 50 insertions(+), 35 deletions(-) diff --git a/src/disk.sh b/src/disk.sh index 2a0c6ff..7fefb74 100644 --- a/src/disk.sh +++ b/src/disk.sh @@ -38,15 +38,9 @@ fmt2ext() { local DISK_FMT="$1" case "${DISK_FMT,,}" in - qcow2) - echo "qcow2" - ;; - raw) - echo "img" - ;; - *) - error "Unrecognized disk format: $DISK_FMT" && exit 78 - ;; + qcow2) echo "qcow2" ;; + raw) echo "img" ;; + *) error "Unrecognized disk format: $DISK_FMT" && exit 78 ;; esac } @@ -54,15 +48,9 @@ ext2fmt() { local DISK_EXT="$1" case "${DISK_EXT,,}" in - qcow2) - echo "qcow2" - ;; - img) - echo "raw" - ;; - *) - error "Unrecognized file extension: .$DISK_EXT" && exit 78 - ;; + qcow2) echo "qcow2" ;; + img) echo "raw" ;; + *) error "Unrecognized file extension: .$DISK_EXT" && exit 78 ;; esac } @@ -118,7 +106,7 @@ allocateRaw() { fallocate -l "$DATA_SIZE" "$DISK_FILE" &>/dev/null && return 0 fallocate -l -x "$DATA_SIZE" "$DISK_FILE" && return 0 - truncate -s "$DATA_SIZE" "$DISK_FILE" + truncate -s "$DATA_SIZE" "$DISK_FILE" || return 1 return 0 } @@ -260,7 +248,7 @@ resizeDisk() { local FS="$5" local CUR_SIZE DATA_SIZE DIR SPACE GB - CUR_SIZE=$(getSize "$DISK_FILE") + CUR_SIZE=$(getSize "$DISK_FILE") || exit 71 DATA_SIZE=$(numfmt --from=iec "$DISK_SPACE") local REQ=$(( DATA_SIZE - CUR_SIZE )) (( REQ < 1 )) && error "Shrinking disks is not supported yet, please increase ${DISK_DESC^^}_SIZE." && exit 71 @@ -328,7 +316,7 @@ convertDisk() { local CUR_SIZE SPACE GB # Check free diskspace - CUR_SIZE=$(getSize "$SOURCE_FILE") + CUR_SIZE=$(getSize "$SOURCE_FILE") || exit 79 SPACE=$(df --output=avail -B 1 "$DIR" | tail -n 1) if (( CUR_SIZE > SPACE )); then @@ -371,8 +359,17 @@ convertDisk() { fi fi - rm -f "$SOURCE_FILE" - mv "$TMP_FILE" "$DST_FILE" + if ! rm -f "$SOURCE_FILE"; then + rm -f "$TMP_FILE" + error "Failed to remove old $DISK_DESC image $SOURCE_FILE." + exit 79 + fi + + if ! mv "$TMP_FILE" "$DST_FILE"; then + rm -f "$TMP_FILE" + error "Failed to move converted $DISK_DESC image to $DST_FILE." + exit 79 + fi if isCow "$FS"; then FA=$(lsattr "$DST_FILE") @@ -538,7 +535,7 @@ addDisk () { if [ -s "$DISK_FILE" ]; then - CUR_SIZE=$(getSize "$DISK_FILE") + CUR_SIZE=$(getSize "$DISK_FILE") || exit 71 if (( DATA_SIZE > CUR_SIZE )); then @@ -563,7 +560,7 @@ addDisk () { if [ -f "$DISK_FILE" ] && disabled "$ALLOCATE"; then - CUR_SIZE=$(getSize "$DISK_FILE") + CUR_SIZE=$(getSize "$DISK_FILE") || exit 73 USED=$(du -sB 1 "$DISK_FILE" | cut -f1) FREE=$(df --output=avail -B 1 "$DIR" | tail -n 1) LEFT=$(( CUR_SIZE - USED - FREE )) diff --git a/src/network.sh b/src/network.sh index 1632fab..5906a14 100644 --- a/src/network.sh +++ b/src/network.sh @@ -136,7 +136,10 @@ configureDNS() { local gateway="$6" local arguments="$DNSMASQ_OPTS" - echo "$gateway" > /run/shm/qemu.gw + if ! echo "$gateway" > /run/shm/qemu.gw; then + error "Failed to write gateway file." + return 1 + fi enabled "${DNSMASQ_DISABLE:-}" && return 0 enabled "$DEBUG" && echo "Starting dnsmasq daemon..." @@ -147,8 +150,8 @@ configureDNS() { if isNAT; then # Create lease file for faster resolve - echo "0 $mac $ip $host 01:$mac" > /var/lib/misc/dnsmasq.leases - chmod 644 /var/lib/misc/dnsmasq.leases + echo "0 $mac $ip $host 01:$mac" > /var/lib/misc/dnsmasq.leases || : + chmod 644 /var/lib/misc/dnsmasq.leases || : # dnsmasq configuration: arguments+=" --dhcp-authoritative" @@ -405,14 +408,22 @@ configureSlirp() { [ -n "$forward" ] && NET_OPTS+=",$forward" if enabled "${DNSMASQ_DISABLE:-}"; then - echo "$gateway" > /run/shm/qemu.gw + echo "$gateway" > /run/shm/qemu.gw || warn "Failed to write gateway file." else - [ ! -f /etc/resolv.dnsmasq ] && cp /etc/resolv.conf /etc/resolv.dnsmasq + if [ ! -f /etc/resolv.dnsmasq ] && ! cp /etc/resolv.conf /etc/resolv.dnsmasq; then + error "Failed to backup /etc/resolv.conf." + return 1 + fi + configureDNS "lo" "$ip" "$VM_NET_MAC" "$VM_NET_HOST" "$VM_NET_MASK" "$gateway" || return 1 - printf '%s\n' \ + + if ! printf '%s\n' \ 'nameserver 127.0.0.1' \ 'search .' \ - 'options ndots:0' > /etc/resolv.conf + 'options ndots:0' > /etc/resolv.conf; then + error "Failed to update /etc/resolv.conf." + return 1 + fi fi VM_NET_IP="$ip" @@ -469,11 +480,18 @@ configurePasst() { PASST_OPTS+=" -q" if ! enabled "${DNSMASQ_DISABLE:-}"; then - [ ! -f /etc/resolv.dnsmasq ] && cp /etc/resolv.conf /etc/resolv.dnsmasq - printf '%s\n' \ + if [ ! -f /etc/resolv.dnsmasq ] && ! cp /etc/resolv.conf /etc/resolv.dnsmasq; then + error "Failed to backup /etc/resolv.conf." + return 1 + fi + + if ! printf '%s\n' \ 'nameserver 127.0.0.1' \ 'search .' \ - 'options ndots:0' > /etc/resolv.conf + 'options ndots:0' > /etc/resolv.conf; then + error "Failed to update /etc/resolv.conf." + return 1 + fi fi PASST_OPTS=$(echo "$PASST_OPTS" | sed 's/\t/ /g' | tr -s ' ' | sed 's/^ *//')