#!/bin/bash # Copyright (C) 2017-2018 Daniel Tartavel-jeannot # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . function title() { echo -e "\e[1;32m${1}\e[0m" } function info() { echo -e "\e[36m${1}\e[0m" } function warning() { echo -e "\e[1;35m${1}\e[0m" } function error() { echo -e "\e[1;31m${1}\e[0m" } function help() { echo -e "${CMDNAME} [option] [size of image in Go]" echo -e "Options:" echo -e "--all create ready to burn image of Mageia ${MAGEIA_VERSION}" echo -e "--clean Clean all (suppress all) to make a new image" echo -e "--size size of image default: 7Go" echo -e "--build-path Path to the build directory of the image of Mageia ${MAGEIA_VERSION}" echo -e "--target target system (for now rpi, odroid)" echo -e "--target-version version of the target (0, 1, 2, 3 for rpi, 3 or 4 for odroid)" echo -e "--config Path to config files" echo -e "--bootfs filesystem of boot partition (ext4 or vfat) default: ext4" echo -e "--nonfree activate nonfree repos" echo -e "--tainted activate tainted repos" echo -e "\nBuild levels:" echo -e "--create-chroot Create the chroot directory" echo -e "--addmedia add mirrors" echo -e "--update-mirror update urpmi database" echo -e "--install-basesystem install base system" echo -e "--chroot chroot to arm directory and launch packages installation" echo -e "--create-image Create the image of Mageia ${MAGEIA_VERSION}" echo -e "\nFor image size, make sure it fit on physical support. (Default size is 7 Go)" } # cleaning build space function clean() { # Unmounting /dev /proc /sys in chroot title "Cleaning" if ! [ -z "$(mountpoint -qd "${BUILD_PATH}/dev")" ]; then # mountpoint - see if a directory or file is a mountpoint ; -d Show the major/minor numbers of the device that is mounted on the given directory. info "Unmounting ${BUILD_PATH}/dev" umount "${BUILD_PATH}/dev" if ! [ ${?} -ne 0 ]; then error "line ${LINENO} can't unmount ${BUILD_PATH}/dev : exiting" #exit ${ERR_1} fi fi if ! [ -z "$(mountpoint -qd "${BUILD_PATH}/sys")" ]; then info "Unmounting ${BUILD_PATH}/sys" umount "${BUILD_PATH}/sys" if ! [ ${?} -ne 0 ]; then error "line ${LINENO} can't unmount ${BUILD_PATH}/sys : exiting" #exit ${ERR_1} fi fi if ! [ -z "$(mountpoint -qd "${BUILD_PATH}/proc")" ]; then info "Unmounting ${BUILD_PATH}/proc" umount "${BUILD_PATH}/proc" if ! [ ${?} -ne 0 ]; then error "line ${LINENO} can't unmount ${BUILD_PATH}/proc : exiting" #exit ${ERR_1} fi fi # Removing old Build directory if [ -d "${BUILD_PATH}" ]; then info "Removing ${BUILD_PATH}" /bin/rm -Rf "${BUILD_PATH}" else warning "${BUILD_PATH} does not exists" fi # removing old image if [ -e "${IMAGE}" ]; then info "Removing ${IMAGE}" /bin/rm -f "${INSTALL_PATH}/${IMAGE}" else warning "${IMAGE} does not exists" fi # removing loop devices for LOOP in $(ls /dev/loop*[0-9]p1); do X=${LOOP:0:10} if [ -e "${X}" ]; then info "removing ${X}" partx -d "${X}" # Tell the kernel about the presence and numbering of partitions. fi done # Removing boot and root directory if [ -d "${BOOT}" ]; then info "Removing ${BOOT}" /bin/rmdir "${BOOT}" else warning "${BOOT} does not exists" fi if [ -d "${ROOT}" ]; then info "Removing ${ROOT}" /bin/rmdir "${ROOT}" else warning "${ROOT} does not exists" fi return 0 } # creation of install path and copy of qemu ( installing it if not yet installed ) function createchroot() { title "Making chroot" if ! [ -f /bin/qemu-arm-static ]; then title "Qemu package not present : installing qemu packages" /sbin/urpmi --auto --no-recommends qemu-user-static if [ ${?} -ne 0 ]; then error "line ${LINENO} can't install qemu-user-static : exiting" exit ${ERR_1} fi fi # Starting qemu service if not started /bin/systemctl is-active systemd-binfmt.service if [ ${?} -ne 0 ]; then title "Starting systemd-binfmt.service" /bin/systemctl start systemd-binfmt.service if [ ${?} -ne 0 ]; then error "line ${LINENO} can't start qemu-user-static : exiting" exit ${ERR_1} fi fi return 0 } # adding Mageia repositories function addmedia() { title "Creating media ${MIRROR}" /sbin/urpmi.addmedia --urpmi-root "${BUILD_PATH}" --distrib "${MIRROR}" err=${?} if [ ${err} -ne 0 ]; then error "line ${LINENO} error ${err} - can't add medias from ${MIRROR} : exiting" exit ${ERR_1} fi if [ ${NONFREE} -eq 1 ]; then title "activating non-free repos" /sbin/urpmi.update --urpmi-root "${BUILD_PATH}" --no-ignore Nonfree\ Release Nonfree\ Updates err=${?} if [ ${err} -ne 0 ]; then error "line ${LINENO} error ${err} - can't activate medias nonfree : exiting" exit ${ERR_1} fi fi if [ ${TAINTED} -eq 1 ]; then title "activating tainted repos" /sbin/urpmi.update --urpmi-root "${BUILD_PATH}" --no-ignore Tainted\ Release Tainted\ Updates err=${?} if [ ${err} -ne 0 ]; then error "line ${LINENO} error ${err} - can't activate medias tainted : exiting" exit ${ERR_1} fi fi return 0 } function updatemirror() { title "updating mirror" /sbin/urpmi.update -a --urpmi-root "${BUILD_PATH}" if [ ${?} -ne 0 ]; then error "line ${LINENO} can't update mirrors : exiting" exit ${ERR_1} fi return 0 } function installbasesystem() { # Create Build path if ! [ -d "${BUILD_PATH}" ]; then warning "Build path ( ${BUILD_PATH} ) does not exist, do you want to create it ? [Y|n] " read yn if [ -z ${yn} ] || [ ${yn} = "Y" ] || [ ${yn} = "y" ]; then title "Creating ${BUILD_PATH}" /bin/mkdir -p "${BUILD_PATH}/usr/bin" "${BUILD_PATH}/usr/lib/binfmt.d" if [ ${?} -ne 0 ]; then error "line ${LINENO} can't create ${BUILD_PATH} : exiting" exit ${ERR_1} fi else exit ${ERR_1} fi else info "Build path exists" fi title "installing basesystem" /sbin/urpmi --urpmi-root "${BUILD_PATH}" --ignorearch --no-verify-rpm --auto --split-level 200 --split-length 200 shadow-utils basesystem-minimal if [ ${?} -ne 0 ]; then error "line ${LINENO} error installing shadow-utils or basesystem-minimal : exiting" exit ${ERR_1} fi #/sbin/urpmi --urpmi-root "${BUILD_PATH}" --ignorearch --no-verify-rpm --auto --split-level 200 --split-length 200 basesystem-minimal #if [ ${?} -ne 0 ]; then # error "line ${LINENO} error installing basesystem-minimal : exiting" # exit ${ERR_1} #fi /sbin/urpmi --urpmi-root "${BUILD_PATH}" --ignorearch --no-verify-rpm --auto --split-level 200 --split-length 200 urpmi locales-fr systemd u-boot if [ ${?} -ne 0 ]; then error "line ${LINENO} error installing urpmi or locales.fr : exiting" exit ${ERR_1} fi return 0 } function preparechroot() { title "Preparing chrooting in ${BUILD_PATH}" #Copying qemu /bin/cp /bin/qemu-arm-static "${BUILD_PATH}/usr/bin/" if [ ${?} -ne 0 ]; then error "line ${LINENO} can't copy /bin/qemu-user-static to ${BUILD_PATH}/usr/bin/ : exiting" exit ${ERR_1} fi /bin/cp /usr/lib/binfmt.d/qemu-arm-static.conf "${BUILD_PATH}/usr/lib/binfmt.d" if [ ${?} -ne 0 ]; then error "line ${LINENO} can't copy /usr/lib/binfmt.d/qemu-arm-static.conf to ${BUILD_PATH}/usr/lib/binfmt.d : exiting" exit ${ERR_1} fi info "making /etc/hostname" echo "${HOSTNAME}" > "${BUILD_PATH}/etc/hostname" info "copying second stage script in ${BUILD_PATH}" #echo "/bin/cp ${CONFIG_PATH}/second_stage_install.sh ${BUILD_PATH}/" cp --preserve=mode "${CONFIG_PATH}/second_stage_install.sh" "${BUILD_PATH}/second_stage_install.sh" if [ ${?} -ne 0 ]; then error "line ${LINENO} error copying ${CONFIG_PATH}/second_stage_install.sh : exiting" exit ${ERR_1} fi info "creation of user account" echo -e "/bin/passwd << EOF\n${ROOT_PWD}\n${ROOT_PWD}\nEOF\n /sbin/useradd ${ID_USER}\n /bin/passwd ${ID_USER} << EOF\n${PASSWORD}\n${PASSWORD}\nEOF" >>"${BUILD_PATH}/second_stage_install.sh" info "Copying skel in root directory" /bin/rsync -rlptH /etc/skel/ "${BUILD_PATH}/root/" postPrepareChroot if [ ${?} -ne 0 ]; then error "line ${LINENO} error in postPrepareChroot function." exit ${ERR_1} fi return 0 } function jumpchroot() { title "chrooting to ${BUILD_PATH}" info "mounting dev, sys, proc directories in chroot" /bin/mount -B /dev "${BUILD_PATH}/dev" if [ ${?} -ne 0 ]; then error "line ${LINENO} error mounting ${BUILD_PATH}/dev : exiting" exit ${ERR_1} fi /bin/mount -B /sys "${BUILD_PATH}/sys" if [ ${?} -ne 0 ]; then error "line ${LINENO} error mounting ${BUILD_PATH}/sys : exiting" exit ${ERR_1} fi /bin/mount -B /proc "${BUILD_PATH}/proc" if [ ${?} -ne 0 ]; then error "line ${LINENO} error mounting ${BUILD_PATH}/proc : exiting" exit ${ERR_1} fi info "Copying resolv.conf" /bin/cp -v --preserve=mode /etc/resolv.conf "${BUILD_PATH}/etc/" if [ ${?} -ne 0 ]; then error "line ${LINENO} error copying ${BUILD_PATH}/etc/resolv.conf : exiting" exit ${ERR_1} fi if [ "$OPT" = "chroot" ]; then /sbin/chroot "${BUILD_PATH}" else /sbin/chroot --userspec root:root "${BUILD_PATH}" /bin/bash -v -c 'sh /second_stage_install.sh' fi RET=${?} if [ ${RET} -ne 0 ]; then error "line ${LINENO} Warning : chrooting to ${BUILD_PATH} retrurn an error ${RET}" ERRORN=$((${ERRORN}+1)) fi info "unmounting dev, sys, proc" /bin/umount -lf "${BUILD_PATH}/dev" if [ ${?} -ne 0 ]; then warning "line ${LINENO} Warning : error unmounting ${BUILD_PATH}/dev, continuing anyway" ERRORN=$((${ERRORN}+1)) fi /bin/umount -lf "${BUILD_PATH}/sys" if [ ${?} -ne 0 ]; then warning "line ${LINENO} Warning : error unmounting ${BUILD_PATH}/sys, continuing anyway" ERRORN=$((${ERRORN}+1)) fi /bin/umount -lf "${BUILD_PATH}/proc" if [ ${?} -ne 0 ]; then warning "line ${LINENO} Warning : error unmounting ${BUILD_PATH}/proc, continuing anyway" ERRORN=$((${ERRORN}+1)) fi return 0 } function verify_disk_space() { title "Verifying if there is enough space on disk to make the image" DISK_SPACE=$(/usr/bin/df -BG --output=avail "${INSTALL_PATH}" | sed '1d;s/[^0-9]//g') info "Free disk space: ${DISK_SPACE}G" if [ ${DISK_SPACE} -lt ${IMAGE_SIZE} ]; then warning "image size is greater than disk space" info "correct the problem and relaunch the script with parameter --create-rpi-image" info "${0} --size ${IMAGE_SIZE} --create-rpi-image" return 1 fi return 0 } function createImageWrap() { title "Wrap image creation" preImgCreation if [ ${?} -ne 0 ]; then error "line ${LINENO} error in the process ${CONFIG_PATH}/createImage.sh ." exit ${ERR_1} fi createimage if [ -z "${BOOTFS}" ]; then BOOTFS="ext4" fi formatpartitions ${BOOTFS} ext4 copyingsystem return 0 } createimage() { title " in ${IMAGE}" if [ -f "${INSTALL_PATH}/${IMAGE}" ]; then warning "Deleting previous image" /bin/rm -f "${INSTALL_PATH}/${IMAGE}" if [ ${?} -ne 0 ]; then error "line ${LINENO} error can't remove previous image at ${INSTALL_PATH}/${IMAGE} : exiting" exit ${ERR_1} fi fi warning "please wait until end of image creation" /bin/dd if=/dev/zero of="${INSTALL_PATH}/${IMAGE}" bs=1MB count=$(( ${IMAGE_SIZE} * 1024 )) if [ ${?} -ne 0 ]; then error "line ${LINENO} can't make image at ${INSTALL_PATH}/${IMAGE} : exiting" exit ${ERR_1} fi DEVICE=$(/sbin/losetup -f --show "${INSTALL_PATH}/${IMAGE}") ### TODO : Functionnalize if [ ${TARGET} = "odroid" ]; then info "installing blobs" pushd "${CONFIG_PATH}/sd_fuse" if [ ${?} -ne 0 ]; then error "line ${LINENO} error directory ${CONFIG_PATH}/sd_fuse does not exists : exiting" exit ${ERR_1} else ./sd_fusing.sh "${DEVICE}" fi pushd fi ### info "making partitions" echo -e "${FDISK_SCRIPT}" | /sbin/fdisk ${DEVICE} # Activate loop device /sbin/losetup -d "${DEVICE}" DEVICE=$(/sbin/partx -va "${INSTALL_PATH}/${IMAGE}" | /bin/grep -m 1 -E -o '/dev/loop.?') info "device ${DEVICE}" info "partitions list:" info "$(/sbin/partx -v "${INSTALL_PATH}/${IMAGE}")" BOOTP="${DEVICE}p1" ROOTP="${DEVICE}p2" return 0 } formatpartitions() { info "Formatting partitions" info "Boot : ${BOOTP} as ${1}" "/sbin/mkfs.${1}" "${BOOTP}" if [ ${?} -ne 0 ]; then error "line ${LINENO} error formating ${BOOTP} : exiting" /sbin/losetup -d "${DEVICE}" exit ${ERR_1} fi info "Root : ${ROOTP} as ${2}" "/sbin/mkfs.${2}" "${ROOTP}" if [ ${?} -ne 0 ]; then error "line ${LINENO} error formating ${ROOTP} : exiting" /sbin/losetup -d "${DEVICE}" exit ${ERR_1} fi BOOT_UUID=$(blkid -s UUID -o value UUID "${BOOTP}") info "Boot UUID: ${BOOT_UUID}" ROOT_UUID=$(blkid -s UUID -o value UUID "${ROOTP}") info "Root UUID: ${ROOT_UUID}" return 0 } copyingsystem() { info "mounting partitions, making mountpoint if necessary" if ! [ -d "${BOOT}" ]; then /bin/mkdir "${BOOT}" if [ ${?} -ne 0 ]; then error "line ${LINENO} error making directory ${BOOT} : exiting" exit ${ERR_1} fi fi if ! [ -d "${ROOT}" ]; then /bin/mkdir "${ROOT}" if [ ${?} -ne 0 ]; then error "line ${LINENO} error making directory ${ROOT} : exiting" exit ${ERR_1} fi fi /bin/mount "${BOOTP}" "${BOOT}" if [ ${?} -ne 0 ]; then error "line ${LINENO} error mounting ${BOOTP} : exiting" exit ${ERR_1} fi /bin/mount "${ROOTP}" "${ROOT}" if [ ${?} -ne 0 ]; then error "line ${LINENO} error mounting ${ROOTP} : exiting" exit ${ERR_1} fi info "making /etc/fstab" ### BUG : /mnt/arm_boot is set to vfat for all plateforms, odroid configuration says ext4. echo -e "proc /proc proc defaults 0 0\nUUID=${BOOT_UUID} /mnt/arm_boot vfat defaults 0 0\nUUID=${ROOT_UUID} / ext4 defaults 0 0" > "${BUILD_PATH}/etc/fstab" if [ ! -d "${BUILD_PATH}/boot/extlinux" ]; then info "making /boot/extlinux/extlinux.conf" mkdir -p "${BUILD_PATH}/boot/extlinux" fi if [ ! -f "${BUILD_PATH}/boot/extlinux/extlinux.conf" ]; then sed -e s/\/${ROOT_UUID}/g ${CONFIG_PATH}/extlinux.conf >"${BUILD_PATH}/boot/extlinux/extlinux.conf" KERNEL_ID=$(basename ${BUILD_PATH}/usr/lib/linux-*) sed -i -e s/\/${KERNEL_ID}/g "${BUILD_PATH}/boot/extlinux/extlinux.conf" fi ### TODO : Functionnalize case ${TARGET} in "rpi") info "copying 10-vchiq-permissions.rules" cp --preserve=mode "${CONFIG_PATH}/10-vchiq-permissions.rules" "${BUILD_PATH}/etc/udev/rules.d/" info "Making /etc/modules" echo -e "vchiq\nsnd_bcm2835\nvc4\nbrcmfmac" >> "${BUILD_PATH}"/etc/modules ARM_BOOT="${BUILD_PATH}/mnt/arm_boot" if ! [ -d "${ARM_BOOT}" ]; then mkdir -p "${ARM_BOOT}" fi info "copying modprobe.conf" /usr/bin/cp -v --preserve=mode "${CONFIG_PATH}/modprobe.conf" "${BUILD_PATH}/etc/" chown root:root "${BUILD_PATH}/etc/modprobe.conf" info "copying firmware, overlays in rpi boot partition" # cp -v --preserve=mode "${BUILD_PATH}/usr/lib/linux-"* "${BOOT}/dtb" cp -v --preserve=mode "${FIRMWARE_PATH}/${FIRMWARE_DIR}/boot/start"* "${ARM_BOOT}/" cp -v --preserve=mode "${FIRMWARE_PATH}/${FIRMWARE_DIR}/boot/fixup"* "${ARM_BOOT}/" cp -v --preserve=mode "${FIRMWARE_PATH}/${FIRMWARE_DIR}/boot/bootcode.bin"* "${ARM_BOOT}/" cp -vR --preserve=mode "${FIRMWARE_PATH}/${FIRMWARE_DIR}/boot/overlays" "${ARM_BOOT}/" info "copying u-boot binary to ${ARM_BOOT}" case ${TARGET_VERSION} in "0") info "copying u-boot for ${TARGET} 0" cp --preserve=mode "${BUILD_PATH}/usr/lib/u-boot/rpi_0_w/u-boot.bin" "${ARM_BOOT}/kernel.img" ;; "1") info "copying u-boot for ${TARGET} 1" cp --preserve=mode "${BUILD_PATH}/usr/lib/u-boot/rpi/u-boot.bin" "${ARM_BOOT}/kernel.img" ;; "2") info "copying u-boot for ${TARGET} 2" cp --preserve=mode "${BUILD_PATH}/usr/lib/u-boot/rpi_2/u-boot.bin" "${ARM_BOOT}/kernel.img" ;; "3_32") info "copying u-boot for ${TARGET} 3 32 bits" cp --preserve=mode "${BUILD_PATH}/usr/lib/u-boot/rpi_3_32b/u-boot.bin" "${ARM_BOOT}/kernel.img" ;; "3+") info "copying u-boot for ${TARGET} 3b+ 32 bits" cp --preserve=mode "${BUILD_PATH}/usr/lib/u-boot/rpi_3_32b/u-boot.bin" "${ARM_BOOT}/kernel.img" ;; esac # info "copying raspberry optionals files in opt" # /bin/rsync -rlptDH "${FIRMWARE_PATH}/${FIRMWARE_DIR}/opt/" "${BUILD_PATH}/opt/" info "copying wifi firmware file missing in kernel-firmware-nonfree" if ! [ -d "${ROOT}/usr/lib/firmware/brcm/" ]; then /bin/mkdir -p "${ROOT}/usr/lib/firmware/brcm/" fi if ! [ -f "${ROOT}/usr/lib/firmware/brcm/brcmfmac434"* ]; then /bin/cp --preserve=mode "${CONFIG_PATH}/brcmfmac434"* "${ROOT}/usr/lib/firmware/brcm/" if [ ${?} -ne 0 ]; then error "line ${LINENO} error copying wifi firmware in ${ROOTP}/usr/lib/firmware/brcm/ : exiting" exit ${ERR_1} fi fi info "copying Mageia image to root partition" /bin/rsync -rlptogDH --exclude "${ARM_BOOT}/" --exclude "qemu-arm-static*" "${BUILD_PATH}/" "${ROOT}/" /bin/rsync -rlptogDH "${ARM_BOOT}/" "${BOOT}/" ;; "odroid") ODROID_BOOT="${BUILD_PATH}/mnt/odroid_boot" if ! [ -d "${ODROID_BOOT}" ]; then mkdir -p "${ODROID_BOOT}" fi case ${TARGET_VERSION} in "xu4") info "copying u-boot for ${TARGET} ${TARGET_VERSION}" cp --preserve=mode "${BUILD_PATH}/usr/lib/u-boot/${TARGET}-${TARGET_VERSION}/u-boot.bin" "${ARM_BOOT}/" ;; esac # temporary code waiting inclusion of xu4 in Mageia kernel and u-boot info "Copying extlinux.conf on ${ODROID_BOOT}" cp --preserve=mode -R "${BUILD_PATH}/boot/extlinux" "${ODROID_BOOT}/" info "copying Mageia image to root partition" /bin/rsync -rlptogDH --exclude "${ODROID_BOOT}/" --exclude "qemu-arm-static*" "${BUILD_PATH}/" "${ROOT}/" /bin/rsync -rlptogDH "${ODROID_BOOT}/" "${BOOT}/" ;; "bananaPro") #TODO ;; esac ### END TODO # info "copying tools in /usr/local/bin/" # /bin/cp -v --preserve=mode "${SOURCE_PATH}/tools/" "${BUILD_PATH}/usr/local/bin/" # if ! [ ${?} -eq 0 ]; then # error "line ${LINENO} error copying tools" # ERRORN=$((${ERRORN}+1)) # fi # /bin/mkdir "${ROOT}/boot" copyingcommon # Syncing devices before unmounting /usr/bin/sync /usr/bin/umount "${BOOT}" "${ROOT}" if [ ${?} -eq 0 ]; then /bin/rmdir "${BOOT}" "${ROOT}" else error "line ${LINENO} error unmounting ${ROOT} or ${BOOT} : exiting" exit ${ERR_1} fi /usr/sbin/partx -d "${DEVICE}" if [ ${?} -ne 0 ]; then error "line ${LINENO} warning : error unmounting ${DEVICE} " exit ${ERR_1} fi warning "You can now burn the image ( ${INSTALL_PATH}/${IMAGE} ) on SD card" return 0 } # Copying files common to all systems copyingcommon() { title "Copying common files and configuration" rsync -rlptDH "${SOURCE_PATH}/common/" "${ROOT}/" rsync -rlptDH "${SOURCE_PATH}/tools/"*.sh "${ROOT}/usr/local/bin/" chown root:root "${ROOT}/usr/local/bin/" return 0 } function preImgCreation() { error "This function is called if no sourced file about fdisk was lauched." return 1 } function postPrepareChroot() { error "This function is called if no sourced file contain postPrepareChroot function." return 1 } ERRORN=0 ERR_1=1 ERR_DEFAULT_CONFIG=2 ERR_NO_CONFIG_FILE=3 ERR_4=4 ERR_5=5 ERR_NO_SPACE=6 ERR_7=7 ERR_8=8 ERR_9=9 ####################### # PROGRAMM START HERE # ####################### info ${0} SOURCE_PATH="$(/bin/dirname "$(readlink -f "${0}")")" INSTALL_PATH="${SOURCE_PATH}/arm" FILES_PATH="${SOURCE_PATH}/files" PLATFORMS_PATH="${SOURCE_PATH}/platforms" CMDNAME=$(/bin/basename "${0}") #while read -r;do # for MAGEIA_VERSION in $REPLY # do # if [ $MAGEIA_VERSION <= 5 ]; then # echo 'Mageia version >= 6 is needed' # exit # fi # break # done #done < /etc/version if [ ${#} == 0 ]; then help exit fi # parsing commandline TEMP=$(getopt -o h,a --long all,help,clean,create-chroot,addmedia,create-image,,config:,target:,target-version:,chroot,bootfs:,install-basesystem,update-mirror,build-path:,size:,nonfree,tainted -n ${CMDNAME} -- "${@}") if [ ${?} -ne 0 ] ; then error "line ${LINENO} Failed parsing options." >&2 ; exit ${ERR_1} ; fi eval set -- "${TEMP}" echo "${TEMP}" # Note the quotes around `$TEMP': they are essential! Or not, $( ) do the same as ` `. But there are the ` ' used ? while true; do case "${1}" in -h|--help) help exit 0 ;; -a|--all) OPT="all" shift 1 ;; --clean) OPT="clean" shift ;; --size) IMAGE_SIZE_P=${2} shift 2 ;; --build-path) INSTALL_PATH_P="${2}" shift 2 ;; --chroot) if [ -z ${OPT} ]; then OPT="chroot" fi shift ;; --create-chroot) if [ -z ${OPT} ]; then OPT="createchroot" fi shift ;; --addmedia) if [ -z ${OPT} ]; then OPT="addmedia" fi shift ;; --update-mirror) if [ -z ${OPT} ]; then OPT="updatemirror" fi shift ;; --install-basesystem) if [ -z ${OPT} ]; then OPT="installbasesystem" fi shift ;; --create-image) if [ -z ${OPT} ]; then CREATEIMAGE=true OPT="createimage" fi shift ;; --target) TARGET_P=${2} shift 2 ;; --target-version) TARGET_VERSION_P=${2} shift 2 ;; --config) CONFIG_PATH="${PLATFORMS_PATH}/${2}" shift 2 ;; --bootfs) BOOTFS_P=${2} shift 2 ;; --nonfree) NONFREE_P=1 ;; --tainted) TAINTED_P=1 ;; --) shift break;; *) error "Parameter ${1} does not exists " exit ${ERR_1};; esac done # path of config file if ! [ -d "${CONFIG_PATH}" ]; then info " Config path does not exists, defaulting to ./platforms/${TARGET}" CONFIG_PATH="${PLATFORMS_PATH}/${TARGET}" warning "Do you want to create it and to copy the template file in? [Y|n] " read yn if [ -z ${yn} ] || [ ${yn} = "Y" ] || [ ${yn} = "y" ]; then /usr/bin/mkdir "${CONFIG_PATH}/" /usr/bin/cp --preserve=mode "${SOURCE_PATH}/mageia4arm.cfg.template" "${CONFIG_PATH}/mageia4arm.cfg" warning "You need now to modify the config file (${CONFIG_PATH}/mageia4arm.cfg) and relaunch the script" exit ${ERR_DEFAULT_CONFIG} else error( "Error: Can't continue without config file, exiting" ) exit ${ERR_NO_CONFIG_FILE} fi fi if [ -e "${CONFIG_PATH}/mageia4arm.cfg" ]; then info "using ${CONFIG_PATH}/mageia4arm.cfg as config" source "${CONFIG_PATH}/mageia4arm.cfg" #NOTE1 : Here is sourced a file with variables. else warning "Config file does not exists, do you want i copy template ? [Y|n] " read yn if [ -z ${yn} ] || [ ${yn} = "Y" ] || [ ${yn} = "y" ]; then /usr/bin/cp --preserve=mode "${SOURCE_PATH}/mageia4arm.cfg.template" "${CONFIG_PATH}/mageia4arm.cfg" warning "You need now to modify the config file (${CONFIG_PATH}/mageia4arm.cfg) and relaunch the script" exit ${ERR_DEFAULT_CONFIG} fi fi # else # What are this "else fi" related to ? # # fi if ! [ -z "${IMAGE_SIZE_P}" ]; then IMAGE_SIZE=${IMAGE_SIZE_P} fi if ! [ -z "${INSTALL_PATH_P}" ]; then INSTALL_PATH=${INSTALL_PATH_P} fi if ! [ -z "${TARGET_P}" ]; then TARGET=${TARGET_P} fi if ! [ -z "${TARGET_VERSION_P}" ]; then TARGET_VERSION=${TARGET_VERSION_P} fi if ! [ -z "${BOOTFS_P}" ]; then BOOTFS=${BOOTFS_P} fi if ! [ -z "${NONFREE_P}" ]; then NONFREE=${NONFREE_P} fi if ! [ -z "${TAINTED_P}" ]; then TAINTED=${TAINTED_P} fi info "Option: "${OPT} IMAGE="Mageia-${MAGEIA_VERSION}-${TARGET}${TARGET_VERSION}.img" BOOT="/mnt/boot" ROOT="/mnt/root" BUILD_PATH="${INSTALL_PATH}/build" ARM_VERSION="armv7hl" # assign function for building image of TARGET ( rpi, odroid ) # case ${TARGET} in #NOTE2 : Why isn't it inside the sourced file ? Inside the .cfg ? It will make the code more flexible. # "bananaPro") # CREATEIMG="createbproimage" # ;; # # "odroid") # CREATEIMG="createxu3image" # ;; # # "rpi") # CREATEIMG="createrpiimage" # ;; # # *) # error "No Target : ${TARGET}" # exit ${ERR_1} # ;; # esac # Assigne a script for creating a particular target image (rpi, odroid, ...) if [ -e "${CONFIG_PATH}/specialFunctions.sh" ]; then source "${CONFIG_PATH}/specialFunctions.sh" fi info "target : ${TARGET}" info "target_version : ${TARGET_VERSION}" info "source path: ${SOURCE_PATH}" info "Install path: ${INSTALL_PATH}" info "Build path: ${BUILD_PATH}" info "Commande : ${CMDNAME}" info "Firmware path : ${FIRMWARE_PATH}" info "Firmware dir : ${FIRMWARE_DIR}" # Defining default image size to 7 go if [[ "${IMAGE_SIZE}" -lt 7 ]] || [[ "${IMAGE_SIZE}" -gt 128 ]]; then IMAGE_SIZE=7 fi # change dir to install path and create it if not existing if [ "${OPT}" != "clean" ]; then info "cd ${INSTALL_PATH}" if ! [ -e "${INSTALL_PATH}" ]; then /bin/mkdir -p "${INSTALL_PATH}" if [ -z ${?} ]; then error "line ${LINENO} can't make directory ${INSTALL_PATH} , exiting" exit ${ERR_1} fi fi cd "${INSTALL_PATH}" if [ -z ${?} ]; then error "line ${LINENO} can't change to directory ${INSTALL_PATH} , exiting" exit ${ERR_1} fi fi #if no parameters then display help message if [ -z ${OPT} ]; then OPT="--help" fi info "Image size is: ${IMAGE_SIZE} Go" case ${OPT} in "clean") clean ;; "all") verify_disk_space if [ ${?} -eq 1 ]; then echo -e "Not enough space on disk\nDo you want to continue anyway ? [Y,n]" read yn if [ ${yn} = "n" ]; then exit ${ERR_NO_SPACE} fi fi createchroot addmedia updatemirror installbasesystem preparechroot jumpchroot # ${CREATEIMG} createImageWrap ;; "createchroot") createchroot ;; "chroot") jumpchroot ;; "addmedia") addmedia ;; "updatemirror") updatemirror ;; "createimage") verify_disk_space if [ ${?} -eq 1 ]; then warning "Not enough space on disk" exit ${ERR_NO_SPACE} fi # ${CREATEIMG} createImageWrap ;; "installbasesystem") installbasesystem ;; esac if ! [ -z ${ERRORN} ]; then warning "Some errors occurs : ${ERRORN} errors" fi exit ${ERRORN}