Changeset View
Changeset View
Standalone View
Standalone View
head/usr.sbin/periodic/etc/daily/221.backup-gpart
Property | Old Value | New Value |
---|---|---|
svn:executable | null | * \ No newline at end of property |
svn:keywords | null | FreeBSD=%H \ No newline at end of property |
#!/bin/sh | |||||
## $FreeBSD$ | |||||
## Created by: Miroslav Lachman <000.fbsd@quip.cz> | |||||
## Backup of disk partitions layout, useful for gpart restore. | |||||
## Data are stored on local filesystem, in /var/backup. | |||||
## It is recommended to copy those files to off-site storage. | |||||
## If there is a global system configuration file, suck it in. | |||||
## | |||||
if [ -r /etc/defaults/periodic.conf ] | |||||
then | |||||
. /etc/defaults/periodic.conf | |||||
source_periodic_confs | |||||
fi | |||||
bak_dir=/var/backups | |||||
rotate() { | |||||
base_name=$1 | |||||
show_diff=$2 | |||||
file="$bak_dir/$base_name" | |||||
if [ -f "${file}.bak" ] ; then | |||||
rc=0 | |||||
if cmp -s "${file}.bak" "${file}.tmp"; then | |||||
rm "${file}.tmp" | |||||
else | |||||
rc=1 | |||||
[ -n "$show_diff" ] && diff "${file}.bak" "${file}.tmp" | |||||
mv "${file}.bak" "${file}.bak2" || rc=3 | |||||
mv "${file}.tmp" "${file}.bak" || rc=3 | |||||
fi | |||||
else | |||||
rc=1 | |||||
mv "${file}.tmp" "${file}.bak" || rc=3 | |||||
[ -n "$show_diff" ] && cat "${file}.bak" | |||||
fi | |||||
} | |||||
case "$daily_backup_gpart_verbose" in | |||||
[Yy][Ee][Ss]) show="YES" | |||||
esac | |||||
case "$daily_backup_gpart_enable" in | |||||
[Yy][Ee][Ss]) | |||||
echo "" | |||||
echo "Dump of kern.geom.conftxt:"; | |||||
sysctl -n kern.geom.conftxt > "$bak_dir/kern.geom.conftxt.tmp" | |||||
rotate "kern.geom.conftxt" $show | |||||
gpart_devs=$(gpart show | awk '$1 == "=>" { print $4 }') | |||||
if [ -n "$daily_backup_gpart_exclude" ]; then | |||||
gpart_devs=$(echo ${gpart_devs} | grep -E -v "${daily_backup_gpart_exclude}") | |||||
fi | |||||
if [ -z "$gpart_devs" ]; then | |||||
echo '$daily_backup_gpart_enable is set but no disk probed by kernel.' \ | |||||
"perhaps NFS diskless client." | |||||
rc=2 | |||||
else | |||||
echo "" | |||||
echo "Backup of partitions information for:"; | |||||
for d in ${gpart_devs}; do | |||||
echo "$d" | |||||
safe_name=$(echo "gpart.${d}" | tr -cs ".[:alnum:]\n" "_") | |||||
gpart backup "$d" > "$bak_dir/$safe_name.tmp" | |||||
rotate "$safe_name" $show | |||||
done | |||||
gpart_show=$(gpart show -p) | |||||
boot_part=$(echo "$gpart_show" | awk '$4 ~ /(bios|freebsd)-boot/ { print $3 }') | |||||
if [ -n "$boot_part" ]; then | |||||
echo "" | |||||
echo "Backup of boot partition content:" | |||||
for b in ${boot_part}; do | |||||
echo "$b" | |||||
safe_name=$(echo "boot.${b}" | tr -cs ".[:alnum:]\n" "_") | |||||
dd if="/dev/${b}" of="$bak_dir/$safe_name.tmp" 2> /dev/null | |||||
rotate "$safe_name" | |||||
done | |||||
fi | |||||
mbr_part=$(echo "$gpart_show" | awk '$1 == "=>" && $5 == "MBR" { print $4 }') | |||||
if [ -n "$mbr_part" ]; then | |||||
echo "" | |||||
echo "Backup of MBR record:" | |||||
for mb in ${mbr_part}; do | |||||
echo "$mb" | |||||
safe_name=$(echo "boot.${mb}" | tr -cs ".[:alnum:]\n" "_") | |||||
dd if="/dev/${mb}" of="$bak_dir/$safe_name.tmp" bs=512 count=1 2> /dev/null | |||||
rotate "$safe_name" | |||||
done | |||||
fi | |||||
fi | |||||
;; | |||||
*) rc=0 | |||||
;; | |||||
esac | |||||
case "$daily_backup_efi_enable" in | |||||
[Yy][Ee][Ss]) | |||||
efi_part=$(gpart show -p | awk '$4 ~ /efi/ {print $3}') | |||||
if [ -n "$efi_part" ]; then | |||||
echo "" | |||||
echo "Backup of EFI partition content:" | |||||
for efi in ${efi_part}; do | |||||
echo "$efi" | |||||
safe_name=$(echo "efi.${efi}" | tr -cs ".[:alnum:]\n" "_") | |||||
dd if="/dev/${efi}" of="$bak_dir/$safe_name.tmp" 2> /dev/null | |||||
rotate "$safe_name" | |||||
done | |||||
fi | |||||
;; | |||||
esac | |||||
exit $rc |