]> CyberLeo.Net >> Repos - CDN/cdn-ports-overlay.git/blob - update
misc-cdn/bash-config: release 1.0.4
[CDN/cdn-ports-overlay.git] / update
1 #!/bin/sh
2
3 # Run as root
4 [ "$(id -u)" -eq 0 ] || exec sudo "${0}" "${@}"
5 cd "$(dirname "${0}")"
6
7 [ "${1}" = "-n" ] && NO_SYNC=true
8
9 meh() { printf " \033[1;32m*\033[0m %s\n" "${*}"; }
10 omg() { printf " \033[1;33m*\033[0m %s\n" "${*}"; }
11 wtf() { printf " \033[1;31m*\033[0m %s\n" "${*}"; kill $$; exit 1; }
12
13 sync="rsync://paka/freebsd-ports"
14
15 sync_opts="--archive --compress --delete --hard-links --sparse --stats --verbose"
16
17 zpool="amani"
18
19 ports=${zpool}/ports
20 upstream=${zpool}/srcs/freebsd/ports/upstream
21 prepare=${zpool}/srcs/freebsd/ports/prepare
22
23 today="$(date +%Y-%m-%d)"
24 upstream_fs="$(zfs get -H -o value mountpoint "${upstream}")"
25
26 # Check if target ports tree actually exists; otherwise, assume it's safe to replace
27 if zfs list "${ports}" >&- 2>&-
28 then
29   ports_exists="YES"
30   ports_origin="$(zfs get -H -o value origin "${ports}")"
31   ports_origin="${ports_origin%%@*}"
32   ports_fs="$(zfs get -H -o value mountpoint "${ports}")"
33
34   # Make sure the ports tree is a descendent of the ports upstream
35   [ "${ports_origin}" = "${upstream}" ] || wtf "Target ${ports} is not a child of ${upstream}
36   (is ${ports_origin})"
37 fi
38 ports_fs="${ports_fs:-/usr/ports}"
39
40 if [ -z "${NO_SYNC}" ]
41 then
42   # Compute the next available snapshot
43   last_snapshot="$(zfs list -rHt snapshot -o name "${upstream}" | grep "@${today}_" | sort | tail -n 1 | sed -e 's/^.*_\([0-9]\{2\}\)$/\1/')"
44   if [ "${last_snapshot}" ]
45   then
46     snapshot="$(printf "${today}_%02u" "$(( ${last_snapshot} + 1 ))")"
47     echo "${today}_${last_snapshot} -> ${snapshot}"
48   else
49     snapshot="${today}_00"
50     echo "None -> ${snapshot}"
51   fi
52 else
53   # Don't bother creating a new snapshot if the tree will not be synchronized
54   last_snapshot="$(zfs list -rHt snapshot -o name "${upstream}" | sort | tail -n 1)"
55   snapshot="${last_snapshot##*@}"
56   echo "Using existing snapshot ${snapshot}"
57 fi
58
59 # Bail out if anything is /
60 [ -z "${ports_fs}" ] && wtf "ports_fs is / ?!"
61 [ -z "${upstream_fs}" ] && wtf "upstream_fs is / ?!"
62 [ -z "${ports_fs}"  -o -z "${upstream_fs}" ] && wtf "Writing to /? Are you nuts?"
63
64 if [ -z "${NO_SYNC}" ]
65 then
66   meh "Update"
67   rsync ${sync_opts} "${sync}/" "${upstream_fs}/" || wtf "update failed"
68
69   meh "Snapshot"
70   zfs snapshot "${upstream}@${snapshot}" || wtf "snapshot failed"
71 fi
72
73 meh "Clone"
74 zfs clone "${upstream}@${snapshot}" "${prepare}" || wtf "clone failed"
75 zfs set atime=off "${prepare}" || wtf "atime-off failed"
76
77 # Resolve filesystem mountpoints, now that everything should exist
78 prepare_fs="$(zfs get -H -o value mountpoint "${prepare}")"
79
80 meh "Overlay"
81 ( cd ports; find * | cpio -p "${prepare_fs}" ) || wtf "overlay failed"
82
83 meh "Patch"
84 for patch in patch/*.patch
85 do
86   meh "... ${patch}"
87   ( cd "${prepare_fs}"; patch -p0 ) < "${patch}" || wtf "patch failed"
88 done
89
90 meh "Install"
91 zfs set readonly=on "${prepare}" || wtf "readonly failed"
92 # Half of this is conditional on the old ports tree's existence
93 [ -z "${ports_exists}" ] || zfs rename "${ports}" "${ports}-bak" || wtf "backup rename failed"
94 zfs rename "${prepare}" "${ports}" || wtf "rename prepare -> ports failed"
95 [ -z "${ports_exists}" ] || zfs inherit mountpoint "${ports}-bak" || wtf "inherit failed"
96 zfs set mountpoint="${ports_fs}" "${ports}" || wtf "mountpoint failed"
97 [ -z "${ports_exists}" ] || zfs destroy "${ports}-bak" || wtf "destroy failed"
98
99 meh "All done"