Merge "[GENERAL] Add Andreas Geissler as committer."
[oom/offline-installer.git] / build / docker-entrypoint.sh
index 14f6aaa..d6f526d 100755 (executable)
@@ -1,25 +1,56 @@
 #!/usr/bin/env bash
 
-# Path where will be created repository (in container)
+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 where is stored onap_rpm.list file
-RPM_LIST_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 () {
-    echo -e "Docker entrypoint script for creating RPM repository\n"
-    echo "usage: create-repo.sh [-d|--directory output directory] [-l|--list input rpm list directory]"
-    echo "-h --help: Show this help"
-    echo "-d --directory: set path for repo directory in container"
-    echo -e "-l --list: set path where rpm list is stored in container\n"
-    echo "Both paths have to be set with shared volume between"
-    echo "container and host computer. Default path in container is: /tmp/"
-    echo "Repository will be created at: /<path>/resources/pkg/rpm/"
-    echo "RMP list is stored at: ./data_list/"
+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 parametters
-POSITIONAL=()
+# Getting input parameters
 if [[ $# -eq 0 ]] ; then
     help # show help
     exit 0
@@ -28,19 +59,36 @@ while [[ $# -gt 0 ]]
 do
     case "$1" in
         -h|--help)
-            # Help parametter
+            # Help parameter
             help # show help
             exit
             ;;
         -d|--directory)
-            # Directory parametter
-            # Sets path where will be created reposity
+            # Directory parameter
+            # Set target reposity path
             OFFLINE_REPO_DIR="$2"
+            shift
             ;;
         -l|--list)
-            # List parametter
-            # Sets path where is stored onap_rpm.list file
-            RPM_LIST_DIR="$2"
+            # 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
@@ -48,33 +96,171 @@ do
             exit
             ;;
     esac
-    shift;shift
+    shift
 done
 
-# Testing if directory parametter was used
-# If not variable is sets to default value /tmp/repo/resources/pkg/rpm
+# 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 parametter was used
-# If not variable is sets to default value /tmp/offline/data-list
-if test -z "$RPM_LIST_DIR"
+# 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
-    RPM_LIST_DIR="/tmp/offline/data_list/"
+    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
 
-# Install createrepo package for create repository in folder
-# and yum-utils due to yum-config-manager for adding docker repository
-yum install createrepo yum-utils -y
+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
 
-# Add official docker repository
-yum-config-manager --add-repo=https://download.docker.com/linux/centos/7/x86_64/stable/
+                for i in $(cat ${list_file});
+                do
+                    yumdownloader --resolve --downloadonly --destdir=${OFFLINE_REPO_DIR} $i -y
+                done
+            done
+        fi
 
-# Download all packages from onap_rpm.list via yumdownloader to repository folder
-for i in $(cat ${RPM_LIST_DIR}onap_rpm.list | awk '{print $1}');do yumdownloader --resolve --downloadonly --destdir=${OFFLINE_REPO_DIR} $i -y; done
+        # Create repository
+        createrepo $OFFLINE_REPO_DIR
+    ;;
 
-# In repository folder create repository
-createrepo $OFFLINE_REPO_DIR
+    *)
+        echo "Unknown type of linux distribution."
+        exit 1
+    ;;
+esac