# -*- mode: sh; sh-basic-offset: 3; indent-tabs-mode: nil; -*-
# vim: set filetype=sh sw=3 sts=3 expandtab autoindent:

HELPERS="$HELPERS mysql:mysql_database_backup"

do_mysql_vserver() {
   choose_one_vserver "$mysql_title"
   [ $? = 0 ] || return 1
   mysql_vsname="vsname = $REPLY"
}

do_mysql_databases() {
   REPLY=
   while [ -z "$REPLY" ]; do
      formBegin "$mysql_title: databases"
         formItem "Database:"
         formItem "Database:"
         formItem "Database:"
         formItem "Database:"
         formItem "Database:"
         formItem "Database:"
         formItem "Database:"
         formItem "Database:"
         formItem "Database:"
         formItem "Database:"
      formDisplay
      [ $? = 0 ] || return 1
      mysql_databases="databases = "
      for i in $REPLY; do
         [ -n "$i" ] && mysql_databases="$mysql_databases $i"
      done
   done
}

do_mysql_password() {
   inputBox "$mysql_title" "specify a mysql user:"
   [ $? = 1 ] && return
   user=$REPLY
   inputBox "$mysql_title" "specify the mysql user's password:"
   [ $? = 1 ] && return
   password=$REPLY
   do_mysql_final "dbusername = $user\ndbpassword = $password"
}

do_mysql_debian() {
   _DISABLE_HOTCOPY=yes
   do_mysql_final "configfile = /etc/mysql/debian.cnf"
}

do_mysql_user() {
   inputBox "$mysql_title" "what system user does mysql backup use?"
   [ $? = 1 ] && return
   do_mysql_final "user = $REPLY"
}

do_mysql_final() {
   if [ -z "$_DISABLE_HOTCOPY" ]; then
      checkBox "$mysql_title" "check options" \
         "sqldump" "create a backup using mysqldump (more compat)." no \
         "hotcopy" "create a backup using mysqlhotcopy (faster)." yes \
         "compress" "compress the sql output files" yes
      status=$?
      sqldump="sqldump = no"
      hotcopy="hotcopy = no"
   else
      checkBox "$mysql_title" "check options" \
         "compress" "compress the sql output files" yes
      status=$?
      sqldump="sqldump = yes"
      hotcopy="hotcopy = no"
   fi

   [ $status = 1 ] && return;
   result="$REPLY"
   compress="compress = no"
   for opt in $result; do
      case $opt in
         '"sqldump"') sqldump="sqldump = yes";;
         '"hotcopy"') hotcopy="hotcopy = yes";;
         '"compress"') compress="compress = yes";;
      esac
   done
   get_next_filename $configdirectory/20.mysql

   cat >> $next_filename <<EOF
### backupninja MySQL config file ###

# hotcopy = < yes | no > (default = no)
# make a backup of the actual database binary files using mysqlhotcopy.
$hotcopy

# sqldump = < yes | no > (default = no)
# make a backup using mysqldump. this creates text files with sql commands
# sufficient to recontruct the database.
#
$sqldump

# sqldumpoptions = <options>
# (default = --lock-tables --complete-insert --add-drop-table --quick --quote-names)
# arguments to pass to mysqldump
# sqldumpoptions = --add-drop-table --quick --quote-names

# compress = < yes | no > (default = yes)
# if yes, compress the sqldump output.
$compress

# dbhost      = <host> (default = localhost)

EOF
   cat >> $next_filename <<EOF

# backupdir = <dir> (default: /var/backups/mysql)
# where to dump the backups. hotcopy backups will be in a subdirectory
# 'hotcopy' and sqldump backups will be in a subdirectory 'sqldump'
$mysql_backupdir

# databases = <all | db1 db2 db3 > (default = all)
# which databases to backup. should either be the word 'all' or a
# space separated list of database names.
$mysql_databases

EOF

if [ $host_or_vservers == vservers ]
   then
      cat >> $next_filename <<EOF
#
# vsname = <vserver> (no default)
# vsname indicates which vserver to operate on, this is only used if
# vserver is set to yes in /etc/backupninja.conf
# NOTE: if you do not specify a vsname the host will be operated on
# alsoNOTE: if operating on a vserver, $VROOTDIR will be
# prepended to backupdir.
EOF
   echo -e "$mysql_vsname\n" >> $next_filename
fi

   echo -e $@ >> $next_filename

   chmod 600 $next_filename
}

mysql_wizard() {

   # Global variables
   mysql_title="MySQL action wizard"

   # backup the host system or a Vserver?
   choose_host_or_one_vserver "$mysql_title"
   [ $? = 0 ] || return 1
   if [ $host_or_vservers == vservers ]
   then
      do_mysql_vserver
      [ $? = 0 ] || return 1
   fi

   # backupdir
   if [ $host_or_vservers == vservers ]
   then
      inputBox "$mysql_title" "Directory where to store the backups:`echo \"\n(Relative to chosen vserver's root directory)\"`" "/var/backups/mysql"
   else
      inputBox "$mysql_title" "Directory where to store the backups" "/var/backups/mysql"
   fi
   [ $? = 1 ] && return
   mysql_backupdir="backupdir = $REPLY"

   # databases
   booleanBox "$mysql_title" "Do you want to backup all of the databases? `echo \"\n\nIf not, you'll be offered to choose individual databases to backup.\"`"
   if [ $? = 0 ]; then
      mysql_databases="databases = all"
   else
      do_mysql_databases
      [ $? = 0 ] || return 1
   fi

   while true; do
      _DISABLE_HOTCOPY=
      menuBoxHelpFile "$mysql_title" "choose a mysql authentication method:" \
         user "change to a linux user first." \
         password "manually specify mysql user and password." \
         debian "use default mysql user debian-sys-maint."
      status=$?
      if [ $status = 2 ]; then
         # show help.
         helptmp="/tmp/backupninja.help.$$"
         cat > $helptmp <<EOF
To connect to mysql, backupninja must authenticate.
There are three possible authentication methods:

USER
With this method, you specify a system user. Backupninja will
then become this user before running mysqldump or mysqlhotcopy.
The result is that ~/.my.cnf is used for authentication.

PASSWORD
With this method, you manually specify a mysql user and
password in the backup action configuration.

DEBIAN
With this method, we use the debian-sys-maint user which is
already defined in /etc/mysql/debian.cnf. If you are running
debian, this is recommended, because no further configuration
is needed. The drawback is that this is incompatible with
mysqlhotcopy: you must use mysqldump.
EOF
         dialog --textbox $helptmp 0 0
         rm $helptmp
      fi

      [ $status = 1 ] && return;
      result="$REPLY"
      case "$result" in
         "user") do_mysql_user;return;;
         "password") do_mysql_password;return;;
         "debian") do_mysql_debian;return;;
      esac
   done
}