mocksetup: /unsafe+/hdd -> /quad
[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   if ! lockfile -1 -r 1 -s 1 $rpath/MOCK.mocksetup-lock;then
41        rm -f                 $rpath/MOCK.mocksetup-lock
42        lockfile -1 -r 1 -s 1 $rpath/MOCK.mocksetup-lock
43   fi
44   echo >&2 " done"
45
46   if $soft && [ -f $rpath/MOCK ];then
47     rm -f $rpath/MOCK.mocksetup-lock
48     echo >&2 "Unlocked $rpath/MOCK.mocksetup-lock ."
49     continue
50   fi
51
52   l=""
53   b=""
54   for p in /proc/*/root;do
55     l="`readlink $p || :`"
56     if [ "${l#/var/lib/mock/$r/}" != "$l" ];then
57       p="${p#/proc/}"
58       p="${p%/root}"
59       b="$b $p"
60     fi
61   done
62   if [ -n "$b" ];then
63     echo >&2 "$rpath has existing processes: $b"
64     rc=1
65     rm -f $rpath/MOCK.mocksetup-lock
66     echo >&2 "Unlocked $rpath/MOCK.mocksetup-lock ."
67     continue
68   fi
69
70   rm -f $rpath/MOCK
71
72   # It fails on already mounted /proc.  But we do not need it.
73   # mock -q -r $r chroot true echo "$rpath lock check"
74
75   for n in passwd group;do
76     cat /etc/$n $rpath/etc/$n|perl -ne 'print if /^(?:[^:]*:){2}(10\d\d):/'|sort|uniq -u|tee -a $rpath/etc/$n
77   done
78   if [ ! -f $rpath/etc/mtab-orig ];then
79     c="mv -f $rpath/etc/mtab $rpath/etc/mtab-orig"
80     echo $c; $c
81     c="ln -s /proc/mounts $rpath/etc/mtab"
82     echo $c; $c
83   fi
84
85   cmp -s   /etc/resolv.conf $rpath/etc/resolv.conf \
86   || cp -p /etc/resolv.conf $rpath/etc/resolv.conf
87
88   dir="/dev/pts"
89   c="umount $rpath$dir"
90   if $c 2>&1|grep -v ': not \(mounted\|found\)$';then
91     echo $c
92   fi
93
94   dir="/dev/shm"
95   c="umount $rpath$dir"
96   if $c 2>&1|grep -v ': not \(mounted\|found\)$';then
97     echo $c
98   fi
99
100   test -e $rpath/dev/pts && (rmdir $rpath/dev/pts || :)
101   if ! $u;then
102     mkdir -p $rpath/dev/pts
103   fi
104   test -e $rpath/dev/shm && (rmdir $rpath/dev/shm || :)
105   if ! $u;then
106     mkdir -p $rpath/dev/shm
107   fi
108   rm -f $rpath/dev/null
109   if ! $u;then
110     mknod -m 666 $rpath/dev/null c 1 3
111   fi
112   rm -f $rpath/dev/full
113   if ! $u;then
114     mknod -m 666 $rpath/dev/full c 1 7
115   fi
116   rm -f $rpath/dev/zero
117   if ! $u;then
118     mknod -m 666 $rpath/dev/zero c 1 5
119   fi
120   rm -f $rpath/dev/random
121   if ! $u;then
122     mknod -m 666 $rpath/dev/random c 1 8
123   fi
124   rm -f $rpath/dev/urandom
125   if ! $u;then
126     mknod -m 444 $rpath/dev/urandom c 1 9
127   fi
128   rm -f $rpath/dev/tty
129   if ! $u;then
130     mknod -m 666 $rpath/dev/tty c 5 0
131   fi
132   rm -f $rpath/dev/console
133   if ! $u;then
134     mknod -m 600 $rpath/dev/console c 5 1
135   fi
136   rm -f $rpath/dev/ptmx
137   if ! $u;then
138     mknod -m 666 $rpath/dev/ptmx c 5 2
139   fi
140   rm -f $rpath/dev/stdin
141   if ! $u;then
142     ln -s /proc/self/fd/0 $rpath/dev/stdin
143   fi
144   rm -f $rpath/dev/stdout
145   if ! $u;then
146     ln -s /proc/self/fd/1 $rpath/dev/stdout
147   fi
148   rm -f $rpath/dev/stderr
149   if ! $u;then
150     ln -s /proc/self/fd/2 $rpath/dev/stderr
151   fi
152   rm -f $rpath/dev/fd
153   if ! $u;then
154     ln -s /proc/self/fd $rpath/dev/fd
155   fi
156
157   # Must be before umount of /quad
158   c="umount $rpath/var/cache/yum"
159   if $c 2>&1|grep -v ': not \(mounted\|found\)$';then
160     echo $c
161   fi
162   if ! $u;then
163     if [ -d /var/cache/mock/$r/yum_cache ];then
164       cr=$r
165     else
166       cr=`echo $r|sed 's/-[^-]*$//'`
167     fi
168     c="mount --bind /var/cache/mock/$cr/yum_cache $rpath/var/cache/yum"
169     echo $c; $c
170   fi
171
172   mkdir -p $rpath/quad
173   for dir in /home /usr/local/bin /proc /sys /root /quad;do
174     c="umount $rpath$dir"
175     if $c 2>&1|grep -v ': not \(mounted\|found\)$';then
176       echo $c
177     fi
178     if ! $u;then
179       c="mount --bind $dir $rpath$dir"
180       echo $c; $c
181     fi
182   done
183
184   if ! $u;then
185     c="mount -t tmpfs mock_shmfs $rpath/dev/shm"
186     echo $c; $c
187     c="mount -t devpts -o mode=620,gid=5 mock_devpts $rpath/dev/pts"
188     echo $c; $c
189   fi
190
191   rm -f $rpath/usr/local/lib/debug
192   if ! $u;then
193     ln -s ../../lib/debug $rpath/usr/local/lib/debug
194   fi
195
196   rm -f $rpath/usr/local/src/debug
197   if ! $u;then
198     ln -s ../../src/debug $rpath/usr/local/src/debug
199   fi
200
201   rm -f $rpath/usr/local/share/gdb
202   if ! $u;then
203     mkdir -p $rpath/usr/local/share
204     ln -s ../../share/gdb $rpath/usr/local/share/gdb
205   fi
206
207   # Old systems incl. RHEL-6 do not feature it.
208   if [ -d $rpath/etc/sudoers.d ];then
209     rm -f $rpath/etc/sudoers.d/inteltest
210     if ! $u;then :
211 #      ln /etc/sudoers.d/inteltest $rpath/etc/sudoers.d/inteltest
212     fi
213   fi
214
215   if ! $u;then
216     echo $r >$rpath/MOCK
217   fi
218
219   rm -f $rpath/MOCK.mocksetup-lock
220   echo >&2 "Unlocked $rpath/MOCK.mocksetup-lock ."
221 done
222 trap 'echo >&2 done' EXIT
223 exit $rc