rev |
line source |
pascal@1725
|
1 #!/bin/sh
|
pascal@1725
|
2 # mkpkgiso, build packages ISO image.
|
pascal@1725
|
3 # (C) 2007-TODAY SliTaz - GNU General Public License v3.
|
pascal@1725
|
4 #
|
pascal@1725
|
5 # Authors : Eric Joseph-Alexandre <erjo@slitaz.org>
|
pascal@1725
|
6 # Pascal Bellard <pascal.bellard@slitaz.org>
|
pascal@1725
|
7
|
pascal@3670
|
8 VERSION=0.5
|
pascal@1725
|
9
|
pascal@1725
|
10 ROOT=/home/slitaz/iso
|
pascal@1725
|
11 TEMP_DIR=${ROOT}/_iso.$$
|
pascal@3670
|
12 SORT_FILE=${ROOT}/_sort.$$
|
pascal@1725
|
13 PKG_VER=$1
|
pascal@1725
|
14 shift
|
pascal@1725
|
15 OPTIONS=$@
|
pascal@1725
|
16 PKG_DIR=$TEMP_DIR/packages/$PKG_VER
|
pascal@1725
|
17 REPOS=/var/www/slitaz/mirror/packages/$PKG_VER
|
pascal@3670
|
18 PXE_DIR=/var/www/slitaz/mirror/pxe
|
pascal@1725
|
19 ISO_DIR=/var/www/slitaz/mirror/iso/$PKG_VER
|
pascal@1725
|
20 LOG=$PWD/$(basename $0).log
|
pascal@1725
|
21
|
pascal@1725
|
22 #
|
pascal@1725
|
23 VOLUME_ID="packages-${PKG_VER}"
|
pascal@1725
|
24 PUBLISHER="SliTaz http://www.slitaz.org/"
|
pascal@1725
|
25 IMAGE="packages-${PKG_VER}.iso"
|
pascal@1725
|
26 OUTPUT="$ROOT/$IMAGE"
|
pascal@1725
|
27
|
pascal@1725
|
28 # Check command line option.
|
pascal@1725
|
29 if [ -z $PKG_VER ]; then
|
pascal@3670
|
30 cat <<EOT
|
pascal@3670
|
31 Usage: $(basename $0) <Version>
|
pascal@3670
|
32 [--boot [--auto-install] [--loram-detect]]|--webboot] [--filter]
|
pascal@3670
|
33 [--wok] [--wok-stable] [--website][--dry-run]
|
pascal@3670
|
34 EOT
|
pascal@1725
|
35 exit 1
|
pascal@1725
|
36 fi
|
pascal@1725
|
37
|
pascal@1725
|
38 # Check if we provide a valide version
|
pascal@1725
|
39 if [ ! -d $REPOS ]; then
|
pascal@1725
|
40 echo "Boooh! $PKG_VER is not a valid version."
|
pascal@1725
|
41 exit 1
|
pascal@1725
|
42 fi
|
pascal@1725
|
43
|
pascal@1725
|
44 # Status function.
|
pascal@1725
|
45 status()
|
pascal@1725
|
46 {
|
pascal@1725
|
47 local CHECK=$?
|
pascal@1725
|
48 echo -en "\\033[70G[ "
|
pascal@1725
|
49 if [ $CHECK = 0 ]; then
|
pascal@1725
|
50 echo -en "\\033[1;33mOK"
|
pascal@1725
|
51 else
|
pascal@1725
|
52 echo -en "\\033[1;31mFailed"
|
pascal@1725
|
53 fi
|
pascal@1725
|
54 echo -e "\\033[0;39m ]"
|
pascal@1725
|
55 }
|
pascal@1725
|
56
|
pascal@1725
|
57 # Create temp directory
|
pascal@1725
|
58 mkdir -p $TEMP_DIR/packages/$PKG_VER
|
pascal@1725
|
59
|
pascal@1725
|
60 # Prepare evrything for ISO
|
pascal@1725
|
61
|
pascal@1725
|
62 echo ""
|
pascal@1725
|
63 echo "Building ISO for packages $PKG_VER"
|
pascal@1725
|
64 echo "==============================================================================="
|
pascal@1725
|
65 echo -n "Creating working dir $(basename $TEMP_DIR)"
|
pascal@1725
|
66 status
|
pascal@1725
|
67 echo -n "Creating symlink"
|
pascal@1725
|
68 status
|
pascal@1725
|
69
|
pascal@1725
|
70 # Link every packages to temp dir
|
pascal@1725
|
71 cd $PKG_DIR
|
pascal@1725
|
72 for i in $REPOS/*
|
pascal@1725
|
73 do
|
pascal@1725
|
74 ln -s $i >> $LOG 2>&1
|
pascal@1725
|
75 done
|
pascal@1725
|
76
|
pascal@1725
|
77 echo -n "Creating install script"
|
pascal@1725
|
78 # Create install script as suggested by Pascal.
|
pascal@1725
|
79 cat >$TEMP_DIR/install.sh<<EOF
|
pascal@1725
|
80 #!/bin/sh
|
pascal@1725
|
81 #
|
pascal@1725
|
82
|
pascal@3670
|
83 DIR=\$(cd \$(busybox dirname \$0); pwd)
|
pascal@3670
|
84
|
pascal@3670
|
85 # Handle --auto-install case
|
pascal@3670
|
86 if [ "\$DIR" == "/etc/init.d" ]; then
|
pascal@3670
|
87 DIR=/mnt
|
pascal@3670
|
88
|
pascal@3670
|
89 # Handle loram on hybrid hard disk / usb key case
|
pascal@3670
|
90 if [ ! -d /usr/bin ]; then
|
pascal@3670
|
91 if [ -d /.usr.rw ]; then
|
pascal@3670
|
92 echo -n "Mounting /usr read-write... "
|
pascal@3670
|
93 usr=.usr.ro
|
pascal@3670
|
94 else
|
pascal@3670
|
95 echo -n "Mounting /usr read-only... "
|
pascal@3670
|
96 usr=usr
|
pascal@3670
|
97 fi
|
pascal@3670
|
98 FS=\$DIR/usr.cromfs
|
pascal@3670
|
99 if [ -f \$FS ]; then
|
pascal@3670
|
100 /bin/cromfs-driver \$FS /\$usr -o ro,dev,suid,allow_other
|
pascal@3670
|
101 elif [ -f \$DIR/usr.sqfs ]; then
|
pascal@3670
|
102 FS=\$DIR/usr.sqfs
|
pascal@3670
|
103 mount -o loop,ro -t squashfs \$FS /\$usr
|
pascal@3670
|
104 elif [ -L /\$usr ]; then
|
pascal@3670
|
105 FS=\$DIR/usr
|
pascal@3670
|
106 fi
|
pascal@3670
|
107 status
|
pascal@3670
|
108 if [ -d /.usr.rw ]; then
|
pascal@3670
|
109 if [ -x /bin/funionfs ]; then
|
pascal@3670
|
110 /bin/funionfs -o dirs=/.usr.ro=RO:/.usr.rw -o allow_other -o suid,dev NONE /usr
|
pascal@3670
|
111 else
|
pascal@3670
|
112 /bin/mount -t aufs -o br:/.usr.rw:/.usr.ro none /usr
|
pascal@3670
|
113 fi
|
pascal@3670
|
114 fi
|
pascal@3670
|
115 fi
|
pascal@3670
|
116 fi
|
pascal@1725
|
117
|
pascal@2121
|
118 echo "Install packages..."
|
pascal@1725
|
119 [ -d /var/cache/tazpkg ] || mkdir -p /var/cache/tazpkg
|
pascal@1725
|
120 ls -d \$DIR/packages/* > /var/lib/tazpkg/mirror
|
pascal@1725
|
121 ln -fs \$DIR/packages/*/*.tazpkg /var/cache/tazpkg/
|
pascal@1725
|
122 ln -fs \$DIR/packages/*/packages.* /var/lib/tazpkg
|
pascal@3670
|
123 echo "=> all $PKG_VER package are available for tazpkg/tazpkgbox"
|
pascal@1725
|
124 EOF
|
pascal@1725
|
125 [ -e files.list.lzma ] && cat >>$TEMP_DIR/install.sh<<EOF
|
pascal@1725
|
126 ln -fs \$DIR/packages/*/files.list.lzma /var/lib/tazpkg
|
pascal@1725
|
127 EOF
|
pascal@1725
|
128
|
pascal@1725
|
129 status
|
pascal@3670
|
130 cat > $SORT_FILE <<EOT
|
pascal@3670
|
131 install.sh 8
|
pascal@3670
|
132 README 8
|
pascal@3670
|
133 index.html 8
|
pascal@3670
|
134 md5sum 8
|
pascal@3670
|
135 style.css 8
|
pascal@3670
|
136 images/header.png 8
|
pascal@3670
|
137 EOT
|
pascal@3670
|
138 ( cd $TEMP_DIR ; ls packages/*/packages* packages/*/files.list.lzma ) | \
|
pascal@3670
|
139 awk '{ printf "%s 4\n",$0 }' >> $SORT_FILE
|
pascal@1725
|
140 chmod 755 $TEMP_DIR/install.sh
|
pascal@1725
|
141
|
pascal@1725
|
142 case " $OPTIONS " in
|
pascal@1725
|
143 *\ --filter\ *)
|
pascal@1725
|
144 SIZE=0
|
pascal@1725
|
145 for i in *.tazpkg; do
|
pascal@1725
|
146 while read f; do
|
pascal@1725
|
147 case "$i" in
|
pascal@1725
|
148 $f*) continue 2;;
|
pascal@1725
|
149 esac
|
pascal@1725
|
150 done < packages.list
|
pascal@1725
|
151 echo -n "Filter out $i ($(du -hs $(readlink $i) | awk '{ print $1 }'))..."
|
pascal@1725
|
152 SIZE=$(( $SIZE + $(stat -c %s $(readlink $i)) ))
|
pascal@1725
|
153 rm $i
|
pascal@1725
|
154 status
|
pascal@1725
|
155 done
|
pascal@1725
|
156 UNIT=" bytes"
|
pascal@1725
|
157 if [ $SIZE -gt 10240 ]; then
|
pascal@1725
|
158 SIZE=$(( $SIZE / 1024 ))
|
pascal@1725
|
159 UNIT="K"
|
pascal@1725
|
160 fi
|
pascal@1725
|
161 if [ $SIZE -gt 10240 ]; then
|
pascal@1725
|
162 SIZE=$(( $SIZE / 1024 ))
|
pascal@1725
|
163 UNIT="M"
|
pascal@1725
|
164 fi
|
pascal@1725
|
165 echo "$SIZE$UNIT removed.";;
|
pascal@1725
|
166 esac
|
pascal@2569
|
167
|
pascal@2569
|
168 # Copy hg subtree
|
pascal@2569
|
169 get_from_hg()
|
pascal@2569
|
170 {
|
pascal@2569
|
171 [ /slitaz/home/slitaz/hg/$1 ] || return
|
pascal@2569
|
172 echo -n "Adding $2"
|
pascal@2569
|
173 /usr/sbin/chroot /slitaz hg --repository /home/slitaz/hg/$1 pull >/dev/null
|
pascal@2569
|
174 /usr/sbin/chroot /slitaz hg --repository /home/slitaz/hg/$1 update >/dev/null
|
pascal@2569
|
175 mkdir $TEMP_DIR/$1
|
pascal@2569
|
176 cp -a /slitaz/home/slitaz/hg/$1/* $TEMP_DIR/$1
|
pascal@2569
|
177 status
|
pascal@2569
|
178 echo "$(du -hs $TEMP_DIR/$1 | awk '{ print $1 }') used by $2."
|
pascal@2569
|
179 }
|
pascal@2569
|
180
|
pascal@2571
|
181 for i in $OPTIONS ; do
|
pascal@2571
|
182 case "$i" in
|
pascal@2571
|
183 --wok)
|
pascal@3670
|
184 cat >>$TEMP_DIR/install.sh<<EOF
|
pascal@3670
|
185 echo "=> Wok (cooking) is in \$DIR/wok"
|
pascal@3670
|
186 EOF
|
pascal@3670
|
187 if get_from_hg wok "wok (cooking)"; then
|
pascal@3670
|
188 ( cd $TEMP_DIR ; find wok -not -type d ) | \
|
pascal@3670
|
189 awk '{ printf "%s 2\n",$0 }' >> $SORT_FILE
|
pascal@3670
|
190 fi;;
|
pascal@2571
|
191 --wok-stable)
|
pascal@3670
|
192 cat >>$TEMP_DIR/install.sh<<EOF
|
pascal@3670
|
193 echo "=> Wok (stable) is in \$DIR/wok"
|
pascal@3670
|
194 EOF
|
pascal@3670
|
195 if get_from_hg wok-stable "wok (stable)"; then
|
pascal@3670
|
196 mv $TEMP_DIR/wok-stable $TEMP_DIR/wok
|
pascal@3670
|
197 ( cd $TEMP_DIR ; find wok -not -type d ) | \
|
pascal@3670
|
198 awk '{ printf "%s 2\n",$0 }' >> $SORT_FILE
|
pascal@3670
|
199 fi;;
|
pascal@2571
|
200 --website)
|
pascal@2569
|
201 if get_from_hg website "web site"; then
|
pascal@3670
|
202 ( cd $TEMP_DIR ; find website -not -type d ) | \
|
pascal@3670
|
203 awk '{ printf "%s 5\n",$0 }' >> $SORT_FILE
|
pascal@1725
|
204 cat >>$TEMP_DIR/install.sh<<EOF
|
pascal@1725
|
205 [ -d /var/www ] || mkdir -p /var/www
|
pascal@1725
|
206 ln -s \$DIR/website /var/www
|
pascal@3670
|
207 tazpkg list | grep -q ^lighttpd || yes y | tazpkg get-install lighttpd > /dev/null 2>&1
|
pascal@3670
|
208 echo "=> slitaz web site installed in http://localhost/website"
|
pascal@1725
|
209 EOF
|
pascal@1725
|
210 fi;;
|
pascal@1725
|
211 esac
|
pascal@2571
|
212 done
|
pascal@1725
|
213
|
pascal@1725
|
214 # Extract boot package function
|
pascal@1725
|
215 extract_boot()
|
pascal@1725
|
216 {
|
pascal@1725
|
217 f=$(ls $REPOS/$1-[0-9]*.tazpkg 2> /dev/null)
|
pascal@1725
|
218 [ -f "$f" ] || return 1
|
pascal@1725
|
219 [ -d $TEMP_DIR/boot ] || mkdir $TEMP_DIR/boot
|
pascal@1725
|
220 ( cd $TEMP_DIR/boot ; cpio -i fs.cpio.gz < $f 2> /dev/null )
|
pascal@1725
|
221 ( cd $TEMP_DIR/boot ; zcat fs.cpio.gz | cpio -id 2> /dev/null )
|
pascal@1725
|
222 mv $TEMP_DIR/boot/fs/boot/* $TEMP_DIR/boot
|
pascal@1725
|
223 rm -rf $TEMP_DIR/boot/fs.cpio.gz $TEMP_DIR/boot/fs
|
pascal@1725
|
224 return 0
|
pascal@1725
|
225 }
|
pascal@1725
|
226
|
pascal@1725
|
227 # Gen boot part
|
pascal@1725
|
228 BOOT_OPT=""
|
pascal@1725
|
229 iso=$ISO_DIR/slitaz-$PKG_VER.iso
|
pascal@3670
|
230 isoloram=$ISO_DIR/flavors/slitaz-loram-cdrom-sqfs.iso
|
pascal@1725
|
231 case " $OPTIONS " in
|
pascal@1725
|
232 *\ --boot\ *)
|
pascal@1725
|
233 echo -n "Creating boot tree"
|
pascal@1725
|
234 isoinfo -R -l -i $iso | awk '/^Directory/ { path=$4 } /^-/ { print path$12 }' | while read file; do
|
pascal@2118
|
235 [ "$(basename $file)" == ".." ] && continue
|
pascal@1725
|
236 [ "$file" = "/boot/isolinux/boot.cat" ] && continue
|
pascal@1725
|
237 [ -d "$(dirname $TEMP_DIR/$file)" ] ||
|
pascal@1725
|
238 mkdir -p "$(dirname $TEMP_DIR/$file)"
|
pascal@1725
|
239 isoinfo -R -x "$file" -i $iso > "$TEMP_DIR/$file"
|
pascal@1725
|
240 done
|
pascal@1725
|
241 status
|
pascal@1725
|
242 BOOT_OPT="-b boot/isolinux/isolinux.bin -c boot/isolinux/boot.cat \
|
pascal@3670
|
243 -no-emul-boot -boot-load-size 4 -boot-info-table -sort $SORT_FILE"
|
pascal@3670
|
244 case " $OPTIONS " in
|
pascal@3670
|
245 *\ --auto-install\ *)
|
pascal@3670
|
246 echo -n "Enable auto install"
|
pascal@3670
|
247 cat >>$TEMP_DIR/install.sh<<EOF
|
pascal@3670
|
248 echo "mount -o ro -t iso9660 LABEL=packages-$PKG_VER /mnt" >> /etc/init.d/local.sh
|
pascal@3670
|
249 EOF
|
pascal@3670
|
250 sed -i "s/rw root/rw config=LABEL=packages-$PKG_VER,install.sh root/" \
|
pascal@3670
|
251 $TEMP_DIR/boot/isolinux/*.cfg
|
pascal@3670
|
252 status
|
pascal@3670
|
253 ;;
|
pascal@3670
|
254 esac
|
pascal@3670
|
255 [ -f $PXE_DIR/ifmem.c32 -a -f $isoloram ] && case " $OPTIONS " in
|
pascal@3670
|
256 *\ --loram-detect\ *)
|
pascal@3670
|
257 echo -n "Enable loram autodetection"
|
pascal@3670
|
258 cp $PXE_DIR/ifmem.c32 "$TEMP_DIR/boot/isolinux"
|
pascal@3670
|
259 isoinfo -R -x "/usr.sqfs" -i $isoloram > "$TEMP_DIR/usr.sqfs"
|
pascal@3670
|
260 echo 'usr.sqfs 8' >> $SORT_FILE
|
pascal@3670
|
261 isoinfo -R -x "/boot/rootfs.gz" -i $isoloram > \
|
pascal@3670
|
262 "$TEMP_DIR/boot/loram.gz"
|
pascal@3670
|
263 sed -i -e 's|kernel /boot/bzImage|kernel /boot/isolinux/ifmem.c32\n\tappend 160768 core loram\n|' \
|
pascal@3670
|
264 -e 's|\(.*/\)rootfs\(.gz .*\)$|label core\n\tkernel /boot/bzImage\n\1rootfs\2\n\nlabel loram\n\tkernel /boot/bzImage\n\1loram\2|' \
|
pascal@3670
|
265 $TEMP_DIR/boot/isolinux/*.cfg
|
pascal@3670
|
266 status
|
pascal@3670
|
267 ;;
|
pascal@3670
|
268 esac
|
pascal@3670
|
269 ( cd $TEMP_DIR ; find boot -not -type d ) | \
|
pascal@3670
|
270 awk '{ printf "%s 9\n",$0 }' >> $SORT_FILE
|
pascal@1725
|
271 ;;
|
pascal@1725
|
272 *\ --webboot\ *)
|
pascal@1725
|
273 if extract_boot gpxe; then
|
pascal@1725
|
274 echo -n "Creating web boot tree"
|
pascal@1725
|
275 mkdir $TEMP_DIR/boot/isolinux/
|
pascal@1725
|
276 isoinfo -x "/BOOT/ISOLINUX/ISOLINUX.BIN;1" -i $iso > \
|
pascal@1725
|
277 $TEMP_DIR/boot/isolinux/isolinux.bin
|
pascal@1725
|
278 mv $TEMP_DIR/boot/gpxe $TEMP_DIR/boot/isolinux
|
pascal@3670
|
279 ( cd $TEMP_DIR ; find boot -not -type d ) | \
|
pascal@3670
|
280 awk '{ printf "%s 9\n",$0 }' >> $SORT_FILE
|
pascal@1725
|
281 cat > $TEMP_DIR/boot/isolinux/isolinux.cfg <<EOT
|
pascal@1725
|
282 default gpxe
|
pascal@1725
|
283 append http://mirror.slitaz.org/pxe/pxelinux.0
|
pascal@1725
|
284 EOT
|
pascal@1725
|
285 status
|
pascal@1725
|
286 BOOT_OPT="-b boot/isolinux/isolinux.bin -c boot/isolinux/boot.cat \
|
pascal@3670
|
287 -no-emul-boot -boot-load-size 4 -boot-info-table -sort $SORT_FILE"
|
pascal@1725
|
288 fi
|
pascal@1725
|
289 ;;
|
pascal@1725
|
290 esac
|
pascal@1725
|
291
|
pascal@1725
|
292 if [ -n "$BOOT_OPT" ]; then
|
pascal@3670
|
293 echo "$(du -chs $TEMP_DIR/boot $TEMP_DIR/usr.sqfs 2> /dev/null | \
|
pascal@3670
|
294 tail -1 | awk '{ print $1 }') used by boot."
|
pascal@1725
|
295 fi
|
pascal@1725
|
296
|
pascal@3670
|
297 case " $OPTIONS " in
|
pascal@3670
|
298 *\ --dry-run\ *)
|
pascal@3670
|
299 echo "Please check and remove $TEMP_DIR and $SORT_FILE"
|
pascal@3670
|
300 exit
|
pascal@3670
|
301 ;;
|
pascal@3670
|
302 esac
|
pascal@1725
|
303 # Gen ISO
|
pascal@1725
|
304 echo -n "Generating iso image"
|
pascal@1725
|
305 /usr/bin/genisoimage -R -J -f -V $VOLUME_ID \
|
pascal@1725
|
306 -P "$PUBLISHER" -md5-list $REPOS/packages.md5 \
|
pascal@1725
|
307 -quiet -o $OUTPUT $BOOT_OPT $TEMP_DIR
|
pascal@1725
|
308 status
|
pascal@1725
|
309
|
pascal@1725
|
310 echo "$(du -hs $OUTPUT | awk '{ print $1 }') used by iso image."
|
pascal@1725
|
311
|
pascal@2118
|
312 cd ${ROOT}
|
pascal@2115
|
313 echo -n "Create hybrid DVD/CDROM"
|
pascal@2118
|
314 [ -x /usr/bin/isohybrid ] && /usr/bin/isohybrid $IMAGE 2> /dev/null
|
pascal@2115
|
315 status
|
pascal@2115
|
316
|
pascal@1725
|
317 echo -n "Calculate md5sum"
|
pascal@1725
|
318 /usr/bin/md5sum $IMAGE > $(basename $IMAGE .iso).md5
|
pascal@1725
|
319 status
|
pascal@1725
|
320
|
pascal@1725
|
321 echo -n "Moving file to mirror"
|
pascal@1725
|
322 mv $IMAGE $ISO_DIR
|
pascal@1725
|
323 mv $(basename $IMAGE .iso).md5 $ISO_DIR
|
pascal@1725
|
324 status
|
pascal@1725
|
325
|
pascal@3670
|
326 # Cleaning temp files
|
pascal@3670
|
327 rm -rf $TEMP_DIR $SORT_FILE
|
pascal@1725
|
328
|