#!/usr/bin/env bash

set -eo pipefail

# Set distribution family
distro_type=$(cat /etc/*-release | grep -w "ID" | awk -F'=' '{ print $2 }' | tr -d '"')
case "$distro_type" in
        ubuntu)
                distro_type="ubuntu"
        ;;
        rhel|centos)
                distro_type="rhel"
        ;;
        *)
                echo "Unknown type of linux distribution."
                exit 1
        ;;
esac

# Target path for created repository
OFFLINE_REPO_DIR=""

# Path to directory containing onap_rpm.list and onap_deb.list files
PCKG_LIST_DIR=""

# Path to additional packages lists
ADD_LIST_DIR=""

# Use cache by default
drop_cache=false

# Show help
help () {
cat <<EOF
Docker entrypoint script for creating RPM/DEB repository based on container platform type

usage: create-repo.sh [OPTION]...

  -d | --directory              target repository path
  -l | --list                   input rpm/deb list directory
  -a | --additional-list        additional packages list; can be used multiple times
  -p | --packages-lists-path    other additional packages lists
  -r | --drop-cache             remove cached packages (use package cache by default)
  -h | --help                   show this help

Both paths have to be set with shared volume between
container and the host. Default path in container is: /tmp/
Repository will be created at: /<path>/resources/pkg/rhel/
RMP/DEB list is stored at: ./data_list/
EOF
}

# Getting input parameters
if [[ $# -eq 0 ]] ; then
    help # show help
    exit 0
fi
while [[ $# -gt 0 ]]
do
    case "$1" in
        -h|--help)
            # Help parameter
            help # show help
            exit
            ;;
        -d|--directory)
            # Directory parameter
            # Set target reposity path
            OFFLINE_REPO_DIR="$2"
            shift
            ;;
        -l|--list)
            # List parameter
            # Set path containing onap_rpm.list or onap_deb.list file
            PCKG_LIST_DIR="$2"
            shift
            ;;
        -p|--packages-lists-path)
            # Path parameter
            # Set path for additional packages lists
            ADD_LIST_DIR="$2"
            shift
            ;;
        -a|--additional-list)
            # Array of additional packages lists
            ADDITIONAL_LISTS+=("$2")
            shift
            ;;
        -r|--drop-cache)
            # Set flag to clean cache
            drop_cache=true
            ;;
        *)
            # unknown option
            help # show help
            exit
            ;;
    esac
    shift
done

# Testing if directory parameter was used
# If not variable is set to /tmp/repo by default
if test -z "$OFFLINE_REPO_DIR"
then
    OFFLINE_REPO_DIR="/tmp/repo/"
fi

# Testing if list parameter was used
# If not variable is set to default value /tmp/offline/data-list
if test -z "$PCKG_LIST_DIR"
then
    PCKG_LIST_DIR="/tmp/offline/data_list"
fi

# Testing if additional packages list parameter was used
# If not variable is set to default value /tmp/additional-lists
if test -z "$PCKG_LIST_DIR"
then
    PCKG_LIST_DIR="/tmp/additional-lists"
fi

# Clean target repo dir if --drop-cache set
if ${drop_cache};
then
    rm -rf ${OFFLINE_REPO_DIR}/*
fi

case "$distro_type" in
    ubuntu)
        # Change current working dir
        pushd $OFFLINE_REPO_DIR

        # Install dpkg-deb package for create repository in folder
        # Install software-properties-common to get add-apt-repository command
        # Install apt-transport-https, ca-certificates, curl and gnupg-agent allowing apt to use a repository over HTTPS
        apt-get update -y
        apt-get install dpkg-dev apt-transport-https ca-certificates curl gnupg-agent software-properties-common -y

        # Add Docker's official GPG key:
        curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
        apt-key fingerprint 0EBFCD88

        # Add docker repository
        add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

        # Temp fix of known bug
        # https://bugs.launchpad.net/ubuntu/+source/aptitude/+bug/1543280
        chown _apt $OFFLINE_REPO_DIR

        # Create tmp file for package list
        list_file=$(mktemp)

        # Enumerate packages that are already downloaded
        for package in $(cat ${PCKG_LIST_DIR}/onap_deb.list);
        do
            # If package name contains explicit version info cut the version string off for further processing
            p=$(echo $package |sed -r 's/=.*//')
            # Add package to download list only if it's not already there
            if [ $(ls ${p}_*.deb 2>/dev/null | wc -l) -eq 0 ];
            then
                echo ${package} >> ${list_file}
            fi
        done

        # Download all packages via apt-get to repository folder
        for i in $(cat ${list_file});do apt-get download $i -y; done
        for i in $(cat ${list_file});
            do
                for depends in $(apt-cache depends $i | grep -E 'Depends' | grep -v 'Depends:.*>$' | cut -d ':' -f 2,3 | sed -e s/'<'/''/ -e s/'>'/''/);
                do
                    apt-get download $depends -y;
                done;
            done

        # Download all packages with dependencies from all additional packages lists via apt-get to repository folder
        if ! [ ${#ADDITIONAL_LISTS[@]} -eq 0 ]; then
            for list in ${ADDITIONAL_LISTS[@]}
            do

                # Create tmp file for package list
                list_file=$(mktemp)

                # Enumerate packages that are already downloaded
                for package in $(cat ${ADD_LIST_DIR}/${list});
                do
                    # If package name contains explicit version info cut the version string off for further processing
                    p=$(echo $package |sed -r 's/=.*//')
                    # Add package to download list only if it's not already there
                    if [ $(ls ${p}_*.deb 2>/dev/null | wc -l) -eq 0 ];
                    then
                        echo ${package} >> ${list_file}
                    fi
                done

                for i in $(cat ${list_file});do apt-get download $i -y; done
                for i in $(cat ${list_file});
                do
                    for depends in $(apt-cache depends $i | grep -E 'Depends' | cut -d ':' -f 2,3 | sed -e s/'<'/''/ -e s/'>'/''/);
                        do apt-get download $depends -y;
                    done;
                done
            done
        fi

        # In repository folder create gz package with deb packages
        dpkg-scanpackages . /dev/null | gzip -9c > Packages.gz
    ;;

    rhel)
        # Install createrepo package for create repository in folder,
        # yum-utils due to yum-config-manager for adding docker repository
        # and epel-release for additional packages (like jq etc.)
        yum install createrepo yum-utils epel-release -y

        # Add official docker repository
        yum-config-manager --add-repo=https://download.docker.com/linux/centos/7/x86_64/stable/

        # Create tmp file for package list
        list_file=$(mktemp)

        # Enumerate packages that are already downloaded
        for package in $(cat ${PCKG_LIST_DIR}/onap_rpm.list);
        do
            # Add package to download list only if it's not already there
            if [ ! -f ${OFFLINE_REPO_DIR}/${package}.rpm ];
            then
                echo ${package} >> ${list_file}
            fi
        done

        # Download all packages from onap_rpm.list via yumdownloader to repository folder
        for i in $(cat ${list_file});do yumdownloader --resolve --downloadonly --destdir=${OFFLINE_REPO_DIR} $i -y; done

        # Download all packages from all additional packages lists via yumdownloader to repository folder
        if ! [ ${#ADDITIONAL_LISTS[@]} -eq 0 ]; then
            for list in ${ADDITIONAL_LISTS[@]}
            do
                # Create tmp file for additional package list
                list_file=$(mktemp)
                # Enumerate packages that are already downloaded
                for package in $(cat ${ADD_LIST_DIR}/${list});
                do
                    # Add package to download list only if it's not already there
                    if [ ! -f ${OFFLINE_REPO_DIR}/${package}.rpm ];
                    then
                        echo ${package} >> ${list_file}
                    fi
                done

                for i in $(cat ${list_file});
                do
                    yumdownloader --resolve --downloadonly --destdir=${OFFLINE_REPO_DIR} $i -y
                done
            done
        fi

        # Create repository
        createrepo $OFFLINE_REPO_DIR
    ;;

    *)
        echo "Unknown type of linux distribution."
        exit 1
    ;;
esac
