#!/bin/bash
#
# $Id: mysql.sh,v 1.11 2006/01/11 22:51:28 anarcat Exp $
# ----------------------------------------------------------------------
# AlternC - Web Hosting System
# Copyright (C) 2002 by the AlternC Development Team.
# http://alternc.org/
# ----------------------------------------------------------------------
# Based on:
# Valentin Lacambre's web hosting softwares: http://altern.org/
# ----------------------------------------------------------------------
# LICENSE
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License (GPL)
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# To read the license please visit http://www.gnu.org/copyleft/gpl.html
# ----------------------------------------------------------------------
# Original Author of file: Benjamin Sonntag
# Purpose of file: Install a fresh new mysql database system
# USAGE : "mysql.sh loginroot passroot systemdb"
# ----------------------------------------------------------------------
#
 
# This script expects the following environment to exist:
# * host
# * user
# * password
# * database
# * alternc_mail_user
# * alternc_mail_password
# * MYSQL_CLIENT
# 
# XXX: the sed script should be generated here
#
# So this file should generally be sourced like this:
# . /usr/share/alternc/install/mysql.sh
#
# Those values are used to set the username/passwords...

MYSQL_CONFIG="/etc/alternc/my.cnf"
MYSQL_MAIL_CONFIG="/etc/alternc/my_mail.cnf"

# The grant all is the most important right needed in this script.
echo "Granting users..."

. /etc/alternc/local.sh
# the purpose of this "grant" is to make sure that the generated my.cnf works
# this means (a) creating the user and (b) creating the database
grant="GRANT ALL ON *.* TO '$user'@'${MYSQL_CLIENT}' IDENTIFIED BY '$password' WITH GRANT OPTION;
CREATE DATABASE IF NOT EXISTS $database; "
grant_mail="GRANT ALL ON $database.dovecot_view TO '$alternc_mail_user'@'${MYSQL_CLIENT}' IDENTIFIED BY '$alternc_mail_password';"
grant_mail=$grant_mail"GRANT ALL ON $database.dovecot_quota TO '$alternc_mail_user'@'${MYSQL_CLIENT}' IDENTIFIED BY '$alternc_mail_password';"
grant_mail=$grant_mail"GRANT SELECT ON $database.* TO '$alternc_mail_user'@'${MYSQL_CLIENT}' IDENTIFIED BY '$alternc_mail_password';"


#if mysql_client != localhost means we are connecting to a remote server
#the remote sql use rshould already be configured but it is a way of confirming it.
if [ $MYSQL_CLIENT != "localhost" ]; then
       mysql="/usr/bin/mysql -h$host -u$user -p$password"
  if ! $mysql << EOF
$grant
EOF
       then
               echo "Fail"
               echo "Can't grant to remote system user $user, aborting";
               exit 1
       fi
else
  echo -n "Trying debian.cnf: "
  mysql="/usr/bin/mysql --defaults-file=/etc/mysql/debian.cnf"
  # If this call fail, we may be connected to a mysql-server version 5.0.
  # In that case, change mysql parameters and retry. Use root / nopassword.
  if ! $mysql <<EOF
  $grant
EOF
  then
      echo "failed: debian-sys-maintainer doesn't have the right credentials"
      echo -n "are we doing an upgrade? "
      mysql="/usr/bin/mysql --defaults-file=$MYSQL_CONFIG"
      if ! $mysql <<EOF
  $grant
EOF
      then 
          echo "No"
          echo -n "Assuming clean install (empty root password)... "
          mysql="/usr/bin/mysql -h$host -uroot "
          if ! $mysql <<EOF
  $grant
EOF
          then 
              echo "Failed"
              echo -n "Assuming pre 0.9.8 version... "
              mysql="/usr/bin/mysql -h$MYSQL_HOST -u$MYSQL_USER -p$MYSQL_PASS"
              if ! $mysql <<EOF
  $grant
EOF
              then
                  echo "No."
                  echo "Can't grant system user $user, aborting"; 
  	        exit 1 
              fi
  	fi
      fi
  fi
fi
echo "ok!"

if [ -f $MYSQL_CONFIG ]; then
    echo "Updating mysql configuration in $MYSQL_CONFIG"
else
    echo "Creating mysql configuration in $MYSQL_CONFIG"
    cat > $MYSQL_CONFIG <<EOF
# AlternC - Web Hosting System - MySQL Configuration
# Automatically generated by AlternC configuration, do not edit
# This file will be modified on package configuration
# (e.g. upgrade or dpkg-reconfigure alternc)
[mysql]
database=

[client]
EOF
    chown root:www-data $MYSQL_CONFIG
    chmod 640 $MYSQL_CONFIG
fi

if [ -f $MYSQL_MAIL_CONFIG ]; then
    echo "Updating mysql configuration in $MYSQL_MAIL_CONFIG"
else
    echo "Creating mysql configuration in $MYSQL_MAIL_CONFIG"
    cat > $MYSQL_MAIL_CONFIG <<EOF
# AlternC - Web Hosting System - MySQL mail user Configuration 
# Automatically generated by AlternC configuration, do not edit
# This file will be modified on package configuration
# (e.g. upgrade or dpkg-reconfigure alternc)
[mysql]
database=

[client]
EOF
    chown root:www-data $MYSQL_MAIL_CONFIG
    chmod 640 $MYSQL_MAIL_CONFIG
fi
# create a sed script to create/update the file
set_value() {
    var=$1
    RET=$2
    file=$3
    grep -Eq "^ *$var=" $file || echo "$var=" >> $file
    if [ $file = $MYSQL_CONFIG ]; then
      SED_SCRIPT_USR="$SED_SCRIPT_USR;s\\^ *$var=.*\\$var=\"$RET\"\\"
    else
      SED_SCRIPT_MAIL="$SED_SCRIPT_MAIL;s\\^ *$var=.*\\$var=\"$RET\"\\"
    fi 
}

SED_SCRIPT_USR=""
SED_SCRIPT_MAIL=""
# hostname was empty in older (pre-0.9.6?) versions
if [ -z "$host" ]; then
    host="localhost"
fi
#filling the config file for the sysusr
set_value host $host $MYSQL_CONFIG
set_value database $database $MYSQL_CONFIG
set_value user $user $MYSQL_CONFIG
set_value password $password $MYSQL_CONFIG


#filling the config file for the mailuser
set_value host $host $MYSQL_MAIL_CONFIG
set_value database $database $MYSQL_MAIL_CONFIG
set_value user $alternc_mail_user $MYSQL_MAIL_CONFIG
set_value password $alternc_mail_password $MYSQL_MAIL_CONFIG


# take extra precautions here with the mysql password:
# put the sed script in a temporary file
SED_SCRIPT_NAME=`mktemp`
cat > $SED_SCRIPT_NAME <<EOF
$SED_SCRIPT_USR
EOF
sed -f "$SED_SCRIPT_NAME" < $MYSQL_CONFIG > $MYSQL_CONFIG.$$
mv -f $MYSQL_CONFIG.$$ $MYSQL_CONFIG
rm -f $SED_SCRIPT_NAME

SED_SCRIPT_NAME_MAIL=`mktemp`
cat > $SED_SCRIPT_NAME_MAIL <<EOF
$SED_SCRIPT_MAIL
EOF
sed -f "$SED_SCRIPT_NAME_MAIL" < $MYSQL_MAIL_CONFIG > $MYSQL_MAIL_CONFIG.$$
mv -f $MYSQL_MAIL_CONFIG.$$ $MYSQL_MAIL_CONFIG
rm -f $SED_SCRIPT_NAME_MAIL

# Now we should be able to use the mysql configuration
mysql="/usr/bin/mysql --defaults-file=$MYSQL_CONFIG"
mysql_mail="/usr/bin/mysql --defaults-file=$MYSQL_MAIL_CONFIG"

echo "Checking for MySQL connectivity"
$mysql -e "SHOW TABLES" >/dev/null && echo "MYSQL.SH OK!" || echo "MYSQL.SH FAILED: database user setup failed"
# Final mysql setup: db schema
echo "installing AlternC schema in $database..."
$mysql < /usr/share/alternc/install/mysql.sql || echo "Error loading database schema, continuing..."
$mysql <<EOF
$grant_mail
EOF
