-
Notifications
You must be signed in to change notification settings - Fork 41
/
grml-live
executable file
·1253 lines (1110 loc) · 52.8 KB
/
grml-live
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
#!/bin/bash
# Filename: grml-live
# Purpose: build process script for generating a (grml based) Linux Live-ISO
# Authors: grml-team (grml.org),
# (c) Michael Prokop <mika@grml.org>,
# (c) Thorsten Glaser <tg@mirbsd.org>
# Bug-Reports: see http://grml.org/bugs/
# License: This file is licensed under the GPL v2 or any later version.
################################################################################
# some misc and global stuff {{{
export LANG=C
export LC_ALL=C
# define function getfilesize before "set -e"
if stat --help >/dev/null 2>&1; then
getfilesize='stat -c %s' # GNU stat
else
getfilesize='stat -f %z' # BSD stat
fi
# exit on any error:
# disable for now since it seems to cause some problems
# set -e
# global variables
GRML_LIVE_VERSION='0.16.1'
PN="$(basename $0)"
CMDLINE="$0 $@"
ADDONS_LIST_FILE='/boot/isolinux/addons_list.cfg'
# }}}
# usage information {{{
usage()
{
echo "
$PN - build process script for generating a (grml based) Linux Live-ISO
Usage: $PN [options, see as follows]
-a <architecture> architecture; available values: i386 and amd64
-b build the ISO without updating the chroot via FAI
-B build the ISO without touching the chroot (skips cleanup)
-c <classe[s]> classes to be used for building the ISO via FAI
-C <configfile> configuration file for grml-live
-d <date> use specified date instead of build time as date of release
-D <configdir> use specified configuration directory instead of /etc/grml/fai
-F force execution without prompting
-g <grml_name> set the grml flavour name
-h display short usage information and exit
-i <iso_name> name of ISO
-I <src_directory> directory which provides files that should become
part of the chroot/ISO
-n skip generation of ISO
-N bootstrap (build chroot) only, do not create files for ISO
-o <output_directory> main output directory of the build process
-q skip mksquashfs
-r <release_name> release name
-s <suite> Debian suite; values: etch, lenny, squeeze, sid
-t <template_directory> place of the templates
-u update existing chroot instead of rebuilding it from scratch
-v <version_number> specify version number of the release
-V increase verbosity in the build process
-z use ZLIB instead of LZMA/XZ compression
Usage examples:
$PN
$PN -c GRMLBASE,GRML_MEDIUM,I386 -o /dev/shm/grml
$PN -c GRMLBASE,GRML_SMALL,REMOVE_DOCS,I386 -g grml-small -v 1.0
$PN -c GRMLBASE,GRML_FULL,I386 -i grml_0.0-1.iso -v 0.0-1
$PN -c GRMLBASE,GRML_FULL,I386 -s sid -V -r 'grml-live rocks'
More details: man grml-live + /usr/share/doc/grml-live/grml-live.html
http://grml.org/grml-live/
Please send your bug reports and feedback to the grml-team: http://grml.org/bugs/
"
}
# make sure it's possible to get usage information without being
# root or actually executing the script
if [ "$1" = '-h' -o "$1" = '--help' ] ; then
usage
[ "$(id -u 2>/dev/null)" != 0 ] && echo "Please notice that this script requires root permissions."
exit 0
fi
# }}}
# some runtime checks {{{
# we need root permissions for the build-process:
if [ "$(id -u 2>/dev/null)" != 0 ] ; then
echo "Error: please run this script with uid 0 (root)." >&2
exit 1
fi
if [ -r /var/run/fai/FAI_INSTALLATION_IN_PROGRESS ] ; then
echo "/usr/sbin/fai already running or was aborted before.">&2
echo "You may remove /var/run/fai/FAI_INSTALLATION_IN_PROGRESS and try again.">&2
exit 1
fi
# see #449236
if [ -r /var/run/fai/fai_softupdate_is_running ] ; then
echo "/usr/sbin/fai softupdate already running or was aborted before.">&2
echo "You may remove /var/run/fai/fai_softupdate_is_running and try again.">&2
exit 1
fi
# }}}
# lsb-functions and configuration stuff {{{
# make sure they are not set by default
VERBOSE=''
FORCE=''
UPDATE=''
BUILD_ONLY=''
BUILD_DIRTY=''
BOOTSTRAP_ONLY=''
HOSTNAME=''
if [ -r /etc/grml/lsb-functions ] ; then
. /etc/grml/lsb-functions
else
einfo() { echo " [*] $*" ;}
eerror() { echo " [!] $*">&2 ;}
ewarn() { echo " [x] $*" ;}
eend() { return 0 ;}
eindent() { return 0 ;}
eoutdent() { return 0 ;}
fi
# source main configuration file:
LIVE_CONF=/etc/grml/grml-live.conf
. $LIVE_CONF
# }}}
# umount all directories {{{
umount_all() {
# make sure we don't leave any mounts - FAI doesn't remove them always
umount $CHROOT_OUTPUT/proc 2>/dev/null || /bin/true
umount $CHROOT_OUTPUT/sys 2>/dev/null || /bin/true
umount $CHROOT_OUTPUT/dev/pts 2>/dev/null || /bin/true
umount $CHROOT_OUTPUT/dev 2>/dev/null || /bin/true
[ -n "$MIRROR_DIRECTORY" ] && umount "${CHROOT_OUTPUT}/${MIRROR_DIRECTORY}"
}
# }}}
# clean exit {{{
bailout() {
rm -f /var/run/fai/fai_softupdate_is_running \
/var/run/fai/FAI_INSTALLATION_IN_PROGRESS
[ -n "$SQUASHFS_STDERR" ] && rm -rf "$SQUASHFS_STDERR"
umount_all
[ -n "$1" ] && EXIT="$1" || EXIT="1"
[ -n "$2" ] && eerror "$2">&2
log "------------------------------------------------------------------------------"
exit "$EXIT"
}
trap bailout 1 2 3 3 6 9 14 15
trap umount_all EXIT
# }}}
# log file stuff {{{
[ -n "$LOGFILE" ] || LOGFILE=/var/log/grml-live.log
touch $LOGFILE
chown root:adm $LOGFILE
chmod 664 $LOGFILE
# }}}
# some important functions {{{
# log output:
# usage: log "string to log"
log() { echo "$*" >> $LOGFILE ; }
# cut string at character number int = $1
# usage: cut_string 5 "1234567890" will output "12345"
cut_string() {
[ -n "$2" ] || return 1
echo "$2" | head -c "$1"; echo -ne "\n"
}
# prepend int = $1 spaces before string = $2
# usage: extend_string_begin 5 "123" will output " 123"
extend_string_begin() {
[ -n "$2" ] || return 1
local COUNT="$(echo $2 | wc -c)"
local FILL="$(expr $COUNT - $1)"
while [ "$FILL" -gt 1 ] ; do
echo -n " "
local FILL=$(expr $FILL - 1)
done
while [ "$FILL" -lt 1 ] ; do
echo -n " "
local FILL=$(expr $FILL + 1)
done
echo "$2" | head -c "$1"; echo -ne "\n"
}
# append int = $1 spaces to string = $2
# usage: extend_string_begin 5 "123" will output "123 "
extend_string_end() {
[ -n "$2" ] || return 1
echo -n "$2" | head -c "$1"
local COUNT="$(echo $2 | wc -c)"
local FILL="$(expr $COUNT - $1)"
while [ "$FILL" -gt 1 ] ; do
echo -n " "
local FILL=$(expr $FILL - 1)
done
while [ "$FILL" -lt 1 ] ; do
echo -n " "
local FILL=$(expr $FILL + 1)
done
echo -ne "\n"
}
# Copy addonfile $1 from the TEMPLATE_DIRECTORY/compat (if exists),
# or from $2 (the system path), or warn about the missing file.
# This is because:
# * On unstable, we Recommend the Debian packages containing
# these files. The user can override them by putting his
# "better" version into TEMPLATE_DIRECTORY/compat.
# * On stable, the Debian packages are probably not available,
# or outdated, so we look in TEMPLATE_DIRECTORY/compat first, where
# our grml-live-compat package installs current file versions.
copy_addon_file() {
if [ ! -d "${BUILD_OUTPUT}/boot/$3/" ]; then
mkdir -p "${BUILD_OUTPUT}/boot/$3"
fi
if [ -e "${TEMPLATE_DIRECTORY}/compat/$3/$1" ]; then
cp "${TEMPLATE_DIRECTORY}/compat/$3/$1" "${BUILD_OUTPUT}/boot/$3/"
return $?
fi
if [ -e "$2/$1" ]; then
log "Copying $1 from system"
cp "$2/$1" "${BUILD_OUTPUT}/boot/$3/"
return $?
fi
msg="Missing addon file: \"$1\""
ewarn "$msg" ; eend 1
log "copy_addon_file: $msg"
}
# }}}
# read local (non-packaged) configuration {{{
LOCAL_CONFIG=/etc/grml/grml-live.local
if [ -r "$LOCAL_CONFIG" ] ; then
log "Sourcing $LOCAL_CONFIG"
. $LOCAL_CONFIG
else
log "No $LOCAL_CONFIG found, not sourcing it"
LOCAL_CONFIG=''
fi
# }}}
# command line parsing {{{
while getopts "a:C:c:d:D:g:i:I:o:r:s:t:v:bBFnNquVz" opt; do
case "$opt" in
a) ARCH="$OPTARG" ;;
b) BUILD_ONLY=1 ;;
B) BUILD_DIRTY=1 ;;
c) CLASSES="$OPTARG" ;;
C) CONFIG="$OPTARG" ;;
d) DATE="$OPTARG" ;;
D) GRML_FAI_CONFIG="$OPTARG" ;;
g) GRML_NAME="$OPTARG" ;;
i) ISO_NAME="$OPTARG" ;;
I) CHROOT_INSTALL="$OPTARG" ;;
n) SKIP_MKISOFS=1 ;;
N) BOOTSTRAP_ONLY=1; SKIP_MKISOFS=1; SKIP_MKSQUASHFS=1 ;;
o) OUTPUT="$OPTARG" ;;
q) SKIP_MKSQUASHFS=1 ;;
r) RELEASENAME="$OPTARG" ;;
s) SUITE="$OPTARG" ;;
t) TEMPLATE_DIRECTORY="$OPTARG";;
v) VERSION="$OPTARG" ;;
F) FORCE=1 ;;
u) UPDATE=1 ;;
V) VERBOSE="-v" ;;
z) SQUASHFS_ZLIB=1 ;;
?) echo "invalid option -$OPTARG" >&2; bailout 1 ;;
esac
done
shift $(($OPTIND - 1)) # set ARGV to the first not parsed commandline parameter
# }}}
# assume sane defaults (if not set already) {{{
[ -n "$ARCH" ] || ARCH="$(dpkg --print-architecture)"
[ -n "$BOOT_METHOD" ] || BOOT_METHOD='isolinux'
[ -n "$CLASSES" ] || CLASSES="GRMLBASE,GRML_MEDIUM,I386"
[ -n "$DATE" ] || DATE="$(date +%Y-%m-%d)"
[ -n "$DISTRI_INFO" ] || DISTRI_INFO='Grml - Live Linux for system administrators '
[ -n "$DISTRI_NAME" ] || DISTRI_NAME="grml"
[ -n "$DISTRI_SPLASH" ] || DISTRI_SPLASH='grml.png'
[ -n "$FORCE_ISO_REBUILD" ] || FORCE_ISO_REBUILD="false"
[ -n "$GRML_FAI_CONFIG" ] || GRML_FAI_CONFIG='/etc/grml/fai'
[ -n "$GRML_NAME" ] || GRML_NAME='grml'
[ -n "$HOSTNAME" ] || HOSTNAME='grml'
[ -n "$HYBRID_METHOD" ] || HYBRID_METHOD='manifold'
[ -n "$NFSROOT_CONF" ] || NFSROOT_CONF="${GRML_FAI_CONFIG}/make-fai-nfsroot.conf"
[ -n "$RELEASENAME" ] || RELEASENAME='grml-live rocks'
[ -n "$SOURCES_LIST_OUTPUT" ] || SOURCES_LIST_OUTPUT="${GRML_FAI_CONFIG}/config/files/etc/apt/sources.list/GRML_LIVE_SOURCES_LIST"
[ -n "$SQUASHFS_EXCLUDES_FILE" ] || SQUASHFS_EXCLUDES_FILE="${GRML_FAI_CONFIG}/config/grml/squashfs-excludes"
[ -n "$SUITE" ] || SUITE='squeeze'
[ -n "$TEMPLATE_DIRECTORY" ] || TEMPLATE_DIRECTORY='/usr/share/grml-live/templates'
[ -n "$USERNAME" ] || USERNAME='grml'
[ -n "$VERSION" ] || VERSION='0.0.1'
# output specific stuff, depends on $OUTPUT (iff not set):
[ -n "$OUTPUT" ] || OUTPUT='/grml/grml-live'
[ -n "$BUILD_OUTPUT" ] || BUILD_OUTPUT="$OUTPUT/grml_cd"
[ -n "$CHROOT_OUTPUT" ] || CHROOT_OUTPUT="$OUTPUT/grml_chroot"
[ -n "$ISO_OUTPUT" ] || ISO_OUTPUT="$OUTPUT/grml_isos"
# }}}
# some misc checks before executing FAI {{{
[ -n "$CLASSES" ] || bailout 1 "Error: \$CLASSES unset, please set it in $LIVE_CONF or
specify it on the command line using the -c option."
[ -n "$OUTPUT" ] || bailout 1 "Error: \$OUTPUT unset, please set it in $LIVE_CONF or
specify it on the command line using the -o option."
# trim characters that are known to cause problems inside $GRML_NAME;
# for example isolinux does not like '-' inside the directory name
[ -n "$GRML_NAME" ] && export SHORT_NAME="$(echo $GRML_NAME | tr -d ',./;\- ')"
# export variables to have them available in fai scripts:
[ -n "$GRML_NAME" ] && export GRML_NAME="$GRML_NAME"
[ -n "$RELEASENAME" ] && export RELEASENAME="$RELEASENAME"
# }}}
# ZERO_LOGFILE - check for backwards compatibility reasons {{{
# this was default behaviour until grml-live 0.9.34:
if [ -n "$ZERO_LOGFILE" ] ; then
PRESERVE_LOGFILE='' # make sure it's cleaned then
ewarn "Please consider disabling the \$ZERO_LOGFILE option as grml-live clears..."
ewarn "... the logfile $LOGFILE by default (unless \$PRESERVE_LOGFILE is set) nowadays."
eend 0
fi
# }}}
# ask user whether the setup is ok {{{
if [ -z "$FORCE" ] ; then
echo
echo "${PN} [${GRML_LIVE_VERSION}]: check your configuration (or use -F to force execution):"
echo
echo " FAI classes: $CLASSES"
[ -r "$LOCAL_CONFIG" ] && echo " Local config: /etc/grml/grml-live.local"
[ -n "$CONFIG" ] && echo " Configuration: $CONFIG"
[ -n "$GRML_FAI_CONFIG" ] && echo " Config directory: $GRML_FAI_CONFIG"
echo " main directory: $OUTPUT"
[ -n "$CHROOT_OUTPUT" ] && echo " Chroot target: $CHROOT_OUTPUT"
[ -n "$BUILD_OUTPUT" ] && echo " Build target: $BUILD_OUTPUT"
[ -n "$ISO_OUTPUT" ] && echo " ISO target: $ISO_OUTPUT"
[ -n "$GRML_NAME" ] && echo " Grml name: $GRML_NAME"
[ -n "$RELEASENAME" ] && echo " Release name: $RELEASENAME"
[ -n "$DATE" ] && echo " Build date: $DATE"
[ -n "$VERSION" ] && echo " Grml version: $VERSION"
[ -n "$SUITE" ] && echo " Debian suite: $SUITE"
[ -n "$ARCH" ] && echo " Architecture: $ARCH"
[ -n "$BOOT_METHOD" ] && echo " Boot method: $BOOT_METHOD"
[ -n "$HYBRID_METHOD" ] && echo " Hybrid method: $HYBRID_METHOD"
[ -n "$TEMPLATE_DIRECTORY" ] && echo " Template files: $TEMPLATE_DIRECTORY"
[ -n "$CHROOT_INSTALL" ] && echo " Install files from directory to chroot: $CHROOT_INSTALL"
[ -n "$BOOTID" ] && echo " Boot identifier: $BOOTID"
[ -n "$NO_BOOTID" ] && echo " Skipping bootid feature."
[ -n "$DEFAULT_BOOTOPTIONS" ] && echo " Adding default bootoptions: \"$DEFAULT_BOOTOPTIONS\""
[ -n "$FAI_ARGS" ] && echo " Additional arguments for FAI: $FAI_ARGS"
[ -n "$LOGFILE" ] && echo " Logging to file: $LOGFILE"
[ -n "$SQUASHFS_ZLIB" ] && echo " Using ZLIB (instead of LZMA/XZ) compression."
[ -n "$SQUASHFS_OPTIONS" ] && echo " Using SQUASHFS_OPTIONS ${SQUASHFS_OPTIONS}"
[ -n "$VERBOSE" ] && echo " Using VERBOSE mode."
[ -n "$UPDATE" ] && echo " Executing UPDATE instead of fresh installation."
if [ -n "$BOOTSTRAP_ONLY" ] ; then
echo " Bootstrapping only and not building (files for) ISO."
else
[ -n "$SKIP_MKSQUASHFS" ] && echo " Skipping creation of SQUASHFS file."
[ -n "$SKIP_MKISOFS" ] && echo " Skipping creation of ISO file."
[ -n "$BUILD_ONLY" ] && echo " Executing BUILD_ONLY instead of fresh installation or UPDATE."
[ -n "$BUILD_DIRTY" ] && echo " Executing BUILD_DIRTY to leave chroot untouched."
fi
echo
echo -n "Is this ok for you? [y/N] "
read a
if ! [ "$a" = 'y' -o "$a" = 'Y' ] ; then
bailout 1 "Exiting as requested."
fi
echo
fi
# }}}
# clean/zero/remove logfiles {{{
if [ -n "$PRESERVE_LOGFILE" ] ; then
echo "Preserving logfile $LOGFILE as requested via \$PRESERVE_LOGFILE"
else
# make sure it is empty (as it is e.g. appended to grml-live-db)
echo -n > $LOGFILE
fi
if [ -n "$ZERO_FAI_LOGFILE" ] ; then
if [ -d /var/log/fai/"$HOSTNAME" ] ; then
rm -rf /var/log/fai/"$HOSTNAME"/"$(readlink /var/log/fai/"$HOSTNAME"/last)"
rm -rf /var/log/fai/"$HOSTNAME"/"$(readlink /var/log/fai/"$HOSTNAME"/last-dirinstall)"
rm -rf /var/log/fai/"$HOSTNAME"/"$(readlink /var/log/fai/"$HOSTNAME"/last-softupdate)"
rm -f /var/log/fai/"$HOSTNAME"/last \
/var/log/fai/"$HOSTNAME"/last-dirinstall \
/var/log/fai/"$HOSTNAME"/last-softupdate
fi
fi
# }}}
# source config and startup {{{
if [ -n "$CONFIG" ] ; then
if ! [ -f "$CONFIG" ] ; then
log "Error: $CONFIG could not be read. Exiting. [$(date)]"
eerror "Error: $CONFIG could not be read. Exiting." ; eend 1
bailout 1
else
log "Sourcing $CONFIG"
. $CONFIG
fi
fi
start_seconds=$(cut -d . -f 1 /proc/uptime)
log "------------------------------------------------------------------------------"
log "Starting grml-live [${GRML_LIVE_VERSION}] run on $(date)"
log "Executed grml-live command line:"
log "$CMDLINE"
einfo "Logging actions to logfile $LOGFILE"
# }}}
# on-the-fly configuration {{{
mkdir -p "$(dirname $SOURCES_LIST_OUTPUT)" # might not be present in -D config space
cat > "$SOURCES_LIST_OUTPUT" << EOF
# NOTE: This file is *NOT* meant for manual customisation! This file is
# installed temporarily only by grml-live and will be overriden in the
# installation and configuration process then.
EOF
if [ -n "$MIRROR_DIRECTORY" ] ; then
if ! [ -d "$MIRROR_DIRECTORY/debian" ] ; then
log "Error: $MIRROR_DIRECTORY/debian does not seem to exist. Exiting. [$(date)]"
eerror "Error: $MIRROR_DIRECTORY/debian does not seem to exist. Exiting." ; eend 1
bailout 1
fi
echo "$MIRROR_SOURCES" >> "$SOURCES_LIST_OUTPUT"
fi
if [ -n "$FAI_DEBOOTSTRAP" ] ; then
sed "s#^FAI_DEBOOTSTRAP=.*#FAI_DEBOOTSTRAP=\"$FAI_DEBOOTSTRAP\"#" "$NFSROOT_CONF" | sponge "$NFSROOT_CONF"
fi
# does this suck? YES!
# /usr/share/debootstrap/scripts/unstable does not exist, instead use 'sid':
case $SUITE in
unstable) SUITE='sid' ;;
# make sure that we *NEVER* write any broken suite name to sources.list,
# otherwise we won't be able to adjust it one next (correct) execution
stable) ;;
testing) ;;
etch) ;;
lenny) ;;
squeeze) ;;
wheezy) ;;
sid) ;;
*) echo "Sorry, $SUITE is not a valid Debian suite, exiting.">&2; bailout 1 ;;
esac
export SUITE # make sure it's available in FAI scripts
if [ -n "${GRML_LIVE_SOURCES:-}" ] ; then
DIST=" etch\| stable\| lenny\| squeeze\| wheezy\| testing\| sid\| unstable"
echo "# generated based on \$GRML_LIVE_SOURCES by grml-live
$GRML_LIVE_SOURCES" | \
sed -e "s/\(^deb .\+\)\([ \t]*\)\($DIST\)\([ \t]*\)\(main \)/\1 \2$SUITE\4\5/;
s/\(^deb-src .\+\)\([ \t]*\)\($DIST\)\([ \t]*\)\(main \)/\1 \2$SUITE\4\5/" >> "$SOURCES_LIST_OUTPUT"
else
cat >> "$SOURCES_LIST_OUTPUT" << EOF
# generated by grml-live
deb http://deb.grml.org/ grml-stable main
deb http://deb.grml.org/ grml-testing main
deb http://cdn.debian.net/debian $SUITE main contrib non-free
EOF
fi
# notice: activate grml-live pool when building against unstable or testing:
if grep -qwe unstable -qwe sid -qwe testing -qwe wheezy "$SOURCES_LIST_OUTPUT" ; then
grep -q 'grml-live.*main' "$SOURCES_LIST_OUTPUT" || \
grep grml-stable "$SOURCES_LIST_OUTPUT" | \
sed 's/grml-stable/grml-live/' >> "$SOURCES_LIST_OUTPUT"
else
grep -q 'grml-live.*main' "$SOURCES_LIST_OUTPUT" && \
sed -i 's/.*grml-live.*main/# removed grml-live repository/' "$SOURCES_LIST_OUTPUT"
fi
for file in "$LIVE_CONF" "$CONFIG" "$LOCAL_CONFIG" "$NFSROOT_CONF" ; do
if [ -n "$file" ] ; then
sed "s|^FAI_DEBOOTSTRAP=\"[a-z]* |FAI_DEBOOTSTRAP=\"$SUITE |" "$file" | sponge "$file"
fi
done
# validate whether the specified architecture class matches the
# architecture (option), otherwise installation of kernel will fail
if echo $CLASSES | grep -qi i386 ; then
if ! [[ "$ARCH" == "i386" ]] ; then
log "Error: You specified the I386 class but are trying to build something else (AMD64?)."
eerror "Error: You specified the I386 class but are trying to build something else (AMD64?)."
eerror "Tip: Either invoke grml-live with '-a i386' or adjust the architecture class. Exiting."
eend 1
bailout
fi
elif echo $CLASSES | grep -qi amd64 ; then
if ! [[ "$ARCH" == "amd64" ]] ; then
log "Error: You specified the AMD64 class but are trying to build something else (I386?)."
eerror "Error: You specified the AMD64 class but are trying to build something else (I386?)."
eerror "Tip: Either invoke grml-live with '-a amd64' or adjust the architecture class. Exiting."
eend 1
bailout
fi
fi
if grep -q -- 'FAI_DEBOOTSTRAP_OPTS.*--arch' "$NFSROOT_CONF" ; then
sed "s/--arch [a-z0-9]* /--arch $ARCH /" "$NFSROOT_CONF" | sponge "$NFSROOT_CONF"
else
sed "s|^FAI_DEBOOTSTRAP_OPTS=\"\(.*\)|FAI_DEBOOTSTRAP_OPTS=\"--arch $ARCH \1|" "$NFSROOT_CONF" | sponge "$NFSROOT_CONF"
fi
# }}}
# CHROOT_OUTPUT - execute FAI {{{
if [ -n "$BUILD_DIRTY" ]; then
log "Skipping stage 'fai' as requested via option -B"
ewarn "Skipping stage 'fai' as requested via option -B" ; eend 0
else
[ -n "$CHROOT_OUTPUT" ] || CHROOT_OUTPUT="$OUTPUT/grml_chroot"
# provide inform fai about the ISO we build
[ -d "$CHROOT_OUTPUT/etc/" ] || mkdir -p "$CHROOT_OUTPUT/etc/"
echo '# This file has been generated by grml-live.' > "$CHROOT_OUTPUT/etc/grml_live_version"
[ -n "$GRML_LIVE_VERSION" ] && echo "GRML_LIVE_VERSION=$GRML_LIVE_VERSION" >> "$CHROOT_OUTPUT/etc/grml_live_version"
[ -n "$SUITE" ] && echo "SUITE=$SUITE" >> "$CHROOT_OUTPUT/etc/grml_live_version"
if [ -n "$UPDATE" -o -n "$BUILD_ONLY" ] ; then
FAI_ACTION=softupdate
else
FAI_ACTION=dirinstall
fi
if [ -n "$UPDATE" -o -n "$BUILD_ONLY" ] ; then
if ! [ -r "$CHROOT_OUTPUT/etc/debian_version" ] ; then
log "Error: does not look like you have a working chroot. Updating/building not possible."
eerror "Error: does not look like you have a working chroot. Updating/building not possible. (Drop -u/-b option?)"
eend 1
bailout 20
fi
fi
if [ -d "$CHROOT_OUTPUT/bin" -a -z "$UPDATE" -a -z "$BUILD_ONLY" ] ; then
log "Skipping stage 'fai dirinstall' as $CHROOT_OUTPUT exists already."
ewarn "Skipping stage 'fai dirinstall' as $CHROOT_OUTPUT exists already." ; eend 0
else
mkdir -p "$CHROOT_OUTPUT" || bailout 5 "Problem with creating $CHROOT_OUTPUT for FAI"
if [ -n "${MIRROR_DIRECTORY}" ] ; then
mkdir -p "${CHROOT_OUTPUT}/${MIRROR_DIRECTORY}"
mount --bind "${MIRROR_DIRECTORY}" "${CHROOT_OUTPUT}/${MIRROR_DIRECTORY}"
fi
# tell dpkg to use "unsafe io" during the build
[ -d "$CHROOT_OUTPUT/etc/dpkg/dpkg.cfg.d" ] || mkdir -p "$CHROOT_OUTPUT/etc/dpkg/dpkg.cfg.d"
echo force-unsafe-io > "$CHROOT_OUTPUT/etc/dpkg/dpkg.cfg.d/unsafe-io"
log "Executed FAI command line:"
log "BUILD_ONLY=$BUILD_ONLY BOOTSTRAP_ONLY=$BOOTSTRAP_ONLY fai $VERBOSE -C $GRML_FAI_CONFIG -s file:///$GRML_FAI_CONFIG/config -c$CLASSES -u $HOSTNAME $FAI_ACTION $CHROOT_OUTPUT $FAI_ARGS"
BUILD_ONLY="$BUILD_ONLY" BOOTSTRAP_ONLY="$BOOTSTRAP_ONLY" fai $VERBOSE \
-C "$GRML_FAI_CONFIG" -s "file:///$GRML_FAI_CONFIG/config" -c"$CLASSES" \
-u "$HOSTNAME" "$FAI_ACTION" "$CHROOT_OUTPUT" $FAI_ARGS | tee -a $LOGFILE
RC="$PIPESTATUS" # notice: bash-only
rm -f "$CHROOT_OUTPUT/etc/dpkg/dpkg.cfg.d/unsafe-io"
FORCE_ISO_REBUILD=true
if [ "$RC" != 0 ] ; then
log "Error: critical error while executing fai [exit code ${RC}]. Exiting."
eerror "Error: critical error while executing fai [exit code ${RC}]. Exiting." ; eend 1
bailout 1
else
einfo "Setting /etc/grml_version to $GRML_NAME $VERSION Release Codename $RELEASENAME [$DATE]"
log "Setting /etc/grml_version to $GRML_NAME $VERSION Release Codename $RELEASENAME [$DATE]"
echo "$GRML_NAME $VERSION Release Codename $RELEASENAME [$DATE]" > $CHROOT_OUTPUT/etc/grml_version
chmod 644 $CHROOT_OUTPUT/etc/grml_version
einfo "Rebuilding initramfs"
# make sure new /etc/grml_version reaches initramfs, iterate over all
# present kernel versions (note: we can't really handle more than one
# kernel version anyway right now)
# chroot $CHROOT_OUTPUT update-initramfs -u -t => might break when using kernel-package :(
for initrd in "$(basename $CHROOT_OUTPUT/boot/vmlinuz-*)" ; do
if ! chroot $CHROOT_OUTPUT update-initramfs -k "${initrd##vmlinuz-}" -c ; then
einfo "Creating fresh initrd did not work, trying update instead:"
log "Creating fresh initrd did not work, trying update instead:"
chroot $CHROOT_OUTPUT update-initramfs -k "${initrd##vmlinuz-}" -u
fi
done
eend $?
fi
# Remove all FAI logs from chroot if class RELEASE is used:
if [ -f "$CHROOT_OUTPUT"/etc/grml_fai_release ] ; then
rm -rf "$CHROOT_OUTPUT"/var/log/fai/*
rm -f "$CHROOT_OUTPUT"/var/log/install_packages.list
fi
umount_all
# notice: 'fai dirinstall' does not seem to exit appropriate, so:
ERROR=''
CHECKLOG=/var/log/fai/$HOSTNAME/last
if [ -r "$CHECKLOG/software.log" ] ; then
# 1 errors during executing of commands
grep 'dpkg: error processing' $CHECKLOG/software.log >> $LOGFILE && ERROR=1
grep 'E: Method http has died unexpectedly!' $CHECKLOG/software.log >> $LOGFILE && ERROR=2
grep 'ERROR: chroot' $CHECKLOG/software.log >> $LOGFILE && ERROR=3
grep 'E: Failed to fetch' $CHECKLOG/software.log >> $LOGFILE && ERROR=4
grep 'Unable to write mmap - msync (28 No space left on device)' $CHECKLOG/software.log >> $LOGFILE && ERROR=5
fi
if [ -r "$CHECKLOG/shell.log" ] ; then
grep 'FAILED with exit code' $CHECKLOG/shell.log >> $LOGFILE && ERROR=6
fi
if [ -n "$ERROR" ] ; then
log "Error: there was a critical error [${ERROR}] during execution of stage 'fai dirinstall' [$(date)]"
eerror "Error: there was a critical error during execution of stage 'fai dirinstall'"
eerror "Note: check out ${CHECKLOG}/ for details. [exit ${ERROR}]"
eend 1
bailout 1
else
log "Finished execution of stage 'fai dirinstall' [$(date)]"
einfo "Finished execution of stage 'fai dirinstall'"
fi
einfo "Find FAI build logs at $(readlink -f /var/log/fai/$HOSTNAME/last)"
log "Find FAI build logs at $(readlink -f /var/log/fai/$HOSTNAME/last)"
eend 0
fi
fi # BUILD_DIRTY?
# }}}
# package validator {{{
CHECKLOG=/var/log/fai/$HOSTNAME/last
# package validator
if [ -r "$CHECKLOG/package_errors.log" ] && grep -q '[a-z]' "$CHECKLOG/package_errors.log" ; then
if [ -n "$EXIT_ON_MISSING_PACKAGES" -a -z "$BUILD_DIRTY" ] ; then
eerror "The following packages were requested for installation but could not be processed:"
cat $CHECKLOG/package_errors.log
eerror "... exiting as requested via \$EXIT_ON_MISSING_PACKAGES."
eend 1
bailout 13
else
ewarn "The following packages were requested for installation but could not be processed:"
cat $CHECKLOG/package_errors.log
eend 0
fi
fi
# }}}
# BUILD_OUTPUT - execute arch specific stuff and squashfs {{{
[ -n "$BUILD_OUTPUT" ] || BUILD_OUTPUT="$OUTPUT/grml_cd"
mkdir -p "$BUILD_OUTPUT" || bailout 6 "Problem with creating $BUILD_OUTPUT for stage ARCH"
# prepare ISO
if [ "$ARCH" = i386 ] || [ "$ARCH" = amd64 ] ; then
if [ -n "$BOOTSTRAP_ONLY" ] ; then
log "Skipping stage 'boot' as building with bootstrap only."
ewarn "Skipping stage 'boot' as building with bootstrap only." ; eend 0
else
if [ -d "$BUILD_OUTPUT"/boot/isolinux -a -z "$UPDATE" -a -z "$BUILD_ONLY" ] ; then
log "Skipping stage 'boot' as $BUILD_OUTPUT/boot/isolinux exists already."
ewarn "Skipping stage 'boot' as $BUILD_OUTPUT/boot/isolinux exists already." ; eend 0
else
# booting stuff:
[ -d "$BUILD_OUTPUT"/boot/isolinux ] || mkdir -p "$BUILD_OUTPUT"/boot/isolinux
[ -d "$BUILD_OUTPUT"/boot/"${SHORT_NAME}" ] || mkdir -p "$BUILD_OUTPUT"/boot/"${SHORT_NAME}"
# if we don't have an initrd we a) can't boot and b) there was an error
# during build, so check for the file:
INITRD="$(ls $CHROOT_OUTPUT/boot/initrd* 2>/dev/null| grep -v '.bak$' | sort -r | head -1)"
if [ -n "$INITRD" ] ; then
cp $INITRD "$BUILD_OUTPUT"/boot/"${SHORT_NAME}"/initrd.gz
find $CHROOT_OUTPUT/boot/ -name initrd\*.bak -exec rm {} \;
else
log "Error: No initrd found inside $CHROOT_OUTPUT/boot/ - Exiting"
eerror "Error: No initrd found inside $CHROOT_OUTPUT/boot/ - Exiting" ; eend 1
bailout 10
fi
KERNEL_IMAGE="$(ls $CHROOT_OUTPUT/boot/vmlinuz* 2>/dev/null | sort -r | head -1)"
if [ -n "$KERNEL_IMAGE" ] ; then
cp "$KERNEL_IMAGE" "$BUILD_OUTPUT"/boot/"${SHORT_NAME}"/linux26
else
log "Error: No kernel found inside $CHROOT_OUTPUT/boot/ - Exiting"
eerror "Error: No kernel found inside $CHROOT_OUTPUT/boot/ - Exiting" ; eend 1
bailout 11
fi
[ -n "$TEMPLATE_DIRECTORY" ] || TEMPLATE_DIRECTORY='/usr/share/grml-live/templates'
if ! [ -d "${TEMPLATE_DIRECTORY}"/boot ] ; then
log "Error: ${TEMPLATE_DIRECTORY}/boot does not exist. Exiting."
eerror "Error: ${TEMPLATE_DIRECTORY}/boot does not exist. Exiting." ; eend 1
bailout 8
fi
# copy _required_ isolinux files
for file in ifcpu64.c32 isolinux.bin vesamenu.c32; do
copy_addon_file "${file}" /usr/lib/syslinux isolinux
done
# *always* copy files to output directory so the variables
# get adjusted according to the build.
cp ${TEMPLATE_DIRECTORY}/boot/isolinux/* "$BUILD_OUTPUT"/boot/isolinux/
if [ -n "$NO_ADDONS" ] ; then
log "Skipping installation of boot addons as requested via \$NO_ADDONS."
einfo "Skipping installation of boot addons as requested via \$NO_ADDONS."; eend 0
else
if ! [ -d "$TEMPLATE_DIRECTORY"/boot/addons ] ; then
log "Boot addons not found, skipping therefore. (Consider installing package grml-live-addons)"
ewarn "Boot addons not found, skipping therefore. (Consider installing package grml-live-addons)" ; eend 0
else
# copy addons from system packages or grml-live-compat
copy_addon_file ipxe.lkrn /usr/lib/ipxe addons
copy_addon_file pci.ids /usr/share/misc addons
copy_addon_file memtest86+.bin /boot addons
for file in memdisk chain.c32 hdt.c32 menu.c32; do
copy_addon_file "${file}" /usr/lib/syslinux addons
done
# make memtest filename FAT16/8.3 compatible
mv "${BUILD_OUTPUT}/boot/addons/memtest86+.bin" \
"${BUILD_OUTPUT}/boot/addons/memtest"
# copy only files so we can handle bsd4grml on its own
for file in ${TEMPLATE_DIRECTORY}/boot/addons/* ; do
test -f $file && cp $file "$BUILD_OUTPUT"/boot/addons/
done
if [ -n "$NO_ADDONS_BSD4GRML" ] ; then
log "Skipping installation of bsd4grml as requested via \$NO_ADDONS_BSD4GRML."
einfo "Skipping installation of bsd4grml as requested via \$NO_ADDONS_BSD4GRML."; eend 0
else
if [ -d "$TEMPLATE_DIRECTORY"/boot/addons/bsd4grml ] ; then
cp -a ${TEMPLATE_DIRECTORY}/boot/addons/bsd4grml "$BUILD_OUTPUT"/boot/addons/
else
log "Missing addon file: bsd4grml"
ewarn "Missing addon file: bsd4grml" ; eend 0
fi
fi
fi # no "$TEMPLATE_DIRECTORY"/boot/addons
fi # NO_ADDONS
if ! [ -d "${BUILD_OUTPUT}/boot/grub" ] ; then
mkdir -p "${BUILD_OUTPUT}/boot/grub"
fi
cp ${TEMPLATE_DIRECTORY}/boot/grub/* "$BUILD_OUTPUT"/boot/grub/
if [ -e ${TEMPLATE_DIRECTORY}/compat/grub/linux.mod ]; then
cp "${TEMPLATE_DIRECTORY}"/compat/grub/* "${BUILD_OUTPUT}"/boot/grub/
else
if ! which "grub-mkimage" >/dev/null 2>&1 ; then
log "grub-mkimage not found, skipping Grub step therefore." ; eend 0
ewarn "grub-mkimage not found, skipping Grub step therefore."
ewarn "Please install grub-pc-bin or grub-common >= 1.98+20100804-14." ; eend 0
elif ! grub-mkimage --help | grep -q -- --format ; then
log "grub-mkimage does not support --format=i386-pc, skipping Grub step therefore." ; eend 0
ewarn "grub-mkimage does not support --format=i386-pc, skipping Grub step therefore."
ewarn "Please install grub-common >= 1.98+20100804-14 or grub-pc-bin." ; eend 0
else
# copy system grub files if grml-live-compat is not installed
cp -a /usr/lib/grub/*-pc/*.mod "${BUILD_OUTPUT}"/boot/grub/
cp -a /usr/lib/grub/*-pc/*.o "${BUILD_OUTPUT}"/boot/grub/
cp -a /usr/lib/grub/*-pc/*.lst "${BUILD_OUTPUT}"/boot/grub/
cp -a /usr/share/grub/ascii.pf2 "${BUILD_OUTPUT}"/boot/grub/
grub-mkimage -d /usr/lib/grub/*-pc -o \
"${BUILD_OUTPUT}/boot/grub/core.img" biosdisk iso9660 --format=i386-pc
fi
fi
if ! [ -d "${TEMPLATE_DIRECTORY}"/GRML ] ; then
log "Error: ${TEMPLATE_DIRECTORY}/GRML does not exist. Exiting."
eerror "Error: ${TEMPLATE_DIRECTORY}/GRML does not exist. Exiting." ; eend 1
bailout 9
fi
[ -d "$BUILD_OUTPUT"/GRML ] || mkdir "$BUILD_OUTPUT"/GRML
cp -a ${TEMPLATE_DIRECTORY}/GRML/* "$BUILD_OUTPUT"/GRML/
# adjust boot splash information:
RELEASE_INFO="$GRML_NAME $VERSION - Release Codename $RELEASENAME"
RELEASE_INFO="$(cut_string 68 "$RELEASE_INFO")"
RELEASE_INFO="$(extend_string_end 68 "$RELEASE_INFO")"
if [ -r "$BUILD_OUTPUT"/GRML/grml-version ] ; then
sed -i "s/%RELEASE_INFO%/$GRML_NAME $VERSION - $RELEASENAME/" "$BUILD_OUTPUT"/GRML/grml-version
sed -i "s/%DATE%/$DATE/" "$BUILD_OUTPUT"/GRML/grml-version
fi
# make sure the squashfs filename is set accordingly:
SQUASHFS_NAME="$GRML_NAME.squashfs"
if [ -n "$NO_BOOTID" ] ; then
log 'Skipping bootid feature as requested via $NO_BOOTID.'
einfo 'Skipping bootid feature as requested via $NO_BOOTID.'
else
[ -n "$BOOTID" ] || BOOTID="$(echo ${GRML_NAME}${VERSION} | tr -d ',./;\- ')"
[ -d "$BUILD_OUTPUT"/conf ] || mkdir "$BUILD_OUTPUT"/conf
einfo "Generating /conf/bootid.txt with entry ${BOOTID}."
log "Generating /conf/bootid.txt with entry ${BOOTID}."
echo "$BOOTID" > "$BUILD_OUTPUT"/conf/bootid.txt
eend $?
fi
# adjust all variables in the templates with the according distribution information
for file in "${BUILD_OUTPUT}"/boot/isolinux/*.cfg "${BUILD_OUTPUT}"/boot/isolinux/*.msg \
"${BUILD_OUTPUT}"/boot/grub/* ; do
if [ -r "${file}" ] ; then
sed -i "s/%ARCH%/$ARCH/g" "${file}"
sed -i "s/%DATE%/$DATE/g" "${file}"
sed -i "s/%DISTRI_INFO%/$DISTRI_INFO/g" "${file}"
sed -i "s/%DISTRI_NAME%/$DISTRI_NAME/g" "${file}"
sed -i "s/%DISTRI_SPLASH%/$DISTRI_SPLASH/g" "${file}"
sed -i "s/%GRML_NAME%/$GRML_NAME/g" "${file}"
sed -i "s/%SQUASHFS_NAME%/$SQUASHFS_NAME/g" "${file}"
sed -i "s/%RELEASE_INFO%/$RELEASE_INFO/g" "${file}"
sed -i "s/%SHORT_NAME%/$SHORT_NAME/g" "${file}"
sed -i "s/%VERSION%/$VERSION/g" "${file}"
[ -n "$DEFAULT_BOOTOPTIONS" ] && sed -i "s/ boot=live/ boot=live $DEFAULT_BOOTOPTIONS/" "${file}"
if [ -n "$NO_BOOTID" ] ; then
sed -i "s/ bootid=%BOOTID%//g" "${file}" # drop bootid bootoption
else
sed -i "s/%BOOTID%/$BOOTID/g" "${file}" # adjust bootid=... argument
fi
fi
done
# adjust bootsplash accordingly but make sure the string has the according lenght
SQUASHFS_NAME="$(cut_string 20 "$SQUASHFS_NAME")"
SQUASHFS_NAME="$(extend_string_end 20 "$SQUASHFS_NAME")"
for file in f4 f5 ; do
if [ -r "${BUILD_OUTPUT}/boot/isolinux/${file}" ] ; then
sed -i "s/%SQUASHFS_NAME%/$SQUASHFS_NAME/" "${BUILD_OUTPUT}/boot/isolinux/${file}"
sed -i "s/%SQUASHFS_NAME%/$SQUASHFS_NAME/" "${BUILD_OUTPUT}/boot/isolinux/${file}"
fi
done
# generate addon list
rm -f "${BUILD_OUTPUT}/${ADDONS_LIST_FILE}"
for name in "${BUILD_OUTPUT}"/boot/isolinux/addon_*.cfg ; do
include_name=$(basename "$name")
echo "include $include_name" >> "${BUILD_OUTPUT}/${ADDONS_LIST_FILE}"
done
if ! [ -r "${BUILD_OUTPUT}/boot/isolinux/${DISTRI_NAME}.cfg" ] || [ "$DISTRI_NAME" = "grml" ] ; then
log "including grmlmain.cfg in ${BUILD_OUTPUT}/boot/isolinux/distri.cfg"
echo "include grmlmain.cfg" > "${BUILD_OUTPUT}/boot/isolinux/distri.cfg"
echo "include default.cfg" > "${BUILD_OUTPUT}/boot/isolinux/grmlmain.cfg"
echo "include menuoptions.cfg" >> "${BUILD_OUTPUT}/boot/isolinux/grmlmain.cfg"
echo "include grml.cfg" >> "${BUILD_OUTPUT}/boot/isolinux/grmlmain.cfg"
for f in "${BUILD_OUTPUT}"/boot/isolinux/submenu*.cfg ; do
echo "include $(basename $f)" >> "${BUILD_OUTPUT}/boot/isolinux/grmlmain.cfg"
done
echo "include options.cfg" >> "${BUILD_OUTPUT}/boot/isolinux/grmlmain.cfg"
if [ ! -n "$NO_ADDONS" ] ; then
echo "include addons.cfg" >> "${BUILD_OUTPUT}/boot/isolinux/grmlmain.cfg"
fi
echo "include isoprompt.cfg" >> "${BUILD_OUTPUT}/boot/isolinux/grmlmain.cfg"
echo "include hd.cfg" >> "${BUILD_OUTPUT}/boot/isolinux/grmlmain.cfg"
echo "include hidden.cfg" >> "${BUILD_OUTPUT}/boot/isolinux/grmlmain.cfg"
else # assume we are building a custom distribution:
log "File ${BUILD_OUTPUT}/boot/isolinux/${DISTRI_NAME}.cfg found, using it."
einfo "File ${BUILD_OUTPUT}/boot/isolinux/${DISTRI_NAME}.cfg found, using it."
if grep -q "^include ${DISTRI_NAME}.cfg" "${BUILD_OUTPUT}/boot/isolinux/distri.cfg" ; then
log "include for ${DISTRI_NAME}.cfg already present, nothing to do."
eindent
einfo "include for ${DISTRI_NAME}.cfg already present, nothing to do."
eoutdent
eend $?
else
log "including ${DISTRI_NAME}.cfg in ${BUILD_OUTPUT}/boot/isolinux/distri.cfg"
echo "include ${DISTRI_NAME}.cfg" > "${BUILD_OUTPUT}/boot/isolinux/distri.cfg"
[ -n "$NO_ADDONS" ] || echo "include addons.cfg" >> "${BUILD_OUTPUT}/boot/isolinux/distri.cfg"
fi
fi
# use old style console based isolinux method only if requested:
if [[ "${ISOLINUX_METHOD}" == "console" ]] ; then
log 'Using console based isolinux method as requested via $ISOLINUX_METHOD.'
einfo 'Using console based isolinux method as requested via $ISOLINUX_METHOD.'
if grep -q '^include console.cfg' "${BUILD_OUTPUT}/boot/isolinux/distri.cfg" ; then
einfo "include for console.cfg already found, nothing to do."
eend 0
else
log "including console.cfg in ${BUILD_OUTPUT}/boot/isolinux/isolinux.cfg"
einfo "including console.cfg in ${BUILD_OUTPUT}/boot/isolinux/isolinux.cfg"
echo "include console.cfg" >> "${BUILD_OUTPUT}/boot/isolinux/isolinux.cfg"
eend $?
fi
else
log 'Using graphical boot menu.'
if grep -q '^include vesamenu.cfg' "${BUILD_OUTPUT}/boot/isolinux/isolinux.cfg" ; then
log "include for vesamenu.cfg already found, nothing to do."
else
log "including vesamenu.cfg in ${BUILD_OUTPUT}/boot/isolinux/isolinux.cfg"
echo "include vesamenu.cfg" >> "${BUILD_OUTPUT}/boot/isolinux/isolinux.cfg"
fi
fi
if [ -e "$BUILD_OUTPUT"/boot/addons/bsd4grml/boot.6 ]; then
sed -i "s/%RELEASE_INFO%/$GRML_NAME $VERSION - $RELEASENAME/" "$BUILD_OUTPUT"/boot/addons/bsd4grml/boot.6
fi
DPKG_LIST="/var/log/fai/$HOSTNAME/last/dpkg.list" # the dpkg --list output of the chroot
if ! [ -r "$DPKG_LIST" ] ; then
ewarn "$DPKG_LIST could not be read, ignoring to store package information on ISO therefore."
else
einfo "Storing package list information as /GRML/${GRML_NAME}-packages.txt on ISO."
cp "$DPKG_LIST" "${BUILD_OUTPUT}/GRML/${GRML_NAME}-packages.txt"
eend $?
fi
# autostart for Windows:
if [ -d "${TEMPLATE_DIRECTORY}/windows/autostart/" ] ; then
cp ${TEMPLATE_DIRECTORY}/windows/autostart/* "$BUILD_OUTPUT"/
fi
FORCE_ISO_REBUILD=true
einfo "Finished execution of stage 'boot'" ; eend 0
fi
fi # BOOTSTRAP_ONLY
else
log 'Error: Unsupported ARCH, sorry. Want to support it? Contribute!'
eerror 'Error: Unsupported ARCH, sorry. Want to support it? Contribute!' ; eend 1
bailout
fi
# support installation of local files into the chroot/ISO
if [ -n "$CHROOT_INSTALL" ] ; then
if ! [ -d "$CHROOT_INSTALL" ] ; then
log "Configuration variable \$CHROOT_INSTALL is set but not a directory; ignoring"
ewarn "Configuration variable \$CHROOT_INSTALL is set but not a directory; ignoring"
else
log "Copying local files to chroot as requested via \$CHROOT_INSTALL"
einfo "Copying local files to chroot as requested via \$CHROOT_INSTALL"
rsync -avz --inplace "$CHROOT_INSTALL"/ "$CHROOT_OUTPUT/"
eend $?
einfo "Make sure to run squashfs stage, otherwise your local files won't be part of the ISO."
FORCE_ISO_REBUILD=true
fi
fi
if [ -f "$BUILD_OUTPUT"/live/${GRML_NAME}.squashfs -a -z "$UPDATE" -a -z "$BUILD_ONLY" -a -z "$BUILD_DIRTY" ] ; then
log "Skipping stage 'squashfs' as $BUILD_OUTPUT/live exists already."
ewarn "Skipping stage 'squashfs' as $BUILD_OUTPUT/live exists already." ; eend 0
elif [ -n "$SKIP_MKSQUASHFS" ] ; then
log "Skipping stage 'squashfs' as requested via option -q or -N"
ewarn "Skipping stage 'squashfs' as requested via option -q or -N" ; eend 0
else
[ -d "$BUILD_OUTPUT"/live ] || mkdir "$BUILD_OUTPUT"/live
# make sure we don't leave (even an empty) base.tgz:
[ -f "$CHROOT_OUTPUT/base.tgz" ] && rm -f "$CHROOT_OUTPUT/base.tgz"
# if unconfigured default to squashfs-tools' mksquashfs binary
if [ -z "$SQUASHFS_BINARY" ] ; then
SQUASHFS_BINARY='mksquashfs'
fi
if which "$SQUASHFS_BINARY" >/dev/null 2>&1 ; then
log "Using mksquashfs binary ${SQUASHFS_BINARY}"
einfo "Using mksquashfs binary ${SQUASHFS_BINARY}" ; eend 0
else
log "Error: mksquashfs binary ($SQUASHFS_BINARY) not found. Exiting."
eerror "Error: mksquashfs binary ($SQUASHFS_BINARY) not found. Exiting." ; eend 1
bailout
fi
# use sane defaults if $SQUASHFS_OPTIONS isn't set
if [ -z "$SQUASHFS_OPTIONS" ] ; then
# use blocksize 256k as this gives best result with regards to time + compression
SQUASHFS_OPTIONS="-b 256k"
# set lzma/xz compression by default, unless -z option has been specified on command line
if [ -z "$SQUASHFS_ZLIB" ] ; then