-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgrombak.xfs
executable file
·160 lines (145 loc) · 4.95 KB
/
grombak.xfs
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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
#!/bin/bash
export PATH=/sbin:/usr/sbin:/usr/bin:/bin
set -e
recover_svcs() {
/usr/bin/systemctl start gromox-midb.service gromox-imap.service gromox-pop3.service
if [ -d "$SNAPPATH" ]; then
umount "$SNAPPATH"
/usr/sbin/lvremove -y /dev/gromox/s_maildir
fi
}
trap "recover_svcs" ERR
SERVICES=( gromox-midb.service gromox-imap.service gromox-pop3.service )
BACKUPROOT=$(awk '/grom.*nfs/ {print $2}' /etc/fstab)
GROMOXSRC=/var/lib/gromox
#LASTBACKUPDIR=$(basename $(ls -td $BACKUPROOT/grombak/* | head -1))
#NEWBACKUPDIR="$BACKUPROOT/grombak/$(date +%Y%m%d-%H%M)"
NEWBACKUPDIR="$BACKUPROOT/grombak/zfs"
ETCFLDS="grom\|postfix\|redis\|nginx"
RSYNCOPTS="-au --partial --delete-after"
#RSYNCOPTS="-HPaS --partial"
#if [ -t ]; then RSYNCOPTS="$RSYNCOPTS --progress"; fi
if [ -t 1 ]; then RSYNCOPTS="$RSYNCOPTS --info=progress2"; fi
MYSQLDUMPOPTS="--single-transaction --routines --triggers --events --add-drop-database"
#Check if dir exists or exit
if [ ${#BACKUPROOT} -gt 0 ]; then
if grep -qs "${BACKUPROOT}" /proc/mounts; then
#echo "NFS-Mount available."
true
else
echo "${BACKUPROOT} not mounted."
# mount "${BACKUPROOT}"
if mount "${BACKUPROOT}"; then
echo "Successfully mounted ${BACKUPROOT}"
else
echo "Failed to mount ${BACKUPROOT}, exiting."
exit 1
fi
fi
else
echo "Couldn't mount backup directory, exiting."
exit 1
fi
#get mysql-info's and `eval` so they will be available as var
MYSQL_CFG="/etc/gromox/mysql_adaptor.cfg"
if [ ! -e "${MYSQL_CFG}" ] ; then
echo "MySQL configuration not found. ($MYSQL_CFG)"
exit 1
fi
MYSQL_USERNAME=$(sed -ne 's/^mysql_username\s*=\s*\(.*\)/\1/p' ${MYSQL_CFG})
if [ -z "$MYSQL_USERNAME" ]; then
MYSQL_USERNAME="root"
fi
MYSQL_PASSWORD=$(sed -ne 's/^mysql_password\s*=\s*\(.*\)/\1/p' ${MYSQL_CFG})
MYSQL_DBNAME=$(sed -ne 's/^mysql_dbname\s*=\s*\(.*\)/\1/p' ${MYSQL_CFG})
if [ -z "$MYSQL_DBNAME" ]; then
MYSQL_DBNAME="grommunio"
fi
if [ "${MYSQL_DBNAME:0:1}" = "-" ]; then
echo "Cannot use that dbname: ${MYSQL_DBNAME}"
exit 1
fi
MYSQL_HOST=$(sed -ne 's/^mysql_host\s*=\s*\(.*\)/-h\1/p' ${MYSQL_CFG})
if [ -z "$MYSQL_HOST" ]; then
MYSQL_HOST="localhost"
fi
#MYSQL_QUERY="SELECT username,maildir from users where id <> 0 and maildir <> \"\";"
CONFIG_FILE=$(mktemp)
cat <<CONFFILE >"${CONFIG_FILE}"
[client]
user=${MYSQL_USERNAME}
password=${MYSQL_PASSWORD}
host=${MYSQL_HOST}
CONFFILE
cleanup() { rm -f "$CONFIG_FILE" ; }
trap cleanup EXIT
date -Is
echo "Restarting ${SERVICES[@]/.service/}"
# restart services to/and cleanup sqlites
/usr/bin/systemctl restart ${SERVICES[@]}
date -Is
echo "Running cleanup tasks for Mailboxes"
for d in $(grommunio-admin user query maildir |sed '/^$/d'); do
/usr/sbin/gromox-mbop -d $d purge-softdelete -t 30d -r IPM_SUBTREE
/usr/sbin/gromox-mbop -d $d purge-datafiles
/usr/sbin/gromox-mbop -d $d vacuum
done
date -Is
# Try to create a LVM-Snapshot
DISKSOURCE=$(findmnt /var/lib/gromox --noheadings --output SOURCE)
# Check if it is a lvm volume
if lvdisplay "$DISKSOURCE" >/dev/null; then
echo "LVM-Snapshot"
date -Is
if /sbin/lvcreate -l100%FREE --snapshot --name s_maildir /dev/gromox/maildir; then
## TEMPORARY MOUNT POINT
SNAPPATH=$(mktemp --suffix=lvmsnap --directory)
## MOUNT XFS ( we need -o nouuid as xfs doesn't like duplicates of UUIDs )
/usr/bin/mount -o nouuid /dev/gromox/s_maildir "$SNAPPATH"
GROMOXSRC=$SNAPPATH
date -Is
echo "Snapshot created and mounted."
fi
fi
# Whether we have a snapshot or not, we can start the Services again.
#echo "Starting midb/pop3/imap services"
#/bin/date -Is
#/usr/bin/systemctl start ${SERVICES[@]}
#CREATE BACKUPDIRS
mkdir -p ${NEWBACKUPDIR}/{confs,mysql,fs} || echo "[ERROR] could not create Directories in ${BACKUPROOT}"
#CONFIGS
date -Is
echo "Creating archive of etc-configs"
cd /
find /etc -maxdepth 1 -type d -iregex ".*\(${ETCFLDS}\).*" -exec tar -czf "${NEWBACKUPDIR}/confs/etc.tar.gz" {} + || echo "[ERROR] config-files"
ls -sh "${NEWBACKUPDIR}/confs/etc.tar.gz"
#MYSQLDUMP
# shellcheck disable=SC2154
date -Is
echo "Creating mysqldump"
COMMAND="mysqldump --defaults-file=${CONFIG_FILE} -B ${MYSQL_DBNAME} ${MYSQLDUMPOPTS}"
$COMMAND > "${NEWBACKUPDIR}/mysql/${MYSQL_DBNAME}.sql" || (echo "[ERROR] ${COMMAND}")
ls -sh "${NEWBACKUPDIR}/mysql/${MYSQL_DBNAME}.sql"
#RSYNC
date -Is
echo "Starting Rsync of $GROMOXSRC"
#COMMAND="rsync ${RSYNCOPTS} --log-file $NEWBACKUPDIR/rsync.log --link-dest ../$LASTBACKUPDIR ${GROMOXSRC[@]} $NEWBACKUPDIR/fs"
echo > $NEWBACKUPDIR/rsync.log
COMMAND="rsync ${RSYNCOPTS} --log-file $NEWBACKUPDIR/rsync.log $GROMOXSRC/* $NEWBACKUPDIR/fs"
#rm -rf ${LATESTBACKUPDIR}
time -p $COMMAND || echo "[ERROR] ${COMMAND}"
# cleanup working snapshot
if [ -d "$SNAPPATH" ]; then
echo "Deleting snapshot $SNAPPATH"
umount -v "$SNAPPATH"
/usr/sbin/lvremove -y /dev/gromox/s_maildir
fi
echo
/bin/date -Is
echo "Data usage:"
echo "grommunio-admin fs du:"
time -p /usr/sbin/grommunio-admin fs du
echo
echo "Backup directory:"
time -p /usr/bin/du -hs "${BACKUPROOT}"
date -Is