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

Revision 3676, 10.5 KB checked in by munepi, 13 years ago (diff)

updated vbootstrap: supported versions format: <version>_<arch>; updated vbuilder.sh.in: sync the above change for vbootstrap

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