blob: d6f526d3bdd99ddfacb115ef1a4ef5105b255b42 [file] [log] [blame]
#!/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