net-misc/universalmediaserver: version bump
[quarks.git] / scripts / update_portage.sh
1 #!/bin/sh
2 #set -x
3
4 # Default portage location
5 PORTAGE="/usr/portage"
6 # By default store SquashFS backing file under /mnt/portage
7 SQFS_PORTAGE="/mnt/portage/portage.sqfs"
8
9 # Store temporary overlayFS within portage tmpdir
10 OVERLAY="$(portageq envvar PORTAGE_TMPDIR)/portage.overlayfs"
11 OVERLAY_NAME=portage_overlay
12
13 usage () {
14     cat << EOF
15 Usage: $0 [-p portage_tree] [-s squashfs_file]
16 EOF
17     exit 0
18 }
19
20 # mount squashed portage incl. writeable overlay
21 mount_overlay () {
22     # Make sure backing tree is mounted, try to mount otherwise
23     mountpoint -q ${PORTAGE} || mount ${PORTAGE} && echo "Mounted ${PORTAGE}."
24
25     # mount the overlay on top of existing live portage tree 
26     mkdir -p ${OVERLAY} ${OVERLAY}.work
27     mount | grep -q ${OVERLAY_NAME} || mount -t overlay ${OVERLAY_NAME} \
28       -olowerdir=${PORTAGE},upperdir=${OVERLAY},workdir=${OVERLAY}.work \
29       ${PORTAGE} && echo "Mounted Overlay file system." 
30 }
31
32 # umount overlay and clean up temp dirs
33 umount_overlay () {
34     mount | grep -q ${OVERLAY_NAME}
35     if [ $? -eq 0 ]; then
36         umount ${OVERLAY_NAME} && rm -rf ${OVERLAY} ${OVERLAY}.work
37         echo "Overlay file system unmounted."
38     fi
39 }
40
41 # umount current, replace and mount new 
42 replace_squashfs () {
43     [ -f ${SQFS_PORTAGE}.new ] || \
44       { echo "No new portage tree version found!"; exit 1; }
45
46     mountpoint -q ${PORTAGE}
47     if [ $? -eq 0 ]; then
48         umount ${PORTAGE} && echo "Unmounted ${PORTAGE}."
49         if [ $? -ne 0 ]; then
50             echo "Could not unmount ${PORTAGE} !"
51             echo "New portage snapshot is at ${SQFS_PORTAGE}.new"
52             exit 1
53         fi
54     fi
55
56     if [ -f ${SQFS_PORTAGE} ]; then
57         mv ${SQFS_PORTAGE} ${SQFS_PORTAGE}.previous
58     else
59         echo "No current squashFS backing file ${SQFS_PORTAGE} found,\
60         assuming initial setup."
61     fi
62        
63     mv ${SQFS_PORTAGE}.new ${SQFS_PORTAGE} && \
64       mount ${PORTAGE} && echo "Mounted new snapshot at ${PORTAGE}."
65 }
66
67 # Create new squashfs image
68 create_squashfs () {
69     echo 'Creating new SquashFS snapshot ...'
70     mksquashfs ${PORTAGE} ${SQFS_PORTAGE}.new -comp xz -noappend \
71       -no-progress 1>/dev/null && echo "SquashFS snapshot created at ${SQFS_PORTAGE}.new"
72 }
73
74 # Any custom changes to the portage tree 
75 customize () {
76     echo "Applying local customizations ..."
77
78     # Reenable nvidia
79     perl -i -p -e 's/^(app-admin\/conky nvidia|x11-drivers\/nvidia|nvidia|video_cards_nvidia|vdpau|cuda|opencl)/# disabled by update_portage.sh - $1/;' \
80       ${PORTAGE}/profiles/hardened/linux/package.mask \
81       ${PORTAGE}/profiles/hardened/linux/amd64/package.mask \
82       ${PORTAGE}/profiles/hardened/linux/use.mask \
83       ${PORTAGE}/profiles/hardened/linux/amd64/use.mask \
84       ${PORTAGE}/profiles/hardened/linux/amd64/package.use.mask
85 }
86
87 cleanup () {
88     # In case still mounted
89     umount_overlay
90
91     # Remove potential left overs from mksquashfs
92     rm -f ${SQFS_PORTAGE}.new
93
94     # Make sure we have a working portage tree mounted
95     mountpoint -q ${PORTAGE} || mount ${PORTAGE} 
96
97     exit 1
98 }
99
100 while getopts "p:s:" OPTIONS; do
101    case $OPTIONS in
102        p) PORTAGE=$OPTARG;;
103        s) SQFS_PORTAGE=$OPTARG;;
104        ?) usage;;
105    esac
106 done
107
108 [ -d ${PORTAGE} ] || { echo "${PORTAGE} is not a directory!"; usage; }
109
110 # make sure we clean up and have a working portage tree if interupted
111 trap "cleanup" INT TERM 
112
113 mount_overlay
114
115 # End early if there are no upstream changes
116 # assume if rsync is run only once that no upstream changes available
117 echo 'Syncing gentoo portage tree ...'
118 RUNS=$(emaint sync -r gentoo 2>/dev/null | grep -c 'Number of files')
119 [ $RUNS -eq 1 ] && { echo 'No upstream changes. Exiting.'; cleanup; }
120
121 # Optional step to customize the tree, mostly to alter upstream use masks
122 customize
123
124 create_squashfs
125 umount_overlay
126
127 replace_squashfs