#!/bin/sh

INSTALLERNAME="ueyesetup"
COMPANYNAME="ids"
PRODUCTNAME="ueye"
REPORTFILE="/tmp/${COMPANYNAME}_${PRODUCTNAME}_${INSTALLERNAME}_$(date +"%Y%m%d_%H%M%S")_$$.log"
DRIVERUSBDCONF="/etc/${COMPANYNAME}/${PRODUCTNAME}/${PRODUCTNAME}usbd.conf"
DRIVERETHDCONF="/etc/${COMPANYNAME}/${PRODUCTNAME}/${PRODUCTNAME}ethd.conf"
DRIVERAPIMACHINECONF="/etc/${COMPANYNAME}/${PRODUCTNAME}/${PRODUCTNAME}apimachine.conf"
DRIVERFIRMWAREDIR="/opt/${COMPANYNAME}/${PRODUCTNAME}/firmware"



usage()
{
    echo "Usage: $0 -v usb|eth|machine [-o <outfile>] [-r <reportfile>]" 1>&2
    exit 1
}

VARIANT=""
OUTFILE=""
while getopts ":v:o:r:" o; do
    case "${o}" in
        v)
            VARIANT=$OPTARG
            if [ "${VARIANT}" = "usb" ]; then
                echo -n
            elif [ "${VARIANT}" = "eth" ]; then
                echo -n
            elif [ "${VARIANT}" = "machine" ]; then
                echo -n
            else
                usage
            fi
            ;;
        o)
            OUTFILE="$OPTARG"
            ;;
        r)
            REPORTFILE="$OPTARG"
            ;;
        *)
            usage
            ;;
    esac
done
shift $((OPTIND-1))

if [ -z "${VARIANT}" ]; then
    usage
fi

if [ "$(id -u)" != "0" ]; then
    echo "This must be run as root." 1>&2
    exit 1
fi



create_usb()
{
    echo ">>> create ${PRODUCTNAME}usbd config" >> "$REPORTFILE" 2>&1

    touch "$OUTFILE" >> "$REPORTFILE" 2>&1
    echo -n > "$OUTFILE"
    echo "; ${PRODUCTNAME}usbd configuration file" >> "$OUTFILE"
    echo "; autogenerated by ${INSTALLERNAME} installer on $(date)" >> "$OUTFILE"
    echo "" >> "$OUTFILE"
    echo "[Parameters]" >> "$OUTFILE"
    echo "Usb2FirmwarePath = ${DRIVERFIRMWAREDIR}/usb2/" >> "$OUTFILE"
    echo "Usb2AddonPath = ${DRIVERFIRMWAREDIR}/usb2_addon/" >> "$OUTFILE"
    echo "Usb3FirmwarePath = ${DRIVERFIRMWAREDIR}/usb3/" >> "$OUTFILE"
    echo "Usb3AddonPath = ${DRIVERFIRMWAREDIR}/usb3_addon/" >> "$OUTFILE"
    echo "" >> "$OUTFILE"
}



create_eth()
{
    echo ">>> create ${PRODUCTNAME}ethd config" >> "$REPORTFILE" 2>&1

    all_interfaces=$(ls -C /sys/class/net | sort)
    interfaces=""
    for INTERFACE in $all_interfaces; do
        current_interface=$INTERFACE

        # loopback devices
        current_interface=$(echo "${current_interface}" | sed 's/^lo$//g')

        # docker devices
        current_interface=$(echo "${current_interface}" | sed 's/^docker[0-9]*//g')

        # libvirt devices
        current_interface=$(echo "${current_interface}" | sed 's/^vir.*//g')

        # serial line ip (slip)
        current_interface=$(echo "${current_interface}" | sed 's/^sl.*//g')

        # wwan
        current_interface=$(echo "${current_interface}" | sed 's/^ww.*//g')

        interfaces="${interfaces} ${current_interface}"
    done
    interfaces="$(echo "${interfaces}" | sed 's/[[:space:]][[:space:]]*/ /g')"
    interfaces="$(echo "${interfaces}" | sed 's/^[[:space:]]*//g')"
    interfaces="$(echo "${interfaces}" | sed 's/[[:space:]]*$//g')"

    touch "$OUTFILE" >> "$REPORTFILE" 2>&1
    echo -n > "$OUTFILE"
    echo "; ${PRODUCTNAME}ethd configuration file" >> "$OUTFILE"
    echo "; autogenerated by ${INSTALLERNAME} installer on $(date)" >> "$OUTFILE"
    echo "" >> "$OUTFILE"
    echo "[Parameters]" >> "$OUTFILE"
    echo "EthFirmwarePath = ${DRIVERFIRMWAREDIR}/eth/" >> "$OUTFILE"
    echo "EthAddonPath = ${DRIVERFIRMWAREDIR}/eth_addon/" >> "$OUTFILE"
    echo "Interfaces = ${interfaces}" >> "$OUTFILE"
    echo "" >> "$OUTFILE"
}



create_machine()
{
    echo ">>> create lib${PRODUCTNAME}_api machine config" >> "$REPORTFILE" 2>&1

    touch "$OUTFILE" >> "$REPORTFILE" 2>&1
    echo -n > "$OUTFILE"
    echo "; lib${PRODUCTNAME}_api (machine) configuration file" >> "$OUTFILE"
    echo "; autogenerated by ${INSTALLERNAME} installer on $(date)" >> "$OUTFILE"
    echo "" >> "$OUTFILE"
    echo "[Parameters]" >> "$OUTFILE"
    echo "" >> "$OUTFILE"
}


if [ "${VARIANT}" = "usb" ] && [ -z "${OUTFILE}" ]; then
    OUTFILE=$DRIVERUSBDCONF
elif [ "${VARIANT}" = "eth" ] && [ -z "${OUTFILE}" ]; then
    OUTFILE=$DRIVERETHDCONF
elif [ "${VARIANT}" = "user" ] && [ -z "${OUTFILE}" ]; then
    OUTFILE=$DRIVERAPIUSERCONF
elif [ "${VARIANT}" = "machine" ] && [ -z "${OUTFILE}" ]; then
    OUTFILE=$DRIVERAPIMACHINECONF
fi

mkdir -p "$(dirname "${OUTFILE}")" >> "$REPORTFILE" 2>&1

if [ -e "$OUTFILE" ]; then
    OLDOUTFILE="${OUTFILE}_backup_$(date +"%Y%m%d%H%M%S")"
    mv "${OUTFILE}" "$OLDOUTFILE"
fi

if [ "${VARIANT}" = "usb" ]; then
    create_usb
elif [ "${VARIANT}" = "eth" ]; then
    create_eth
elif [ "${VARIANT}" = "machine" ]; then
    create_machine
fi

if [ "$OLDOUTFILE" ]; then
    DIFF=$(diff -B -I '^;' -I '^ ;' "$OUTFILE" "$OLDOUTFILE")
    if [ "$DIFF" ]; then
        # files are different
        echo "old config file differs from the new one, please have a look at the diff and" | tee -a "$REPORTFILE"
        echo "merge manualy into ${OUTFILE}" | tee -a "$REPORTFILE"
        echo "$DIFF" | tee -a "$REPORTFILE"
    else
        # match
        rm "$OLDOUTFILE"
    fi
fi
