File: //opt/cpguard/app/scripts/backup.sh
#!/bin/bash
#set -euo pipefail
# Variables
#DATE=$(date +'%d-%m-%Y')
SRC_FILE="$1"
if [[ -f "$SRC_FILE" ]]; then
source "$SRC_FILE"
else
echo "File not found: $SRC_FILE"
exit 1
fi
SOURCE_DIR="/home/$USERNAME"
CPGUARDX_CNF_DIR="/opt/cpguard/app/data/users/$USERNAME"
TIME=$(date +'%H%M%S')
TIMESTAMP=$(date '+%a %b %d %T %Y')
BACKUP_FILE_DIR="$BACKUP_DIR/$FILENAME/files"
BACKUP_DB_DIR="$BACKUP_DIR/$FILENAME/databases"
BACKUP_CNF_DIR="$BACKUP_DIR/$FILENAME/.conf"
BACKUP_FILE_NAME="$BACKUP_DIR/$FILENAME.tar.lz4"
DB_LIST_FILE="$BACKUP_DIR/db_list.txt"
log_info() {
echo -e "\n\e[32m [backup] \e[0m $1" >> /opt/cpguard/logs/backup.log
}
log_warn() {
echo -e "\n\e[33m [WARN] \e[0m $1" >> /opt/cpguard/logs/backup.log
}
log_error() {
echo -e "\n\e[31m [ERROR] $1 \e[0m" >> /opt/cpguard/logs/backup.log
exit "${2:-1}"
}
log_info "Started at $TIMESTAMP"
mkdir -p "$BACKUP_FILE_DIR" "$BACKUP_DB_DIR" "$BACKUP_CNF_DIR" || log_error "Failed to create backup directories" 2
log_info "Running backup for user: $USERNAME"
log_info "Backing up files from $SOURCE_DIR to $BACKUP_DIR"
# List of Linux system files/folders to exclude
EXCLUDE=(
--exclude=".bash*"
--exclude=".profile"
--exclude=".cache"
--exclude=".ssh"
--exclude=".local"
--exclude=".config"
--exclude=".cloud-locale-test.skip"
--exclude=".sessions"
--exclude="logs"
)
# Create file backup
if ! rsync -a "${EXCLUDE[@]}" "$SOURCE_DIR/" "$BACKUP_FILE_DIR"; then
log_error "File backup failed" 30
fi
# Create cpguardx conf files backup
if ! rsync -a "$CPGUARDX_CNF_DIR/" "$BACKUP_CNF_DIR"; then
log_error "Configuration backup failed" 40
fi
cp -rf $BACKUP_DIR/.meta "$BACKUP_DIR/$FILENAME/" > /dev/null 2>&1
printf "\n Status : %s [Completed] \n" "$SOURCE_DIR" >> /opt/cpguard/logs/backup.log
# Create database backup
log_info "Collecting MySQL databases for user $USERNAME"
mysql -N -B -e "SHOW DATABASES LIKE '${USERNAME}\_%';" > "$DB_LIST_FILE"
log_info "Backing up databases to $BACKUP_DIR \n"
# MySQL database backup
while read -r DB_NAME; do
[[ -z "$DB_NAME" || "$DB_NAME" =~ ^# ]] && continue
printf "\n Status : $DB_NAME ">> /opt/cpguard/logs/backup.log
#echo -ne " Status : $DB_NAME \c"
if ! mysqldump --single-transaction --quick --lock-tables=false "$DB_NAME" > "$BACKUP_DB_DIR/${DB_NAME}.sql"; then
printf " [Failed] \n" >> /opt/cpguard/logs/backup.log
log_warn "Some databases failed to dump" 50
else
printf " [Completed] \n" >> /opt/cpguard/logs/backup.log
fi
done < "$DB_LIST_FILE"
rm -rf "$DB_LIST_FILE"
compressed() {
log_info "Compressing backup data"
sync
sleep 1
if ! tar --warning=no-file-changed -cf - -C "$BACKUP_DIR" "$FILENAME" | lz4 -q - "$BACKUP_FILE_NAME" 2>> /opt/cpguard/logs/backup.log; then
log_error "Failed to create compressed backup" 5
fi
rm -rf "$BACKUP_DIR/$FILENAME"
}
if [ "$BACKUP_TYPE" = "compressed" ]; then
compressed
elif [ "$BACKUP_TYPE" = "uncompressed" ]; then
log_info "Keeping files uncompressed in $BACKUP_DIR"
elif [ "$BACKUP_TYPE" = "incremental" ]; then
log_info "Incremental backups not configured now"
else
log_warn "Unknown BACKUP_TYPE: $BACKUP_TYPE — proceeding uncompressed"
fi
log_info "Backup process for user $USERNAME completed"
log_info "Completed at $(date '+%a %b %d %T %Y')"
log_info "Final state is Success"
log_info "========================"