Bash程序  |  130行  |  3.19 KB

#!/bin/bash
#
# Copyright 2016 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
set -e

USAGE='Usage: setup_db.sh [-pacm]'
HELP="${USAGE}\n\n\
Setup database needed to run autotest.\n\
Options:\n\
  -p Desired Autotest DB password. Must be non-empty.\n\
  -a Path to user local autotest directiry. Default is /usr/local/autotest.\n\
  -c Clobber existing database if it exists.\n\
  -m Allow remote access for database."

PASSWD=
AT_DIR=/usr/local/autotest
clobberdb="FALSE"
remotedb="FALSE"
while getopts ":p:a:cmh" opt; do
  case ${opt} in
    p)
      PASSWD=$OPTARG
      ;;
    a)
      AT_DIR=$OPTARG
      ;;
    c)
      clobberdb="TRUE"
      ;;
    m)
      remotedb="TRUE"
      ;;
    h)
      echo -e "${HELP}" >&2
      exit 0
      ;;
    \?)
      echo "Invalid option: -$OPTARG" >&2
      echo -e "${HELP}" >&2
      exit 1
      ;;
    :)
      echo "Option -$OPTARG requires an argument." >&2
      echo -e "${HELP}" >&2
      exit 1
      ;;
  esac
done

if [ -z "${PASSWD}" ]; then
  echo "Option -p is required." >&2
  echo -e "${HELP}" >&2
  exit 1
fi

echo "Installing needed Ubuntu packages for mysql db."
DB_PKG_LIST="mysql-server mysql-common python-mysqldb"

if ! sudo apt-get install -y ${DB_PKG_LIST}; then
  echo "Could not install packages: $?"
  exit 1
fi
echo -e "Done!\n"

# Check if database exists, clobber existing database with user consent.
#
# Arguments: Name of the database
check_database()
{
  local db_name=$1
  echo "Setting up Database: $db_name in MySQL..."
  if mysql -u root -e ';' 2> /dev/null ; then
    PASSWD_STRING=
  elif mysql -u root -p"${PASSWD}" -e ';' 2> /dev/null ; then
    PASSWD_STRING="-p${PASSWD}"
  else
    PASSWD_STRING="-p"
  fi

  if [ -z "${PASSWD_STRING}" ]; then
    mysqladmin -u root ping >/dev/null
  else
    mysqladmin -u root "${PASSWD_STRING}" ping >/dev/null
  fi

  if [ $? -ne 0 ]; then
    sudo service mysql start
  fi

  local existing_database=$(mysql -u root "${PASSWD_STRING}" -e "SELECT \
  SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = '$db_name'")

  local sql_priv="GRANT ALL PRIVILEGES ON $db_name.* TO \
  'chromeosqa-admin'@'localhost' IDENTIFIED BY '${PASSWD}';"

  if [ "${remotedb}" = "TRUE" ]; then
    sql_priv="${sql_priv} GRANT ALL PRIVILEGES ON $db_name.* TO \
    'chromeosqa-admin'@'%' IDENTIFIED BY '${PASSWD}';"
  fi

  local sql_command="drop database if exists $db_name; \
  create database $db_name; \
  ${sql_priv} FLUSH PRIVILEGES;"

  if [[ -z "${existing_database}" || "${clobberdb}" = 'TRUE' ]]; then
    mysql -u root "${PASSWD_STRING}" -e "${sql_command}"
  else
    echo "Use existing database. Use option -c to clobber it."
  fi
  echo -e "Done!\n"
}

check_database 'chromeos_autotest_db'
check_database 'chromeos_lab_servers'

echo "Populating autotest mysql DB..."
"${AT_DIR}"/database/migrate.py sync -f
"${AT_DIR}"/frontend/manage.py syncdb --noinput
# You may have to run this twice.
"${AT_DIR}"/frontend/manage.py syncdb --noinput
"${AT_DIR}"/utils/test_importer.py
echo -e "Done!\n"

echo "Initializing chromeos_lab_servers mysql DB..."
"${AT_DIR}"/database/migrate.py sync -f -d AUTOTEST_SERVER_DB
echo -e "Done!\n"