aboutsummaryrefslogtreecommitdiff
path: root/Tools/portbuild/scripts/clean-chroot
blob: 6e17a69bcc9a146fcda72d3bb1b34b2ab8c751ff (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#!/bin/sh

kill_procs()
{
  dir=$1
  mount=$2

  pids="XXX"
  while [ ! -z "${pids}" ]; do
    pids=$(fstat -f "${dir}${mount}" | tail +2 | awk '{print $3}' | sort -u)
    if [ ! -z "${pids}" ]; then
      echo "Killing off pids in ${dir}"
      ps -p $pids
      kill -KILL ${pids} 2> /dev/null
      sleep 2
    fi
  done
}

cleanup_mount() {
  chroot=$1
  mount=$2

  if [ -d ${chroot}${mount} ]; then
    mdir=$(fstat -f ${chroot}${mount} | head -2 | tail -1 | awk '{print $5}')
    if [ "${mdir}" = "MOUNT" ]; then
      umount -f ${chroot}${mount} || echo "Cleanup of ${chroot}${mount} failed!"
    fi
    if [ "${mdir}" = "${chroot}${mount}" ]; then
      kill_procs ${chroot} ${mount}
      umount -f ${chroot}${mount} || echo "Cleanup of ${chroot}${mount} failed!" 
    fi
  fi
}

arch=$1
branch=$2
chroot=$3
clean=$4

pb=/var/portbuild
. ${pb}/${arch}/portbuild.conf
. ${pb}/${arch}/portbuild.$(hostname)
. ${pb}/scripts/buildenv
buildenv ${pb} ${arch} ${branch}

# directories to clean
cleandirs="${LOCALBASE} ${X11BASE} /compat /var/db/pkg"

if [ ! -d "${chroot}" ]; then
  exit 0
fi

if [ `realpath ${chroot}` = "/" ]; then
  # Don't spam the root file system if something has gone wrong!
  exit 1
fi

if [ -f ${chroot}/tmp/jail.id ]; then
  pgrep -lfj `awk '{print $1}' ${chroot}/tmp/jail.id`
  pkill -j `awk '{print $1}' ${chroot}/tmp/jail.id`
fi

#umount ${chroot}/proc

if [ ${arch} = "i386" -o ${arch} = "amd64" ]; then
  cleanup_mount ${chroot} /compat/linux/proc
fi

for i in /a/ports /usr/src /dev /root/.ccache; do
  cleanup_mount ${chroot} ${i}
done

#kill_procs ${chroot}

if [ "${use_zfs}" = "1" ]; then
  cleanup_mount ${chroot} ""
  zfs destroy $(echo ${chroot} | sed -e 's,/,,' )
elif [ "${use_tmpfs}" = "1" -a "${clean}" = "2" ]; then
  cleanup_mount ${chroot} ""
  if ! rm -rf ${chroot} >/dev/null 2>&1; then
    chflags -R noschg ${chroot} >/dev/null 2>&1
    rm -rf ${chroot} >/dev/null 2>&1
  fi
  # XXX possible race from cleanup and claim by next build?
elif [ "${use_md_swap}" = "1" -a \( "${md_persistent}" != "1" -a "${clean}" -gt "0" \) -o "${clean}" = "2" ]; then
  cleanup_mount ${chroot} /used
  cleanup_mount ${chroot} ""
  mdconfig -d -u $(basename ${chroot})
  if ! rm -rf ${chroot} >/dev/null 2>&1; then
    chflags -R noschg ${chroot} >/dev/null 2>&1
    rm -rf ${chroot} >/dev/null 2>&1
  fi
else
  if [ "${clean}" = 1 ]; then
    rm -rf ${chroot}/tmp/*
    for dir in ${cleandirs}; do
      if ! rm -rf ${chroot}${dir} >/dev/null 2>&1; then
        chflags -R noschg ${chroot}${dir} >/dev/null 2>&1
        rm -rf ${chroot}${dir} >/dev/null 2>&1
      fi
    done
    test -x ${chroot}/sbin/ldconfig && chroot ${chroot} /sbin/ldconfig -R
    if [ ${arch} = "i386" ]; then
        test -x ${chroot}/sbin/ldconfig && chroot ${chroot} /sbin/ldconfig -aout -R
    fi
    rm -rf ${chroot}/var/db/pkg/*
    rm -rf ${chroot}/used
  elif [ "${clean}" = 2 ]; then
    if ! rm -rf ${chroot} >/dev/null 2>&1; then
      chflags -R noschg ${chroot} >/dev/null 2>&1
      rm -rf ${chroot} >/dev/null 2>&1
    fi
  fi
fi