tazlito view tazlito @ rev 40

Really remove .moved subdir
author Pascal Bellard <pascal.bellard@slitaz.org>
date Wed Feb 20 14:05:21 2008 +0100 (2008-02-20)
parents 9c563f497af9
children 2be2a3822f02
line source
1 #!/bin/sh
2 # TazLito - SliTaz Live Tool.
3 #
4 # Tazlito is a tool to help generating and configuring SliTaz LiveCD
5 # ISO images. You can creat a custom distro in one command from a list of
6 # packages, extract a existing ISO image to hack it, creat new initramfs
7 # and/or new ISO. Most commands must be run by root, expect the stats
8 # and the configuration file manipulation.
9 #
10 # (C) 2007-2008 SliTaz - GNU General Public License.
11 #
12 # Authors : Christophe Lincoln <pankso@slitaz.org>
13 # Pascal Bellard <pascal.bellard@slitaz.org>
14 #
15 VERSION=1.4
17 # Tazlito configuration variables to be shorter
18 # and to use words rater than numbers.
19 COMMAND=$1
20 LIST_NAME=$2
21 TMP_DIR=/tmp/tazlito-$$-$RANDOM
22 TMP_MNT=/media/tazlito-$$-$RANDOM
23 TOP_DIR=`pwd`
24 INITRAMFS=rootfs.gz
25 LOCALSTATE=/var/lib/tazpkg
26 INSTALLED=$LOCALSTATE/installed
27 CACHE_DIR=/var/cache/tazpkg
28 MIRROR=$LOCALSTATE/mirror
30 # Try to include config file, continue if command is gen-config or exit.
31 # The main config used by default is in /etc/tazlito.
32 if [ -f "/etc/tazlito/tazlito.conf" ] ; then
33 CONFIG_FILE="/etc/tazlito/tazlito.conf"
34 fi
35 # Specific distro config file can be put in a distro tree.
36 if [ -f "$TOP_DIR/tazlito.conf" ] ; then
37 CONFIG_FILE="$TOP_DIR/tazlito.conf"
38 fi
39 if [ ! "$CONFIG_FILE" = "" ] ; then
40 . $CONFIG_FILE
41 else
42 if [ "$COMMAND" = "gen-config" ] ; then
43 continue
44 else
45 echo "Unable to find any configuration file. Please read the doc"
46 echo "or run '`basename $0` gen-config' to get an empty config file."
47 exit 0
48 fi
49 fi
51 # Set the rootfs and rootcd path with $DISTRO
52 # configuration variable.
53 ROOTFS=$DISTRO/rootfs
54 ROOTCD=$DISTRO/rootcd
56 #####################
57 # Tazlito functions #
58 #####################
60 # Print the usage.
61 usage ()
62 {
63 echo -e "\nSliTaz Live Tool - Version: $VERSION\n
64 \033[1mUsage: \033[0m `basename $0` [command] [list|iso|flavor] [dir]
65 \033[1mCommands: \033[0m\n
66 usage Print this short usage.
67 stats View Tazlito and distro configuration statistics.
68 gen-config Generate a new configuration file for a distro.
69 configure Configure the main config file or a specific tazlito.conf.
70 gen-iso Generate a new ISO from a distro tree.
71 gen-initiso Generate a new initramfs and ISO from the distro tree.
72 list-flavors List all available package lists on the mirror.
73 gen-flavor Generate a new live-CD description.
74 show-flavor Show live-CD description.
75 get-flavor Get a flavor's list of packages.
76 extract-distro Extract and ISO to a directory and rebuild LiveCD tree.
77 gen-distro Generated a Live distro and ISO from a list of packages.
78 clean-distro Remove all files generated by gen-distro.
79 addhacker Add Linux User Hacker to the current distro.
80 check-distro Help to check if distro is ready to release.
81 burn-iso Burn ISO image to a cdrom using Wodim.\n"
82 }
84 # Status function.
85 status()
86 {
87 local CHECK=$?
88 echo -en "\\033[70G[ "
89 if [ $CHECK = 0 ]; then
90 echo -en "\\033[1;33mOK"
91 else
92 echo -en "\\033[1;31mFailed"
93 fi
94 echo -e "\\033[0;39m ]"
95 }
97 yesorno()
98 {
99 echo -n "$1"
100 case "$DEFAULT_ANSWER" in
101 Y|y) answer="y";;
102 N|n) answer="n";;
103 *) read answer;;
104 esac
105 }
107 field()
108 {
109 grep "^$1" "$2" | sed 's/.*: \([0-9KMG\.]*\).*/\1/'
110 }
112 todomsg()
113 {
114 echo -e "\\033[70G[ \\033[1;31mTODO\\033[0;39m ]"
115 }
117 # Download a file trying each mirror
118 download()
119 {
120 for i in $(cat $MIRROR); do
121 wget $i$@
122 done
123 }
125 # exec hooks provided by some packages
126 genisohooks()
127 {
128 local here=`pwd`
129 cd $ROOTFS
130 for i in $(ls etc/tazlito/*.$1 2> /dev/null); do
131 . $i $ROOTCD
132 done
133 cd $here
134 }
136 cleanup()
137 {
138 if [ -d $TMP_MNT ]; then
139 umount $TMP_MNT
140 rmdir $TMP_MNT
141 rm -f /boot
142 fi
143 }
145 # echo the package name if the tazpkg is already installed
146 installed_package_name()
147 {
148 local tazpkg
149 local package
150 local VERSION
151 tazpkg=$1
152 # try du find package name and version to be able
153 # to repack it from installation
154 # a dash (-) can exist in name *and* in version
155 package=${tazpkg%-*}
156 i=$package
157 while true; do
158 VERSION=""
159 eval $(grep -s ^VERSION= $INSTALLED/$i/receipt)
160 if [ "$i-$VERSION" = "$tazpkg" ]; then
161 echo $i
162 break
163 fi
164 case "$i" in
165 *-*);;
166 *) break;;
167 esac
168 i=${i%-*}
169 done
170 }
172 # Check if user is root.
173 check_root()
174 {
175 if test $(id -u) != 0 ; then
176 echo -e "\nYou must be root to run `basename $0` with this option."
177 echo -e "Please type 'su' and root password to become super-user.\n"
178 exit 0
179 fi
180 }
182 # Check for the rootfs tree.
183 check_rootfs()
184 {
185 if [ ! -d "$ROOTFS/etc" ] ; then
186 echo -e "\nUnable to find a distro rootfs...\n"
187 exit 0
188 fi
189 }
191 # Check for the boot dir into the root CD tree.
192 verify_rootcd()
193 {
194 if [ ! -d "$ROOTCD/boot" ] ; then
195 echo -e "\nUnable to find the rootcd boot directory...\n"
196 exit 0
197 fi
198 }
200 # Gen a new ISO image using isolinux.
201 gen_livecd_isolinux()
202 {
203 # Some packages may want to alter iso
204 genisohooks iso
205 if [ ! -f "$ROOTCD/boot/isolinux/isolinux.bin" ]; then
206 echo -e "\nUnable to find isolinux binary.\n"
207 cleanup
208 exit 0
209 fi
210 # Set date for boot msg.
211 if grep -q 'XXXXXXXX' $ROOTCD/boot/isolinux/isolinux.msg; then
212 DATE=`date +%Y%m%d`
213 echo -n "Setting build date to: $dATE..."
214 sed -i s/'XXXXXXXX'/"$DATE"/ $ROOTCD/boot/isolinux/isolinux.msg
215 status
216 fi
217 cd $DISTRO
218 echo ""
219 echo -e "\033[1mGenerating ISO image\033[0m"
220 echo "================================================================================"
221 genisoimage -R -o $ISO_NAME.iso -b boot/isolinux/isolinux.bin \
222 -c boot/isolinux/boot.cat -no-emul-boot -boot-load-size 4 \
223 -V "$VOLUM_NAME" -p "$PREPARED" -input-charset iso8859-1 \
224 -boot-info-table $ROOTCD
225 echo "================================================================================"
226 # Some packages may want to alter final iso
227 genisohooks final
228 }
230 # Gen a new initramfs from the root file system.
231 gen_initramfs()
232 {
233 # Some packages may want to alter rootfs
234 genisohooks rootfs
235 cd $ROOTFS
236 echo ""
237 # Use lzma if installed
238 if [ "$COMPRESSION" = "none" ]; then
239 echo -n "Generating uncompressed initramfs... "
240 find . -print | cpio -o -H newc > $DISTRO/$INITRAMFS
241 elif [ -x /usr/bin/lzma -a "$COMPRESSION" != "gzip" ]; then
242 echo -n "Generating lzma'ed initramfs... "
243 find . -print | cpio -o -H newc | lzma e -si -so > $DISTRO/$INITRAMFS
244 else
245 echo -n "Generating gziped initramfs... "
246 find . -print | cpio -o -H newc | gzip -9 > $DISTRO/$INITRAMFS
247 fi
248 cd $DISTRO
249 mv $INITRAMFS $ROOTCD/boot
250 }
252 distro_sizes()
253 {
254 echo "Build date : `date +%Y%m%d\ \at\ \%H:%M:%S`"
255 echo "Packages : `ls -1 $ROOTFS$INSTALLED | wc -l`"
256 echo "Rootfs size : `du -sh $ROOTFS`"
257 echo "Initramfs size : `du -sh $ROOTCD/boot/$INITRAMFS`"
258 echo "ISO image size : `du -sh $ISO_NAME.iso`"
259 echo "================================================================================"
260 echo ""
261 }
263 # Print ISO and rootfs size.
264 distro_stats()
265 {
266 echo ""
267 echo -e "\033[1mDistro statistics\033[0m"
268 echo "================================================================================"
269 distro_sizes
270 }
272 # Creat an empty configuration file.
273 empty_config_file()
274 {
275 cat >> tazlito.conf << "EOF"
276 # tazlito.conf: Tazlito (SliTaz Live Tool)
277 # configuration file.
278 #
280 # Name of the ISO image to generate.
281 ISO_NAME=""
283 # ISO image volum name.
284 VOLUM_NAME="SliTaz"
286 # Name of the preparator.
287 PREPARED="$USER"
289 # Path to the packages repository and the packages.list.
290 PACKAGES_REPOSITORY=""
292 # Path to the distro tree to gen-distro from a
293 # list of packages.
294 DISTRO=""
296 # Path to the directory contening additional files
297 # to copy into the rootfs and rootcd of the LiveCD.
298 ADDFILES="$DISTRO/addfiles"
300 # Default answer for binary question (Y or N)
301 DEFAULT_ANSWER="ASK"
303 # Compression utility (lzma, gzip or none)
304 COMPRESSION="lzma"
305 EOF
306 }
308 ####################
309 # Tazlito commands #
310 ####################
312 case "$COMMAND" in
313 stats)
314 # Tazlito general statistics from the config file.
315 #
316 echo ""
317 echo -e "\033[1mTazlito statistics\033[0m
318 ===============================================================================
319 Config file : $CONFIG_FILE
320 ISO name : $ISO_NAME.iso
321 Volum name : $VOLUM_NAME
322 Prepared : $PREPARED
323 Packages repository : $PACKAGES_REPOSITORY
324 Distro directory : $DISTRO"
325 if [ ! "$ADDFILES" = "" ] ; then
326 echo -e "Additional files : $ADDFILES"
327 fi
328 echo "================================================================================"
329 echo ""
330 ;;
331 gen-config)
332 # Gen a new config file in the current dir or the specified
333 # directory by $2.
334 #
335 if [ -n "$2" ] ; then
336 mkdir -p $2 && cd $2
337 fi
338 echo -n "Generating empty tazlito.conf..."
339 empty_config_file
340 status
341 echo ""
342 if [ -f "tazlito.conf" ] ; then
343 echo "Configuration file is ready to edit."
344 echo "File location : `pwd`/tazlito.conf"
345 echo ""
346 fi
347 ;;
348 configure)
349 # Configure a tazlito.conf config file. Start by getting
350 # a empty config file and sed it.
351 #
352 if [ -f "tazlito.conf" ] ; then
353 rm tazlito.conf
354 else
355 if test $(id -u) = 0 ; then
356 cd /etc
357 else
358 echo "You must be root to configure the main config file or in"
359 echo "the same directory of the file you want to configure."
360 exit 0
361 fi
362 fi
363 empty_config_file
364 echo""
365 echo -e "\033[1mConfiguring :\033[0m `pwd`/tazlito.conf"
366 echo "================================================================================"
367 # ISO name.
368 echo -n "ISO name : " ; read answer
369 sed -i s#'ISO_NAME=\"\"'#"ISO_NAME=\"$answer\""# tazlito.conf
370 # Volume name.
371 echo -n "Volume name : " ; read answer
372 sed -i s/'VOLUM_NAME=\"SliTaz\"'/"VOLUM_NAME=\"$answer\""/ tazlito.conf
373 # Packages repository.
374 echo -n "Packages repository : " ; read answer
375 sed -i s#'PACKAGES_REPOSITORY=\"\"'#"PACKAGES_REPOSITORY=\"$answer\""# tazlito.conf
376 # Distro path.
377 echo -n "Distro path : " ; read answer
378 sed -i s#'DISTRO=\"\"'#"DISTRO=\"$answer\""# tazlito.conf
379 echo "================================================================================"
380 echo "Config file is ready to use."
381 echo "You can now extract an ISO or generate a distro."
382 echo ""
383 ;;
384 gen-iso)
385 # Simply generated a new iso.
386 #
387 check_root
388 verify_rootcd
389 gen_livecd_isolinux
390 distro_stats
391 ;;
392 gen-initiso)
393 # Simply generated a new initramfs with a new iso.
394 #
395 check_root
396 verify_rootcd
397 gen_initramfs
398 gen_livecd_isolinux
399 distro_stats
400 ;;
401 extract-distro)
402 # Extract a ISO image to a directory and rebuild the LiveCD tree.
403 #
404 check_root
405 ISO_IMAGE=$2
406 if [ -z "$ISO_IMAGE" ] ; then
407 echo -e "\nPlease specify the path to the ISO image."
408 echo -e "Example : `basename $0` image.iso /path/target\n"
409 exit 0
410 fi
411 # Set the distro path by checking for $3 on cmdline.
412 if [ -n "$3" ] ; then
413 TARGET=$3
414 else
415 TARGET=$DISTRO
416 fi
417 # Exit if existing distro is found.
418 if [ -d "$TARGET/rootfs" ] ; then
419 echo -e "\nA rootfs exist in : $TARGET"
420 echo -e "Please clean the distro tree or change directory path.\n"
421 exit 0
422 fi
423 echo ""
424 echo -e "\033[1mTazlito extracting :\033[0m $ISO_IMAGE"
425 echo "================================================================================"
426 # Start to mount the ISO.
427 echo ""
428 echo "Mounting ISO image..."
429 mkdir -p $TMP_DIR
430 # Get ISO file size.
431 isosize=`du -sh $ISO_IMAGE`
432 mount -o loop $ISO_IMAGE $TMP_DIR
433 sleep 2
434 # Prepare target dir, copy the kernel and the rootfs.
435 mkdir -p $TARGET/rootfs
436 mkdir -p $TARGET/rootcd/boot
437 echo -n "Copying the Linux kernel..."
438 if cp $TMP_DIR/boot/vmlinuz* $TARGET/rootcd/boot 2> /dev/null; then
439 ln $TARGET/rootcd/boot/vmlinuz* $TARGET/rootcd/boot/bzImage
440 else
441 cp $TMP_DIR/boot/bzImage $TARGET/rootcd/boot
442 fi
443 status
444 echo -n "Copying isolinux files..."
445 cp -a $TMP_DIR/boot/isolinux $TARGET/rootcd/boot
446 status
447 if [ -d $TMP_DIR/boot/syslinux ]; then
448 echo -n "Copying syslinux files..."
449 cp -a $TMP_DIR/boot/syslinux $TARGET/rootcd/boot
450 status
451 fi
452 if [ -d $TMP_DIR/boot/extlinux ]; then
453 echo -n "Copying extlinux files..."
454 cp -a $TMP_DIR/boot/extlinux $TARGET/rootcd/boot
455 status
456 fi
457 if [ -d $TMP_DIR/boot/grub ]; then
458 echo -n "Copying GRUB files..."
459 cp -a $TMP_DIR/boot/grub $TARGET/rootcd/boot
460 status
461 fi
463 echo -n "Copying the rootfs..."
464 cp $TMP_DIR/boot/rootfs.?z $TARGET/rootcd/boot
465 status
466 # Exract initramfs.
467 cd $TARGET/rootfs
468 echo -n "Extracting the rootfs... "
469 ( zcat ../rootcd/boot/rootfs.gz 2>/dev/null || \
470 lzma d ../rootcd/boot/rootfs.?z -so 2>/dev/null || \
471 cat ../rootcd/boot/rootfs.gz ) | cpio -id
472 # unpack /usr
473 if [ -f .usr.sqfs ]; then
474 echo -en "\nUnsquashfs'ing /usr... "
475 /sbin/unsquashfs .usr.sqfs
476 if [ -d squashfs-root/.moved ]; then
477 ( cd squashfs-root/.moved ; find * -type f -print ) | \
478 while read $file; do
479 rm -f $file
480 mv squashfs-root/.moved/$file $file
481 done
482 rm -rf squashfs-root/.moved
483 fi
484 mv squashfs-root/* usr
485 rmdir squashfs-root
486 fi
487 # Umount and remove temp directory and cd to $TARGET to get stats.
488 umount $TMP_DIR && rm -rf $TMP_DIR
489 cd ..
490 echo ""
491 echo "================================================================================"
492 echo "Extracted : $ISO_IMAGE ($isosize)"
493 echo "Distro tree : `pwd`"
494 echo "Rootfs size : `du -sh rootfs`"
495 echo "Rootcd size : `du -sh rootcd`"
496 echo "================================================================================"
497 echo ""
498 ;;
499 list-flavors)
500 # Show available flavors.
501 if [ ! -s /etc/tazlito/flavors.list -o "$2" == "--recharge" ]; then
502 download flavors.list -O - > /etc/tazlito/flavors.list
503 fi
504 echo ""
505 echo -e "\033[1mList of flavors\033[0m"
506 echo "================================================================================"
507 cat /etc/tazlito/flavors.list
508 echo ""
509 ;;
510 show-flavor)
511 # Show flavor description.
512 FLAVOR=$2
513 if [ ! -f "$FLAVOR.flavor" ]; then
514 echo "File $FLAVOR.flavor not found."
515 exit 1
516 fi
517 mkdir $TMP_DIR
518 zcat $FLAVOR.flavor | ( cd $TMP_DIR; cpio -i 2> /dev/null )
519 if [ "$3" = "--brief" ]; then
520 if [ "$4" != "--noheader" ]; then
521 echo "Name Sizes Description"
522 echo "================================================================================"
523 fi
524 printf "%-15.15s %5.5s/%5.5s %-51s\n" "$FLAVOR" \
525 "$(field ISO $TMP_DIR/$FLAVOR.desc)" \
526 "$(field Rootfs $TMP_DIR/$FLAVOR.desc)" \
527 "$(grep ^Description $TMP_DIR/$FLAVOR.desc | cut -d: -f2)"
528 else
529 echo "================================================================================"
530 cat $TMP_DIR/$FLAVOR.desc
531 fi
532 rm -Rf $TMP_DIR
533 ;;
534 gen-flavor)
535 # Generate a new flavor form then last iso image generation.
536 FLAVOR=$2
537 echo ""
538 echo -e "\033[1mFlavor generation\033[0m"
539 echo "================================================================================"
540 if [ -z "$FLAVOR" ]; then
541 echo -n "Flavor name : "
542 read FLAVOR
543 [ -z "$FLAVOR" ] && exit 1
544 fi
545 check_rootfs
546 FILES="$FLAVOR.pkglist"
547 echo -n "Creating file $FLAVOR.flavor..."
548 for i in rootcd rootfs; do
549 if [ -d "$ADDFILES/$i" ] ; then
550 FILES="$FILES\n$FLAVOR.$i"
551 ( cd "$ADDFILES/$i"; find . | \
552 cpio -o -H newc 2> /dev/null | gzip -9 ) > $FLAVOR.$i
553 fi
554 done
555 status
556 answer=`grep -s ^Description $FLAVOR.desc`
557 answer=${answer#Description : }
558 if [ -z "$answer" ]; then
559 echo -n "Description : "
560 read answer
561 fi
562 echo -n "Compressing flavor $FLAVOR..."
563 echo "Flavor : $FLAVOR" > $FLAVOR.desc
564 echo "Description : $answer" >> $FLAVOR.desc
565 ( cd $DISTRO; distro_sizes) >> $FLAVOR.desc
566 \rm -f $FLAVOR.pkglist 2> /dev/null
567 for i in $(ls $ROOTFS$INSTALLED); do
568 eval $(grep ^VERSION= $ROOTFS$INSTALLED/$i/receipt)
569 echo "$i-$VERSION" >> $FLAVOR.pkglist
570 done
571 echo -e "$FLAVOR.desc\n$FILES" | cpio -o -H newc 2>/dev/null | \
572 gzip -9 > $FLAVOR.flavor
573 rm `echo -e $FILES`
574 status
575 echo "================================================================================"
576 echo "Flavor size : `du -sh $FLAVOR.flavor`"
577 echo ""
578 ;;
579 get-flavor)
580 # Get a flavor's files and prepare for gen-distro.
581 FLAVOR=$2
582 if [ -f $FLAVOR.flavor ] || download $FLAVOR.flavor; then
583 echo -n "Cleaning $DISTRO..."
584 rm -R $DISTRO 2> /dev/null
585 mkdir -p $DISTRO
586 status
587 mkdir $TMP_DIR
588 zcat $FLAVOR.flavor | ( cd $TMP_DIR; cpio -i 2>/dev/null )
589 echo -n "Create distro-packages.list..."
590 mv $TMP_DIR/$FLAVOR.pkglist distro-packages.list
591 status
592 for i in rootcd rootfs; do
593 if [ -f $TMP_DIR/$FLAVOR.$i ]; then
594 mkdir -p "$ADDFILES/$i"
595 zcat $TMP_DIR/$FLAVOR.$i | \
596 ( cd "$ADDFILES/$i"; cpio -id 2> /dev/null)
597 fi
598 done
599 echo -n "Update tazlito.conf..."
600 [ -f tazlito.conf ] || cp /etc/tazlito/tazlito.conf .
601 cat tazlito.conf | grep -v "^#VOLUM_NAME" | \
602 sed "s/^VOLUM_NA/VOLUM_NAME=\"SliTaz $FLAVOR\"\\n#VOLUM_NA/" \
603 > tazlito.conf.$$ && mv tazlito.conf.$$ tazlito.conf
604 status
605 rm -Rf $TMP_DIR
606 fi
607 ;;
608 gen-distro)
609 # Generate a live distro tree with a set of packages.
610 #
611 check_root
612 if [ -d $ROOTFS ] ; then
613 echo "A rootfs exist in : $DISTRO"
614 echo -e "Please clean the distro tree or change directory path.\n"
615 exit 0
616 fi
617 # Check if a package list was specified on cmdline.
618 LIST_NAME="distro-packages.list"
619 CDROM=""
620 while [ -n "$2" ]; do
621 case "$2" in
622 --iso=*)
623 CDROM="-o loop ${2#--iso=}"
624 ;;
625 --cdrom)
626 CDROM="/dev/cdrom"
627 ;;
628 *) if [ ! -f "$2" ] ; then
629 echo -e "\nUnable to find the specified packages list."
630 echo -e "List name : $2\n"
631 exit 1
632 fi
633 LIST_NAME=$2
634 ;;
635 esac
636 shift
637 done
638 if [ ! -f "$LIST_NAME" -a -d $INSTALLED ] ; then
639 # Build list with installed packages
640 for i in $(ls $INSTALLED); do
641 eval $(grep ^VERSION= $INSTALLED/$i/receipt)
642 echo "$i-$VERSION" >> $LIST_NAME
643 done
644 fi
645 # Exit if no list name.
646 if [ ! -f "$LIST_NAME" ]; then
647 echo -e "\nNo packages list found or specified. Please read the doc.\n"
648 exit 0
649 fi
650 # Start generation.
651 echo ""
652 echo -e "\033[1mTazlito generating a distro\033[0m"
653 echo "================================================================================"
654 # Misc checks
655 [ -n "$PACKAGES_REPOSITORY" ] || PACKAGES_REPOSITORY="."
656 [ -d $PACKAGES_REPOSITORY ] || mkdir -p $PACKAGES_REPOSITORY
657 # Get the list of packages using cat for a file list.
658 LIST=`cat $LIST_NAME`
659 # Verify if all packages in list are presents in $PACKAGES_REPOSITORY.
660 REPACK=""
661 DOWNLOAD=""
662 for pkg in $LIST
663 do
664 [ "$pkg" = "" ] && continue
665 pkg=${pkg%.tazpkg}
666 [ -f $PACKAGES_REPOSITORY/$pkg.tazpkg ] && continue
667 PACKAGE=$(installed_package_name $pkg)
668 [ -n "$PACKAGE" -a "$REPACK" = "y" ] && continue
669 [ -z "$PACKAGE" -a -n "$DOWNLOAD" ] && continue
670 echo -e "\nUnable to find $pkg in the repository."
671 echo -e "Path : $PACKAGES_REPOSITORY\n"
672 if [ -n "$PACKAGE" -a -z "$REPACK" ]; then
673 yesorno "Repack packages from rootfs (y/N) ? "
674 REPACK="$answer"
675 [ "$answer" = "y" ] || REPACK="n"
676 [ "$DOWNLOAD" = "y" ] && break
677 fi
678 if [ -f $MIRROR -a -z "$DOWNLOAD" ]; then
679 yesorno "Download packages from mirror (Y/n) ? "
680 DOWNLOAD="$answer"
681 if [ "$answer" = "n" ]; then
682 [ -z "$PACKAGE" ] && exit 1
683 else
684 DOWNLOAD="y"
685 [ -n "$REPACK" ] && break
686 fi
687 fi
688 [ "$REPACK" = "n" -a "$DOWNLOAD" = "n" ] && exit 1
689 done
691 # mount cdrom to be able to repack boot-loader packages
692 if [ ! -e /boot -a -n "$CDROM" ]; then
693 mkdir $TMP_MNT
694 if mount -r $CDROM $TMP_MNT 2> /dev/null; then
695 ln -s $TMP_MNT/boot /
696 if [ ! -d "$ADDFILES/rootcd" ] ; then
697 mkdir -p $ADDFILES/rootcd
698 for i in $(ls $TMP_MNT); do
699 [ "$i" = "boot" ] && continue
700 cp -a $TMP_MNT/$i $ADDFILES/rootcd
701 done
702 fi
703 else
704 rmdir $TMP_MNT
705 fi
706 fi
708 # Root fs stuff.
709 echo "Preparing the rootfs directory..."
710 mkdir -p $ROOTFS
711 sleep 2
712 for pkg in $LIST
713 do
714 [ "$pkg" = "" ] && continue
715 # First copy and extract the package in tmp dir.
716 pkg=${pkg%.tazpkg}
717 PACKAGE=$(installed_package_name $pkg)
718 mkdir -p $TMP_DIR
719 if [ ! -f $PACKAGES_REPOSITORY/$pkg.tazpkg ]; then
720 # look for package in cache
721 if [ -f $CACHE_DIR/$pkg.tazpkg ]; then
722 ln -s $CACHE_DIR/$pkg.tazpkg $PACKAGES_REPOSITORY
723 # look for package in running distribution
724 elif [ -n "$PACKAGE" -a "$REPACK" = "y" ]; then
725 tazpkg repack $PACKAGE && \
726 mv $pkg.tazpkg $PACKAGES_REPOSITORY
727 fi
728 fi
729 if [ ! -f $PACKAGES_REPOSITORY/$pkg.tazpkg ]; then
730 # get package from mirror
731 [ "$DOWNLOAD" = "y" ] && \
732 download $pkg.tazpkg && \
733 mv $pkg.tazpkg $PACKAGES_REPOSITORY
734 fi
735 if [ ! -f $PACKAGES_REPOSITORY/$pkg.tazpkg ]; then
736 echo "Missing package $pkg."
737 cleanup
738 exit 1
739 fi
740 yes "" | tazpkg install $PACKAGES_REPOSITORY/$pkg.tazpkg --root=$ROOTFS
741 done
742 cp $LIST_NAME $ROOTFS/etc/tazlito/distro-packages.list
743 echo ""
744 cd $DISTRO
745 # Copy all files from $ADDFILES/rootfs to the rootfs.
746 if [ -d "$ADDFILES/rootfs" ] ; then
747 echo -n "Copying addfiles content to the rootfs... "
748 cp -a $ADDFILES/rootfs/* $ROOTFS
749 status
750 fi
751 echo "Root file system is generated..."
752 # Root CD part.
753 echo -n "Preparing the rootcd directory..."
754 mkdir -p $ROOTCD
755 status
756 # Move the boot dir with the Linux kernel from rootfs.
757 # The boot dir goes directly on the CD.
758 if [ -d "$ROOTFS/boot" ] ; then
759 echo -n "Moving the boot directory..."
760 mv $ROOTFS/boot $ROOTCD
761 cd $ROOTCD/boot
762 ln vmlinuz-* bzImage
763 status
764 fi
765 cd $DISTRO
766 # Copy all files from $ADDFILES/rootcd to the rootcd.
767 if [ -d "$ADDFILES/rootcd" ] ; then
768 echo -n "Copying addfiles content to the rootcd... "
769 cp -a $ADDFILES/rootcd/* $ROOTCD
770 status
771 fi
772 # Initramfs and ISO image stuff.
773 gen_initramfs
774 gen_livecd_isolinux
775 distro_stats
776 cleanup
777 ;;
778 clean-distro)
779 # Remove old distro tree.
780 #
781 check_root
782 echo ""
783 echo -e "\033[1mCleaning :\033[0m $DISTRO"
784 echo "================================================================================"
785 if [ -d "$DISTRO" ] ; then
786 if [ -d "$ROOTFS" ] ; then
787 echo -n "Removing the rootfs..."
788 rm -f $DISTRO/$INITRAMFS
789 rm -rf $ROOTFS
790 status
791 fi
792 if [ -d "$ROOTCD" ] ; then
793 echo -n "Removing the rootcd..."
794 rm -rf $ROOTCD
795 status
796 fi
797 echo -n "Removing eventual ISO image..."
798 rm -f $DISTRO/$ISO_NAME.iso
799 status
800 fi
801 echo "================================================================================"
802 echo ""
803 ;;
804 addhacker)
805 # Without /etc/passwd...
806 #
807 check_root
808 echo ""
809 echo -e "\033[1mAdduser hacker to :\033[0m $ROOTFS"
810 echo "================================================================================"
811 if [ ! -d "$ROOTFS/etc" ] ; then
812 echo -e "\nUnable to find : $ROOTFS/etc"
813 echo -e "Users and passwords config files will not be found.\n"
814 exit 0
815 fi
816 # Go for echoing on configuration files if any hacker was found.
817 #
818 if ! grep -q hacker $root/etc/passwd; then
819 echo -n "Configuring $ROOTFS/etc..."
820 echo 'hacker:x:500:500:Linux User,,,:/home/hacker:/bin/ash' >> $ROOTFS/etc/passwd
821 echo 'hacker::13646:0:99999:7:::' >> $ROOTFS/etc/shadow
822 echo 'hacker:x:500:' >> $ROOTFS/etc/group
823 echo 'hacker:!::' >> $ROOTFS/etc/gshadow
824 status
825 else
826 echo "Hacker is already in : $ROOTFS/etc/passwd"
827 fi
828 # Hacker can listen to music
829 #
830 if grep -q audio $root/etc/group; then
831 if ! grep -q "audio:x:20:hacker" $root/etc/group; then
832 sed -i s/'audio:x:20:'/'audio:x:20:hacker'/ $root/etc/group
833 fi
834 fi
835 # /home/hacker directories.
836 #
837 echo -n "Creating default directories... "
838 mkdir -p $fs/home/hacker/Documents \
839 $fs/home/hacker/Downloads \
840 $fs/home/hacker/Templates \
841 $fs/home/hacker/.local/bin \
842 $fs/home/hacker/.local/share
843 status
844 # Change permissions.
845 #
846 echo -n "Chmodig all files in /home/hacker..."
847 chown -R 500.500 $ROOTFS/home/hacker
848 status
849 echo "================================================================================"
850 echo "Linux User Hacker have an account in the distro."
851 echo ""
852 ;;
853 check-distro)
854 # Check for a few LiveCD needed files not installed by packages.
855 #
856 check_rootfs
857 echo ""
858 echo -e "\033[1mChecking distro :\033[0m $ROOTFS"
859 echo "================================================================================"
860 # SliTaz release info.
861 if [ ! -f "$ROOTFS/etc/slitaz-release" ]; then
862 echo "Missing release info : /etc/slitaz-release"
863 else
864 release=`cat $ROOTFS/etc/slitaz-release`
865 echo -n "Release : $release"
866 status
867 fi
868 # Tazpkg mirror.
869 if [ ! -f "$ROOTFS/var/lib/tazpkg/mirror" ]; then
870 echo -n "Mirror URL : Missing /var/lib/tazpkg/mirror"
871 todomsg
872 else
873 echo -n "Mirror configuration exist..."
874 status
875 fi
876 # Isolinux msg
877 if grep -q "cooking-XXXXXXXX" /$ROOTCD/boot/isolinux/isolinux.msg; then
878 echo -n "Isolinux msg : Missing cooking date XXXXXXXX (ex `date +%Y%m%d`)"
879 todomsg
880 else
881 echo -n "Isolinux message seems good..."
882 status
883 fi
884 echo "================================================================================"
885 echo ""
886 ;;
887 burn-iso)
888 # Guess cdrom device, ask user and burn the ISO.
889 #
890 check_root
891 DRIVE_NAME=`cat /proc/sys/dev/cdrom/info | grep "drive name" | cut -f 3`
892 DRIVE_SPEED=`cat /proc/sys/dev/cdrom/info | grep "drive speed" | cut -f 3`
893 # We can specify an alternative ISO from the cmdline.
894 if [ -n "$2" ] ; then
895 iso=$2
896 else
897 iso=$DISTRO/$ISO_NAME.iso
898 fi
899 if [ ! -f "$iso" ]; then
900 echo -e "\nUnable to find ISO : $iso\n"
901 exit 0
902 fi
903 echo ""
904 echo -e "\033[1mTazlito burn ISO\033[0m "
905 echo "================================================================================"
906 echo "Cdrom device : /dev/$DRIVE_NAME"
907 echo "Drive speed : $DRIVE_SPEED"
908 echo "ISO image : $iso"
909 echo "================================================================================"
910 echo ""
911 yesorno "Burn ISO image (y/N) ? "
912 if [ "$answer" == "y" ]; then
913 echo ""
914 echo "Starting Wodim to burn the iso..." && sleep 2
915 echo "================================================================================"
916 wodim speed=$DRIVE_SPEED dev=/dev/$DRIVE_NAME $iso
917 echo "================================================================================"
918 echo "ISO image is burned to cdrom."
919 else
920 echo -e "\nExiting. No ISO burned."
921 fi
922 echo ""
923 ;;
924 usage|*)
925 # Clear and print usage also for all unknow commands.
926 #
927 clear
928 usage
929 ;;
931 esac
933 exit 0