mocksetup: Update for recent Fedoras.
[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   cp -p /etc/resolv.conf $rpath/etc/resolv.conf
86
87   dir="/dev/pts"
88   c="umount $rpath$dir"
89   if $c 2>&1|grep -v ': not \(mounted\|found\)$';then
90     echo $c
91   fi
92
93   dir="/dev/shm"
94   c="umount $rpath$dir"
95   if $c 2>&1|grep -v ': not \(mounted\|found\)$';then
96     echo $c
97   fi
98
99   test -e $rpath/dev/pts && rmdir $rpath/dev/pts
100   if ! $u;then
101     mkdir -p $rpath/dev/pts
102   fi
103   test -e $rpath/dev/shm && rmdir $rpath/dev/shm
104   if ! $u;then
105     mkdir -p $rpath/dev/shm
106   fi
107   rm -f $rpath/dev/null
108   if ! $u;then
109     mknod -m 666 $rpath/dev/null c 1 3
110   fi
111   rm -f $rpath/dev/full
112   if ! $u;then
113     mknod -m 666 $rpath/dev/full c 1 7
114   fi
115   rm -f $rpath/dev/zero
116   if ! $u;then
117     mknod -m 666 $rpath/dev/zero c 1 5
118   fi
119   rm -f $rpath/dev/random
120   if ! $u;then
121     mknod -m 666 $rpath/dev/random c 1 8
122   fi
123   rm -f $rpath/dev/urandom
124   if ! $u;then
125     mknod -m 444 $rpath/dev/urandom c 1 9
126   fi
127   rm -f $rpath/dev/tty
128   if ! $u;then
129     mknod -m 666 $rpath/dev/tty c 5 0
130   fi
131   rm -f $rpath/dev/console
132   if ! $u;then
133     mknod -m 600 $rpath/dev/console c 5 1
134   fi
135   rm -f $rpath/dev/ptmx
136   if ! $u;then
137     mknod -m 666 $rpath/dev/ptmx c 5 2
138   fi
139   rm -f $rpath/dev/stdin
140   if ! $u;then
141     ln -s /proc/self/fd/0 $rpath/dev/stdin
142   fi
143   rm -f $rpath/dev/stdout
144   if ! $u;then
145     ln -s /proc/self/fd/1 $rpath/dev/stdout
146   fi
147   rm -f $rpath/dev/stderr
148   if ! $u;then
149     ln -s /proc/self/fd/2 $rpath/dev/stderr
150   fi
151   rm -f $rpath/dev/fd
152   if ! $u;then
153     ln -s /proc/self/fd $rpath/dev/fd
154   fi
155
156   mkdir -p $rpath/unsafe
157   for dir in /home /usr/local/bin /proc /sys /root /unsafe;do
158     c="umount $rpath$dir"
159     if $c 2>&1|grep -v ': not mounted$';then
160       echo $c
161     fi
162     if ! $u;then
163       c="mount --bind $dir $rpath$dir"
164       echo $c; $c
165     fi
166   done
167
168   if ! $u;then
169     c="mount -t tmpfs mock_shmfs $rpath/dev/shm"
170     echo $c; $c
171     c="mount -t devpts -o mode=620,gid=5 mock_devpts $rpath/dev/pts"
172     echo $c; $c
173   fi
174
175   c="umount $rpath/var/cache/yum"
176   if $c 2>&1|grep -v ': not mounted$';then
177     echo $c
178   fi
179   if ! $u;then
180     if [ -d /var/cache/mock/$r/yum_cache ];then
181       cr=$r
182     else
183       cr=`echo $r|sed 's/-[^-]*$//'`
184     fi
185     c="mount --bind /var/cache/mock/$cr/yum_cache $rpath/var/cache/yum"
186     echo $c; $c
187   fi
188
189   rm -f $rpath/usr/local/lib/debug
190   if ! $u;then
191     ln -s ../../lib/debug $rpath/usr/local/lib/debug
192   fi
193
194   rm -f $rpath/usr/local/src/debug
195   if ! $u;then
196     ln -s ../../src/debug $rpath/usr/local/src/debug
197   fi
198
199   rm -f $rpath/usr/local/share/gdb
200   if ! $u;then
201     mkdir -p $rpath/usr/local/share
202     ln -s ../../share/gdb $rpath/usr/local/share/gdb
203   fi
204
205   # Old systems incl. RHEL-6 do not feature it.
206   if [ -d $rpath/etc/sudoers.d ];then
207     rm -f $rpath/etc/sudoers.d/inteltest
208     if ! $u;then :
209 #      ln /etc/sudoers.d/inteltest $rpath/etc/sudoers.d/inteltest
210     fi
211   fi
212
213   if ! $u;then
214     echo $r >$rpath/MOCK
215   fi
216
217   rm -f $rpath/MOCK.mocksetup-lock
218   echo >&2 "Unlocked $rpath/MOCK.mocksetup-lock ."
219 done
220 trap 'echo >&2 done' EXIT
221 exit $rc