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.

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