#!/bin/bash

# author : Nicolas Chipaux <aegiap@gandi.net> for GANDI
# all rights reserved.

set -o pipefail

if [ -z "$SYSLOG_TARGET" ]; then
    SYSLOG_TARGET='gandi'
fi

# If the last partition of the GPT disk has label gandiroot, resize it.
disk=/dev/xvda
if which sgdisk >/dev/null && [ -b "$disk" ]; then
    disk_layout=$(sgdisk -p "$disk")
    if [ $? -eq 0 ] && ! echo "${disk_layout}" | grep -qF 'Found invalid GPT'; then
        # Disk is GPT
        if sgdisk -v "$disk" | grep -qF 'secondary header'; then
            # Disk has been extended
            tmpfile=$(mktemp)
            part_id=$(sgdisk -p "$disk" | tail -n1 | sed 's/^ *\([0-9]*\) .*$/\1/')
            sgdisk -i "$part_id" "$disk" >"$tmpfile"
            part_begin=$(sed -n 's/^First sector: \([0-9]*\) .*$/\1/p' "$tmpfile")
            part_attributes=$(sed -n 's/^Attribute flags: \([0-9A-F]*\)$/\1/p' "$tmpfile")
            part_guid_code=$(sed -n 's/^Partition GUID code: \([0-9A-F-]*\) .*$/\1/p' "$tmpfile")
            part_unique_guid=$(sed -n 's/^Partition unique GUID: \([0-9A-F-]*\)$/\1/p' "$tmpfile")
            part_name=$(sed -n "s/^Partition name: '\\(.*\\)'$/\\1/p" "$tmpfile")
            if [ "$part_name" = 'gandiroot' ]; then
                if ! sgdisk --move-second-header \
                        --delete "$part_id" \
                        --new="${part_id}:${part_begin}:0" \
                        --attributes="${part_id}:=:${part_attributes}" \
                        --change-name="${part_id}:${part_name}" \
                        --partition-guid="${part_id}:${part_unique_guid}" \
                        --typecode="${part_id}:${part_guid_code}" \
                        "$disk" 2>&1 | logger -t "$SYSLOG_TARGET"; then
                    err_code="$?"
                    msg="Error resizing partition ${part_id} of GPT disk ${disk}, return: ${err_code}"
                    logger -t "$SYSLOG_TARGET" "$msg"
                    exit "$err_code"
                fi
            fi
            rm "$tmpfile"
        fi
        # Reset all GUIDs if disk GUID is null (on first boot)
        disk_guid=$(sgdisk -p "$disk" | sed -n 's/^Disk identifier (GUID): \([0-9A-F-]*\)$/\1/p')
        if [ "$disk_guid" = '00000000-0000-0000-0000-000000000000' ]; then
            if ! sgdisk --randomize-guids "$disk" 2>&1 | logger -t "$SYSLOG_TARGET"; then
                err_code="$?"
                msg="Error randomizing GPT UIDs on disk ${disk}, return: ${err_code}"
                logger -t "$SYSLOG_TARGET" "$msg"
                exit "$err_code"
            fi
        fi
        # Inform kernel of partition changes.
        if ! partx --update "$disk" 2>&1 | logger -t "$SYSLOG_TARGET"; then
            err_code="$?"
            msg="Error updating in-kernel partition layout for disk ${disk}, return: ${err_code}"
            logger -t "$SYSLOG_TARGET" "$msg"
            exit "$err_code"
        fi

        # ensure /dev/disk/ links are correctly set for disk
        if command -v udevadm &> /dev/null; then
            udevadm trigger "${disk}" 2>&1 | logger -t "$SYSLOG_TARGET"
            udevadm settle 2>&1 | logger -t "$SYSLOG_TARGET"
        elif command -v udevtrigger &> /dev/null; then
            udevtrigger 2>&1 | logger -t "$SYSLOG_TARGET"
            udevsettle 2>&1 | logger -t "$SYSLOG_TARGET"
        fi
    fi
fi

device=/dev/xvda1
if [ -b /dev/disk/by-partlabel/gandiroot ]; then
    device=/dev/disk/by-partlabel/gandiroot
elif [ ! -d /proc/xen ]; then
    device=/dev/sda
fi

if [ -e $device ]; then
    type=$(blkid -s TYPE -o value "$device")

    if [ $(expr match "$type" 'ext') -ge 3 ]; then
        resize2fs=$(which resize2fs)
        if [ -x "$resize2fs" ]; then
            if ! $resize2fs "$device" 2>&1 | logger -t "$SYSLOG_TARGET"; then
                err_code="$?"
                msg="Error resizing ext disk ${device}, return: ${err_code}"
                logger -t "$SYSLOG_TARGET" "$msg"
                exit "${err_code}"
            fi
        fi
    fi

    if [ $(expr match "$type" 'xfs') -ge 3 ]; then
        xfscmd=$(which xfs_growfs)
        if [ -x "$xfscmd" ]; then
            if ! $xfscmd "$device" 2>&1 | logger -t "$SYSLOG_TARGET"; then
                err_code="$?"
                msg="Error resizing XFS disk ${device}, return: ${err_code}"
                logger -t "$SYSLOG_TARGET" "$msg"
                exit "$err_code"
            fi
        fi
    fi
fi

exit 0
