18529fb7f4b528d7956f6e2a63b42b22862ab80c
[nethome.git] / bin / mocksetup
1 #! /bin/sh
2 # $Id$
3
4 if [ "$1" = "-u" ];then
5   u=true
6   shift
7 else
8   u=false
9 fi
10 # Do not rebuild the tree if it looks as already setup.
11 if [ "$1" = "-s" ];then
12   soft=true
13   shift
14 else
15   soft=false
16 fi
17 if [ "$1" = "-h" ];then
18   echo >&2 "$0 [/var/lib/mock/]<ROOTNAME>..."
19   exit 1
20 fi
21 if [ $# = 0 ];then
22   l="`echo /var/lib/mock/*`"
23 else
24   l="$*"
25 fi
26 set -e
27 trap 'echo >&2 FATAL ERROR' EXIT
28 rc=0
29 for r in $l;do
30   r="`echo "$r"|tr -s /`"
31   r="${r#/var/lib/mock/}"
32   r="${r%/}"
33   rpath="/var/lib/mock/$r/root"
34   if [ ! -d "$rpath" ];then
35     echo >&2 "$rpath does not exist"
36     exit 1
37   fi
38
39   echo >&2 -n "Locking $rpath/MOCK.mocksetup-lock ..."
40   lockfile -l 10 $rpath/MOCK.mocksetup-lock
41   echo >&2 " done"
42
43   if $soft && [ -f $rpath/MOCK ];then
44     rm -f $rpath/MOCK.mocksetup-lock
45     echo >&2 "Unlocked $rpath/MOCK.mocksetup-lock ."
46     continue
47   fi
48
49   l=""
50   b=""
51   for p in /proc/*/root;do
52     l="`readlink $p || :`"
53     if [ "${l#/var/lib/mock/$r/}" != "$l" ];then
54       p="${p#/proc/}"
55       p="${p%/root}"
56       b="$b $p"
57     fi
58   done
59   if [ -n "$b" ];then
60     echo >&2 "$rpath has existing processes: $b"
61     rc=1
62     rm -f $rpath/MOCK.mocksetup-lock
63     echo >&2 "Unlocked $rpath/MOCK.mocksetup-lock ."
64     continue
65   fi
66
67   rm -f $rpath/MOCK
68
69   # It fails on already mounted /proc.  But we do not need it.
70   # mock -q -r $r chroot true echo "$rpath lock check"
71
72   for n in passwd group;do
73     cat /etc/$n $rpath/etc/$n|perl -ne 'print if /^(?:[^:]*:){2}(5\d\d):/'|sort|uniq -u|tee -a $rpath/etc/$n
74   done
75   if [ ! -f $rpath/etc/mtab-orig ];then
76     c="mv -f $rpath/etc/mtab $rpath/etc/mtab-orig"
77     echo $c; $c
78     c="ln -s /proc/mounts $rpath/etc/mtab"
79     echo $c; $c
80   fi
81
82   dir="/dev/pts"
83   c="umount $rpath$dir"
84   while $c 2>&1|grep -v ': not mounted$';do
85     echo $c
86   done
87
88   for dir in /home /usr/local/bin /dev /proc /sys;do
89     c="umount $rpath$dir"
90     while $c 2>&1|grep -v ': not mounted$';do
91       echo $c
92     done
93     if ! $u;then
94       c="mount --bind $dir $rpath$dir"
95       echo $c; $c
96     fi
97   done
98
99   dir="/dev/pts"
100   if ! $u;then
101     c="mount --bind $dir $rpath$dir"
102     echo $c; $c
103   fi
104
105   c="umount $rpath/var/cache/yum"
106   while $c 2>&1|grep -v ': not mounted$';do
107     echo $c
108   done
109   if ! $u;then
110     if [ -d /var/cache/mock/$r/yum_cache ];then
111       cr=$r
112     else
113       cr=`echo $r|sed 's/-[^-]*$//'`
114     fi
115     c="mount --bind /var/cache/mock/$cr/yum_cache $rpath/var/cache/yum"
116     echo $c; $c
117   fi
118
119   rm -f $rpath/usr/local/lib/debug
120   if ! $u;then
121     ln -s ../../lib/debug $rpath/usr/local/lib/debug
122   fi
123
124   rm -f $rpath/usr/local/src/debug
125   if ! $u;then
126     ln -s ../../src/debug $rpath/usr/local/src/debug
127   fi
128
129   rm -f $rpath/usr/local/share/gdb/auto-load
130   if ! $u;then
131     mkdir -p $rpath/usr/local/share/gdb
132     ln -s ../../../share/gdb/auto-load $rpath/usr/local/share/gdb/auto-load
133   fi
134
135   if ! $u;then
136     echo $r >$rpath/MOCK
137   fi
138
139   rm -f $rpath/MOCK.mocksetup-lock
140   echo >&2 "Unlocked $rpath/MOCK.mocksetup-lock ."
141 done
142 trap 'echo >&2 done' EXIT
143 exit $rc