aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJybz <j.biernacki@free.fr>2020-08-30 02:09:22 +0200
committerJybz <j.biernacki@free.fr>2020-08-30 02:09:22 +0200
commitf3dec362df236e5f964ca18bcb1d6b2cc4b68411 (patch)
treef54d69173ace9c2c3ed24f6834bada9f3c00634b
parenta507682ec01f690b8e106c7f87f61272dfa2d4d2 (diff)
downloadmageia4arm-f3dec362df236e5f964ca18bcb1d6b2cc4b68411.tar
mageia4arm-f3dec362df236e5f964ca18bcb1d6b2cc4b68411.tar.gz
mageia4arm-f3dec362df236e5f964ca18bcb1d6b2cc4b68411.tar.bz2
mageia4arm-f3dec362df236e5f964ca18bcb1d6b2cc4b68411.tar.xz
mageia4arm-f3dec362df236e5f964ca18bcb1d6b2cc4b68411.zip
Split script into two separate files, workflow and functions.
-rwxr-xr-xcreate_arm_image.sh881
-rwxr-xr-xfunctions.sh773
2 files changed, 828 insertions, 826 deletions
diff --git a/create_arm_image.sh b/create_arm_image.sh
index b79276b..34dcfd6 100755
--- a/create_arm_image.sh
+++ b/create_arm_image.sh
@@ -20,30 +20,7 @@
#Change the local to the most global
export LC_ALL=C
-function timestamp() {
- date "+[%H:%M:%S]"
-}
-
-
-function WaitToContinue() {
- read -p "Break... Press [ENTER] to continue." GARBAGE
-}
-
-function title() {
- echo -e "\e[1;32m$(timestamp) ${1}\e[0m"
-}
-
-function info() {
- echo -e "\e[36m$(timestamp) ${1}\e[0m"
-}
-
-function warning() {
- echo -e "\e[1;35m$(timestamp) ${1}\e[0m"
-}
-
-function error() {
- echo -e "\e[1;31m$(timestamp) ${1}\e[0m"
-}
+source "$(dirname $(realpath "$0"))/functions.sh"
function help() {
echo -e "${CMDNAME} [option] [size of image in Go]"
@@ -71,737 +48,6 @@ function help() {
}
-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
-}
-
-
-# creation of install path and copy of qemu ( installing it if not yet installed )
-function createchroot()
-{
- title "Making chroot"
- if ! [ -f /usr/share/distribution-gpg-keys/mageia/RPM-GPG-KEY-Mageia ]; then
- title "distribution-gpg-keys package not present : installing distribution-gpg-keys"
- #/usr/bin/dnf --assumeyes --setopt=install_weak_deps=False install distribution-gpg-keys
- installpkg "distribution-gpg-keys" "--setopt=install_weak_deps=False"
- if [ ${?} -ne 0 ]; then
- error "line ${LINENO} can't install distribution-gpg-keys : exiting"
- exit ${ERR_1}
- fi
- fi
-
- if ! [ -f /usr/bin/qemu-arm-static ]; then
- title "Qemu package not present : installing qemu packages"
- #/usr/bin/dnf --assumeyes --setopt=install_weak_deps=False install qemu-user-static
- installpkg "qemu-user-static" "--setopt=install_weak_deps=False"
- 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
- /usr/bin/systemctl is-active systemd-binfmt.service
- if [ ${?} -ne 0 ]; then
- title "Starting systemd-binfmt.service"
- /usr/bin/systemctl start systemd-binfmt.service
- if [ ${?} -ne 0 ]; then
- error "line ${LINENO} can't start qemu-user-static : exiting"
- exit ${ERR_1}
- fi
- else
- title "Restarting systemd-binfmt.service"
- /usr/bin/systemctl restart systemd-binfmt.service
- if [ ${?} -ne 0 ]; then
- error "line ${LINENO} can't start qemu-user-static : exiting"
- exit ${ERR_1}
- fi
- fi
- return 0
-}
-
-# enabling extra Mageia repositories
-function genusemirroroptions()
-{
-
- DNF_MIRROROPTS="--config=${DNF_CONFIGPATH} --forcearch=${ARM_VERSION} --nogpgcheck --releasever=${MAGEIA_VERSION}"
- if [ ! -z "${MIRROR}" ]; then
- DNF_MIRROROPTS="${DNF_MIRROROPTS} --disablerepo=* --repofrompath=mgarel,${MIRROR}/media/core/release/ --enablerepo=mgarel"
- if [ "${MAGEIA_VERSION}" != "cauldron" ]; then
- DNF_MIRROROPTS="${DNF_MIRROROPTS} --repofrompath=mgaup,${MIRROR}/media/core/updates/ --enablerepo=mgaup"
- fi
- if [ ${NONFREE} -eq 1 ]; then
- DNF_MIRROROPTS="${DNF_MIRROROPTS} --repofrompath=mgarel-nonfree,${MIRROR}/media/nonfree/release/ --enablerepo=mgarel-nonfree "
- if [ "${MAGEIA_VERSION}" != "cauldron" ]; then
- DNF_MIRROROPTS="${DNF_MIRROROPTS} --repofrompath=mgaup-nonfree,${MIRROR}/media/nonfree/updates/ --enablerepo=mgaup-nonfree"
- fi
- fi
- if [ ${TAINTED} -eq 1 ]; then
- DNF_MIRROROPTS="${DNF_MIRROROPTS} --repofrompath=mgarel-tainted,${MIRROR}/media/tainted/release/ --enablerepo=mgarel-tainted "
- if [ "${MAGEIA_VERSION}" != "cauldron" ]; then
- DNF_MIRROROPTS="${DNF_MIRROROPTS} --repofrompath=mgaup-tainted,${MIRROR}/media/tainted/updates/ --enablerepo=mgaup-tainted"
- fi
- fi
- fi
- export DNF_MIRROROPTS
- enableextrarepos
- return 0
-}
-
-# enabling extra Mageia repositories
-function enableextrarepos()
-{
- extrasect_baseprefix="mageia"
-# if [ "${MAGEIA_VERSION}" = "cauldron" ]; then
-# extrasect_baseprefix="cauldron"
-# extrasect_updatesprefix=""
-# else
-# extrasect_baseprefix="mageia"
- extrasect_updatesprefix="updates"
- # fi
- if [ ${NONFREE} -eq 1 ]; then
- title "activating non-free repos"
- DNFPARAM=--installroot="${BUILD_PATH}" config-manager --set-enabled "${extrasect_baseprefix}-${ARM_VERSION}-nonfree"
- if [ "${MAGEIA_VERSION}" != "cauldron" ]; then
- DNFPARAM=$DNFPARAM" --set-enabled ${extrasect_updatesprefix}-${ARM_VERSION}-nonfree"
- fi
- /usr/bin/dnf $DNFPARAM
- err=${?}
- if [ ${err} -ne 0 ]; then
- error "line ${LINENO} error ${err} - can't activate nonfree repositories : exiting"
- exit ${ERR_1}
- fi
- fi
- if [ ${TAINTED} -eq 1 ]; then
- title "activating tainted repos"
- DNFPARAM=--installroot="${BUILD_PATH}" config-manager --set-enabled "${extrasect_baseprefix}-${ARM_VERSION}-tainted"
- if [ "${MAGEIA_VERSION}" != "cauldron" ]; then
- DNFPARAM=$DNFPARAM" --set-enabled ${extrasect_updatesprefix}-${ARM_VERSION}-tainted"
- fi
- /usr/bin/dnf $DNFPARAM
- err=${?}
- if [ ${err} -ne 0 ]; then
- error "line ${LINENO} error ${err} - can't activate tainted repositories : exiting"
- exit ${ERR_1}
- fi
- fi
- return 0
-}
-
-# adding Mageia urpmi repositories
-function addurpmimedia()
-{
- title "Creating media ${MIRROR}"
-
- info "Removing old media"
- /sbin/urpmi.removemedia --urpmi-root "${BUILD_PATH}" -a
-
- info "Adding media"
- if [ ! -z "${MIRROR}" ] ; then
- /sbin/urpmi.addmedia --urpmi-root "${BUILD_PATH}" --ignorearch --distrib "${MIRROR}"
- else
- info "MIRROR variable not set, using mirrorlist."
- /sbin/urpmi.addmedia --urpmi-root "${BUILD_PATH}" --ignorearch --distrib --mirrorlist "http://mirrors.mageia.org/api/mageia.${MAGEIA_VERSION}.${ARM_VERSION}.list"
- fi
-
- 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 updateurpmmirror()
-{
- 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}"
- /usr/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
-
- # Workaround mga#26044.
- info "Preparing root filesystem tree"
- mkdir -p "${BUILD_PATH}/usr/bin"
- mkdir -p "${BUILD_PATH}/usr/sbin"
- mkdir -p "${BUILD_PATH}/usr/lib"
- ln -sr "${BUILD_PATH}/usr/bin" "${BUILD_PATH}/bin"
- ln -sr "${BUILD_PATH}/usr/sbin" "${BUILD_PATH}/sbin"
- ln -sr "${BUILD_PATH}/usr/lib" "${BUILD_PATH}/lib"
- if [ "${ARM_VERSION}" = "aarch64" ]; then
- mkdir -p "${BUILD_PATH}/usr/lib64"
- ln -sr "${BUILD_PATH}/usr/lib64" "${BUILD_PATH}/lib64"
- fi
-
- title "installing basesystem"
- installpkg "shadow-utils basesystem-minimal"
- if [ ${?} -ne 0 ]; then
- error "line ${LINENO} error installing shadow-utils or basesystem-minimal : exiting"
- exit ${ERR_1}
- fi
- if [ ${INSTALL_METHOD} = "urpmi" ]; then
- installpkg "urpmi locales"
- else
- installpkg "dnf dnf-plugins-core locales"
- fi
- return 0
-}
-
-function installpkg()
-{
- if [ ${INSTALL_METHOD} = "urpmi" ]; then
- /usr/sbin/urpmi --urpmi-root "$BUILD_PATH" --ignorearch --no-verify-rpm --auto --split-level 200 --split-length 200 $3 $1;
- else
- /usr/bin/dnf $2 --installroot="${BUILD_PATH}" ${DNF_MIRROROPTS} --assumeyes install $1;
- fi
-
-}
-function preparechroot()
-{
- title "Preparing chrooting in ${BUILD_PATH}"
-
- info "making /etc/hostname"
- echo "${HOSTNAME:="localhost.localdomain"}" > "${BUILD_PATH}/etc/hostname"
-
- info "copying second stage script in ${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 "configuring second_stage_install.sh for ${INSTALL_METHOD}"
- if [ ${INSTALL_METHOD} = "urpmi" ]; then
- sed -i -e "s/<INSTALL_EXEC>/sbin\/urpmi --no-verify-rpm --auto/g" "${BUILD_PATH}/second_stage_install.sh"
- else
- sed -i -e "s/<INSTALL_EXEC>/bin\/dnf --nogpgcheck --assumeyes install/g" "${BUILD_PATH}/second_stage_install.sh"
- fi
-
- info "Preparation for setting root and user account"
- if [ -n "${ROOT_PWD}" ]; then #If root password defined, it will be setted at the end of the chroot of the second_stage_install.sh script
- echo -e "/usr/bin/passwd << EOF\n${ROOT_PWD}\n${ROOT_PWD}\nEOF\n" >>"${BUILD_PATH}/second_stage_install.sh"
- else
- info "No root password... One password will be set at the first login."
- echo -e "/usr/bin/passwd -d root\n/usr/bin/passwd -e root\n" >>"${BUILD_PATH}/second_stage_install.sh"
- fi
-
- if [ -n "${ID_USER}" ]; then #If user ID defined, it will be setted at the end of the chroot of the second_stage_install.sh script
- echo -e " /sbin/useradd ${ID_USER}\n" >>"${BUILD_PATH}/second_stage_install.sh"
- if [ -n "${PASSWORD}" ]; then
- echo -e "/usr/bin/passwd ${ID_USER} << EOF\n${PASSWORD}\n${PASSWORD}\nEOF" >>"${BUILD_PATH}/second_stage_install.sh"
- else
- echo -e "/usr/bin/passwd -d ${ID_USER}\n" >>"${BUILD_PATH}/second_stage_install.sh"
- fi
- else
- info "No user defined, no user account created."
- fi
-
- 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"
- /usr/bin/mount -B /dev "${BUILD_PATH}/dev"
- if [ ${?} -ne 0 ]; then
- error "line ${LINENO} error mounting ${BUILD_PATH}/dev : exiting"
- exit ${ERR_1}
- fi
- /usr/bin/mount -B /sys "${BUILD_PATH}/sys"
- if [ ${?} -ne 0 ]; then
- error "line ${LINENO} error mounting ${BUILD_PATH}/sys : exiting"
- exit ${ERR_1}
- fi
- /usr/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"
- /usr/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
- info "chrooting to ${BUILD_PATH}"
- if [ "$OPT" = "chroot" ]; then
- info "/sbin/chroot ${BUILD_PATH}"
- /sbin/chroot "${BUILD_PATH}"
- RET=${?}
- if [ ${RET} -ne 0 ]; then
- error "line ${LINENO} Warning : chrooting to ${BUILD_PATH} retrurn an error ${RET}"
- ERRORN=$((${ERRORN}+1))
- fi
- else
- info "/sbin/chroot --userspec root:root ${BUILD_PATH} /usr/bin/bash -v -c 'bash /second_stage_install.sh 2>&1'"
- /sbin/chroot --userspec root:root "${BUILD_PATH}" /usr/bin/bash -v -c 'bash /second_stage_install.sh 2>&1'
- RET=${?}
- if [ ${RET} -ne 0 ]; then
- error "line ${LINENO} Warning : chrooting to ${BUILD_PATH} retrurn an error ${RET}"
- ERRORN=$((${ERRORN}+1))
- fi
- fi
-
- info "unmounting dev, sys, proc"
- /usr/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
- /usr/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
- /usr/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 createImageWrap()
-{
- title "Wrap image creation"
- preImgCreation
- if [ ${?} -ne 0 ]; then
- error "line ${LINENO} error in the process ${CONFIG_PATH}/specialFunctions.sh ."
- exit ${ERR_1}
- fi
- createimage
- if [ -z "${BOOTFS}" ]; then
- BOOTFS="ext4"
- fi
- formatpartitions ${BOOTFS} ext4
-
- return 0
-}
-
-
-function createimage()
-{
- title " in ${IMAGE}"
- if [ -f "${INSTALL_PATH}/${IMAGE}" ]; then
- warning "Deleting previous image"
- /usr/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"
- /usr/bin/dd if=/dev/zero of="${INSTALL_PATH}/${IMAGE}" bs=1MB count=$(( ${IMAGE_SIZE} * 1024 )) status=progress
- if [ ${?} -ne 0 ]; then
- error "line ${LINENO} can't make image at ${INSTALL_PATH}/${IMAGE} : exiting"
- exit ${ERR_1}
- fi
-
- loopingImage
-
- if [ ${?} -ne 0 ]; then
- error "line ${LINENO} error in the process ${CONFIG_PATH}/specialFunctions.sh ."
- exit ${ERR_1}
- fi
-
- info "making partitions"
- echo -e "${FDISK_SCRIPT}" | /sbin/fdisk ${DEVICE}
-
- #Activate 'pY' : /dev/loopXpY
- partx -vu "${DEVICE}"
- #Previous function give us a list of partition. It is easy to get it and define prior this list the partition.
- #But... How to distinguish between the boot p1 and the root p2 if both are empty and ext4 ? ...
-
- if [ 1 -eq ${SEPARATE_BOOT_PARTITION} ]; then
- BOOTP="${DEVICE}p1"
- ROOTP="${DEVICE}p2"
- else
- ROOTP="${DEVICE}p1"
- fi
- return 0
-}
-
-
-function loopingImage()
-{
- title "Looping image ..."
-
- # Mettre en place et contrôler des périphériques boucle.
- # -f, --find trouver le premier périphérique inutilisé
- # --show afficher le nom du périphérique après configuration (avec -f)
- DEVICE=$(/sbin/losetup -f --show "${INSTALL_PATH}/${IMAGE}")
-
- return 0
-}
-
-
-function formatpartitions()
-{
- info "Formatting partitions"
- if [ 1 -eq ${SEPARATE_BOOT_PARTITION} ]; then
- 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
- BOOT_UUID=$(blkid -s UUID -o value UUID "${BOOTP}")
- info "Boot UUID: ${BOOT_UUID}"
- 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
- ROOT_UUID=$(blkid -s UUID -o value UUID "${ROOTP}")
- info "Root UUID: ${ROOT_UUID}"
-
- return 0
-}
-
-function generateExtlinux()
-{
- info "Generate extlinux if extlinux.conf exists."
- if [ -e "${CONFIG_PATH}/extlinux.conf" ]; then
- info "\tFound extlinux.conf"
- if [ ! -d "${BUILD_PATH}/boot/extlinux" ]; then
- info "making /boot/extlinux/extlinux.conf"
- /usr/bin/rm -rf "${BUILD_PATH}/boot/extlinux"
- mkdir -p "${BUILD_PATH}/boot/extlinux"
- fi
- if [ ! -f "${BUILD_PATH}/boot/extlinux/extlinux.conf" ]; then
- info "\tTuning extlinux.conf"
- cp "${CONFIG_PATH}/extlinux.conf" "${BUILD_PATH}/boot/extlinux/extlinux.conf"
- #In order to use the UUID, a initrd file is necessary.
- sed -i -e "s/<UUID>/${ROOT_UUID}/g" "${BUILD_PATH}/boot/extlinux/extlinux.conf"
- sed -i -e "s/<BOOT_ARGS>/${BOOT_ARGS}/g" "${BUILD_PATH}/boot/extlinux/extlinux.conf"
- KERNEL_ID=$(basename ${BUILD_PATH}/usr/lib/linux-*)
- sed -i -e "s/<FDTDIR>/${KERNEL_ID}/g" "${BUILD_PATH}/boot/extlinux/extlinux.conf"
- fi
- fi
-}
-
-function copyingsystem()
-{
- generateExtlinux
-
- info "Remove second_stage_install.sh"
- /usr/bin/rm -f "${BUILD_PATH}/second_stage_install.sh"
-
- ### BUG : rpi3b+64b is using a bootloader partition, in which only the bootloader lays. Here, everything is copying into.
- if [ 1 -eq ${SEPARATE_BOOT_PARTITION} ]; then
- ARM_BOOT="${BUILD_PATH}/mnt/arm_boot"
- if ! [ -d "${ARM_BOOT}" ]; then
- rm -rf "${ARM_BOOT}"
- mkdir -p "${ARM_BOOT}"
- fi
- info "copying Mageia image to root partition"
- /usr/bin/rsync -rlptogDH --exclude "${ARM_BOOT}/" --exclude "qemu-arm-static*" "${BUILD_PATH}/" "${ROOT}/"
- /usr/bin/rsync -rlptogDH "${ARM_BOOT}/" "${BOOT}/"
- #/usr/bin/rsync -rlptogDH "${BUILD_PATH}/boot/" "${BOOT}/"
- else
- info "copying Mageia image to root partition"
- /usr/bin/rsync -rlptogDH --exclude "qemu-arm-static*" "${BUILD_PATH}/" "${ROOT}/"
- fi
-
- copyingCustomSystem
- if [ ${?} -ne 0 ]; then
- error "line ${LINENO} error in the process ${CONFIG_PATH}/specialFunctions.sh ."
- exit ${ERR_1}
- fi
-
- copyingcommon
-
- sync
- warning "You can now burn the image ( ${INSTALL_PATH}/${IMAGE} ) on SD card"
- info "pv \"${INSTALL_PATH}/${IMAGE}\" | dd of=/dev/mmcblk#"
- return 0
-}
-
-
-function mountPartitions(){
- info "mounting partitions, making mountpoint if necessary"
-
- if [ 1 -eq ${SEPARATE_BOOT_PARTITION} ]; then
- if ! [ -d "${BOOT}" ]; then
- /usr/bin/mkdir "${BOOT}"
- if [ ${?} -ne 0 ]; then
- error "line ${LINENO} error making directory ${BOOT} : exiting"
- exit ${ERR_1}
- fi
- fi
- /usr/bin/mount "${BOOTP}" "${BOOT}"
- if [ ${?} -ne 0 ]; then
- error "line ${LINENO} error mounting ${BOOTP} : exiting"
- exit ${ERR_1}
- fi
- fi
-
- if ! [ -d "${ROOT}" ]; then
- /usr/bin/mkdir "${ROOT}"
- if [ ${?} -ne 0 ]; then
- error "line ${LINENO} error making directory ${ROOT} : exiting"
- exit ${ERR_1}
- fi
- fi
- /usr/bin/mount "${ROOTP}" "${ROOT}"
- if [ ${?} -ne 0 ]; then
- error "line ${LINENO} error mounting ${ROOTP} : exiting"
- exit ${ERR_1}
- fi
-}
-
-
-function unmountingPartitions()
-{
- title "Unmounting partitions..."
-
- # Syncing devices before unmounting
- /usr/bin/sync
-
- if [ -z "${BOOTP}" ] && [ -z "${ROOTP}" ] ; then
- warning "Root partition and Boot partition not defined !"
-
- for LOOP in $(losetup -l -O NAME,BACK-FILE -n | grep "${IMAGE}" | cut -d ' ' -f 1 ) ; do
- IFS=$'\n'
- for PARTITION in $(mount -l | grep ${LOOP}); do
- MOUNTPOINT=$(echo "$PARTITION" | cut -d ' ' -f 3)
- PARTITION=$(echo "$PARTITION" | cut -d ' ' -f 1)
- info "unmount ${PARTITION} and remove ${MOUNTPOINT}"
- /usr/bin/umount "${PARTITION}"
- if [ ${?} -eq 0 ]; then
- /usr/bin/rmdir "${MOUNTPOINT}"
- else
- error "line ${LINENO} error unmounting ${BOOT}..."
- fi
- done
- unset IFS
- done
- else
- if [ ! -z "${BOOTP}" ]; then
- /usr/bin/umount "${BOOTP}"
- if [ ${?} -eq 0 ]; then
- /usr/bin/rmdir "${BOOT}"
- else
- error "line ${LINENO} error unmounting ${BOOT}..."
- fi
- fi
- /usr/bin/umount "${ROOTP}"
- if [ ${?} -eq 0 ]; then
- /usr/bin/rmdir "${ROOT}"
- else
- error "line ${LINENO} error unmounting ${ROOT}..."
- fi
- fi
- return 0
-}
-
-
-function unloopingImage(){
- title "Unlooping image..."
- # Syncing devices before unmounting
- /usr/bin/sync
-
- # [root@jabztop mageia4arm (master)]# losetup -l -O NAME,BACK-FILE -n
- # /dev/loop0 /home/jibz/workspaces/mageia4arm/build/Mageia-7-bananaPro1.img (deleted)
- info "Looped devices to unmount : $(losetup -l -O NAME,BACK-FILE -n | grep "${IMAGE}" | cut -d ' ' -f 1 ) "
-
- for LOOP in $(losetup -l -O NAME,BACK-FILE -n | grep "${IMAGE}" | cut -d ' ' -f 1 ) ; do
- info "removing ${LOOP}"
- for PARTITION in ${LOOP}p* ; do
- partx -dv "${PARTITION}"
- done
-# losetup -d "${LOOP}"
- kpartx -d "${INSTALL_PATH}/${IMAGE}"
- done
-
- return 0
-}
-
-
-# Copying files common to all systems
-function copyingcommon()
-{
- title "Copying common files and configuration"
- rsync -rlptDH "${SOURCE_PATH}/common/" "${ROOT}/"
- rsync -rlptDH "${SOURCE_PATH}/tools/"*.sh "${ROOT}/usr/local/usr/bin/"
- chown root:root "${ROOT}/usr/local/usr/bin/"
- return 0
-}
-
-
-function mkfstab()
-{
- title "making /etc/fstab"
- if [ 1 -eq ${SEPARATE_BOOT_PARTITION} ]; then
- echo -e "proc\t/proc\tproc\tdefaults\t0\t0\nUUID=${BOOT_UUID}\t/mnt/arm_boot\t${BOOTFS}\tdefaults\t0\t0\nUUID=${ROOT_UUID}\t/\text4\tdefaults\t0\t0" > "${BUILD_PATH}/etc/fstab"
- else
- echo -e "proc\t/proc\tproc\tdefaults\t0\t0\nUUID=${ROOT_UUID}\t/\text4\tdefaults\t0\t0" > "${BUILD_PATH}/etc/fstab"
- fi
- return 0
-}
-
-
-# cleaning build space
-function clean()
-{
- title "Cleaning"
-
- info "In case script failed or crash inside the chroot, need to unmount dev|sys|proc..."
- /bin/umount -lf "${BUILD_PATH}/dev"
- /bin/umount -lf "${BUILD_PATH}/sys"
- /bin/umount -lf "${BUILD_PATH}/proc"
-
- unmountingPartitions
- unloopingImage
-
- # Removing old Build directory
- if [ -d "${BUILD_PATH}" ]; then
- info "Removing ${BUILD_PATH}"
- /usr/bin/rm -Rf "${BUILD_PATH}"
- else
- warning "${BUILD_PATH} does not exists"
- fi
- # removing old image
- if [ -e "${INSTALL_PATH}/${IMAGE}" ]; then
- info "Removing ${IMAGE}"
- /usr/bin/rm -f "${INSTALL_PATH}/${IMAGE}"
- else
- warning "${IMAGE} does not exists"
- fi
-
- return 0
-}
-
-
-function generateExtra()
-{
- if [ ${GEN_CHECKSUM} ] ; then
- title "Generate checksum"
- md5sum "${INSTALL_PATH}/${IMAGE}" > "${INSTALL_PATH}/${IMAGE}.md5"
- sha512sum "${INSTALL_PATH}/${IMAGE}" > "${INSTALL_PATH}/${IMAGE}.sha512"
- sha384sum "${INSTALL_PATH}/${IMAGE}" > "${INSTALL_PATH}/${IMAGE}.sha3"
- fi
- if [ ${GEN_GZ} ] ; then
- title "Image compression"
- pv "${INSTALL_PATH}/${IMAGE}" | gzip -9 >"${INSTALL_PATH}/${IMAGE}.gz"
- fi
- if [ ${GEN_SIGN} ]; then
- pushd "${INSTALL_PATH}"
- gpg --sign ${IMAGE}.md5
- gpg --sign ${IMAGE}.sha512
- gpg --sign ${IMAGE}.sha384
- popd
- fi
-}
-
-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 is containing postPrepareChroot function."
- return 1
-}
-
-function bunrningBootloader()
-{
- error "This function is called if no sourced file is containing bunrningBootloader function."
- return 1
-}
-
-function copyingCustomSystem()
-{
- error "This function is called if no sourced file is containing copyingCustomSystem function."
- return 1
-}
-
-
-
-ERRORN=0
-ERR_1=1
-ERR_DEFAULT_CONFIG=2
-ERR_NO_CONFIG_FILE=3
-ERR_NOT_ROOT=4
-ERR_DEPENDENCY_MISSING=5
-ERR_NO_SPACE=6
-ERR_7=7
-ERR_8=8
-ERR_9=9
-
-SEPARATE_BOOT_PARTITION=1
-
-#######################
-# PROGRAMM START HERE #
-#######################
-
-
info ${0}
#Check dependencies :
@@ -830,7 +76,7 @@ fi
# parsing commandline
-TEMP=$(getopt -o h,a --long all,help,clean,create-chroot,prepare-chroot,jump-chroot,add-urpmimedia,create-image,,config:,target:,target-version:,chroot,bootfs:,install-basesystem,update-mirror,build-path:,size:,nonfree,tainted -n ${CMDNAME} -- "${@}")
+TEMP=$(getopt -o h,a --long all,help,clean,create-chroot,prepare-chroot,jump-chroot,add-urpmimedia,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}"
@@ -838,20 +84,18 @@ 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
+ --add-urpmimedia)
+ if [ -z ${OPT} ]; then
+ OPT="addurpmimedia"
+ fi
+ shift
;;
-a|--all)
OPT="all"
shift 1
;;
- --clean)
- OPT="clean"
- shift
- ;;
- --size)
- IMAGE_SIZE_P=${2}
+ --bootfs)
+ BOOTFS_P=${2}
shift 2
;;
--build-path)
@@ -864,47 +108,58 @@ while true; do
fi
shift
;;
+ --clean)
+ OPT="clean"
+ shift
+ ;;
+ --config)
+ CONFIG_PATH="${PLATFORMS_PATH}/${2}"
+ shift 2
+ ;;
--create-chroot)
if [ -z ${OPT} ]; then
OPT="createchroot"
fi
shift
;;
- --prepare-chroot)
+ --create-image)
if [ -z ${OPT} ]; then
- OPT="preparechroot"
+ OPT="createimage"
fi
shift
;;
- --jump-chroot)
+ -h|--help)
+ help
+ exit 0
+ ;;
+ --install-basesystem)
if [ -z ${OPT} ]; then
- OPT="jumpchroot"
+ OPT="installbasesystem"
fi
shift
;;
- --add-urpmimedia)
+ --jump-chroot)
if [ -z ${OPT} ]; then
- OPT="addurpmimedia"
+ OPT="jumpchroot"
fi
shift
;;
- --update-mirror)
- if [ -z ${OPT} ]; then
- OPT="updatemirror"
- fi
+ --nonfree)
+ NONFREE_P=1
shift
;;
- --install-basesystem)
+ --prepare-chroot)
if [ -z ${OPT} ]; then
- OPT="installbasesystem"
+ OPT="preparechroot"
fi
shift
;;
- --create-image)
- if [ -z ${OPT} ]; then
- CREATEIMAGE=true
- OPT="createimage"
- fi
+ --size)
+ IMAGE_SIZE_P=${2}
+ shift 2
+ ;;
+ --tainted)
+ TAINTED_P=1
shift
;;
--target)
@@ -915,25 +170,15 @@ while true; do
TARGET_VERSION_P=${2}
shift 2
;;
- --config)
- CONFIG_PATH="${PLATFORMS_PATH}/${2}"
- shift 2
- ;;
- --bootfs)
- BOOTFS_P=${2}
- shift 2
- ;;
- --nonfree)
- NONFREE_P=1
- shift
- ;;
- --tainted)
- TAINTED_P=1
+ --update-mirror)
+ if [ -z ${OPT} ]; then
+ OPT="updatemirror"
+ fi
shift
;;
- --)
- shift
- break;;
+# --)
+# shift
+# break;;
*)
error "Parameter ${1} does not exists "
exit ${ERR_1};;
@@ -971,38 +216,22 @@ else
fi
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}
-else
- NONFREE=0
-fi
-if ! [ -z "${TAINTED_P}" ]; then
- TAINTED=${TAINTED_P}
-else
- TAINTED=0
-fi
+# VARIABLE_A=${VARIABLE_B_IF_EXISTS:=${VARIABLE_C_IF_B_DOESNT_EXISTS}}
+IMAGE_SIZE=${IMAGE_SIZE_P:=${IMAGE_SIZE}}
+INSTALL_PATH=${INSTALL_PATH_P:=${INSTALL_PATH}}
+TARGET=${TARGET_P:=${TARGET}}
+TARGET_VERSION=${TARGET_VERSION_P:=${TARGET_VERSION}}
+BOOTFS=${BOOTFS_P:=${BOOTFS}}
+NONFREE=${NONFREE_P:=0}
+TAINTED=${TAINTED_P:=0}
-info "Option: "${OPT}
+info "Option: "${OPT}
BUILD_PATH="${INSTALL_PATH}/build-${TARGET}${TARGET_VERSION}"
-# ARM_VERSION="armv7hl"
+
DNF_CONFIGPATH="$(dirname $(realpath "$0"))/mageia4arm-dnf.conf"
+
# Assigne a script for creating a particular target image (rpi, odroid, ...)
if [ -e "${CONFIG_PATH}/specialFunctions.sh" ]; then
source "${CONFIG_PATH}/specialFunctions.sh"
diff --git a/functions.sh b/functions.sh
new file mode 100755
index 0000000..cec3e55
--- /dev/null
+++ b/functions.sh
@@ -0,0 +1,773 @@
+#!/usr/bin/bash
+
+# Copyright (C) 2017-2018 Daniel Tartavel-jeannot <contact@librepc.com>
+# Jean-Baptiste Biernacki <j.biernacki@free.fr>
+# Copyright (C) 2020 Neal Gompa <ngompa13@gmail.com>
+#
+# 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,dnf 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 <http://www.gnu.org/licenses/>.
+
+#Change the local to the most global
+export LC_ALL=C
+
+function timestamp() {
+ date "+[%H:%M:%S]"
+}
+
+
+function WaitToContinue() {
+ read -p "Break... Press [ENTER] to continue." GARBAGE
+}
+
+function title() {
+ echo -e "\e[1;32m$(timestamp) ${1}\e[0m"
+}
+
+function info() {
+ echo -e "\e[36m$(timestamp) ${1}\e[0m"
+}
+
+function warning() {
+ echo -e "\e[1;35m$(timestamp) ${1}\e[0m"
+}
+
+function error() {
+ echo -e "\e[1;31m$(timestamp) ${1}\e[0m"
+}
+
+
+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
+}
+
+
+# creation of install path and copy of qemu ( installing it if not yet installed )
+function createchroot()
+{
+ title "Making chroot"
+ if ! [ -f /usr/share/distribution-gpg-keys/mageia/RPM-GPG-KEY-Mageia ]; then
+ title "distribution-gpg-keys package not present : installing distribution-gpg-keys"
+ #/usr/bin/dnf --assumeyes --setopt=install_weak_deps=False install distribution-gpg-keys
+ installpkg "distribution-gpg-keys" "--setopt=install_weak_deps=False"
+ if [ ${?} -ne 0 ]; then
+ error "line ${LINENO} can't install distribution-gpg-keys : exiting"
+ exit ${ERR_1}
+ fi
+ fi
+
+ if ! [ -f /usr/bin/qemu-arm-static ]; then
+ title "Qemu package not present : installing qemu packages"
+ #/usr/bin/dnf --assumeyes --setopt=install_weak_deps=False install qemu-user-static
+ installpkg "qemu-user-static" "--setopt=install_weak_deps=False"
+ 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
+ /usr/bin/systemctl is-active systemd-binfmt.service
+ if [ ${?} -ne 0 ]; then
+ title "Starting systemd-binfmt.service"
+ /usr/bin/systemctl start systemd-binfmt.service
+ if [ ${?} -ne 0 ]; then
+ error "line ${LINENO} can't start qemu-user-static : exiting"
+ exit ${ERR_1}
+ fi
+ else
+ title "Restarting systemd-binfmt.service"
+ /usr/bin/systemctl restart systemd-binfmt.service
+ if [ ${?} -ne 0 ]; then
+ error "line ${LINENO} can't start qemu-user-static : exiting"
+ exit ${ERR_1}
+ fi
+ fi
+ return 0
+}
+
+# enabling extra Mageia repositories
+function genusemirroroptions()
+{
+
+ DNF_MIRROROPTS="--config=${DNF_CONFIGPATH} --forcearch=${ARM_VERSION} --nogpgcheck --releasever=${MAGEIA_VERSION}"
+ if [ ! -z "${MIRROR}" ]; then
+ DNF_MIRROROPTS="${DNF_MIRROROPTS} --disablerepo=* --repofrompath=mgarel,${MIRROR}/media/core/release/ --enablerepo=mgarel"
+ if [ "${MAGEIA_VERSION}" != "cauldron" ]; then
+ DNF_MIRROROPTS="${DNF_MIRROROPTS} --repofrompath=mgaup,${MIRROR}/media/core/updates/ --enablerepo=mgaup"
+ fi
+ if [ ${NONFREE} -eq 1 ]; then
+ DNF_MIRROROPTS="${DNF_MIRROROPTS} --repofrompath=mgarel-nonfree,${MIRROR}/media/nonfree/release/ --enablerepo=mgarel-nonfree "
+ if [ "${MAGEIA_VERSION}" != "cauldron" ]; then
+ DNF_MIRROROPTS="${DNF_MIRROROPTS} --repofrompath=mgaup-nonfree,${MIRROR}/media/nonfree/updates/ --enablerepo=mgaup-nonfree"
+ fi
+ fi
+ if [ ${TAINTED} -eq 1 ]; then
+ DNF_MIRROROPTS="${DNF_MIRROROPTS} --repofrompath=mgarel-tainted,${MIRROR}/media/tainted/release/ --enablerepo=mgarel-tainted "
+ if [ "${MAGEIA_VERSION}" != "cauldron" ]; then
+ DNF_MIRROROPTS="${DNF_MIRROROPTS} --repofrompath=mgaup-tainted,${MIRROR}/media/tainted/updates/ --enablerepo=mgaup-tainted"
+ fi
+ fi
+ fi
+ export DNF_MIRROROPTS
+ enableextrarepos
+ return 0
+}
+
+# enabling extra Mageia repositories
+function enableextrarepos()
+{
+ extrasect_baseprefix="mageia"
+# if [ "${MAGEIA_VERSION}" = "cauldron" ]; then
+# extrasect_baseprefix="cauldron"
+# extrasect_updatesprefix=""
+# else
+# extrasect_baseprefix="mageia"
+ extrasect_updatesprefix="updates"
+ # fi
+ if [ ${NONFREE} -eq 1 ]; then
+ title "activating non-free repos"
+ DNFPARAM=--installroot="${BUILD_PATH}" config-manager --set-enabled "${extrasect_baseprefix}-${ARM_VERSION}-nonfree"
+ if [ "${MAGEIA_VERSION}" != "cauldron" ]; then
+ DNFPARAM=$DNFPARAM" --set-enabled ${extrasect_updatesprefix}-${ARM_VERSION}-nonfree"
+ fi
+ /usr/bin/dnf $DNFPARAM
+ err=${?}
+ if [ ${err} -ne 0 ]; then
+ error "line ${LINENO} error ${err} - can't activate nonfree repositories : exiting"
+ exit ${ERR_1}
+ fi
+ fi
+ if [ ${TAINTED} -eq 1 ]; then
+ title "activating tainted repos"
+ DNFPARAM=--installroot="${BUILD_PATH}" config-manager --set-enabled "${extrasect_baseprefix}-${ARM_VERSION}-tainted"
+ if [ "${MAGEIA_VERSION}" != "cauldron" ]; then
+ DNFPARAM=$DNFPARAM" --set-enabled ${extrasect_updatesprefix}-${ARM_VERSION}-tainted"
+ fi
+ /usr/bin/dnf $DNFPARAM
+ err=${?}
+ if [ ${err} -ne 0 ]; then
+ error "line ${LINENO} error ${err} - can't activate tainted repositories : exiting"
+ exit ${ERR_1}
+ fi
+ fi
+ return 0
+}
+
+# adding Mageia urpmi repositories
+function addurpmimedia()
+{
+ title "Creating media ${MIRROR}"
+
+ info "Removing old media"
+ /sbin/urpmi.removemedia --urpmi-root "${BUILD_PATH}" -a
+
+ info "Adding media"
+ if [ ! -z "${MIRROR}" ] ; then
+ /sbin/urpmi.addmedia --urpmi-root "${BUILD_PATH}" --ignorearch --distrib "${MIRROR}"
+ else
+ info "MIRROR variable not set, using mirrorlist."
+ /sbin/urpmi.addmedia --urpmi-root "${BUILD_PATH}" --ignorearch --distrib --mirrorlist "http://mirrors.mageia.org/api/mageia.${MAGEIA_VERSION}.${ARM_VERSION}.list"
+ fi
+
+ 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 updateurpmmirror()
+{
+ 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}"
+ /usr/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
+
+ # Workaround mga#26044.
+ info "Preparing root filesystem tree"
+ mkdir -p "${BUILD_PATH}/usr/bin"
+ mkdir -p "${BUILD_PATH}/usr/sbin"
+ mkdir -p "${BUILD_PATH}/usr/lib"
+ ln -sr "${BUILD_PATH}/usr/bin" "${BUILD_PATH}/bin"
+ ln -sr "${BUILD_PATH}/usr/sbin" "${BUILD_PATH}/sbin"
+ ln -sr "${BUILD_PATH}/usr/lib" "${BUILD_PATH}/lib"
+ if [ "${ARM_VERSION}" = "aarch64" ]; then
+ mkdir -p "${BUILD_PATH}/usr/lib64"
+ ln -sr "${BUILD_PATH}/usr/lib64" "${BUILD_PATH}/lib64"
+ fi
+
+ title "installing basesystem"
+ installpkg "shadow-utils basesystem-minimal"
+ if [ ${?} -ne 0 ]; then
+ error "line ${LINENO} error installing shadow-utils or basesystem-minimal : exiting"
+ exit ${ERR_1}
+ fi
+ if [ ${INSTALL_METHOD} = "urpmi" ]; then
+ installpkg "urpmi locales"
+ else
+ installpkg "dnf dnf-plugins-core locales"
+ fi
+ return 0
+}
+
+function installpkg()
+{
+ if [ ${INSTALL_METHOD} = "urpmi" ]; then
+ /usr/sbin/urpmi --urpmi-root "$BUILD_PATH" --ignorearch --no-verify-rpm --auto --split-level 200 --split-length 200 $3 $1;
+ else
+ /usr/bin/dnf $2 --installroot="${BUILD_PATH}" ${DNF_MIRROROPTS} --assumeyes install $1;
+ fi
+
+}
+function preparechroot()
+{
+ title "Preparing chrooting in ${BUILD_PATH}"
+
+ info "making /etc/hostname"
+ echo "${HOSTNAME:="localhost.localdomain"}" > "${BUILD_PATH}/etc/hostname"
+
+ info "copying second stage script in ${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 "configuring second_stage_install.sh for ${INSTALL_METHOD}"
+ if [ ${INSTALL_METHOD} = "urpmi" ]; then
+ sed -i -e "s/<INSTALL_EXEC>/sbin\/urpmi --no-verify-rpm --auto/g" "${BUILD_PATH}/second_stage_install.sh"
+ else
+ sed -i -e "s/<INSTALL_EXEC>/bin\/dnf --nogpgcheck --assumeyes install/g" "${BUILD_PATH}/second_stage_install.sh"
+ fi
+
+ info "Preparation for setting root and user account"
+ if [ -n "${ROOT_PWD}" ]; then #If root password defined, it will be setted at the end of the chroot of the second_stage_install.sh script
+ echo -e "/usr/bin/passwd << EOF\n${ROOT_PWD}\n${ROOT_PWD}\nEOF\n" >>"${BUILD_PATH}/second_stage_install.sh"
+ else
+ info "No root password... One password will be set at the first login."
+ echo -e "/usr/bin/passwd -d root\n/usr/bin/passwd -e root\n" >>"${BUILD_PATH}/second_stage_install.sh"
+ fi
+
+ if [ -n "${ID_USER}" ]; then #If user ID defined, it will be setted at the end of the chroot of the second_stage_install.sh script
+ echo -e " /sbin/useradd ${ID_USER}\n" >>"${BUILD_PATH}/second_stage_install.sh"
+ if [ -n "${PASSWORD}" ]; then
+ echo -e "/usr/bin/passwd ${ID_USER} << EOF\n${PASSWORD}\n${PASSWORD}\nEOF" >>"${BUILD_PATH}/second_stage_install.sh"
+ else
+ echo -e "/usr/bin/passwd -d ${ID_USER}\n" >>"${BUILD_PATH}/second_stage_install.sh"
+ fi
+ else
+ info "No user defined, no user account created."
+ fi
+
+ 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"
+ /usr/bin/mount -B /dev "${BUILD_PATH}/dev"
+ if [ ${?} -ne 0 ]; then
+ error "line ${LINENO} error mounting ${BUILD_PATH}/dev : exiting"
+ exit ${ERR_1}
+ fi
+ /usr/bin/mount -B /sys "${BUILD_PATH}/sys"
+ if [ ${?} -ne 0 ]; then
+ error "line ${LINENO} error mounting ${BUILD_PATH}/sys : exiting"
+ exit ${ERR_1}
+ fi
+ /usr/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"
+ /usr/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
+ info "chrooting to ${BUILD_PATH}"
+ if [ "$OPT" = "chroot" ]; then
+ info "/sbin/chroot ${BUILD_PATH}"
+ /sbin/chroot "${BUILD_PATH}"
+ RET=${?}
+ if [ ${RET} -ne 0 ]; then
+ error "line ${LINENO} Warning : chrooting to ${BUILD_PATH} retrurn an error ${RET}"
+ ERRORN=$((${ERRORN}+1))
+ fi
+ else
+ info "/sbin/chroot --userspec root:root ${BUILD_PATH} /usr/bin/bash -v -c 'bash /second_stage_install.sh 2>&1'"
+ /sbin/chroot --userspec root:root "${BUILD_PATH}" /usr/bin/bash -v -c 'bash /second_stage_install.sh 2>&1'
+ RET=${?}
+ if [ ${RET} -ne 0 ]; then
+ error "line ${LINENO} Warning : chrooting to ${BUILD_PATH} retrurn an error ${RET}"
+ ERRORN=$((${ERRORN}+1))
+ fi
+ fi
+
+ info "unmounting dev, sys, proc"
+ /usr/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
+ /usr/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
+ /usr/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 createImageWrap()
+{
+ title "Wrap image creation"
+ preImgCreation
+ if [ ${?} -ne 0 ]; then
+ error "line ${LINENO} error in the process ${CONFIG_PATH}/specialFunctions.sh ."
+ exit ${ERR_1}
+ fi
+ createimage
+ if [ -z "${BOOTFS}" ]; then
+ BOOTFS="ext4"
+ fi
+ formatpartitions ${BOOTFS} ext4
+
+ return 0
+}
+
+
+function createimage()
+{
+ title " in ${IMAGE}"
+ if [ -f "${INSTALL_PATH}/${IMAGE}" ]; then
+ warning "Deleting previous image"
+ /usr/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"
+ /usr/bin/dd if=/dev/zero of="${INSTALL_PATH}/${IMAGE}" bs=1MB count=$(( ${IMAGE_SIZE} * 1024 )) status=progress
+ if [ ${?} -ne 0 ]; then
+ error "line ${LINENO} can't make image at ${INSTALL_PATH}/${IMAGE} : exiting"
+ exit ${ERR_1}
+ fi
+
+ loopingImage
+
+ if [ ${?} -ne 0 ]; then
+ error "line ${LINENO} error in the process ${CONFIG_PATH}/specialFunctions.sh ."
+ exit ${ERR_1}
+ fi
+
+ info "making partitions"
+ echo -e "${FDISK_SCRIPT}" | /sbin/fdisk ${DEVICE}
+
+ #Activate 'pY' : /dev/loopXpY
+ partx -vu "${DEVICE}"
+ #Previous function give us a list of partition. It is easy to get it and define prior this list the partition.
+ #But... How to distinguish between the boot p1 and the root p2 if both are empty and ext4 ? ...
+
+ if [ 1 -eq ${SEPARATE_BOOT_PARTITION} ]; then
+ BOOTP="${DEVICE}p1"
+ ROOTP="${DEVICE}p2"
+ else
+ ROOTP="${DEVICE}p1"
+ fi
+ return 0
+}
+
+
+function loopingImage()
+{
+ title "Looping image ..."
+
+ # Mettre en place et contrôler des périphériques boucle.
+ # -f, --find trouver le premier périphérique inutilisé
+ # --show afficher le nom du périphérique après configuration (avec -f)
+ DEVICE=$(/sbin/losetup -f --show "${INSTALL_PATH}/${IMAGE}")
+
+ return 0
+}
+
+
+function formatpartitions()
+{
+ info "Formatting partitions"
+ if [ 1 -eq ${SEPARATE_BOOT_PARTITION} ]; then
+ 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
+ BOOT_UUID=$(blkid -s UUID -o value UUID "${BOOTP}")
+ info "Boot UUID: ${BOOT_UUID}"
+ 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
+ ROOT_UUID=$(blkid -s UUID -o value UUID "${ROOTP}")
+ info "Root UUID: ${ROOT_UUID}"
+
+ return 0
+}
+
+function generateExtlinux()
+{
+ info "Generate extlinux if extlinux.conf exists."
+ if [ -e "${CONFIG_PATH}/extlinux.conf" ]; then
+ info "\tFound extlinux.conf"
+ if [ ! -d "${BUILD_PATH}/boot/extlinux" ]; then
+ info "making /boot/extlinux/extlinux.conf"
+ /usr/bin/rm -rf "${BUILD_PATH}/boot/extlinux"
+ mkdir -p "${BUILD_PATH}/boot/extlinux"
+ fi
+ if [ ! -f "${BUILD_PATH}/boot/extlinux/extlinux.conf" ]; then
+ info "\tTuning extlinux.conf"
+ cp "${CONFIG_PATH}/extlinux.conf" "${BUILD_PATH}/boot/extlinux/extlinux.conf"
+ #In order to use the UUID, a initrd file is necessary.
+ sed -i -e "s/<UUID>/${ROOT_UUID}/g" "${BUILD_PATH}/boot/extlinux/extlinux.conf"
+ sed -i -e "s/<BOOT_ARGS>/${BOOT_ARGS}/g" "${BUILD_PATH}/boot/extlinux/extlinux.conf"
+ KERNEL_ID=$(basename ${BUILD_PATH}/usr/lib/linux-*)
+ sed -i -e "s/<FDTDIR>/${KERNEL_ID}/g" "${BUILD_PATH}/boot/extlinux/extlinux.conf"
+ fi
+ fi
+}
+
+function copyingsystem()
+{
+ generateExtlinux
+
+ info "Remove second_stage_install.sh"
+ /usr/bin/rm -f "${BUILD_PATH}/second_stage_install.sh"
+
+ ### BUG : rpi3b+64b is using a bootloader partition, in which only the bootloader lays. Here, everything is copying into.
+ if [ 1 -eq ${SEPARATE_BOOT_PARTITION} ]; then
+ ARM_BOOT="${BUILD_PATH}/mnt/arm_boot"
+ if ! [ -d "${ARM_BOOT}" ]; then
+ rm -rf "${ARM_BOOT}"
+ mkdir -p "${ARM_BOOT}"
+ fi
+ info "copying Mageia image to root partition"
+ /usr/bin/rsync -rlptogDH --exclude "${ARM_BOOT}/" --exclude "qemu-arm-static*" "${BUILD_PATH}/" "${ROOT}/"
+ /usr/bin/rsync -rlptogDH "${ARM_BOOT}/" "${BOOT}/"
+ #/usr/bin/rsync -rlptogDH "${BUILD_PATH}/boot/" "${BOOT}/"
+ else
+ info "copying Mageia image to root partition"
+ /usr/bin/rsync -rlptogDH --exclude "qemu-arm-static*" "${BUILD_PATH}/" "${ROOT}/"
+ fi
+
+ copyingCustomSystem
+ if [ ${?} -ne 0 ]; then
+ error "line ${LINENO} error in the process ${CONFIG_PATH}/specialFunctions.sh ."
+ exit ${ERR_1}
+ fi
+
+ copyingcommon
+
+ sync
+ warning "You can now burn the image ( ${INSTALL_PATH}/${IMAGE} ) on SD card"
+ info "pv \"${INSTALL_PATH}/${IMAGE}\" | dd of=/dev/mmcblk#"
+ return 0
+}
+
+
+function mountPartitions(){
+ info "mounting partitions, making mountpoint if necessary"
+
+ if [ 1 -eq ${SEPARATE_BOOT_PARTITION} ]; then
+ if ! [ -d "${BOOT}" ]; then
+ /usr/bin/mkdir "${BOOT}"
+ if [ ${?} -ne 0 ]; then
+ error "line ${LINENO} error making directory ${BOOT} : exiting"
+ exit ${ERR_1}
+ fi
+ fi
+ /usr/bin/mount "${BOOTP}" "${BOOT}"
+ if [ ${?} -ne 0 ]; then
+ error "line ${LINENO} error mounting ${BOOTP} : exiting"
+ exit ${ERR_1}
+ fi
+ fi
+
+ if ! [ -d "${ROOT}" ]; then
+ /usr/bin/mkdir "${ROOT}"
+ if [ ${?} -ne 0 ]; then
+ error "line ${LINENO} error making directory ${ROOT} : exiting"
+ exit ${ERR_1}
+ fi
+ fi
+ /usr/bin/mount "${ROOTP}" "${ROOT}"
+ if [ ${?} -ne 0 ]; then
+ error "line ${LINENO} error mounting ${ROOTP} : exiting"
+ exit ${ERR_1}
+ fi
+}
+
+
+function unmountingPartitions()
+{
+ title "Unmounting partitions..."
+
+ # Syncing devices before unmounting
+ /usr/bin/sync
+
+ if [ -z "${BOOTP}" ] && [ -z "${ROOTP}" ] ; then
+ warning "Root partition and Boot partition not defined !"
+
+ for LOOP in $(losetup -l -O NAME,BACK-FILE -n | grep "${IMAGE}" | cut -d ' ' -f 1 ) ; do
+ IFS=$'\n'
+ for PARTITION in $(mount -l | grep ${LOOP}); do
+ MOUNTPOINT=$(echo "$PARTITION" | cut -d ' ' -f 3)
+ PARTITION=$(echo "$PARTITION" | cut -d ' ' -f 1)
+ info "unmount ${PARTITION} and remove ${MOUNTPOINT}"
+ /usr/bin/umount "${PARTITION}"
+ if [ ${?} -eq 0 ]; then
+ /usr/bin/rmdir "${MOUNTPOINT}"
+ else
+ error "line ${LINENO} error unmounting ${BOOT}..."
+ fi
+ done
+ unset IFS
+ done
+ else
+ if [ ! -z "${BOOTP}" ]; then
+ /usr/bin/umount "${BOOTP}"
+ if [ ${?} -eq 0 ]; then
+ /usr/bin/rmdir "${BOOT}"
+ else
+ error "line ${LINENO} error unmounting ${BOOT}..."
+ fi
+ fi
+ /usr/bin/umount "${ROOTP}"
+ if [ ${?} -eq 0 ]; then
+ /usr/bin/rmdir "${ROOT}"
+ else
+ error "line ${LINENO} error unmounting ${ROOT}..."
+ fi
+ fi
+ return 0
+}
+
+
+function unloopingImage(){
+ title "Unlooping image..."
+ # Syncing devices before unmounting
+ /usr/bin/sync
+
+ # [root@jabztop mageia4arm (master)]# losetup -l -O NAME,BACK-FILE -n
+ # /dev/loop0 /home/jibz/workspaces/mageia4arm/build/Mageia-7-bananaPro1.img (deleted)
+ info "Looped devices to unmount : $(losetup -l -O NAME,BACK-FILE -n | grep "${IMAGE}" | cut -d ' ' -f 1 ) "
+
+ for LOOP in $(losetup -l -O NAME,BACK-FILE -n | grep "${IMAGE}" | cut -d ' ' -f 1 ) ; do
+ info "removing ${LOOP}"
+ for PARTITION in ${LOOP}p* ; do
+ partx -dv "${PARTITION}"
+ done
+# losetup -d "${LOOP}"
+ kpartx -d "${INSTALL_PATH}/${IMAGE}"
+ done
+
+ return 0
+}
+
+
+# Copying files common to all systems
+function copyingcommon()
+{
+ title "Copying common files and configuration"
+ rsync -rlptDH "${SOURCE_PATH}/common/" "${ROOT}/"
+ rsync -rlptDH "${SOURCE_PATH}/tools/"*.sh "${ROOT}/usr/local/usr/bin/"
+ chown root:root "${ROOT}/usr/local/usr/bin/"
+ return 0
+}
+
+
+function mkfstab()
+{
+ title "making /etc/fstab"
+ if [ 1 -eq ${SEPARATE_BOOT_PARTITION} ]; then
+ echo -e "proc\t/proc\tproc\tdefaults\t0\t0\nUUID=${BOOT_UUID}\t/mnt/arm_boot\t${BOOTFS}\tdefaults\t0\t0\nUUID=${ROOT_UUID}\t/\text4\tdefaults\t0\t0" > "${BUILD_PATH}/etc/fstab"
+ else
+ echo -e "proc\t/proc\tproc\tdefaults\t0\t0\nUUID=${ROOT_UUID}\t/\text4\tdefaults\t0\t0" > "${BUILD_PATH}/etc/fstab"
+ fi
+ return 0
+}
+
+
+# cleaning build space
+function clean()
+{
+ title "Cleaning"
+
+ info "In case script failed or crash inside the chroot, need to unmount dev|sys|proc..."
+ /bin/umount -lf "${BUILD_PATH}/dev"
+ /bin/umount -lf "${BUILD_PATH}/sys"
+ /bin/umount -lf "${BUILD_PATH}/proc"
+
+ unmountingPartitions
+ unloopingImage
+
+ # Removing old Build directory
+ if [ -d "${BUILD_PATH}" ]; then
+ info "Removing ${BUILD_PATH}"
+ /usr/bin/rm -Rf "${BUILD_PATH}"
+ else
+ warning "${BUILD_PATH} does not exists"
+ fi
+ # removing old image
+ if [ -e "${INSTALL_PATH}/${IMAGE}" ]; then
+ info "Removing ${IMAGE}"
+ /usr/bin/rm -f "${INSTALL_PATH}/${IMAGE}"
+ else
+ warning "${IMAGE} does not exists"
+ fi
+
+ return 0
+}
+
+
+function generateExtra()
+{
+ if [ ${GEN_CHECKSUM} ] ; then
+ title "Generate checksum"
+ md5sum "${INSTALL_PATH}/${IMAGE}" > "${INSTALL_PATH}/${IMAGE}.md5"
+ sha512sum "${INSTALL_PATH}/${IMAGE}" > "${INSTALL_PATH}/${IMAGE}.sha512"
+ sha384sum "${INSTALL_PATH}/${IMAGE}" > "${INSTALL_PATH}/${IMAGE}.sha3"
+ fi
+ if [ ${GEN_GZ} ] ; then
+ title "Image compression"
+ pv "${INSTALL_PATH}/${IMAGE}" | gzip -9 >"${INSTALL_PATH}/${IMAGE}.gz"
+ fi
+ if [ ${GEN_SIGN} ]; then
+ pushd "${INSTALL_PATH}"
+ gpg --sign ${IMAGE}.md5
+ gpg --sign ${IMAGE}.sha512
+ gpg --sign ${IMAGE}.sha384
+ popd
+ fi
+}
+
+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 is containing postPrepareChroot function."
+ return 1
+}
+
+function bunrningBootloader()
+{
+ error "This function is called if no sourced file is containing bunrningBootloader function."
+ return 1
+}
+
+function copyingCustomSystem()
+{
+ error "This function is called if no sourced file is containing copyingCustomSystem function."
+ return 1
+}
+
+
+
+ERRORN=0
+ERR_1=1
+ERR_DEFAULT_CONFIG=2
+ERR_NO_CONFIG_FILE=3
+ERR_NOT_ROOT=4
+ERR_DEPENDENCY_MISSING=5
+ERR_NO_SPACE=6
+ERR_7=7
+ERR_8=8
+ERR_9=9
+
+SEPARATE_BOOT_PARTITION=1