.vimrc: +vim-fugitive
[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   for cache in yum dnf;do
159     c="umount $rpath/var/cache/$cache"
160     if $c 2>&1|grep -v ': not \(mounted\|found\)$';then
161       echo $c
162     fi
163     if ! $u;then
164       if [ -d /var/cache/mock/$r/${cache}_cache ];then
165         cr=$r
166       else
167         cr=`echo $r|sed 's/-[^-]*$//'`
168       fi
169       if [ -d /var/cache/mock/$cr/${cache}_cache ];then
170         c="mount --bind /var/cache/mock/$cr/${cache}_cache $rpath/var/cache/${cache}"
171         echo $c; $c
172       fi
173     fi
174   done
175
176   mkdir -p $rpath/quad
177   for dir in /home /usr/local/bin /proc /sys /root /quad;do
178     c="umount $rpath$dir"
179     if $c 2>&1|grep -v ': not \(mounted\|found\)$';then
180       echo $c
181     fi
182     if ! $u;then
183       c="mount --bind $dir $rpath$dir"
184       echo $c; $c
185     fi
186   done
187
188   if ! $u;then
189     c="mount -t tmpfs mock_shmfs $rpath/dev/shm"
190     echo $c; $c
191     c="mount -t devpts -o mode=620,gid=5 mock_devpts $rpath/dev/pts"
192     echo $c; $c
193   fi
194
195   rm -f $rpath/usr/local/lib/debug
196   if ! $u;then
197     ln -s ../../lib/debug $rpath/usr/local/lib/debug
198   fi
199
200   rm -f $rpath/usr/local/src/debug
201   if ! $u;then
202     ln -s ../../src/debug $rpath/usr/local/src/debug
203   fi
204
205   rm -f $rpath/usr/local/share/gdb
206   if ! $u;then
207     mkdir -p $rpath/usr/local/share
208     ln -s ../../share/gdb $rpath/usr/local/share/gdb
209   fi
210
211   # Old systems incl. RHEL-6 do not feature it.
212   if [ -d $rpath/etc/sudoers.d ];then
213     rm -f $rpath/etc/sudoers.d/inteltest
214     if ! $u;then :
215 #      ln /etc/sudoers.d/inteltest $rpath/etc/sudoers.d/inteltest
216     fi
217   fi
218
219   if ! $u;then
220     echo $r >$rpath/MOCK
221   fi
222
223   rm -f $rpath/MOCK.mocksetup-lock
224   echo >&2 "Unlocked $rpath/MOCK.mocksetup-lock ."
225 done
226 trap 'echo >&2 done' EXIT
227 exit $rc