#!/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 </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