aboutsummaryrefslogtreecommitdiffstats
path: root/bin/crypted-backups
diff options
context:
space:
mode:
Diffstat (limited to 'bin/crypted-backups')
-rwxr-xr-xbin/crypted-backups102
1 files changed, 87 insertions, 15 deletions
diff --git a/bin/crypted-backups b/bin/crypted-backups
index 429d3db..e2dc887 100755
--- a/bin/crypted-backups
+++ b/bin/crypted-backups
@@ -1,15 +1,12 @@
#!/usr/bin/env bash
-set -e -u
+set -euo pipefail
+IFS=$'\n\t'
. /etc/crypted-backups
user_mode=""
source_mode=""
verbose=''
-test_source="/tmp/test"
-test_destination="/home/dave/Downloads/test"
-
-
function notification_source_to_destination () {
local source_directory=$1
local destination_directory=$2
@@ -51,6 +48,30 @@ function sanitize_pathname () {
fi
}
+function check_database_server () {
+ if [ ! -x /usr/bin/mysql ]; then
+ echo "/usr/bin/mysql is not available. Is MariaDB or MySQL actually installed?"
+ return 1
+ elif [ !$(systemctl is-active mysqld) = "active" ]; then
+ echo "No MariaDB or MySQL service is currently running. Start it with 'systemctl start mysqld'."
+ return 1
+ fi
+}
+
+function check_database_settings () {
+ if [ -z "$database_destination" ]; then
+ echo "The \"database_destination\" variable can not be empty."
+ return 1
+ elif [ -z "$database_user" ]; then
+ echo "The \"database_user\" variable can not be empty."
+ return 1
+ elif [ -z "$database_password" ]; then
+ echo "The \"database_password\" variable can not be empty."
+ return 1
+ fi
+ return 0
+}
+
function check_directory_exists () {
local destination=$1
if [ ! -d $destination ]; then
@@ -118,22 +139,22 @@ function get_basename_directory () {
return 0
}
-function compress_directory () {
- local source_directory=$1
+function compress_to_tmp_file () {
+ local source_file=$1
local tmp_file=$2
- echo "Compressing source directory ($source_directory) to temporary file ($tmp_file)."
+ echo "Compressing source ($source_file) to temporary file ($tmp_file)."
case $tar_suffix in
".tar.tbz")
- tar cfj "$tmp_file" $source_directory
+ tar cfj "$tmp_file" $source_file
;;
".tar.tgz")
- tar cfz "$tmp_file" $source_directory
+ tar cfz "$tmp_file" $source_file
;;
".tar.tlz")
- tar --lzma -cf "$tmp_file" $source_directory
+ tar --lzma -cf "$tmp_file" $source_file
;;
".tar.xz")
- tar cfJ "$tmp_file" $source_directory
+ tar cfJ "$tmp_file" $source_file
;;
*)
echo "Using \"$tar_suffix\" as \$tar_suffix is not supported."
@@ -147,6 +168,7 @@ function encrypt_tmp_file () {
local tmp_file=$1
local destination_file=$2
echo "Encrypting $tmp_file to $destination_file."
+ #TODO: Failover for still deleting $tmp_file, if encryption fails
gpg -e \
-r "$gpg_public_key" \
-o "$destination_file" \
@@ -172,7 +194,7 @@ function backup_single_directory () {
check_directory_exists $source_directory
"check_"$user_mode"_directory" $tmp_directory
"check_"$user_mode"_directory" $destination_directory
- compress_directory $source_directory_basename $tmp_file
+ compress_to_tmp_file $source_directory_basename $tmp_file
encrypt_tmp_file $tmp_file $destination_file
}
@@ -199,6 +221,56 @@ function backup_multiple_directories () {
}
+function dump_database () {
+ local db=$1
+ local tmp_file=$2
+ mysqldump --force \
+ --opt \
+ -u$database_user \
+ -p$database_password \
+ --databases $db > $tmp_file
+}
+
+function backup_all_databases () {
+ check_database_server
+ check_database_settings
+ local databases=( )
+ local destination=$(sanitize_pathname $database_destination)
+ local database
+ set +eu
+ databases=$(mysql -u$database_user \
+ -p$database_password \
+ -e "SHOW DATABASES;" \
+ | grep -Ev "(Database|information_schema|performance_schema|tmp)")
+ set -eu
+ if [ ${#databases} -eq 0 ];then
+ echo "There are actually no databases on this server. If you've set wrong user or password variables MariaDB/ MySQL will by now have complained about it."
+ return 1
+ else
+ echo "Databases for which backups will be created: ${databases[@]}"
+ for database in $databases; do
+ backup_database $database $destination
+ done
+ fi
+}
+
+function backup_database () {
+ local db=$1
+ local destination_directory=$2
+ local timestamp=$(generate_timestamp)
+ local tmp_directory=$(sanitize_pathname $tmp)
+ local sql_file="$timestamp$db$sql_suffix"
+ local tmp_file="$tmp_directory$sql_file$tar_suffix"
+ local destination_file="$destination_directory$timestamp$db$sql_suffix$tar_suffix$gpg_suffix"
+ "check_"$user_mode"_directory" $tmp_directory
+ "check_"$user_mode"_directory" $destination_directory
+ echo "Going to temporary directory ($tmp_directory)."
+ cd $tmp_directory
+ dump_database $db $sql_file
+ compress_to_tmp_file $sql_file $tmp_file
+ encrypt_tmp_file $tmp_file $destination_file
+}
+
function set_user_mode () {
if [ $(id -u) -eq 0 ]; then
user_mode="root"
@@ -221,7 +293,6 @@ function print_help () {
}
#TODO: Add function to delete compressed data in working directory (also after fail)
-#TODO: Add function for database backups
#TODO: Add function to cleanup backups
#TODO: Add function to mirror backups
#TODO: Add function to automatically add key to keyring, if not found
@@ -287,7 +358,8 @@ if [ -n "$source_mode" ];then
mailman)
backup_single_directory $mailman_source $mailman_destination
;;
- mariadb)
+ databases)
+ backup_all_databases
;;
logs)
backup_single_directory $logs_source $logs_destination