cfe45dadae
Signed-off-by: Dean Troyer <dtroyer@gmail.com>
259 lines
6.6 KiB
Bash
Executable File
259 lines
6.6 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# Add file signature to RPMs
|
|
#
|
|
# This script will add file signature to rpms in a given directory.
|
|
# The directory containing the RPMs must be passed as a parameter. There is no default location.
|
|
#
|
|
#
|
|
|
|
usage () {
|
|
echo ""
|
|
echo "Usage: "
|
|
echo " sign-rpms -d|--pkg-dir <directory>"
|
|
echo " -d --pkg-dir <directory> directory contain the RPMs to sign"
|
|
echo " -h|--help this message"
|
|
echo ""
|
|
}
|
|
|
|
# number of processors. The process will use all available processors by default.
|
|
NPROCS=$(nproc)
|
|
|
|
export MOCK=/usr/bin/mock
|
|
|
|
# check input variables
|
|
function check_vars {
|
|
# need access to repo, which should normally be defined as MY_REPO in the env
|
|
|
|
if [ ! -z "$MY_REPO" ] && [ -d "$MY_REPO" ] ; then
|
|
INTERNAL_REPO_ROOT=$MY_REPO
|
|
fi
|
|
|
|
if [ -z "$INTERNAL_REPO_ROOT" ] ; then
|
|
printf " unable to use \$MY_REPO (value \"$MY_REPO\")\n"
|
|
printf " -- checking \$MY_REPO_ROOT_DIR (value \"$MY_REPO_ROOT_DIR\")\n"
|
|
if [ ! -z "$MY_REPO_ROOT_DIR" ] && [ -d "$MY_REPO_ROOT_DIR/cgcs-root" ] ; then
|
|
INTERNAL_REPO_ROOT=$MY_REPO_ROOT_DIR/cgcs-root
|
|
printf " Found!\n"
|
|
fi
|
|
fi
|
|
|
|
if [ -z "$INTERNAL_REPO_ROOT" ] ; then
|
|
printf " No joy -- checking for \$MY_WORKSPACE/cgcs-root\n"
|
|
if [ -d "$MY_WORKSPACE/cgcs-root" ] ; then
|
|
INTERNAL_REPO_ROOT=$MY_WORKSPACE/cgcs-root
|
|
printf " Found!\n"
|
|
fi
|
|
fi
|
|
|
|
if [ -z "$INTERNAL_REPO_ROOT" ] ; then
|
|
printf " Error -- could not locate cgcs-root repo.\n"
|
|
exit 1
|
|
fi
|
|
|
|
if [ -z "$MY_BUILD_ENVIRONMENT" ] ; then
|
|
printf " Error -- missing environment variable MY_BUILD_ENVIRONMENT"
|
|
exit 1
|
|
fi
|
|
|
|
if [ -z "$MY_BUILD_DIR" ] ; then
|
|
printf " Error -- missing environment variable MY_BUILD_DIR"
|
|
exit 1
|
|
fi
|
|
|
|
}
|
|
|
|
#
|
|
# this function will add IMA file signatures to all rpms in the Packages directory
|
|
#
|
|
# the process will copy the signing key and a makefile in the mock env under /tmp
|
|
# it will also mount the Packages directory under /mnt/Packages
|
|
# then mock will be invoked to sign the packages
|
|
#
|
|
# This process is using mock because the build servers do not have the same rpm / rpmsign version
|
|
#
|
|
|
|
|
|
function sign_packages {
|
|
OLD_PWD=$PWD
|
|
|
|
_MOCK_PKG_DIR=/mnt/Packages
|
|
_IMA_PRIV_KEY=ima_signing_key.priv
|
|
_KEY_DIR=$MY_REPO/build-tools/signing
|
|
_MOCK_KEY_DIR=/mnt/keys
|
|
_SIGN_MAKEFILE=_sign_pkgs.mk
|
|
_MK_DIR=$MY_REPO/build-tools/mk
|
|
_MOCK_MK_DIR=/mnt/mk
|
|
|
|
# mock confgiuration file
|
|
_MOCK_CFG=$MY_BUILD_DIR/${MY_BUILD_ENVIRONMENT}-sign.cfg
|
|
|
|
# recreate configuration file
|
|
rm $_MOCK_CFG
|
|
export BUILD_TYPE=std
|
|
export MY_BUILD_DIR_TOP=$MY_BUILD_DIR
|
|
modify-build-cfg $_MOCK_CFG
|
|
# and customize
|
|
echo "config_opts['chroot_setup_cmd'] = 'install shadow-utils make rpm-sign'" >> $_MOCK_CFG
|
|
echo "config_opts['root'] = 'mock-sign'" >> $_MOCK_CFG
|
|
echo "config_opts['basedir'] = '${MY_WORKSPACE}'" >> $_MOCK_CFG
|
|
echo "config_opts['cache_topdir'] = '${MY_WORKSPACE}/mock-cache'" >> $_MOCK_CFG
|
|
|
|
echo "Signing packages in $_PKG_DIR with $NPROCS threads"
|
|
echo "using development key $_KEY_DIR/$_IMA_PRIV_KEY"
|
|
|
|
printf "Initializing mock environment\n"
|
|
|
|
# invoke make in mock to sign packages.
|
|
# this call will also create and initialize the mock env
|
|
eval $MOCK -q -r $_MOCK_CFG \'--plugin-option=bind_mount:dirs=[\(\"$_PKG_DIR\", \"$_MOCK_PKG_DIR\"\),\(\"$_MK_DIR\",\"$_MOCK_MK_DIR\"\),\(\"$_KEY_DIR\",\"$_MOCK_KEY_DIR\"\)]\' --shell \"cd $_MOCK_PKG_DIR\; make -j $NPROCS -f $_MOCK_MK_DIR/$_SIGN_MAKEFILE KEY=$_MOCK_KEY_DIR/$_IMA_PRIV_KEY\"
|
|
|
|
retval=$?
|
|
|
|
printf "Cleaning mock environment\n"
|
|
$MOCK -q -r $_MOCK_CFG --scrub=all
|
|
|
|
if [ $retval -ne 0 ] ; then
|
|
echo "failed to add file signatures to RPMs in mock environment."
|
|
return $retval
|
|
fi
|
|
|
|
cd $OLD_PWD
|
|
|
|
}
|
|
|
|
function _copy_and_sign {
|
|
|
|
# upload rpms to server
|
|
scp $_PKG_DIR/*.rpm $SIGNING_USER@$SIGNING_SERVER:$_UPLOAD_DIR
|
|
retval=$?
|
|
if [ $retval -ne 0 ] ; then
|
|
echo "ERROR: failed to copy RPM files to signing server."
|
|
return $retval
|
|
fi
|
|
|
|
# get server to sign packages.
|
|
ssh $SIGNING_USER@$SIGNING_SERVER -- sudo $SIGNING_SERVER_SCRIPT -s -d $sub
|
|
retval=$?
|
|
if [ $retval -ne 0 ] ; then
|
|
echo "ERROR: failed to sign RPM files."
|
|
return $retval
|
|
fi
|
|
|
|
# download results back. This overwrites the original files.
|
|
scp $SIGNING_USER@$SIGNING_SERVER:$_UPLOAD_DIR/*.rpm $_PKG_DIR
|
|
retval=$?
|
|
if [ $retval -ne 0 ] ; then
|
|
echo "ERROR: failed to copy signed RPM files back from signing server."
|
|
return $retval
|
|
fi
|
|
|
|
return $retval
|
|
|
|
}
|
|
|
|
|
|
function sign_packages_on_server {
|
|
|
|
retval=0
|
|
|
|
# obtain temporary diretory to upload RPMs on signing server
|
|
_UPLOAD_DIR=`ssh $SIGNING_USER@$SIGNING_SERVER -- sudo $SIGNING_SERVER_SCRIPT -r`
|
|
|
|
retval=$?
|
|
if [ $retval -ne 0 ] ; then
|
|
echo "failed to obtain upload directory from signing server."
|
|
return $retval
|
|
fi
|
|
|
|
# extract base chroot dir and rpm dir within chroot
|
|
read base com sub <<< $_UPLOAD_DIR
|
|
|
|
# this is the upload temp dir, outside of chroot env
|
|
_UPLOAD_DIR=$base$sub
|
|
|
|
_copy_and_sign
|
|
retval=$?
|
|
|
|
# cleanup
|
|
ssh $SIGNING_USER@$SIGNING_SERVER rm $_UPLOAD_DIR/*.rpm
|
|
if [ $? -ne 0 ] ; then
|
|
echo "Warning : failed to remove rpms from temporary upload directory."
|
|
fi
|
|
ssh $SIGNING_USER@$SIGNING_SERVER rmdir $_UPLOAD_DIR
|
|
if [ $? -ne 0 ] ; then
|
|
echo "Warning : failed to remove temporary upload directory."
|
|
fi
|
|
|
|
return $retval
|
|
}
|
|
|
|
|
|
|
|
#############################################
|
|
# Main code
|
|
#############################################
|
|
|
|
# Check args
|
|
HELP=0
|
|
SIGNING_SERVER=yow-tiks01
|
|
SIGNING_USER=signing
|
|
SIGNING_SERVER_SCRIPT=/opt/signing/sign_rpms_18.03.sh
|
|
|
|
# return value
|
|
retval=0
|
|
|
|
# read the options
|
|
TEMP=`getopt -o hd: --long help,pkg-dir: -n 'test.sh' -- "$@"`
|
|
if [ $? -ne 0 ] ; then
|
|
echo "Invalid parameters - exiting"
|
|
exit 1
|
|
fi
|
|
|
|
eval set -- "$TEMP"
|
|
|
|
# extract options and their arguments into variables.
|
|
while true ; do
|
|
case "$1" in
|
|
-h|--help) HELP=1 ; shift ;;
|
|
-d|--pkg-dir) _PKG_DIR="$2"; shift; shift ;;
|
|
--) shift ; break ;;
|
|
*) echo "Internal error : unexpected parameter $2" ; exit 1 ;;
|
|
esac
|
|
done
|
|
|
|
if [ $HELP -eq 1 ]; then
|
|
usage
|
|
exit 0
|
|
fi
|
|
|
|
# package directory must be defined
|
|
if [ -z "$_PKG_DIR" ]; then
|
|
echo "Need package directory. Use -d/--pkg-dir option"
|
|
usage
|
|
exit 1
|
|
fi
|
|
|
|
# ... and must exist
|
|
if [ ! -d "$_PKG_DIR" ]; then
|
|
echo "Package directory $_PKG_DIR does not exist"
|
|
exit 1
|
|
fi
|
|
|
|
# Init variables
|
|
check_vars
|
|
|
|
echo signing $_PKG_DIR
|
|
|
|
# sign all rpms
|
|
if [ "$USER" == "jenkins" ]; then
|
|
sign_packages_on_server
|
|
retval=$?
|
|
else
|
|
sign_packages
|
|
retval=$?
|
|
fi
|
|
|
|
exit $retval
|
|
|