# -*-Shell-script-*-

LF=$'\n'
SEP=','
TAB=$'\t'

# compat function to handle different udev versions
udev_info() {
    local name=$1
    local query=$2
    local options=$3
    local out

    out=$(udevadm info --name=$name --query=$query $options)
    rc=$?
    if [ $rc -eq 0 ]; then
        echo $out
    fi
    return $rc
}



# $(get_live_disk)
# livecd boot disk
get_live_disk() {
    local live_dev=$(grep /dev/.initramfs/live /proc/mounts | awk '{print $1}')
    if [ ! -e $live_dev ]; then
      # PXE boot
      live_dev=/dev/loop0
      live_disk=
    else
      live_part=$(readlink -e $live_dev)
      live_disk=$(basename $(dirname $(udev_info $live_part path)))
      if [ "$live_disk" = "block" ]; then
          live_disk=$(basename $(udev_info $live_part path))
      fi
    fi
    echo $live_disk
}

# find_disk $bus $serial
find_disk() {
    local bus=$1
    local serial=$2
    local live=$(get_live_disk)
    local found=
    # in initramfs, shell does not expand
    # /dev/disk/by-id/{ata,cciss,scsi,usb}* correctly,
    # so manually enumerate them
    for d in $(ls /dev/disk/by-id/$bus* 2>/dev/null); do
        DEVTYPE=
        eval $(udev_info $(readlink -f $d) property "--export")
        # ID_FS_USAGE is set for partitions
        if [ "$DEVTYPE" = "disk" -a "$ID_BUS" = "$bus" ]; then
            if [ -z "$serial" -o "$serial" = "ALL" \
                -o "$ID_SERIAL" = "$serial" ]; then
                local dev="$(readlink -e $d)"
                if [ -n "$live" -a  "$dev" = "/dev/$live" ]; then
                # cannot install LiveOS over itself
                    continue
                elif [ "$serial" = "ALL" ]; then
                    if [ "$found" ]; then
                        echo -n "${SEP}"
                    fi
                    echo -n "$dev"
                    found="yes"
                    continue
                else
                    echo -n "$dev"
                    found="yes"
                    break
                fi
            fi
        fi
    done
    if [ "$found" ]; then
      echo
      return 0
    else
       return 1
    fi
}

# parse_disk_id DISK_ID
#   DISK_ID=[ata|cciss|scsi|usb[:serial#]|/dev/...]
# ata|cciss|scsi|usb - select disk bus, as reported by udev ID_BUS
# serial# - select exact disk using serial number, as reported by
#           udev ID_SERIAL
# e.g. storage_init=usb:Generic_STORAGE_DEVICE_0000145418-0:0
#           ALL selects all the disks on the specified bus
# e.g. storage_init=ata:ALL
#
# /dev/... - use specified disk device
#            (for cases when HAL doesn't handle it)
parse_disk_id() {
    local i="$1"
    local disk=
    local bus=
    local serial=
    case "$i" in
        ata*)
            bus=ata
            i=${i#ata}
            serial=${i#:}
        ;;
        scsi*)
            bus=scsi
            i=${i#scsi}
            serial=${i#:}
        ;;
        usb*)
            bus=usb
            i=${i#usb}
            serial=${i#:}
        ;;
        cciss*)
            bus=cciss
            i=${i#cciss}
            serial=${i#:}
        ;;
        /dev/*)
            # iscsi disk won't be present until later in the boot
            iscsi_install=$(grep -q iscsi_install /proc/cmdline)
            rc=$?
            if [ $rc -eq 0 ]; then
                disk=$i
            else
                disk="$(ls -1 $i 2>/dev/null | head -n1)"
            fi
        ;;
    esac
    if [ -n "$bus" ]; then
        disk=$(find_disk $bus $serial)
    fi
    echo "$disk"
}

lvm_name_for()
{
    # A small hack to get the devname used by lvm for a given device
    DEVICE="$1"
    LVM2_VARS=$(lvm pvs --noheadings --nameprefixes --unquoted -o pv_name,vg_name "$DEVICE" 2> /dev/null)
    if [ -n "$LVM2_VARS" ]; then
        export $LVM2_VARS
        echo $LVM2_PV_NAME
    fi
}

# execute a function if called as a script, e.g.
#   ovirt-boot-functions ovirt_store_config /etc/hosts

if [ "$(basename -- "$0")" = "ovirt-boot-functions" ]; then
    "$@"
fi
