pentest-distro-builder/modules/live-build-config/build.sh

186 lines
4.6 KiB
Bash
Executable file

#!/bin/bash
set -e
set -o pipefail # Bashism
KALI_DIST="kali-rolling"
KALI_VERSION=""
KALI_VARIANT="default"
TARGET_DIR="$(dirname $0)/images"
TARGET_SUBDIR=""
SUDO="sudo"
VERBOSE=""
HOST_ARCH=$(dpkg --print-architecture)
image_name() {
local arch=$1
case "$arch" in
i386|amd64)
IMAGE_TEMPLATE="live-image-ARCH.hybrid.iso"
;;
armel|armhf)
IMAGE_TEMPLATE="live-image-ARCH.img"
;;
esac
echo $IMAGE_TEMPLATE | sed -e "s/ARCH/$arch/"
}
target_image_name() {
local arch=$1
IMAGE_NAME="$(image_name $arch)"
IMAGE_EXT="${IMAGE_NAME##*.}"
if [ "$IMAGE_EXT" = "$IMAGE_NAME" ]; then
IMAGE_EXT="img"
fi
if [ "$KALI_VARIANT" = "default" ]; then
echo "${TARGET_SUBDIR:+$TARGET_SUBDIR/}kali-linux-$KALI_VERSION-$KALI_ARCH.$IMAGE_EXT"
else
echo "${TARGET_SUBDIR:+$TARGET_SUBDIR/}kali-linux-$KALI_VARIANT-$KALI_VERSION-$KALI_ARCH.$IMAGE_EXT"
fi
}
target_build_log() {
TARGET_IMAGE_NAME=$(target_image_name $1)
echo ${TARGET_IMAGE_NAME%.*}.log
}
default_version() {
case "$1" in
kali-*)
echo "${1#kali-}"
;;
*)
echo "$1"
;;
esac
}
failure() {
# Cleanup update-kali-menu that might stay around so that the
# build chroot can be properly unmounted
$SUDO pkill -f update-kali-menu || true
echo "Build of $KALI_DIST/$KALI_VARIANT/$KALI_ARCH live image failed (see build.log for details)" >&2
exit 2
}
run_and_log() {
if [ -n "$VERBOSE" ]; then
"$@" 2>&1 | tee -a build.log
else
"$@" >>build.log 2>&1
fi
return $?
}
. $(dirname $0)/.getopt.sh
# Parsing command line options
temp=$(getopt -o "$BUILD_OPTS_SHORT" -l "$BUILD_OPTS_LONG,get-image-path" -- "$@")
eval set -- "$temp"
while true; do
case "$1" in
-d|--distribution) KALI_DIST="$2"; shift 2; ;;
-p|--proposed-updates) OPT_pu="1"; shift 1; ;;
-a|--arch) KALI_ARCHES="${KALI_ARCHES:+$KALI_ARCHES } $2"; shift 2; ;;
-v|--verbose) VERBOSE="1"; shift 1; ;;
-s|--salt) shift; ;;
--variant) KALI_VARIANT="$2"; shift 2; ;;
--version) KALI_VERSION="$2"; shift 2; ;;
--subdir) TARGET_SUBDIR="$2"; shift 2; ;;
--get-image-path) ACTION="get-image-path"; shift 1; ;;
--) shift; break; ;;
*) echo "ERROR: Invalid command-line option: $1" >&2; exit 1; ;;
esac
done
# Set default values
KALI_ARCHES=${KALI_ARCHES:-$HOST_ARCH}
if [ -z "$KALI_VERSION" ]; then
KALI_VERSION="$(default_version $KALI_DIST)"
fi
# Check parameters
for arch in $KALI_ARCHES; do
if [ "$arch" = "$HOST_ARCH" ]; then
continue
fi
case "$HOST_ARCH/$arch" in
amd64/i386|i386/amd64)
;;
*)
echo "Can't build $arch image on $HOST_ARCH system." >&2
exit 1
;;
esac
done
if [ ! -d "$(dirname $0)/kali-config/variant-$KALI_VARIANT" ]; then
echo "ERROR: Unknown variant of Kali configuration: $KALI_VARIANT" >&2
fi
# Build parameters for lb config
KALI_CONFIG_OPTS="--distribution $KALI_DIST -- --variant $KALI_VARIANT"
if [ -n "$OPT_pu" ]; then
KALI_CONFIG_OPTS="$KALI_CONFIG_OPTS --proposed-updates"
KALI_DIST="$KALI_DIST+pu"
fi
# Set sane PATH (cron seems to lack /sbin/ dirs)
export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
# Either we use a git checkout of live-build
# export LIVE_BUILD=/srv/cdimage.kali.org/live/live-build
# Or we ensure we have proper version installed
ver_live_build=$(dpkg-query -f '${Version}' -W live-build)
if dpkg --compare-versions "$ver_live_build" lt 1:20151215kali1; then
echo "ERROR: You need live-build (>= 1:20151215kali1), you have $ver_live_build" >&2
exit 1
fi
# Check we have a good debootstrap
ver_debootstrap=$(dpkg-query -f '${Version}' -W debootstrap)
if dpkg --compare-versions "$ver_debootstrap" lt "1.0.97"; then
if ! echo "$ver_debootstrap" | grep -q kali; then
echo "ERROR: You need debootstrap >= 1.0.97 (or a Kali patched debootstrap). Your current version: $ver_debootstrap" >&2
#exit 1
fi
fi
# We need root rights at some point
if [ "$(whoami)" != "root" ]; then
if ! which $SUDO >/dev/null; then
echo "ERROR: $0 is not run as root and $SUDO is not available" >&2
exit 1
fi
else
SUDO="" # We're already root
fi
if [ "$ACTION" = "get-image-path" ]; then
for KALI_ARCH in $KALI_ARCHES; do
echo $(target_image_name $KALI_ARCH)
done
exit 0
fi
cd $(dirname $0)
mkdir -p $TARGET_DIR/$TARGET_SUBDIR
for KALI_ARCH in $KALI_ARCHES; do
IMAGE_NAME="$(image_name $KALI_ARCH)"
set +e
: > build.log
run_and_log $SUDO lb clean --purge
[ $? -eq 0 ] || failure
run_and_log lb config -a $KALI_ARCH $KALI_CONFIG_OPTS "$@"
[ $? -eq 0 ] || failure
run_and_log $SUDO lb build
if [ $? -ne 0 ] || [ ! -e $IMAGE_NAME ]; then
failure
fi
set -e
mv -f $IMAGE_NAME $TARGET_DIR/$(target_image_name $KALI_ARCH)
mv -f build.log $TARGET_DIR/$(target_build_log $KALI_ARCH)
done