chiark / gitweb /
remountrocp
[chiark-utils.git] / backup / remountrocp
diff --git a/backup/remountrocp b/backup/remountrocp
new file mode 100755 (executable)
index 0000000..5e40cc3
--- /dev/null
@@ -0,0 +1,69 @@
+#!/bin/bash
+# invoked by backup scripts as
+#    remountrocp snap $vardir $device $mountpoint
+#              remounts $mountpoint readonly
+#              copies data to $vardir/snap-mount
+#              remounts $mountpoint readwrite
+#    remountrocp drop $vardir
+#              deletes $vardir/snap-mount
+
+set -e
+snapkind=remountrocp
+: ${lvm_vg:=}
+remountrocp_fs=ext2
+. ${CHIARK_BACKUP_SHAREDIR:-/usr/share/chiark-backup}/snap-common
+
+#---------- clean up anything
+
+vgroup=$lvm_vg
+lvmdropcore
+
+lastsettings="$vardir/remountrocp-settings"
+test ! -f $lastsettings || . $lastsettings
+
+if test "$opmode" = drop; then
+       test -z "$last_mountpoint" || mount -o remount,rw $last_mountpoint
+       rm -f $lastsettings
+       echo 'remountrocp snap dropped'
+       exit 0
+fi
+
+#---------- create snapshot
+
+if [ -z "$lvm_lvsize_opts" ]; then
+       lvmextentscore1
+
+       df_out="$(really df -P --block-size=$extsize $mountpoint)"
+       extents2="$(printf "%s" "$df_out" | awk '/^\// {print $3}')"
+       extents2=$(( ($extents2*150+99)/100 + 4 ))
+
+       lvmextentscore2
+fi
+
+lvmcreatecore1
+
+cat >$lastsettings.new <<END
+last_mountpoint=$mountpoint
+END
+mv -f $lastsettings.new $lastsettings
+
+lvcreate \
+       $lvm_lvtools_opts \
+       $lvm_lvsize_opts \
+       -n $lvm_lv \
+       $lvm_lvcreate_opts \
+       $vgroup \
+       $lvm_lvcreate_args
+
+mkfs -t $remountrocp_fs "$lvpath"
+mkdir -- "$snmnt"
+mount -t $remountrocp_fs $lvm_mount_opts "$lvpath" "$snmnt"
+
+mount -o remount,ro "$mountpoint"
+trap "mount -o remount,rw $mountpoint; exit 12" 0
+cp -a -- "$mountpoint/." "$snmnt/."
+mount -o remount,rw "$mountpoint"
+trap '' 0
+mount -o remount,ro "$lvpath"
+
+echo 'remountrocp snap activated'