Subversion Repositories ALCASAR

Rev

Details | Last modification | View Log

Rev Author Line No. Line
2477 richard 1
#!/bin/bash
2
#
3
# Authors: Mageia Team
4
# Update for ALCASAR : Hamza ESSAYEGH (Querdos) - Rexy - Laurent Roux
5
##
6
# Usage: $0 ARGS
7
#     --iso-file, -i      Mageia-xxx-xxxxxx-xxx.iso (mandatory)
8
#     --config-file, -c   Minimal rpm list (mandatory)
9
#     --lang, -l          Language for installation (optional)
10
#                         Supported languages: fr;en
11
#
12
 
13
# Colors parameters
14
RED='\033[0;31m'
15
GREEN='\033[0;32m'
16
YELLOW='\033[0;33m'
17
NC='\033[0m'
18
 
19
# Check if a given option is valid an set a global var with the option value
20
function optionIsValid() {
21
    # Retrieving option and its value
22
    local option=$1
23
    local value=$2
24
 
25
    # Available options (short and long)
26
    local configFileOption="--config-file -c"
27
    local isoFileOption="--iso-file -i"
28
    local langOption="--lang -l"
29
 
30
    # Config file option ?
31
    for opt in ${configFileOption}; do
32
        if [[ ${opt} = ${option} ]]; then
33
            configFile=${value}
34
            return 0
35
        fi
36
    done
37
 
38
    # Iso file option ?
39
    for opt in ${isoFileOption}; do
40
        if [[ ${opt} = ${option} ]]; then
41
            isoFile=${value}
42
            return 0
43
        fi
44
    done
45
 
46
    # Language option ?
47
    for opt in ${langOption}; do
48
        if [[ ${opt} = ${option} ]]; then
49
            lang="-${value}"
50
            return 0
51
        fi
52
    done
53
 
54
    # Unknown option
55
    echo "Unknown option '${option}'. Aborting." && exit 1
56
}
57
 
58
# Check if needed packages are installed
59
function requiredPackagesInstalled() {
60
    # Checking mkisofs
61
    command -v genisoimage > /dev/null 2>&1 || \
62
        { echo "The package genisoimage is not installed." && \
63
            genisoimageNotInstalled=1; }
64
 
65
    # Checking genhdlist2
66
    command -v genhdlist2 > /dev/null 2>&1 || \
67
        { echo "The package genhdlist2 is not installed." && \
68
            genhdlist2NotInstalled=1; }
69
 
70
    # Checking gendistrib
71
    command -v gendistrib > /dev/null 2>&1 || \
72
        { echo "The package gendistrib is not installed (rpmtools)." && \
73
            gendistribNotInstalled=1; }
74
 
75
    # If one of the following, aborting
76
    [[ ${genisoimageNotInstalled} -eq 1 ]] || \
77
        [[ ${genhdlist2NotInstalled} -eq 1 ]] || \
78
        [[ ${gendistribNotInstalled} -eq 1 ]] && exit 1
79
}
80
 
81
# Check if a given language is supported by this script or not
82
function languageIsSupported() {
83
    local lang=$1
84
    local supportedLang="fr en"
85
 
86
    # Comparing with available langs
87
    for supLang in ${supportedLang}; do
88
        if [[ ${supLang} = ${lang} ]]; then
89
            return 0
90
        fi
91
    done
92
 
93
    # Language is not supported
94
    echo "Language '${lang}' is not supported. Aborting." && exit 1
95
}
96
 
97
# "Purify" the rpm name -> for the plop.idx file ("Mageia-5.1-x86_64 rpmname" for example)
98
function purifyRpmName() {
99
    local str=$1
100
    local arch=$2
101
    local len=${#str}
102
 
103
    p=`echo ${str} | grep -oP ".*\.mga6"`
104
    echo "Mageia-6-${arch} ${p}"
105
}
106
 
107
# Checking arguments (rpm_list and iso file and eventually lang)
108
[[ ($# -lt 4) || ($# -eq 5) || ($# -gt 6) ]] && echo \
109
"Usage: $0 ARGS
110
    --iso-file, -i      Mageia-xxx-xxxxxx-xxx.iso (mandatory)
111
    --config-file, -c   Minimal rpm list (mandatory)
112
    --lang, -l          Language for installation (optional)
113
                        Supported languages: fr;en
114
" && exit 1
115
 
116
# Checking options
117
optionIsValid $1 $2 && optionIsValid $3 $4
118
 
119
# Checking if other options have been specified
120
[[ $# -eq 6 ]] && optionIsValid $5 $6
121
 
122
# Checking that mandatory option have been specified
123
[[ -z ${isoFile} ]] && { echo "Iso file option is mandatory. Aborting." && exit 1; }
124
[[ -z ${configFile} ]] && { echo "Configuration file option is mandatory. Aborting." && exit 1; }
125
 
126
# Checking validity of options
127
[[ -f ${configFile} ]] || { echo "Invalid config file. Aborting." && exit 1; }
128
[[ -f ${isoFile} ]] || { echo "Invalid iso file. Aborting." && exit 1; }
129
 
130
# Checking required packages
131
requiredPackagesInstalled
132
 
133
# Actual directory
134
actualDir=$(pwd)
135
 
136
# Retreiving elements in rpm_list
137
filesInRpm=$(cat ${configFile})
138
 
139
# official and new dirs
140
mageiaNewDir=/tmp/mageia_new
141
mageiaOfficialDir=/tmp/mageia_official
142
 
143
# Checking that executed as root
144
[[ $(whoami) != "root" ]] && \
145
    { echo "This script must be executed with root privileges. Aborting." && exit 1; }
146
 
147
# Mounting the image
148
echo "Mounting the image..."
149
[[ ! -d ${mageiaOfficialDir} ]] && mkdir ${mageiaOfficialDir}
150
mount -o ro,loop ${isoFile} ${mageiaOfficialDir} || { echo "Failed mounting '${isoFile}'. Aborting." && exit 1; }
151
 
152
# Checking architecture
153
[[ -d ${mageiaOfficialDir}/x86_64 ]] && arch=x86_64 || arch=i586
154
 
155
# Creating new directory that will contains the "cleared" iso image
156
[[ ! -d ${mageiaNewDir} ]] && mkdir ${mageiaNewDir}
157
 
158
# Copying main files except core and nonfree directories
159
echo "Extracting base image..."
160
cd /tmp/mageia_official && \
161
    tar cf - --exclude=${arch}/media . | (cd /tmp/mageia_new && tar xf - ) && cd "${actualDir}"
162
 
163
# Creating new directories core and nonfree and dir for alcasar stufs
164
mkdir -p ${mageiaNewDir}/${arch}/{media/{core,nonfree},install/alcasar}
165
 
166
# Copying configuration files
167
echo "Copying initial configuration files..."
168
 
169
cp -f ${mageiaOfficialDir}"/isolinux/isolinux.bin" ${mageiaNewDir}/isolinux/isolinux.bin   
170
cp ${actualDir}/config/alcasar.tar.gz ${mageiaNewDir}/${arch}/install/alcasar
171
 
172
###   only if we want to change the normal install procedure ###
173
#cp ${actualDir}/config/first_login ${mageiaNewDir}/${arch}/install/alcasar
174
#cp ${actualDir}/config/auto_inst-${arch}${lang}.cfg.pl ${mageiaNewDir}/${arch}/install/alcasar/auto_inst-${arch}.cfg.pl
175
#cp -f ${actualDir}"/config/isolinux-x86_64.cfg" ${mageiaNewDir}/isolinux/isolinux.cfg
176
 
177
 
178
# alcasar needed rpms
179
if [ -f ${actualDir}/rpms-${arch}.tar.gz ]; then
180
    echo -e "${GREEN}RPMs archive found, using it${NC}"
181
    cp ${actualDir}/rpms-${arch}.tar.gz ${mageiaNewDir}/${arch}/install/alcasar
182
else
183
    echo -e "${RED}config/rpms-x86_64.tar.gz not found, skipping${NC}"
184
fi
185
 
186
# Retrieving core and nonfree dirs (official)
187
coreDir=${mageiaOfficialDir}/${arch}/media/core
188
nonFreeDir=${mageiaOfficialDir}/${arch}/media/nonfree
189
 
190
# Retrieving core and nonfree dirs (new)
191
coreDirNew=${mageiaNewDir}/${arch}/media/core/
192
nonFreeDirNew=${mageiaNewDir}/${arch}/media/nonfree
193
plopFilePath=${mageiaNewDir}/${arch}/media/plop.idx
194
 
195
# Initializing counts
196
countCore=0
197
countNonFree=0
198
 
199
# Creating the RPM list in core and nonfree and clearing the plop.idx file
200
echo "Comparing RPMS..."
201
> ${plopFilePath}
202
 
203
# Selecting rpm
204
for rpm in ${filesInRpm}; do
205
	# Retreiving output of ls in directories
206
	fileInCore=$(ls ${coreDir} | grep "^${rpm}")
207
	fileInNonFree=$(ls ${nonFreeDir} | grep "^${rpm}")
208
 
209
	# If present in core, copying in core_new
210
	if [[ ! -z ${fileInCore} ]]; then
211
		# Moving RPM
212
		cp "${coreDir}/${fileInCore}" ${coreDirNew}
213
		countCore=$(expr ${countCore} + 1)
214
 
215
    # Updating the plop.idx
216
    purifyRpmName ${rpm} ${arch} >> ${plopFilePath}
217
 
218
  # If present in nonfree, copying in nonfree_new
219
	elif [[ ! -z ${fileInNonFree} ]]; then
220
		# Copying RPM
221
		cp  "${nonFreeDir}/${fileInNonFree}" ${nonFreeDirNew}
222
		countNonFree=$(expr ${countNonFree} + 1)
223
 
224
    # Updating the plop.idx
225
    purifyRpmName ${rpm} ${arch} >> ${plopFilePath}
226
	fi
227
done
228
 
229
# Sorting the plop file alphabetically
230
cat ${plopFilePath} | sort > /tmp/tmpFileMageia && mv /tmp/tmpFileMageia ${plopFilePath}
231
 
232
# Informations
233
echo "${countCore} files kept from core"
234
echo "${countNonFree} files kept from nonfree"
235
 
236
# Generating media info for core
237
echo "Generating media_info for core..."
238
genhdlist2 ${coreDirNew} --allow-empty-media --quiet
239
 
240
echo "Generating media_info for nonfree..."
241
genhdlist2 ${nonFreeDirNew} --allow-empty-media --quiet
242
 
243
# Puting pubkeys in media_info
244
cp ${coreDir}/media_info/pubkey ${coreDirNew}/media_info/
245
cp ${nonFreeDir}/media_info/pubkey ${nonFreeDirNew}/media_info/
246
 
247
# Retrieving media.cfg & compssUsers.pl depending on the arch
248
mkdir ${mageiaNewDir}/${arch}/media/media_info
249
cp ${mageiaOfficialDir}/${arch}/media/media_info/compssUsers.pl ${mageiaNewDir}/${arch}/media/media_info/compssUsers.pl
250
cp ${mageiaOfficialDir}/${arch}/media/media_info/media.cfg ${mageiaNewDir}/${arch}/media/media_info/media.cfg
251
 
252
# Generating distr
253
echo "Generating mirror tree..."
254
gendistrib -s ${mageiaNewDir}/${arch}
255
 
256
# Creating the new iso file
257
echo "Creating the isofile..."
258
newIsoName=Mageia-6-${arch}${lang}-Alcasar.iso
259
cd ${mageiaNewDir} && genisoimage -quiet -o ${actualDir}/${newIsoName} \
260
    -b isolinux/isolinux.bin \
261
    -c boot.catalog \
262
    -no-emul-boot -boot-load-size 4 \
263
    -boot-info-table -J -R -V "Mageia-6 Alcasar (${arch})" .
264
 
265
# Unmounting
266
echo "Umounting..."
267
umount ${mageiaOfficialDir} && rmdir ${mageiaOfficialDir}
268
 
269
# Removing temporary dir
270
rm -rf ${mageiaNewDir}
271
 
272
# Setting same permissions as the initial image
273
cd ${actualDir}
274
chmod --reference=${isoFile} ${newIsoName}
275
chown --reference=${isoFile} ${newIsoName}
276
 
277
# Finished
278
echo "Done."