#!/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="$$" qnd_exit() { unset_quiet kill "$MLTK_PID" [ $# -ge 1 ] && kill "$1" } . "${ROOT_DIR}/helper/logging.inc" . "${ROOT_DIR}/helper/useradd.inc" . "${ROOT_DIR}/helper/downloader.inc" . "${ROOT_DIR}/helper/fileutil.inc" . "${ROOT_DIR}/helper/binutil.inc" pinfo "System's packet manager is $PACKET_MANAGER" 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 "Toolkit for creating preboot mini-linux for OpenSLX NG (mltk)" echo "Usage: $(basename ${SELF}) tools [-d] [-c [module]*] [-b [module]*] [-p profile]" echo " $(basename ${SELF}) core [-d] [-c] [-b] [-n]" echo -e "" echo -e " Target:" echo -e " core \t minimal initramfs (stage 3.1) to mount the system-container (stage 3.2)." echo -e " tools \t minimal systemd-based rootfs including basic tools (required for core)." echo -e "" echo -e " Target options:" echo -e " -b build target" echo -e " -c clean target" echo -e " -d activates debug output for current target" echo -e " -p profile build all modules from given profile" echo -e " -n don't generate squashfs for stage 3.2" echo -e "" echo -e " For target 'tools', 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 " tools -c -b base policykit sshd (clean all tools, build base, policykit and sshd)" echo -e " tools -c -b (clean all tools, build all tools)" echo -e " tools -c base sshd -b sshd ldm -d (clean base and sshd, build sshd and ldm, be verbose)" echo -e " tools -c -p default (clean all tools, build modules listed in profile default)" echo -e " core -c -b (clean and build core)" echo -e "" echo -e " Existing modules for tools are:" echo -e " $(echo $(ls ${ROOT_DIR}/remote/tools))" } initial_checks() { if [ "x$(whoami)" != "xroot" ]; then perror "ERROR: You need to have root rights to install packages." exit 1 else banner fi # setup_tools and build_core BUILD_CORE="${ROOT_DIR}/server/build_core" SETUP_TOOLS="${ROOT_DIR}/remote/setup_tools" [ ! -e "${BUILD_CORE}" ] && perror "Missing script build_core, re-clone. Exiting." [ ! -e "${SETUP_TOOLS}" ] && perror "Missing script setup_tools, re-clone. Exiting." } read_params() { local MODE="" local SUBMODE="" # select target: core or tools case "$1" in core) MODE="CORE" ;; tools) MODE="TOOLS" ;; *) pwarning "Unknown target: $1" print_usage exit 1 ;; esac shift # handle rest of arguments while [ "$#" -gt "0" ]; do local PARAM="$1" shift # options to current target if [[ "$PARAM" == "-"* ]]; then case "$PARAM" in -c) SUBMODE="CLEAN" ;; -b) SUBMODE="BUILD" ;; -d) eval ${MODE}_DEBUG="1" continue ;; -p) [ "$#" -lt "1" ] && perror "Missing argument to -p" [ "$MODE" != "TOOLS" ] && perror "-p can only be used for target tools" . "remote/profiles/${1}.profile" || perror "Profile '$1' not found in remote/profiles/" TOOLS_BUILD="1" TOOLS_LIST_BUILD="$TOOLS_LIST_BUILD $MODULES" unset MODULES shift continue ;; -n) [ "$MODE" != "CORE" ] && perror "-n can only be used for target core" CORE_NO_SQUASHFS="1" continue ;; *) pwarning "Unknown flag to target: $PARAM" print_usage exit 1 ;; esac eval ${MODE}_${SUBMODE}="1" continue fi # module name [[ $MODE != TOOLS ]] && pwarning "You cannot specify module names for target CORE." && print_usage && exit 1 [[ $SUBMODE != CLEAN && $SUBMODE != BUILD ]] && pwarning "Module name given for --tools, but no action specified (eg. build)" && print_usage && exit 1 eval "${MODE}_LIST_${SUBMODE}=\"\$${MODE}_LIST_${SUBMODE} \$PARAM\"" done #pinfo "tools clean: $TOOLS_CLEAN -$TOOLS_LIST_CLEAN" #pinfo "tools build: $TOOLS_BUILD -$TOOLS_LIST_BUILD" #pinfo "core clean: $CORE_CLEAN" #pinfo "core build: $CORE_BUILD" # exit if no command [[ $CORE_CLEAN == 0 && $CORE_BUILD == 0 && $TOOLS_CLEAN == 0 && $TOOLS_BUILD == 0 ]] && print_usage && exit 1 } run() { if [[ $TOOLS_CLEAN == 1 || $TOOLS_BUILD == 1 ]]; then [[ $TOOLS_DEBUG == 1 ]] && unset_quiet || set_quiet . "${SETUP_TOOLS}" || perror "Cannot source ${SETUP_TOOLS}" [[ $TOOLS_CLEAN == 1 ]] && clean_tools $TOOLS_LIST_CLEAN [[ $TOOLS_BUILD == 1 ]] && generate_stage32 $TOOLS_LIST_BUILD fi if [[ $CORE_CLEAN == 1 || $CORE_BUILD == 1 ]]; then [[ $CORE_DEBUG == 1 ]] && unset_quiet || set_quiet local TOOL_STR="[CORE]" . "${BUILD_CORE}" || perror "Cannot source ${BUILD_CORE}" [[ $CORE_CLEAN == 1 ]] && clean_core [[ $CORE_BUILD == 1 ]] && generate_stage31 fi } CORE_DEBUG="0" CORE_BUILD="0" CORE_CLEAN="0" CORE_NO_SQUASHFS="0" TOOLS_DEBUG="0" TOOLS_CLEAN="0" TOOLS_BUILD="0" TOOLS_LIST_CLEAN="" TOOLS_LIST_BUILD="" initial_checks read_params $@ run