libvbuilder.sh.in 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405
  1. #!/bin/bash
  2. setup-vbuilder(){
  3. ## load default settings
  4. VBUILDER_CONF=/etc/vbootstrap/vbuilder.conf
  5. if [ -r $VBUILDER_CONF ]; then
  6. . $VBUILDER_CONF
  7. [ $? -eq 1 ] && return 1
  8. fi
  9. [ -z "${DEFAULT_VERSION}" ] && \
  10. DEFAULT_VERSION=@@VBUILDER_DEFAULT_VERSION@@
  11. [ -z "${CATEGORIES}" ] && \
  12. CATEGORIES=@@VBUILDER_CATEGORIES@@
  13. [ -z "${VBOOTSTRAP_DIR}" ] && \
  14. VBOOTSTRAP_DIR=@@VBUILDER_VBOOTSTRAP_DIR@@
  15. [ -z "${UNIONFS_DIR}" ] && \
  16. UNIONFS_DIR=@@VBUILDER_UNIONFS_DIR@@
  17. [ -z "${CACHE_DIR}" ] && \
  18. CACHE_DIR=@@VBUILDER_CACHE_DIR@@
  19. [ -z "${BUILT_RPMS_DIR}" ] && \
  20. BUILT_RPMS_DIR=@@VBUILDER_BUILT_RPMS_DIR@@
  21. ## set default version for vbootstrap
  22. VERSION=$DEFAULT_VERSION
  23. ## set current stable relase version
  24. STABLE_VERSION=@@VBUILDER_STABLE_VERSION@@
  25. ## set boolian variables
  26. with_setup_vbootstrap=0
  27. with_dist_upgrade=0
  28. with_unionfs=0
  29. with_sign=0
  30. with_no_install=0
  31. with_debug=0
  32. with_actions=0
  33. with_ix86_on_x86_64=0
  34. with_category_main=0
  35. with_category_plus=0
  36. with_category_nonfree=0
  37. with_category_test=0
  38. with_category_proposed_updates=0
  39. with_category_security=0
  40. return 0
  41. }
  42. setup-vbootstrap(){
  43. if [ ${with_setup_vbootstrap} -eq 0 ]; then
  44. with_setup_vbootstrap=1
  45. ## check debug mode
  46. [ ${with_debug} -eq 1 ] && \
  47. set && set -x
  48. ## check some directories
  49. ## Note: create $BUILT_RPMS_DIR in RPM_Build()
  50. [ -d $VBOOTSTRAP_DIR ] || mkdir -p $VBOOTSTRAP_DIR
  51. [ -d $CACHE_DIR ] || mkdir -p $CACHE_DIR
  52. UARCH=$(uname -i)
  53. case "${UARCH}" in
  54. arm*)
  55. UARCH="arm"
  56. ;;
  57. esac
  58. case "${VARCH}" in
  59. arm*)
  60. VARCH="arm"
  61. ;;
  62. esac
  63. ## check a chroot archtecture
  64. if [ -z ${VARCH} ]; then
  65. VARCH=${UARCH}
  66. else
  67. case "${VARCH}" in
  68. i386|i686|x86_64)
  69. [ "$(uname -i)" = "ppc" -o "${UARCH}" = "arm" ] && \
  70. echo $"E: arch ${VARCH} is NOT supported on $(uname -i)" && return 1
  71. ;;
  72. ppc)
  73. [ "$(uname -i)" = "i386" -o "$(uname -i)" = "i686" -o "$(uname -i)" = "x86_64" -o "${UARCH}" = "arm" ] && \
  74. echo $"E: arch ${VARCH} is NOT supported on $(uname -i)" && return 1
  75. ;;
  76. arm)
  77. [ "${UARCH}" = "i386" -o "${UARCH}" = "i686" -o "${UARCH}" = "x86_64" -o "${UARCH}" = "ppc" ] && \
  78. echo $"E: arch ${VARCH} is NOT supported on ${UARCH}" && return 1
  79. ;;
  80. esac
  81. fi
  82. ##!! 4.2 is NO support on VARCH=x86_64
  83. if [ "${VERSION}" = "4.2" -a "${VARCH}" = "x86_64" ]; then
  84. echo $"E: ${VERSION} is NOT supported"
  85. return 1
  86. fi
  87. ##!! 4.2 is NO support on VARCH=arm
  88. if [ "${VERSION}" = "4.2" -a "${VARCH}" = "arm" ]; then
  89. echo $"E: ${VERSION} is NOT supported"
  90. return 1
  91. fi
  92. ## support i386 chroot on x86_64 below:
  93. [ "${VARCH}" != "${UARCH}" ] && \
  94. VERSION=${VERSION}_${VARCH} && \
  95. with_ix86_on_x86_64=1
  96. ## hack arm repository to local
  97. [ "${VARCH}" = "arm" ] && \
  98. VERSION=${VERSION}_${VARCH}
  99. ## check support ${VERSION}
  100. if [ -z "$(/usr/sbin/vbootstrap | sed -e s/^Usage:.*// -e s/^E:.*// | grep -m 1 ${VERSION})" ]; then
  101. echo $"E: ${VERSION} is NOT supported"
  102. return 1
  103. fi
  104. ## check ${VERSION} equals VineSeed*, when with_dist_upgrade=1
  105. if [ $with_dist_upgrade -eq 1 ]; then
  106. if [ "$(echo ${VERSION} | sed -e "s/\(VineSeed\).*/\1/")" != "VineSeed" ]; then
  107. echo $"E: version ${VERSION} does not support --dist-upgrade option"
  108. return 1
  109. fi
  110. fi
  111. ## set ${MAJOR_VERSION}
  112. MAJOR_VERSION=$(echo ${VERSION} | sed -e "s/_i[0-9]86//")
  113. ## check apt categories
  114. ## "main" category is unconditionally permited
  115. with_category_main=1
  116. for cat in $(echo ${CATEGORIES} | sed -e "s/,/ /"g); do
  117. case $cat in
  118. main)
  119. with_category_main=1
  120. ;;
  121. plus)
  122. with_category_plus=1
  123. ;;
  124. nonfree)
  125. with_category_nonfree=1
  126. ;;
  127. test)
  128. ## "test" category only exists in VineSeed
  129. [ "${MAJOR_VERSION}" = "VineSeed" ] || \
  130. echo $"E: No such category exists: $cat" && return 1
  131. with_category_test=1
  132. ;;
  133. proposed-updates)
  134. ##!! "proposed-updates" category does not exist in 4.2
  135. [ "${MAJOR_VERSION}" = "4.2" ] && \
  136. echo $"E: No such category exists: $cat" && return 1
  137. with_category_proposed_updates=1
  138. ;;
  139. security)
  140. ## "security" category does not exist in VineSeed
  141. [ "${MAJOR_VERSION}" = "VineSeed" ] && \
  142. echo $"E: No such category exists: $cat" && return 1
  143. with_category_security=1
  144. ;;
  145. *)
  146. echo $"E: No such category exists: $cat" && return 1
  147. ;;
  148. esac
  149. done
  150. ## check build target option ${TARGET}
  151. if [ ! -z "${TARGET}" ]; then
  152. RPM_TARGET_LIST="$(cat /usr/lib/rpm/rpmrc | grep arch_canon: | sed -e "s/arch_canon:[[:blank:]]*\(.*\):.*/\1/")"
  153. if [ -z "$(echo $RPM_TARGET_LIST | grep $TARGET)" ]; then
  154. echo $"E: rpm build target ${TARGET} is NOT supported"
  155. return 1
  156. fi
  157. fi
  158. ## set ${RPM_PKG_ARCH_LIST}
  159. RPM_PKG_ARCH_LIST="RPMS/i386 RPMS/i686 RPMS/x86_64 RPMS/ppc RPMS/noarch RPMS/armv3l RPMS/armv4l RPMS/armv4tl RPMS/armv5tejl RPMS/armv5tel RPMS/armv6l RPMS/armv7l SRPMS"
  160. [ -z "${TARGET}" ] || \
  161. RPM_PKG_ARCH_LIST="RPMS/${TARGET} ${RPM_PKG_ARCH_LIST}"
  162. fi
  163. ## set global variables
  164. BUILD_ROOT=${VBOOTSTRAP_DIR}/${VERSION}
  165. BUILD_USER=vbuilder
  166. BUILD_DIR=/home/${BUILD_USER}/rpm
  167. UNIONFS_ROOT=${UNIONFS_DIR}/${VERSION}
  168. ARCHIVES_DIR=${BUILD_ROOT}/var/cache/apt/archives
  169. EXTERNAL_ARCHIVES_DIR=${CACHE_DIR}/${VERSION}/apt/archives
  170. VBUILDER_LOG=${BUILD_ROOT}/var/log/vbuilder.log
  171. __chroot_sh="/usr/sbin/chroot ${BUILD_ROOT} /bin/sh -c -l"
  172. mkdir -p $VBOOTSTRAP_DIR
  173. return 0
  174. }
  175. setup-vbootstrap-rpm(){
  176. setup-vbootstrap || return 1
  177. ## check ${BUILD_ROOT}
  178. [ -d ${BUILD_ROOT} ] || Build
  179. ## setarch ix86 if ix86 chroot on x86_64 host
  180. [ $with_ix86_on_x86_64 -eq 1 ] && \
  181. __chroot_sh="/usr/sbin/chroot ${BUILD_ROOT} setarch ${VARCH} /bin/sh -c -l"
  182. DIST_RELEASE=$(cat ${BUILD_ROOT}/etc/vine-release | cut -f3 -d" " | cut -f1 -d.)
  183. if [ -f $RPM_PKG ]; then
  184. BASE_RPM_PKG=$(basename $RPM_PKG)
  185. cp -f $RPM_PKG $BUILD_ROOT${BUILD_DIR}
  186. else
  187. BASE_RPM_PKG=$RPM_PKG
  188. fi
  189. return 0
  190. }
  191. ## recover apt-get data on host/chroot
  192. apt-get-update(){
  193. case $1 in
  194. --host)
  195. echo -n $"apt-get update on host ... "
  196. apt-get -qq update > /dev/null 2>&1
  197. echo $"done."
  198. ;;
  199. --chroot)
  200. echo -n $"apt-get update on chroot ... "
  201. $__chroot_sh 'apt-get -qq update' > /dev/null 2>&1
  202. echo $"done."
  203. ;;
  204. *)
  205. echo apt-get-update: unknown option $1
  206. exit 1
  207. ;;
  208. esac
  209. }
  210. ## mount-chroot {|--umount} [file system|name]
  211. ## support file systems: /home /tmp /sys /proc /dev/shm /dev/pts /dev
  212. ## support names: vfs archives_dir
  213. ## NOTE: /tmp needs for applications which use X
  214. ## vfs is virtual file systems
  215. ## archives_dir uses to mount ${EXTERNAL_ARCHIVES_DIR} to ${ARCHIVES_DIR}
  216. ## unionfs_dir covers ${BUILD_ROOT} with unionfs
  217. mount-chroot(){
  218. if [ "$1" = "--umount" ]; then
  219. mount-chroot-umount $2 || return 1
  220. else
  221. mount-chroot-mount $1 || return 1
  222. fi
  223. return 0
  224. }
  225. ## mount-chroot-umount [file system|name]
  226. mount-chroot-umount(){
  227. local fs=$1
  228. case $fs in
  229. /home|/tmp|/sys|/proc|/dev/shm|/dev/pts|/dev)
  230. [ -d ${BUILD_ROOT}${fs} ] || return 1
  231. [ -z "$(mount | grep ${BUILD_ROOT}${fs})" ] || \
  232. umount ${BUILD_ROOT}${fs}
  233. if [ ! -z "$(mount | grep ${BUILD_ROOT}${fs})" ]; then
  234. echo $"Retry lazy unmount ${BUILD_ROOT}${fs} ... "
  235. umount -l ${BUILD_ROOT}${fs}
  236. echo $"done."
  237. fi
  238. ;;
  239. vfs)
  240. for dir in /sys /proc /dev/shm /dev/pts /dev; do
  241. mount-chroot-umount ${dir} || return 1
  242. done
  243. ;;
  244. archives_dir)
  245. [ -d ${ARCHIVES_DIR} ] || return 1
  246. [ -z "$(mount | grep ${ARCHIVES_DIR})" ] || \
  247. umount ${ARCHIVES_DIR}
  248. ;;
  249. unionfs_dir)
  250. [ -d ${BUILD_ROOT} ] || return 1
  251. [ -z "$(mount | grep ${BUILD_ROOT} | grep unionfs)" ] || \
  252. umount ${BUILD_ROOT}
  253. if [ ! -z "$(mount | grep ${BUILD_ROOT} | grep unionfs)" ]; then
  254. echo $"Retry lazy unmount ${BUILD_ROOT} ... "
  255. umount -l ${BUILD_ROOT}
  256. echo $"done."
  257. fi
  258. ;;
  259. *)
  260. echo mount-chroot-umount: unknown file system $fs
  261. exit 1
  262. ;;
  263. esac
  264. return 0
  265. }
  266. ## mount-chroot-mount [file system|name]
  267. mount-chroot-mount(){
  268. local fs=$1
  269. case $fs in
  270. /home)
  271. [ -d ${BUILD_ROOT}${fs} ] || mkdir -p ${BUILD_ROOT}${fs}
  272. [ -z "$(mount | grep ${BUILD_ROOT}${fs})" ] && \
  273. mount -o _netdev,rbind ${fs} ${BUILD_ROOT}${fs}
  274. ;;
  275. /tmp|/dev)
  276. [ -d ${BUILD_ROOT}${fs} ] || mkdir -p ${BUILD_ROOT}${fs}
  277. [ -z "$(mount | grep ${BUILD_ROOT}${fs})" ] && \
  278. mount --bind -o _netdev ${fs} ${BUILD_ROOT}${fs}
  279. ;;
  280. /sys)
  281. [ -d ${BUILD_ROOT}${fs} ] || mkdir -p ${BUILD_ROOT}${fs}
  282. [ -z "$(mount | grep ${BUILD_ROOT}${fs})" ] && \
  283. mount -o _netdev -t sysfs vbuildersysfs ${BUILD_ROOT}${fs}
  284. ;;
  285. /proc)
  286. [ -d ${BUILD_ROOT}${fs} ] || mkdir -p ${BUILD_ROOT}${fs}
  287. [ -z "$(mount | grep ${BUILD_ROOT}${fs})" ] && \
  288. mount -o _netdev -t proc vbuilderproc ${BUILD_ROOT}${fs}
  289. ;;
  290. /dev/shm)
  291. [ -d ${BUILD_ROOT}${fs} ] || mkdir -p ${BUILD_ROOT}${fs}
  292. [ -z "$(mount | grep ${BUILD_ROOT}${fs})" ] && \
  293. mount -o _netdev -t tmpfs vbuildertmpfs ${BUILD_ROOT}${fs}
  294. ;;
  295. /dev/pts)
  296. [ -d ${BUILD_ROOT}${fs} ] || mkdir -p ${BUILD_ROOT}${fs}
  297. [ -z "$(mount | grep ${BUILD_ROOT}${fs})" ] && \
  298. mount -o gid=5,mode=620,_netdev -t devpts vbuilderdevpts ${BUILD_ROOT}${fs}
  299. ;;
  300. vfs)
  301. for dir in /dev /dev/pts /dev/shm /proc /sys; do
  302. mount-chroot-mount ${dir} || return 1
  303. done
  304. ;;
  305. archives_dir)
  306. [ -d ${EXTERNAL_ARCHIVES_DIR} ] || mkdir -p ${EXTERNAL_ARCHIVES_DIR}
  307. [ -d ${ARCHIVES_DIR} ] || mkdir -p ${ARCHIVES_DIR}
  308. [ -z "$(mount | grep ${ARCHIVES_DIR})" ] && \
  309. mount --bind -o _netdev ${EXTERNAL_ARCHIVES_DIR} ${ARCHIVES_DIR}
  310. [ -d ${ARCHIVES_DIR}/partial ] || mkdir -p ${ARCHIVES_DIR}/partial
  311. ;;
  312. unionfs_dir)
  313. if [ $with_unionfs -eq 1 ]; then
  314. [ -d ${UNIONFS_ROOT} ] || mkdir -p ${UNIONFS_ROOT}
  315. [ -z "$(mount | grep ${BUILD_ROOT})" ] && \
  316. mount -t unionfs -o dirs=${UNIONFS_ROOT}=rw:${BUILD_ROOT}=ro unionfs ${BUILD_ROOT}
  317. unionctl ${BUILD_ROOT} --list
  318. fi
  319. ;;
  320. *)
  321. echo mount-chroot-mount: unknown file system $fs
  322. exit 1
  323. ;;
  324. esac
  325. return 0
  326. }
  327. write-vbuilder-log(){
  328. HRULE="======================================================================"
  329. [ -d ${BUILD_ROOT} ] || return 1
  330. if [ ! -f $VBUILDER_LOG ]; then
  331. cat<<EOF > $VBUILDER_LOG
  332. ${HRULE}
  333. VBUILDER REPORT
  334. DATE: $(LANG=C date)
  335. HOSTNAME: $(hostname)
  336. OS: $(echo $($__chroot_sh "cat /etc/vine-release"))
  337. %_arch: $(echo $($__chroot_sh "rpm --eval %_arch"))
  338. --version: ${VERSION}
  339. $(echo $([ -z "${VARCH}" ] || echo "--arch: ${VARCH}"))
  340. $(echo $([ -z "${CATEGORIES}" ] || echo "--category: ${CATEGORIES}"))
  341. $(echo $([ $with_dist_upgrade -eq 1 ] && echo "--dist-upgrade"))
  342. $(echo $([ $with_unionfs -eq 1 ] && echo "--unionfs"))
  343. $(echo $([ -z "${TARGET}" ] || echo "--target: ${TARGET}"))
  344. --bootstrap-dir: ${VBOOTSTRAP_DIR}
  345. --unionfs-dir: ${UNIONFS_DIR}
  346. --cache-dir: ${CACHE_DIR}
  347. --built-rpms-dir: ${BUILT_RPMS_DIR}
  348. ${HRULE}
  349. [$VBUILDER_CONF]
  350. $(cat $VBUILDER_CONF)
  351. [History]
  352. EOF
  353. else
  354. cat<<EOF >> $VBUILDER_LOG
  355. $*
  356. EOF
  357. fi
  358. return 0
  359. }
  360. ### end of file