blob: a42f46f02629a82176f59b3414c7a271f2cd3bc7 (
plain) (
tree)
|
|
#!/bin/bash
# -----------------------------------------------------------------------------
#
# Copyright (c) 2011 - OpenSLX GmbH
#
# This program is free software distributed under the GPL version 2.
# See http://openslx.org/COPYING
#
# If you have any feedback please consult http://openslx.org/feedback and
# send your suggestions, praise, or complaints to feedback@openslx.org
#
# General information about OpenSLX can be found at http://openslx.org/
# -----------------------------------------------------------------------------
#
# Mini-Linux Toolkit
#
# -----------------------------------------------------------------------------
SELF="$(readlink -f $0)"
ROOT_DIR="$(dirname "${SELF}")"
MLTK_PID="$$"
# Checking for needed development tools, compilers etc.
# Required: m4 make gcc g++ binutils
DEVTOOLS="gcc c++ g++ make m4 strip git depmod" # 'strip' as marker for binutils
for i in $DEVTOOLS; do
which "$i" 2>/dev/null 1>&2 || { echo "Essential development tool $i not found - exiting."; exit 1; }
done
# Make apt-get install non-interactive when it comes to postinstall questions
# ie. kdm asking which dm you want to set as default
export DEBIAN_FRONTEND=noninteractive
qnd_exit() {
unset_quiet
kill "$MLTK_PID"
[ $# -ge 1 ] && kill "$1"
}
# source all helper functions files that are found under helper/*.inc
for HELPER in $ROOT_DIR/helper/*.inc; do
. "$HELPER" && continue
unset_quiet
echo "Could not source $HELPER"
qnd_exit
done
banner () {
echo -e "\033[38;5;202m\t __ __ __ "
echo -e "\033[38;5;202m\t.--------.| | | |_| |--."
echo -e "\033[38;5;208m\t| || |_| _| < "
echo -e "\033[38;5;214m\t|__|__|__||____|____|__|__|"
echo -e "\033[38;5;214m\t "
echo -e "\033[38;5;220m\t ** OpenSLX Project // 2013 **"
echo -e "\033[38;5;226m\t http://lab.openslx.org/"
echo -e "\033[0m"
}
print_usage() {
echo -e ""
echo -e "Toolkit for creating preboot mini-linux for OpenSLX NG (mltk)"
echo -e "Usage: $(basename ${SELF}) remote <target> [-d] [-c [module]*] [-b [module]*] [-p profile]"
echo -e " $(basename ${SELF}) server <remotehost> [-s] [<target>] [-e stage31|stage32|addons] [-d] [-c]"
echo -e ""
echo -e " Mode:"
echo -e " server \t server mode: packs stage3.1, stage3.2 or addons as initramfs/squashfs."
echo -e " remote \t remote mode: builds a minimal rootfs based on the activated modules in <target>"
echo -e ""
echo -e " Mode options:"
echo -e " -b remote: build module(s)"
echo -e " -e type server: export target as stage31, stage32 or addons"
echo -e " -s server: sync 'builds' directory of remote host"
echo -e " -c remote: clean module(s). / server: clean target in remote_builds/ and corresponding files under boot/"
echo -e " -d activates debug output for current target/build"
echo -e " -p profile remote: build all modules from given profile"
echo -e ""
echo -e " In mode 'remote', you can pass names of specific modules to clean/build."
echo -e " Otherwise, all modules will be built/cleaned."
echo -e ""
echo -e " Examples:"
echo -e " remote stage31 -c -b (clean all modules and build all linked modules in remote/targets/stage31 to remote/builds/stage31)"
echo -e " remote stage32 -c -b rootfs_stage31 sshd (clean all modules, build base, policykit and sshd in remote/builds/stage32)"
echo -e " remote stage32 -c base sshd -b sshd ldm -d (clean base and sshd, build sshd and ldm, be verbose)"
echo -e " server 1.2.3.4 -s (sync all builds from remote system 1.2.3.4)"
echo -e " server 1.2.3.4 stage32 -e stage32 (pack stage32 as squashfs+initramfs from remote system 1.2.3.4)"
echo -e " server 1.2.3.4 stage31 -c (clean stage31 build under server/remote_builds and initramfs under server/boot)"
echo -e " server 1.2.3.4 addons-eexam -e addons (pack eexam-addons as squashfs)"
echo -e ""
echo -e " Existing targets for remote are:"
echo -e " $(echo $(ls ${ROOT_DIR}/remote/targets 2>/dev/null || echo "No targets for remote found."))"
echo -e " Existing targets for server are:"
echo -e "<TODO: Scan mirrored remote machines and the targets they contain>"
echo -e "*** Use 'local' as the remotehost if you're running the server part on the same machine as the remote part ***"
echo -e ""
}
initial_checks() {
if [ "x$(whoami)" != "xroot" ]; then
perror "ERROR: You need to have root rights to install packages."
exit 1
else
banner
fi
# print system information
pinfo "Arch triplet of this machine: $ARCH_TRIPLET"
pinfo "Kernel version: $KERNEL_VERSION"
pinfo "System's packet manager is $PACKET_MANAGER"
# source the 2 central scripts:
# setup_target
# - builds all modules activated under the target directory
# (basic targets are 'stage31' and 'stage32')
# export_target
# - pack given target as a cpio or squashfs depending on
# the export type:
# stage31 (cpio archive of the complete stage31-filesystem)
# stage32 (cpio archive containing the squashfs'ed stage32-filesystem)
REMOTE_SETUP_TARGET="${ROOT_DIR}/remote/setup_target"
SERVER_EXPORT_TARGET="${ROOT_DIR}/server/export_target"
[ ! -e "${REMOTE_SETUP_TARGET}" ] && perror "Missing script remote/setup_target. Exiting."
[ ! -e "${SERVER_EXPORT_TARGET}" ] && perror "Missing script server/export_target. Exiting."
}
read_params() {
local MODE=""
local SUBMODE=""
# mltk knows two modes in which to run:
# - remote: functions to be run on the reference system
# from which to build the mini-linux
# - server: functions for rsyncing the generated stage31/stage32
# to a server, exporting the stage31-/stage32-filesystems
case "$1" in
server)
MODE="SERVER"
[ "$#" -lt "2" ] && perror "Missing argument to -s (expecting remote host)"
REMOTE_IP="$2"
shift
;;
remote)
MODE="REMOTE"
;;
*)
pwarning "Unknown mode: $1"
print_usage
exit 1
;;
esac
shift
# A target represents a set of modules to be build for a specific stage.
# i.e. a very basic stage31 includes:
# - busybox
# - kernel
# - rootfs-stage31
# a basic stage32 would also contain these and additionally:
# - systemd
# - dbus
# - pam
# for a GUI, you could add:
# - xorg
# - kdm
# - plymouth
TARGET=""
if [[ $1 != "-"* ]]; then
TARGET=$1
shift
elif [[ $1 != "-s" ]]; then
perror "A target is required. None given."
fi
# handle rest of arguments
while [ "$#" -gt "0" ]; do
local PARAM="$1"
shift
# options to current target
if [[ "$PARAM" == "-"* ]]; then
case "$PARAM" in
-s)
SERVER_SYNC="1"
#TODO mit Remote IP
continue
;;
-c)
SUBMODE="CLEAN"
;;
-b)
[ "$MODE" != "REMOTE" ] && perror "-b can only be used in remote mode"
SUBMODE="BUILD"
;;
-d)
eval ${MODE}_DEBUG="1"
continue
;;
-p)
[ "$#" -lt "1" ] && perror "Missing argument to -p"
[ "$MODE" != "REMOTE" ] && perror "-p can only be used in remote mode"
. "remote/profiles/${1}.profile" || perror "Profile '$1' not found in remote/profiles/"
REMOTE_BUILD="1"
REMOTE_LIST_BUILD="$REMOTE_LIST_BUILD $MODULES"
unset MODULES
shift
continue
;;
-e)
[ "$#" -lt "1" ] && perror "Missing argument to -e"
[ "$MODE" != "SERVER" ] && perror "-e can only be used in server mode"
[[ "stage31|stage32|addons" != *"$1"* ]] && perror "Wrong type specified. Muste be either 'stage31', 'stage32' or 'addons'"
SERVER_EXPORT="1"
SERVER_EXPORT_TYPE="$1"
shift
continue
;;
*)
pwarning "Unknown flag to target: $PARAM"
print_usage
exit 1
;;
esac
eval ${MODE}_${SUBMODE}="1"
continue
fi
# module name
[[ $MODE != REMOTE ]] && pwarning "You cannot specify module names in server mode." && print_usage && exit 1
[[ $SUBMODE != CLEAN && $SUBMODE != BUILD ]] && pwarning "Module name given in remote mode, but no action specified (eg. build)" && print_usage && exit 1
eval "${MODE}_LIST_${SUBMODE}=\"\$${MODE}_LIST_${SUBMODE} \$PARAM\""
done
# exit if no command
[[ $SERVER_CLEAN == 0 && $SERVER_EXPORT == 0 && $REMOTE_CLEAN == 0 && $REMOTE_BUILD == 0 && $SERVER_SYNC == 0 ]] && print_usage && exit 1
}
run() {
if [[ $REMOTE_CLEAN == 1 || $REMOTE_BUILD == 1 ]]; then
[[ $REMOTE_DEBUG == 1 ]] && unset_quiet || set_quiet
. "${REMOTE_SETUP_TARGET}" || perror "Cannot source ${REMOTE_SETUP_TARGET}"
[[ $REMOTE_CLEAN == 1 ]] && clean_modules $TARGET $REMOTE_LIST_CLEAN
[[ $REMOTE_BUILD == 1 ]] && generate_target $TARGET $REMOTE_LIST_BUILD
fi
if [[ $SERVER_CLEAN == 1 || $SERVER_EXPORT == 1 || $SERVER_SYNC == 1 ]]; then
[[ $SERVER_DEBUG == 1 ]] && unset_quiet || set_quiet
. "${SERVER_EXPORT_TARGET}" || perror "Cannot source ${SERVER_EXPORT_TARGET}"
[[ $SERVER_SYNC == 1 ]] && sync_remote
[[ $SERVER_CLEAN == 1 ]] && clean_target $TARGET
[[ $SERVER_EXPORT == 1 ]] && export_target $TARGET $SERVER_EXPORT_TYPE
fi
}
SERVER_DEBUG="0"
SERVER_EXPORT="0"
SERVER_CLEAN="0"
SERVER_EXPORT_TYPE=""
SERVER_SYNC="0"
REMOTE_DEBUG="0"
REMOTE_CLEAN="0"
REMOTE_BUILD="0"
REMOTE_LIST_CLEAN=""
REMOTE_LIST_BUILD=""
initial_checks
read_params $@
run
|