source: projects/vbootstrap/trunk/libvbuilder.sh.in @ 2718

Revision 2718, 11.1 KB checked in by munepi, 13 years ago (diff)

updated vbuilder: added --debug, --login options; applied vbootstrap-0.0.37-armhack.patch (Thanks to parrot-san)

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