#!/bin/bash # ############################################################################### # HIRS DB creation # Environment variables used: # a. HIRS_MYSQL_ROOT_PWD: Set this variable if mysql root password is already set # b. HIRS_DB_PWD: Set the pwd if default password to hirs_db user needs to be changed ################################################################################ param ( [string]$LOG_FILE = $null, [switch]$unattended = $false ) $APP_HOME=(Split-Path -parent $PSCommandPath) $ACA_COMMON_SCRIPT=(Join-Path "$APP_HOME" .. aca aca_common.ps1) # Load other scripts . $ACA_COMMON_SCRIPT . $global:HIRS_REL_WIN_DB_MYSQL_UTIL # Read aca.properties read_aca_properties $global:HIRS_DATA_ACA_PROPERTIES_FILE # Read spring application.properties read_spring_properties $global:HIRS_DATA_SPRING_PROP_FILE # Parameter check if ($LOG_FILE) { touch $LOG_FILE $global:LOG_FILE=$LOG_FILE } else { set_up_log } touch $global:HIRS_DATA_ACA_PROPERTIES_FILE touch $global:DB_CONF # Make sure required paths exist mkdir -F -p $global:HIRS_CONF_DIR 2>&1 > $null mkdir -F -p $global:HIRS_DATA_LOG_DIR 2>&1 > $null Function check_mysql_root_pwd () { # Check if DB root password needs to be obtainedS $DB_ADMIN_PWD="" if (!$Env:HIRS_MYSQL_ROOT_PWD) { # Create a 32 character random password echo "Using randomly generated password for the DB admin" | WriteAndLog $DB_ADMIN_PWD=(create_random) Write-Host "NOT LOGGED: DB Admin will be set to $DB_ADMIN_PWD, please make note for next mysql use." # Check unattended flag set m if not then prompt user for permission ot store mysql root password if (!$unattended) { $confirm=Read-Host 'Do you wish to save this password to the aca.properties file?' if (($confirm -eq "y") -or ($confirm -eq "yes")) { # case-insensitive add_new_aca_property -file:"$global:HIRS_DATA_ACA_PROPERTIES_FILE" -newKeyAndValue:"mysql_admin_password=$DB_ADMIN_PWD" echo "Mysql root password saved locally" | WriteAndLog } else { echo "Mysql root password not saved locally" | WriteAndLog } } else { # unattended install add_new_aca_property -file:"$global:HIRS_DATA_ACA_PROPERTIES_FILE" -newKeyAndValue:"mysql_admin_password=$DB_ADMIN_PWD" echo "Mysql root password has been saved locally." | WriteAndLog } mysqladmin --user=root password "$DB_ADMIN_PWD" } else { $DB_ADMIN_PWD=$Env:HIRS_MYSQL_ROOT_PWD echo "Using system variable supplied password" | WriteAndLog } # Make sure root password is correct mysql -u root -p"$DB_ADMIN_PWD" -e 'quit' 2>&1 | WriteAndLog if ($LastExitCode -eq 0) { echo "Mysql root password verified" | WriteAndLog } else { echo "MYSQL root password was not the default, not supplied, or was incorrect" | WriteAndLog echo " please set the HIRS_MYSQL_ROOT_PWD system variable and retry." | WriteAndLog echo " ********** ACA Mysql setup aborted ********" | WriteAndLog exit 1 } return $DB_ADMIN_PWD } Function set_mysql_tls () { # Check DB server setup. If ssl params dont exist then we need to add them. if (!(Get-Content $global:DB_CONF | grep "ssl")) { # Add TLS files to my.ini- Assumes [client] section at the end, and no [server] section echo "Updating $global:DB_CONF with ssl parameters..." | WriteAndLog echo "ssl_ca=$SSL_DB_CLIENT_CHAIN" >> $global:DB_CONF echo "ssl_cert=$SSL_DB_CLIENT_CERT" >> $global:DB_CONF echo "ssl_key=$SSL_DB_CLIENT_KEY" >> $global:DB_CONF echo "[server]" >> $global:DB_CONF echo "ssl_ca=$global:SSL_DB_SRV_CHAIN" >> $global:DB_CONF echo "ssl_cert=$global:SSL_DB_SRV_CERT" >> $global:DB_CONF echo "ssl_key=$global:SSL_DB_SRV_KEY" >> $global:DB_CONF ChangeFileBackslashToForwardSlash $global:DB_CONF } else { echo "$global:DB_CONF contains existing entry for ssl, skipping..." | WriteAndLog } } # Process HIRS DB USER Function set_hirs_db_pwd () { param ( [string]$DB_ADMIN_PWD = $null ) if (!$DB_ADMIN_PWD) { echo "set_hirs_db_pwd was called without supplying a required variable" | WriteAndLog } $HIRS_PASS="" if ($Env:HIRS_DB_PWD) { $HIRS_PASS=$Env:HIRS_DB_PWD echo "Using hirs_db password found in the environment variable HIRS_DB_PWD" | WriteAndLog } elseif ($global:ACA_PROPERTIES.'hirs_db_password') { $HIRS_PASS=$global:ACA_PROPERTIES.'hirs_db_password' echo "Using hirs_db password found in the ACA properties file $global:HIRS_DATA_ACA_PROPERTIES_FILE" | WriteAndLog } else { echo "Using randomly generated password for the DB key password" | WriteAndLog $HIRS_PASS=(create_random) add_new_aca_property -file:"$global:HIRS_DATA_ACA_PROPERTIES_FILE" -newKeyAndValue:"hirs_db_username=hirs_db" add_new_aca_property -file:"$global:HIRS_DATA_ACA_PROPERTIES_FILE" -newKeyAndValue:"hirs_db_password=$HIRS_PASS" echo "Stored hirs_db password in the ACA properties file $global:HIRS_DATA_ACA_PROPERTIES_FILE" | WriteAndLog } $RESULT=(mysql -u root -p"$DB_ADMIN_PWD" -e "SELECT EXISTS(SELECT 1 FROM mysql.user WHERE user = 'hirs_db')") if ($RESULT -eq 1) { echo "hirs-db user exists" | WriteAndLog } return $HIRS_PASS } # Create a hirs_db with client side TLS enabled Function create_hirs_db_with_tls () { param ( [string]$DB_ADMIN_PWD = $null, [string]$HIRS_PASS = $null ) if (!$DB_ADMIN_PWD) { echo "create_hirs_db_with_tls: DB_ADMIN_PWD not provided and is required" | WriteAndLog } if (!$HIRS_PASS) { echo "create_hirs_db_with_tls: HIRS_PASS not provided and is required" | WriteAndLog } # Check if hirs_db not created and create it if it wasn't mysqlshow -u root -p"$DB_ADMIN_PWD" | grep "hirs_db" 2>&1 > $null if ($LastExitCode -eq 0) { echo "hirs_db exists, skipping hirs_db create" | WriteAndLog } else { echo "Creating hirs_db database" | WriteAndLog mysql -u root -p"$DB_ADMIN_PWD" -e "source $global:HIRS_REL_SCRIPTS_DB_CREATE_SQL" mysql -u root -p"$DB_ADMIN_PWD" -e "source $global:HIRS_REL_SCRIPTS_DB_SECURE_MYSQL_SQL" mysql -u root -p"$DB_ADMIN_PWD" -e "ALTER USER 'hirs_db'@'localhost' IDENTIFIED BY '$HIRS_PASS'; FLUSH PRIVILEGES;" } } Function create_hibernate_url () { param ( [string]$ALG = $null ) if ($ALG -eq "RSA") { $CERT_CHAIN=(Join-Path $global:HIRS_DATA_CERTIFICATES_HIRS_RSA_PATH 'HIRS_rsa_3k_sha384_Cert_Chain.pem') $CLIENT_DB_P12=(Join-Path $global:HIRS_DATA_CERTIFICATES_HIRS_RSA_PATH 'HIRS_db_client_rsa_3k_sha384.p12') $ALIAS="hirs_aca_tls_rsa_3k_sha384" } elseif ($ALG -eq "ECC") { $CERT_CHAIN=(Join-Path $global:HIRS_DATA_CERTIFICATES_HIRS_ECC_PATH 'HIRS_ecc_512_sha384_Cert_Chain.pem') $CLIENT_DB_P12=(Join-Path $global:HIRS_DATA_CERTIFICATES_HIRS_ECC_PATH 'HIRS_db_client_ecc_512_sha384.p12') $ALIAS="hirs_aca_tls_ecc_512_sha384" } $CONNECTOR_URL="hibernate.connection.url=jdbc:mariadb://localhost:3306/hirs_db?autoReconnect=true&user="+$global:ACA_PROPERTIES.'hirs_db_username'+"&password="+$global:ACA_PROPERTIES.'hirs_db_password'+"&sslMode=VERIFY_CA&serverSslCert=$CERT_CHAIN&keyStoreType=PKCS12&keyStorePassword="+$global:ACA_PROPERTIES.'hirs_pki_password'+"&keyStore=$CLIENT_DB_P12" | ChangeBackslashToForwardSlash # Save connector information to the application properties file. add_new_spring_property -file:"$global:HIRS_DATA_SPRING_PROP_FILE" -newKeyAndValue:"$CONNECTOR_URL" } # HIRS ACA Mysqld processing ... check_mariadb_install -p check_for_container -p set_mysql_tls start_mysqlsd -p $DB_ADMIN_PWD=check_mysql_root_pwd $HIRS_PASS=set_hirs_db_pwd -DB_ADMIN_PWD:"$DB_ADMIN_PWD" create_hirs_db_with_tls -DB_ADMIN_PWD:"$DB_ADMIN_PWD" -HIRS_PASS:"$HIRS_PASS" create_hibernate_url -ALG:"RSA" mysqld_reboot -p