| 0,0 → 1,243 |
| #!/bin/bash |
| # |
| # Authors: Mageia Team |
| # Update for ALCASAR : Hamza ESSAYEGH (Querdos) - Rexy - Laurent Roux - Aurelien Dubois |
| ## |
| # Usage: $0 ARGS |
| # --iso-file, -i Mageia-xxx-xxxxxx-xxx.iso (mandatory) |
| # --lang, -l Language for installation (optional) |
| # Supported languages: fr;en |
| # |
| ####################### |
| ###### Variables ###### |
| ###############################################################################"" |
| |
| CURRENT_DIR="$(readlink -f "$(dirname $0)")" |
| LOG_FILE="$CURRENT_DIR/build-image.log" |
| |
| # Mageia |
| MAGEIA_VERSION=`cat /etc/release|cut -c 16` |
| ARCH=`cat /etc/release|cut -c 33-38` |
| MAGEIA_NEW_DIR=/tmp/mageia_new |
| MAGEIA_OFFICIAL_DIR=/tmp/mageia_official |
| # ISO file |
| ISO_DIR="/var/iso" |
| ISO_IN="$ISO_DIR/Mageia-$MAGEIA_VERSION-$ARCH-DVD.iso" |
| |
| # Drake installer |
| INSTALLER_DIR="${MAGEIA_NEW_DIR}/${ARCH}/install/alcasar" |
| AUTO_INSTALL_CFG="/var/iso/auto_inst.cfg.pl" |
| ADVERT_DIR="${MAGEIA_NEW_DIR}/${ARCH}/install/extra/advertising" |
| |
| # Alcasar |
| ALCASAR_TAR="$1" |
| ALCASAR_EXTRACTED_DIR=$(echo $ALCASAR_TAR | rev | cut -d '.' -f 3- | rev) |
| |
| # Mirrors |
| ISO_SUPPORT="http://ftp.free.fr/mirrors/mageia.org/iso/$MAGEIA_VERSION/Mageia-$MAGEIA_VERSION-$ARCH-DVD/Mageia-$MAGEIA_VERSION-$ARCH-DVD.iso" |
| ISO_MD5="http://ftp.free.fr/mirrors/mageia.org/iso/$MAGEIA_VERSION/Mageia-$MAGEIA_VERSION-$ARCH-DVD/Mageia-$MAGEIA_VERSION-$ARCH-DVD.iso.md5" |
| |
| # RPMs |
| RPM_DIR="/root/rpms" |
| BASE_RPM_LIST="acpi acpid alsa-utils aoss arp-scan basesystem bash-completion coreutils-doc cpupower curl dhcp-client dmraid dnf dnf-plugins-core dosfstools dracut drakx-net-text gpm grub2 grub2-mageia-theme harddrake hdparm hexedit info iwlwifi-agn-ucode kernel-desktop-latest kernel-firmware kernel-firmware-nonfree ldetect lftp lib64alsa-plugins lib64glib-networking-gnutls locales-en locales-fr lsof lvm2 mageia-theme-Default man-db mandi-ifw man-pages microcode microcode_ctl mtools ntfs-3g numlock os-prober p11-kit perl-Hal-Cdroms plymouth procmail python3 python3-dbus radeon-firmware ralink-firmware rtlwifi-firmware sharutils shorewall-ipv6 strace sysfsutils tmpwatch tree vim-minimal vnstat xdg-user-dirs-gtk" |
| |
| ####################### |
| ###### Functions ###### |
| ################################################################################ |
| # Print the given error message and exit 1 |
| function errorExit() |
| { |
| tput bold |
| echo -e "ERROR : $1 \nAborting\n" >&2 |
| echo "$1" > "$LOG_FILE" |
| tput sgr0 |
| exit 1 |
| } |
| #------------------------------------------------------------------------------- |
| # Print progress bar. $1 is a multiple of five |
| function printProgress() |
| { |
| local a |
| let "a = $1 / 5" |
| let "b = 25 - $a" |
| progressStr=$(printf "%${a}s") |
| progressStrBlanks=$(printf "%${b}s") |
| echo -en "Downloading...$1% [${progressStr// /#}${progressStrBlanks// / }]\r" |
| } |
| #------------------------------------------------------------------------------- |
| function printBold() |
| { |
| tput bold 2>/dev/null |
| echo $1 |
| tput sgr0 2>/dev/null |
| } |
| ####################### |
| ###### Main ###### |
| ################################################################################ |
| |
| # Retrieve list of Alcasar dependencies |
| tar -xf /var/iso/$ALCASAR_TAR -C /tmp/ || errorExit "could not extract alcasar tar archive" |
| alcasarRpmList="$(grep -oP "(?<=PACKAGES=\").*?(?=\")" /tmp/$ALCASAR_EXTRACTED_DIR/scripts/alcasar-urpmi.sh)" |
| alcasarKernel="$(grep -oP "(?<=KERNEL=\").*?(?=\")" /tmp/$ALCASAR_EXTRACTED_DIR/scripts/alcasar-urpmi.sh)" |
| alcasarRpmList="$alcasarRpmList $alcasarKernel" |
| |
| # Make clean rpm list |
| rpmList=$(echo $BASE_RPM_LIST $alcasarRpmList | sed "s/ /\n/g" | sort | uniq | sed "s/\n/ /g") |
| |
| # Insert list into AUTO_INSTALL_CFG |
| formattedList=$(echo $rpmList | sed "s/[^ ]*/\'\0\'/g" | sed "s/ /,\n/g" | sed "/kernel-server/d") |
| cp "${AUTO_INSTALL_CFG}_template" "$AUTO_INSTALL_CFG" -f |
| insertLineNumber=$(grep -n "'default_packages' => " "$AUTO_INSTALL_CFG" | cut -d ':' -f1) |
| fileTop=$(head -n "+$insertLineNumber" "$AUTO_INSTALL_CFG") |
| fileBottom=$(tail -n "+$insertLineNumber" "$AUTO_INSTALL_CFG" | tail -n +2) |
| cat /dev/null > "$AUTO_INSTALL_CFG" |
| |
| echo "$fileTop" > "$AUTO_INSTALL_CFG" |
| echo "$formattedList" >> "$AUTO_INSTALL_CFG" |
| echo "$fileBottom" >> "$AUTO_INSTALL_CFG" |
| |
| # Installing tools to create the iso |
| printBold "Installing necessary tools" |
| dnf install 'dnf-command(download)' -y >/dev/null || errorExit "could not install necessary packages" |
| dnf config-manager --set-enabled mageia-x86_64-nonfree updates-x86_64-nonfree >/dev/null || errorExit "could not install necessary packages" |
| dnf install -y lftp wget cdrkit-genisoimage rpmtools >/dev/null || errorExit "could not install necessary packages" |
| |
| |
| # Directories initialization |
| #------------------------------------------------------------------------------- |
| [[ ! -d "$RPM_DIR" ]] && mkdir -p "$RPM_DIR" |
| |
| # Beggining work on the ISO |
| #------------------------------------------------------------------------------- |
| # Checking the optional Mageia image. If not present or does not match the |
| # docker's version, download it |
| if [[ ! -f "$ISO_IN" ]]; then |
| printBold "Downloading the Mageia iso" |
| cd $ISO_DIR || errorExit "could not cd to $ISO_DIR" |
| echo Installing lftp |
| lftpget -c $ISO_SUPPORT || ( cd "$CURRENT_DIR" && errorExit "could not download Mageia iso" ) |
| cd $CURRENT_DIR |
| fi |
| |
| # Mounting the image |
| printBold "Mounting the image" |
| [[ ! -d "$MAGEIA_OFFICIAL_DIR" ]] && mkdir -p "$MAGEIA_OFFICIAL_DIR" |
| mount -o ro,loop "$ISO_IN" "$MAGEIA_OFFICIAL_DIR" || errorExit "failed mounting $ISO_IN" |
| |
| # Checking ARCHitecture |
| [[ -d ${MAGEIA_OFFICIAL_DIR}/x86_64 ]] && ARCH=x86_64 || ARCH=i586 |
| |
| # Creating new directory that will contains the "cleared" iso image |
| [[ -d ${MAGEIA_NEW_DIR} ]] && rm -rf ${MAGEIA_NEW_DIR} |
| mkdir ${MAGEIA_NEW_DIR} |
| |
| # Copying main files except core and nonfree directories |
| echo "Extracting base image..." |
| cd $MAGEIA_OFFICIAL_DIR && \ |
| tar cf - --exclude=${ARCH}/media . | (cd $MAGEIA_NEW_DIR && tar xf - ) && cd "${CURRENT_DIR}" |
| |
| # Creating new directories core and nonfree and dir for alcasar stufs |
| mkdir -p ${MAGEIA_NEW_DIR}/${ARCH}/{media/{core,nonfree},install/alcasar} |
| |
| # Adding Alcasar image advert to the installer |
| cp -f /var/iso/install_slideshow/* "$ADVERT_DIR" |
| |
| # Retrieving core and nonfree dirs (official) |
| coreDir=${MAGEIA_OFFICIAL_DIR}/${ARCH}/media/core |
| nonFreeDir=${MAGEIA_OFFICIAL_DIR}/${ARCH}/media/nonfree |
| |
| # Retrieving core and nonfree dirs (new) |
| coreDirNew=${MAGEIA_NEW_DIR}/${ARCH}/media/core/ |
| nonFreeDirNew=${MAGEIA_NEW_DIR}/${ARCH}/media/nonfree |
| plopFilePath=${MAGEIA_NEW_DIR}/${ARCH}/media/plop.idx |
| |
| # Initializing counts |
| count=0 |
| |
| # Getting list of rpms needed by Mageia |
| #mageiaRpms="$(cat $MINIMAL_rpmList)" |
| |
| # Copying the RPM in core and nonfree and clearing the plop.idx file |
| echo "Copying RPMS in ISO ..." |
| echo /dev/null > ${plopFilePath} |
| |
| installedList="$(dnf list installed | cut -d ' ' -f1 | rev | cut -d . -f2- | rev | tail -n +2 | tr '\n' ' ')" |
| nbInstalled=$(echo $installedList | wc -w) |
| rpmList="$installedList $BASE_RPM_LIST $alcasarRpmList" |
| total=`echo $rpmList | wc -w` |
| |
| for rpm in ${rpmList}; do |
| let percent="${count} * 100 / ${total}" |
| if [[ $count -lt $nbInstalled ]] ; then |
| dnf reinstall -y --downloadonly --downloaddir $coreDirNew $rpm 1> /dev/null || errorExit "could not download $rpm" |
| else |
| dnf install -y --downloadonly --downloaddir $coreDirNew $rpm 1> /dev/null || errorExit "could not download $rpm" |
| fi |
| printProgress ${percent} |
| |
| count=$(expr ${count} + 1) |
| done |
| |
| # Sorting the plop file alphabetically |
| cat ${plopFilePath} | sort > /tmp/tmpFileMageia && mv /tmp/tmpFileMageia ${plopFilePath} |
| |
| # Informations |
| printBold "$count RPMs copied" |
| |
| # Downloading rpms needed by Alcasar |
| cd "$CURRENT_DIR" |
| printBold "Downloading Alcasar dependencies" |
| tar -xf /var/iso/$ALCASAR_TAR |
| |
| # Copying the Alcasar tar to be put into the ISO |
| cp /var/iso/$ALCASAR_TAR $INSTALLER_DIR/ |
| |
| # Add automatic install options |
| mkdir -p $INSTALLER_DIR || errorExit "could not create directory $INSTALLER_DIR" |
| cp $AUTO_INSTALL_CFG $INSTALLER_DIR || errorExit "could not copy $AUTO_INSTALL_CFG to $INSTALLER_DIR" |
| |
| # Generating media info for core |
| echo "Generating media_info for core..." |
| genhdlist2 ${coreDirNew} --allow-empty-media --quiet |
| |
| echo "Generating media_info for nonfree..." |
| genhdlist2 ${nonFreeDirNew} --allow-empty-media --quiet |
| |
| # Puting pubkeys in media_info |
| cp ${coreDir}/media_info/pubkey ${coreDirNew}/media_info/ |
| cp ${nonFreeDir}/media_info/pubkey ${nonFreeDirNew}/media_info/ |
| |
| # Retrieving media.cfg & compssUsers.pl depending on the arch |
| mkdir ${MAGEIA_NEW_DIR}/${ARCH}/media/media_info |
| cp ${MAGEIA_OFFICIAL_DIR}/${ARCH}/media/media_info/compssUsers.pl ${MAGEIA_NEW_DIR}/${ARCH}/media/media_info/compssUsers.pl |
| cp ${MAGEIA_OFFICIAL_DIR}/${ARCH}/media/media_info/media.cfg ${MAGEIA_NEW_DIR}/${ARCH}/media/media_info/media.cfg |
| |
| # Specify install configuration |
| sed -i -e 's*rdz*rdz kickstart=/tmp/media/x86_64/install/alcasar/auto_inst.cfg.pl*g' ${MAGEIA_NEW_DIR}/isolinux/isolinux.cfg |
| |
| # Generating distr |
| echo "Generating mirror tree..." |
| gendistrib -s ${MAGEIA_NEW_DIR}/${ARCH} |
| |
| # Creating the new iso file |
| echo "Creating the isofile..." |
| alcasarVersion=$(echo $ALCASAR_TAR | cut -d '-' -f2 | rev | cut -d '.' -f 3- | rev ) |
| newIsoName=Mageia-$MAGEIA_VERSION-${ARCH}-Alcasar${alcasarVersion}.iso |
| cd ${MAGEIA_NEW_DIR} && genisoimage -quiet -o ${CURRENT_DIR}/${newIsoName} \ |
| -b isolinux/isolinux.bin \ |
| -c boot.catalog \ |
| -no-emul-boot -boot-load-size 4 \ |
| -boot-info-table -J -R -V "Mageia-$MAGEIA_VERSION Alcasar ${ARCH}" . |
| |
| # Unmounting |
| echo "Umounting..." |
| umount ${MAGEIA_OFFICIAL_DIR} && rmdir ${MAGEIA_OFFICIAL_DIR} |
| |
| # Removing temporary dir |
| rm -rf ${MAGEIA_NEW_DIR} |
| |
| mv ${CURRENT_DIR}/${newIsoName} /var/iso/ |
| |
| # Finished |
| rm -f "$AUTO_INSTALL_CFG" |
| echo "Done." |
| Property changes: |
| Added: svn:eol-style |
| +native |
| \ No newline at end of property |
| Added: svn:executable |
| +* |
| \ No newline at end of property |