mirror of the now-defunct rocklinux.org
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

302 lines
6.9 KiB

  1. #!/bin/bash
  2. #
  3. # Commands in isofs.txt files:
  4. #
  5. # EVERY from to Put this on every disk
  6. # DISK1 from to Put this on the 1st disk
  7. # SINGLE from to Put it on any disk
  8. # SPLIT from to You may split it up over many disks
  9. #
  10. # BOOT boot-options Add this mkisofs options for 1st disk
  11. #
  12. # If you want to add multiple 'BOOT' lines, use the tag-name 'BOOTx' for
  13. # the 2nd and all further lines.
  14. #
  15. # SCRIPT script-name Run given script on each image
  16. #
  17. # Intended for image post-processing - like needed for IBM RS/6k boot
  18. # blessing. The first argument is the CD number - the second the image file.
  19. #
  20. if [ $# -eq 0 ] ; then
  21. echo
  22. echo "Usage: $0 [ -size MB ] [ -mkdebug] ISO-Prefix \\"
  23. echo " ${0//?/ } Config [ Config [ .. ] ]"
  24. echo
  25. echo "E.g.: $0 mycdset install generic"
  26. echo
  27. exit 1
  28. fi
  29. # default disk-size is 600 MB
  30. dsize=$(( 600 * 1024 ))
  31. mkdebug=0
  32. while true ; do
  33. case "$1" in
  34. -size)
  35. dsize=$(( $2 * 1024 )) ; shift ; shift ;;
  36. -mkdebug)
  37. mkdebug=1 ; shift ;;
  38. -* | '')
  39. $0 ; exit 1 ;;
  40. *)
  41. isoprefix=$1 ; shift ; break ;;
  42. esac
  43. done
  44. spacer=" "
  45. echo ; date "+ [%X] Removing old files with same prefix ..."
  46. rm -rf ${isoprefix}_*
  47. date "+ [%X] Reading configs and creating ISO index ..."
  48. index=`mktemp` ; dat=`mktemp`
  49. for cfg ; do
  50. id="`grep '^export ROCKCFG_ID=' config/$cfg/config | cut -f2 -d\'`"
  51. if ! cat build/$id/isofs.txt >> $dat
  52. then rm -f $dat $index ; exit 1 ; fi
  53. done
  54. add() {
  55. local from="$1" to="$2" done=0
  56. if [ ! -f "$from" -a ! -d "$from" ] ; then
  57. echo "No such file or directory: $from"
  58. rm -f $dat $index ; exit 1
  59. fi
  60. size="`du -sk $from | cut -f1`"
  61. if [ $size -gt $(( $dsize - $disk_0_size )) ] ; then
  62. echo "Junk $from is too big!"
  63. rm -f $dat $index ; exit 1
  64. fi
  65. for x in $disks ; do
  66. ds=disk_${x}_size ; dd=disk_${x}_data
  67. if [ $(( ${!ds} + $size )) -le \
  68. $(( $dsize - $disk_0_size )) ] ; then
  69. eval "$ds=$(( ${!ds} + $size ))"
  70. eval "$dd='${!dd} $to=$from'"
  71. done=1 ; break
  72. fi
  73. done
  74. if [ $done = 0 ] ; then
  75. disk_nr=$(( $disk_nr + 1 ))
  76. ds=disk_${disk_nr}_size ; eval "$ds=$size"
  77. dd=disk_${disk_nr}_data ; eval "$dd='$to=$from'"
  78. disks="$disks $disk_nr"
  79. fi
  80. }
  81. bootoptions=""
  82. scripts=""
  83. while read tag data ; do
  84. if [ $tag = BOOT ] ; then
  85. if [ "$bootoptions" ] ; then
  86. echo "Multiple boot options found!"
  87. rm -f $dat $index ; exit 1
  88. else
  89. bootoptions="$data"
  90. fi
  91. elif [ $tag = SCRIPT ] ; then
  92. scritps="$scripts '$data'"
  93. fi
  94. done < $dat
  95. while read tag data ; do
  96. [ $tag = BOOTx ] && bootoptions="$bootoptions $data"
  97. done < $dat
  98. echo "$spacer parsing for EVERY disk."
  99. disks="0" ; disk_nr=0 ; disk_0_size=0
  100. disk_0_data="index.txt=${isoprefix}_index.txt"
  101. while read type from to ; do
  102. if [ $type = EVERY ] ; then
  103. add $from $to
  104. if [ $disk_nr -gt 0 ] ; then
  105. echo "Every-disk data is too big!"
  106. rm -f $dat $index ; exit 1
  107. fi
  108. fi
  109. done < $dat
  110. echo "$spacer parsing for DISK1 disk."
  111. disk_nr=0 ; disks=""
  112. while read type from to ; do
  113. if [ $type = DISK1 ] ; then
  114. add $from $to
  115. if [ $disk_nr -gt 1 ] ; then
  116. echo "Disk 1 is too big!"
  117. rm -f $dat $index ; exit 1
  118. fi
  119. fi
  120. done < $dat
  121. echo "$spacer parsing for SINGLE disk."
  122. while read type from to ; do
  123. if [ $type = SINGLE ] ; then
  124. add $from $to
  125. fi
  126. done < $dat
  127. echo "$spacer parsing for SPLIT disk."
  128. while read type from to ; do
  129. if [ $type = SPLIT ] ; then
  130. find $from -type f -printf '%P\n' | sort > $index
  131. while read p ; do
  132. add $from$p $to$p
  133. done < $index
  134. fi
  135. done < $dat
  136. echo -n > $index
  137. for x in 0 $disks ; do
  138. dd=disk_${x}_data
  139. for y in ${!dd} ; do
  140. to=${y%=*} ; from=${y#*=}
  141. if [ -d $from ] ; then
  142. find $from -printf "disk$x $to%P\\n" >> $index
  143. else
  144. echo "disk$x $to" >> $index
  145. fi
  146. done
  147. done
  148. disk_0_size=$(( $disk_0_size + $( du -sk $index | cut -f1 ) ))
  149. if [ -z "$bootoptions" ] ; then
  150. echo "WARNING: Disk1 is not bootable - no boot options defined."
  151. fi
  152. xxx() {
  153. if ! mkisofs "$@" &> $dat ; then
  154. echo ; echo "mkisofs $*" ; echo
  155. cat $dat ; rm -f $index $dat ; exit 1
  156. fi
  157. }
  158. echo
  159. total=0
  160. for x in 0 $disks ; do
  161. ds=disk_${x}_size
  162. total=$(( $total + ${!ds} ))
  163. if [ $x = 0 ] ; then y="Shared"
  164. else y="`printf 'Disk%2d' $x`" ; fi
  165. z="$( grep "^disk$x " $index | wc -l )"
  166. if [ -z "$bootoptions" -o $x != 1 ] ; then
  167. printf "%15s $y: %7s kB in %5d files\n" "" ${!ds} $z
  168. else
  169. printf "%15s $y: %7s kB in %5d files (boot)\n" "" ${!ds} $z
  170. fi
  171. done
  172. printf "%15s Total: %8s kB in %5d files\n" "" $total $( wc -l < $index )
  173. echo
  174. date "+ [%X] Creating ${isoprefix}_index.txt ..."
  175. sort -tk -n -k2 < $index > ${isoprefix}_index.txt
  176. for x in $disks ; do
  177. dd=disk_${x}_data ; ds=disk_${x}_size
  178. date "+ [%X] Creating ${isoprefix}_cd$x.iso ..."
  179. echo "This is disk #$x." > $dat
  180. xxx -q -r -T -J -l -o ${isoprefix}_cd$x.iso -A "ROCK Linux - Disk $x" \
  181. -P 'The ROCK Linux Project - http://www.rocklinux.org' \
  182. $bootoptions -graft-points disk$x.txt=$dat $disk_0_data ${!dd}
  183. bootoptions=""
  184. if [ "$scripts" ] ; then
  185. echo "Running post-processing scripts on image ..."
  186. for script in $scripts ; do
  187. sh $script $x ${isoprefix}_cd$x.iso
  188. done
  189. fi
  190. if [ "$mkdebug" = 1 ] ; then
  191. cat > ${isoprefix}_loop$x.sh << EOT
  192. #!/bin/sh
  193. if [ "\$1" -a -z "\${1//[0-9]/}" ] ; then
  194. [ "\$2" ] && umount \$2 > /dev/null 2>&1
  195. losetup -d /dev/loop/\$1 > /dev/null 2>&1
  196. losetup /dev/loop/\$1 ${isoprefix}_cd$x.iso
  197. [ "\$2" ] && mount /dev/loop/\$1 \$2
  198. else
  199. echo "Usage: \$0 loopback-dev-nr [ mount-point ]"
  200. exit 1
  201. fi
  202. EOT
  203. chmod +x ${isoprefix}_loop$x.sh
  204. fi
  205. done
  206. if [ "$mkdebug" = 1 ] ; then
  207. vmwarebin="`type -p vmware`"
  208. if [ "$vmwarebin" ] ; then
  209. date "+ [%X] Creating ${isoprefix}_vmware.cfg ..."
  210. cat > ${isoprefix}_vmware.cfg << EOT
  211. #!$vmwarebin
  212. config.version = 6
  213. virtualHW.version = 2
  214. displayName = "${isoprefix}"
  215. # CD-ROM
  216. ide1:0.present = TRUE
  217. ide1:0.fileName = "${isoprefix}_cd1.iso"
  218. ide1:0.deviceType = "cdrom-image"
  219. ide1:0.startConnected = "TRUE"
  220. # Disk
  221. ide0:0.present = "TRUE"
  222. ide0:0.fileName = "${isoprefix}_vmware.vmdk"
  223. # Floppy
  224. floppy0.present = "TRUE"
  225. floppy0.fileType = "device"
  226. floppy0.startConnected = "FALSE"
  227. # Networked through shared IP address
  228. ethernet0.present = TRUE
  229. ethernet0.connectionType = "bridged"
  230. # Virtual Memory
  231. memsize = 128
  232. nvram = ${isoprefix}_vmware.nvram
  233. # Various
  234. log.fileName = ${isoprefix}_vmware.log
  235. tools.remindInstall = "FALSE"
  236. guestOS = linux
  237. EOT
  238. chmod +x ${isoprefix}_vmware.cfg
  239. cat << 'EOT' > $index
  240. begin 644 vmware_empty_disk.tar.bz2
  241. M0EIH.3%!62936<Q_V!4``/E_[OX`0$C``WN1S`"2@&8KGX5``"````%``(0`
  242. M!%PP`/@#`````#0:`-`-`8`````:#0!H!H`JA*-!!HU#)@:`A^J,GJ/)@GC[
  243. MI_;>_#.I9(V),D]J8B*R99?]WJCD9V-9S.<YUD94PB%GT5$1$7)#-TT4RG6I
  244. M:(CH3<E$&:3CEX+D5!H2:V-[K(^_=.!QXT-"1247(S/7ULT85/&CBQ5.19@>
  245. M4J),'U7,*U,0W-RFY>_2R]+T?#^M+2ZFTO6;#)A-9J+-+8P&Q\-;;MS.#+&\
  246. 4EP<%+R]J60*?(NY(IPH2&8_[`J``
  247. `
  248. end
  249. EOT
  250. uudecode -o - $index | bunzip2 > $dat
  251. date "+ [%X] Creating ${isoprefix}_vmware(-02).vmdk ..."
  252. tar xf $dat -O vmware.vmdk > ${isoprefix}_vmware.vmdk
  253. tar xf $dat -O vmware-02.vmdk > ${isoprefix}_vmware-02.vmdk
  254. fi
  255. fi
  256. date "+ [%X] Done. Have fun!"
  257. echo
  258. rm -f $index $dat