2941 |
rexy |
1 |
#!/bin/bash
|
|
|
2 |
#
|
|
|
3 |
# Build Mageiar (Mageia + ALCASAR) ISO file
|
|
|
4 |
# Authors: Hamza ESSAYEGH (Querdos) - Rexy - Laurent Roux - Aurelien Dubois - Pierre Rivault
|
|
|
5 |
#
|
|
|
6 |
####################################
|
|
|
7 |
###### Variables & functions ######
|
|
|
8 |
################################################################################
|
|
|
9 |
|
|
|
10 |
CURRENT_DIR="$(readlink -f "$(dirname $0)")"
|
|
|
11 |
LOG_FILE="$CURRENT_DIR/build-image.log"
|
|
|
12 |
RESSOURCES="$CURRENT_DIR/ressources"
|
|
|
13 |
|
|
|
14 |
# Print the given error message and exit 1
|
|
|
15 |
function errorExit()
|
|
|
16 |
{
|
|
|
17 |
tput bold
|
|
|
18 |
echo -e "ERROR : $1 \nAborting\n" >&2
|
|
|
19 |
echo "$1" > "$LOG_FILE"
|
|
|
20 |
tput sgr0
|
|
|
21 |
exit 1
|
|
|
22 |
}
|
|
|
23 |
#-------------------------------------------------------------------------------
|
|
|
24 |
# Print progress bar. $1 is a multiple of five
|
|
|
25 |
function printProgress()
|
|
|
26 |
{
|
|
|
27 |
local a
|
|
|
28 |
let "a = $1 / 5"
|
|
|
29 |
let "b = 25 - $a"
|
|
|
30 |
progressStr=$(printf "%${a}s")
|
|
|
31 |
progressStrBlanks=$(printf "%${b}s")
|
|
|
32 |
echo -en "Downloading...$1% [${progressStr// /#}${progressStrBlanks// / }]\r"
|
|
|
33 |
}
|
|
|
34 |
#-------------------------------------------------------------------------------
|
|
|
35 |
function printBold()
|
|
|
36 |
{
|
|
|
37 |
tput bold 2>/dev/null
|
|
|
38 |
echo $1
|
|
|
39 |
tput sgr0 2>/dev/null
|
|
|
40 |
}
|
|
|
41 |
|
|
|
42 |
ISO_IN=`ls $RESSOURCES | grep '^Mageia.*iso'`
|
|
|
43 |
MAGEIA_VERSION=`echo $ISO_IN|cut -d"-" -f2`
|
|
|
44 |
ARCH=`echo $ISO_IN |cut -d"-" -f3|cut -d"." -f1`
|
|
|
45 |
ALCASAR_TARBALL=`ls $RESSOURCES| grep '^alcasar.*gz'`
|
|
|
46 |
ALCASAR_EXTRACTED_DIR=$(echo $ALCASAR_TARBALL | rev | cut -d '.' -f 3- | rev)
|
|
|
47 |
ALCASAR_VERSION=`echo $ALCASAR_EXTRACTED_DIR | cut -d"-" -f2`
|
2944 |
rexy |
48 |
TMP_DIR=/var/tmp
|
|
|
49 |
MAGEIA_NEW_DIR=$TMP_DIR/mageia_new
|
|
|
50 |
MAGEIA_OFFICIAL_DIR=$TMP_DIR/mageia_official
|
2941 |
rexy |
51 |
coreDir=${MAGEIA_OFFICIAL_DIR}/${ARCH}/media/core
|
|
|
52 |
nonFreeDir=${MAGEIA_OFFICIAL_DIR}/${ARCH}/media/nonfree
|
2945 |
rexy |
53 |
mediaDirNew=${MAGEIA_NEW_DIR}/${ARCH}/media
|
2941 |
rexy |
54 |
coreDirNew=${MAGEIA_NEW_DIR}/${ARCH}/media/core/
|
|
|
55 |
nonFreeDirNew=${MAGEIA_NEW_DIR}/${ARCH}/media/nonfree
|
2945 |
rexy |
56 |
urpmi_cache=/var/cache/urpmi/rpms
|
2941 |
rexy |
57 |
|
|
|
58 |
# Drake installer
|
|
|
59 |
INSTALLER_DIR="${MAGEIA_NEW_DIR}/${ARCH}/install/alcasar"
|
|
|
60 |
EFI_GRUB_CFG="${MAGEIA_NEW_DIR}/boot/grub2/grub.cfg"
|
|
|
61 |
ADVERT_DIR="${MAGEIA_NEW_DIR}/${ARCH}/install/extra/advertising"
|
2944 |
rexy |
62 |
AUTO_INSTALL_CFG=$TMP_DIR/auto_inst.cfg.pl
|
2941 |
rexy |
63 |
|
|
|
64 |
# RPMs needed during an install stage
|
2944 |
rexy |
65 |
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-efi grub2-mageia-theme harddrake hdparm hexedit info ldetect lftp lib64alsa-plugins lib64glib-networking-gnutls locales-en locales-fr lsof lvm2 mageia-theme-Default man-db 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 sudo socat mandi mandi-ifw"
|
2945 |
rexy |
66 |
ISO_RPM_LIST="cdrkit-genisoimage xorriso rpmtools syslinux"
|
2941 |
rexy |
67 |
|
|
|
68 |
#######################
|
|
|
69 |
###### Main ######
|
|
|
70 |
################################################################################
|
|
|
71 |
|
|
|
72 |
# Some checks
|
|
|
73 |
[[ $(whoami) != 'root' ]] && errorExit 'Please run as root'
|
|
|
74 |
[[ $ISO_IN == "" ]] && errorExit "No Mageia iso file in $RESSOURCES"
|
|
|
75 |
[[ ! -f "$RESSOURCES/auto_inst.cfg.pl_template" ]] && errorExit "No auto_inst.cfg.pl_template file in $RESSOURCES"
|
|
|
76 |
[[ $ALCASAR_TARBALL == "" ]] && errorExit "No ALCASAR tarball file in $RESSOURCES"
|
2944 |
rexy |
77 |
|
2945 |
rexy |
78 |
for directory in $MAGEIA_NEW_DIR $MAGEIA_OFFICIAL_DIR
|
2941 |
rexy |
79 |
do
|
|
|
80 |
[ -d $directory ] || mkdir -p $directory
|
|
|
81 |
done
|
|
|
82 |
printBold "Mageiar will be build with Mageia-$MAGEIA_VERSION-$ARCH and $ALCASAR_EXTRACTED_DIR"
|
2947 |
rexy |
83 |
# Update the system. Keep only RPMs needed to create ALCASAR rpmslist
|
|
|
84 |
urpmi --auto-update --auto 2>/dev/null
|
2945 |
rexy |
85 |
urpme $ISO_RPM_LIST --auto-orphans --force 2>/dev/null
|
2946 |
rexy |
86 |
urpmi $BASE_RPM_LIST --force --auto 2>/dev/null
|
2945 |
rexy |
87 |
# Retrieve list of installed RPM (without those that will be installed with the alcasar install script)
|
2946 |
rexy |
88 |
RPM_LIST="$(rpm -qa --queryformat "%{NAME}\n"| grep -Ev 'coova-chilli|gammu|lib64gammu8|ipt-netflow|nfdump|wkhtmltopdf' | tr '\n' ' ')"
|
2941 |
rexy |
89 |
|
|
|
90 |
# Insert list into AUTO_INSTALL_CFG
|
2944 |
rexy |
91 |
formattedList=$(echo $RPM_LIST | sed "s/[^ ]*/\'\0\'/g" | sed "s/ /,\n/g")
|
|
|
92 |
cp -f $RESSOURCES/auto_inst.cfg.pl_template $AUTO_INSTALL_CFG
|
2941 |
rexy |
93 |
insertLineNumber=$(grep -n "'default_packages' => " "$AUTO_INSTALL_CFG" | cut -d ':' -f1)
|
|
|
94 |
fileTop=$(head -n "+$insertLineNumber" "$AUTO_INSTALL_CFG")
|
|
|
95 |
fileBottom=$(tail -n "+$insertLineNumber" "$AUTO_INSTALL_CFG" | tail -n +2)
|
|
|
96 |
cat /dev/null > "$AUTO_INSTALL_CFG"
|
|
|
97 |
echo "$fileTop" > "$AUTO_INSTALL_CFG"
|
|
|
98 |
echo "$formattedList" >> "$AUTO_INSTALL_CFG"
|
|
|
99 |
echo "$fileBottom" >> "$AUTO_INSTALL_CFG"
|
|
|
100 |
|
2944 |
rexy |
101 |
# Installing tools to create the iso file
|
|
|
102 |
printBold "Installing ISO building tools"
|
2945 |
rexy |
103 |
#dnf install -y $ISO_RPM_LIST || errorExit "could not install necessary packages"
|
|
|
104 |
urpmi $ISO_RPM_LIST --force|| errorExit "could not install necessary packages"
|
2941 |
rexy |
105 |
|
|
|
106 |
# Mounting the ISO image
|
|
|
107 |
printBold "Mounting the image"
|
2944 |
rexy |
108 |
if [ `mount |grep $MAGEIA_OFFICIAL_DIR | wc -l` -eq 0 ]; then # if not already mounted
|
|
|
109 |
mount -o ro,loop $RESSOURCES/$ISO_IN $MAGEIA_OFFICIAL_DIR || errorExit "failed mounting $ISO_IN."
|
|
|
110 |
fi
|
2941 |
rexy |
111 |
sleep 1 # wait for mounting process
|
|
|
112 |
[ -d ${MAGEIA_OFFICIAL_DIR}/x86_64 ] || umount $MAGEIA_OFFICIAL_DIR || errorExit "The ISO file isn't in the target architecture ($ARCH)"
|
|
|
113 |
|
|
|
114 |
# Copying main files except core and nonfree directories
|
|
|
115 |
echo "Extracting base image..."
|
|
|
116 |
cd $MAGEIA_OFFICIAL_DIR && \
|
|
|
117 |
tar cf - --exclude=${ARCH}/media . | (cd $MAGEIA_NEW_DIR && tar xf - ) && cd "${CURRENT_DIR}"
|
|
|
118 |
|
|
|
119 |
# Creating new directories core and nonfree and dir for alcasar stufs
|
|
|
120 |
mkdir -p ${MAGEIA_NEW_DIR}/${ARCH}/{media/{core,nonfree},install/alcasar}
|
|
|
121 |
|
|
|
122 |
# Adding Alcasar image advert to the installer
|
2944 |
rexy |
123 |
cp -f $RESSOURCES/install_slideshow/* "$ADVERT_DIR" || errorExit "could not copy custom slideshow to $ADVERT_DIR"
|
2941 |
rexy |
124 |
|
|
|
125 |
# Create the installed RPM list excluding those brought with alcasar archive (they aren't in repository)
|
2944 |
rexy |
126 |
nbInstalled=$(echo $RPM_LIST | wc -w)
|
|
|
127 |
total=`echo $RPM_LIST | wc -w`
|
2941 |
rexy |
128 |
count=0
|
|
|
129 |
# Copying the RPM in core and clearing the plop.idx file
|
2944 |
rexy |
130 |
echo "Copying $total RPMS in ISO ..."
|
|
|
131 |
for rpm in ${RPM_LIST}; do
|
2941 |
rexy |
132 |
let percent="${count} * 100 / ${total}"
|
2946 |
rexy |
133 |
full_rpm_name=`rpm -q $rpm`
|
2947 |
rexy |
134 |
if [ `ls $urpmi_cache/$full_rpm_name* 2>/dev/null | wc -l` -ne 1 ] ; then # rpm isn't already in $urpmi_cache
|
|
|
135 |
if [ `ls $coreDir/$full_rpm_name* 2>/dev/null | wc -l` -eq 1 ] ; then # rpm is in official ISO file
|
|
|
136 |
cp $coreDir/$full_rpm_name* $urpmi_cache/
|
|
|
137 |
else # rpm must be downloaded
|
|
|
138 |
# dnf download --downloaddir $coreDirNew $rpm 1> /dev/null || errorExit "could not download $rpm"
|
|
|
139 |
urpmi --no-install --replacepkgs -q $rpm 2> /dev/null || urpmi --no-install -q --force $rpm 2> /dev/null || echo "could not download $rpm"
|
|
|
140 |
fi
|
2946 |
rexy |
141 |
fi
|
2941 |
rexy |
142 |
printProgress ${percent}
|
|
|
143 |
count=$(expr ${count} + 1)
|
|
|
144 |
done
|
|
|
145 |
printBold "$count RPMs copied"
|
2944 |
rexy |
146 |
# Copying the Alcasar tarball & automatic install option into the ISO
|
2941 |
rexy |
147 |
mkdir -p $INSTALLER_DIR || errorExit "could not create directory $INSTALLER_DIR"
|
2944 |
rexy |
148 |
cp $RESSOURCES/$ALCASAR_TARBALL $INSTALLER_DIR || errorExit "could not copy $RESSOURCES/$ALCASAR_TARBALL to $INSTALLER_DIR"
|
2941 |
rexy |
149 |
cp $AUTO_INSTALL_CFG $INSTALLER_DIR || errorExit "could not copy $AUTO_INSTALL_CFG to $INSTALLER_DIR"
|
|
|
150 |
|
2945 |
rexy |
151 |
mv $urpmi_cache/*.rpm $coreDirNew
|
2941 |
rexy |
152 |
# Generating media info for core
|
|
|
153 |
echo "Generating media_info for core..."
|
|
|
154 |
genhdlist2 ${coreDirNew} --allow-empty-media --quiet
|
|
|
155 |
echo "Generating media_info for nonfree..."
|
|
|
156 |
genhdlist2 ${nonFreeDirNew} --allow-empty-media --quiet
|
|
|
157 |
|
|
|
158 |
# Puting pubkeys in media_info
|
|
|
159 |
cp ${coreDir}/media_info/pubkey ${coreDirNew}/media_info/
|
|
|
160 |
cp ${nonFreeDir}/media_info/pubkey ${nonFreeDirNew}/media_info/
|
|
|
161 |
|
|
|
162 |
# Retrieving media.cfg & compssUsers.pl depending on the arch
|
|
|
163 |
mkdir ${MAGEIA_NEW_DIR}/${ARCH}/media/media_info
|
|
|
164 |
cp ${MAGEIA_OFFICIAL_DIR}/${ARCH}/media/media_info/compssUsers.pl ${MAGEIA_NEW_DIR}/${ARCH}/media/media_info/compssUsers.pl
|
|
|
165 |
cp ${MAGEIA_OFFICIAL_DIR}/${ARCH}/media/media_info/media.cfg ${MAGEIA_NEW_DIR}/${ARCH}/media/media_info/media.cfg
|
|
|
166 |
|
|
|
167 |
# Specify install configuration
|
|
|
168 |
#sed -i -e 's*rdz*rdz kickstart=/tmp/media/x86_64/install/alcasar/auto_inst.cfg.pl*g' ${MAGEIA_NEW_DIR}/isolinux/isolinux.cfg
|
|
|
169 |
sed -i -e 's*noiswmd*noiswmd kickstart=/tmp/media/x86_64/install/alcasar/auto_inst.cfg.pl*g' $EFI_GRUB_CFG
|
|
|
170 |
|
|
|
171 |
# Generating distr
|
|
|
172 |
echo "Generating mirror tree..."
|
|
|
173 |
gendistrib -s ${MAGEIA_NEW_DIR}/${ARCH}
|
|
|
174 |
|
|
|
175 |
# Creating the new iso file
|
|
|
176 |
echo "Creating the isofile..."
|
|
|
177 |
newIsoName=Mageia-$MAGEIA_VERSION-${ARCH}-Alcasar-$ALCASAR_VERSION.iso
|
|
|
178 |
|
|
|
179 |
# Generating the iso file
|
|
|
180 |
# Parameters for xorriso found using the following command on the original mageia iso
|
|
|
181 |
# xorriso -indev Mageia-7-x86_64.iso -report_el_torito as_mkisofs
|
|
|
182 |
cd ${MAGEIA_NEW_DIR} && xorriso -as mkisofs \
|
|
|
183 |
-V 'Mageia-7.1-x86_64' \
|
|
|
184 |
-partition_cyl_align off \
|
|
|
185 |
-partition_offset 0 \
|
|
|
186 |
--mbr-force-bootable \
|
|
|
187 |
-iso_mbr_part_type 0x00 \
|
2944 |
rexy |
188 |
-c 'boot.catalog' \
|
|
|
189 |
-b 'boot/grub2/eltorito.img' \
|
2941 |
rexy |
190 |
-no-emul-boot \
|
|
|
191 |
-boot-load-size 4 \
|
|
|
192 |
-boot-info-table \
|
|
|
193 |
--grub2-boot-info \
|
|
|
194 |
-eltorito-alt-boot \
|
|
|
195 |
-boot-load-size 8192 \
|
2944 |
rexy |
196 |
-o ${TMP_DIR}/${newIsoName} .
|
2941 |
rexy |
197 |
|
|
|
198 |
# Unmounting & Removing temporary dir
|
|
|
199 |
echo "Umounting..."
|
|
|
200 |
umount $MAGEIA_OFFICIAL_DIR
|
2945 |
rexy |
201 |
mv $coreDirNew/*.rpm $urpmi_cache
|
|
|
202 |
for directory in $MAGEIA_NEW_DIR $MAGEIA_OFFICIAL_DIR
|
2941 |
rexy |
203 |
do
|
|
|
204 |
[ -d $directory ] && rm -rf $directory
|
|
|
205 |
done
|
|
|
206 |
rm -f "$AUTO_INSTALL_CFG"
|
2947 |
rexy |
207 |
echo "All RPM are always in $urpmi_cache. Remove them if nedded."
|
|
|
208 |
echo "The ISO file is here : ${TMP_DIR}/${newIsoName}"
|