#!/bin/bash license() { echo This is a dummy function to allow the editors code folding ability to hide this text #============================================================================= # Initial Developer's Public License. # The contents of this file are subject to the Initial Developer's Public # License Version 1.0 (the "License"). You may not use this file except # in compliance with the License. You may obtain a copy of the License at # http://www.ibphoenix.com?a=ibphoenix&page=ibp_idpl # Software distributed under the License is distributed on an "AS IS" basis, # WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License # for the specific language governing rights and limitations under the # License. # # The Original Code is copyright 2004-2023 Paul Reeves. # # The Initial Developer of the Original Code is Paul Reeves # # All Rights Reserved. # #============================================================================= # To Do # # Add Debug/Verbose/better logging : } todo() { # To Do # # Add Debug/Verbose/better logging : } GETOPT=$(getopt -o b:c:d:f:i:hs:u:p:z: --long firebirdbin:,firebirdconf:,firebirddb:,firebird:,input:,help,savedb:,user:,pass:,firebirdserverversion: -n "$0" -- "$@") EXECFILENAME=$(basename "$0") BASENAME=$(basename "$0" .sh) declare -i FIREBIRDMAJORVERSION=0 declare -i FIREBIRDMINORVERSION=0 ShowHelp(){ tabs 3,5,9,13,17,21,25,29,33,37,41,45,49,53,57,61,65,69,73,77 DOCNOTE=$(cat << MSG > ${BASENAME}-readme.md # $BASENAME Run this script from a console prompt. It will execute ddl to (re)create a firebird database. -i | --input ALIASNAME Pass the name of the master script to execute. This master script must have the same name as the alias used for the database that is being worked on. If the alias does not exist in alias.conf it will be added. $ALIAS = \$FIREBIRD_CONF\\\$ALIAS.fdb NOTE: Do not add the script file type (.sql) ### Options Other available parameters: -f | --firebirdconf a/path/to/firebird/conf files Assign a path to the FIREBIRD_CONF variable Default is /opt/firebird -d | --firebirddb a/path/to/firebird/db Assign a path to the FB_DATA variable Default is /srv/data/ -s | --savedb /a/backup/dir Do a gbak backup of the existing db before executing ddl -h | --help This help screen. MSG ) local _help=$BASE_NAME-readme.md #echo -e $DOCNOTE > ${_help} cat ${_help} } #################### Start of generic functions ############################# Pause() { local _aprompt if [ "${1:-}" = "" ]; then _aprompt="Press any key to continue..." else _aprompt="$*" fi #shellcheck disable=SC2162 read -p "$_aprompt" } GetTime(){ export LOGSTAMP=$(date "+%Y-%m-%d %H:%M:%S") export DATESTAMP=$(date +%Y%m%d) export TIMESTAMP=$(date +%Y%m%d-%H%M%S) export TAGSTAMP=$(date +:%Y%m%d%H%M) case "${1:-}" in LOGSTAMP) echo LOGSTAMP is "$LOGSTAMP" ;; DATESTAMP) echo DATE is "$DATESTAMP" ;; TIMESTAMP) echo TIMESTAMP is "$TIMESTAMP" ;; TAGSTAMP) echo TAGSTAMP is "$TAGSTAMP" ;; esac } GetLogStamp() { GetTime "LOGSTAMP" } Debug() { # Debug is intended for printing values assigned to variables etc. if [ "${DEBUG:-}" = "1" ]; then GetTime local FUNC=$1 shift echo -e $LOGSTAMP $FUNC "-" "$@" fi } Verbose() { # Verbose is intended to give the user a more # detailed narrative of programm execution. # shellcheck disable=SC2166 if [ "${VERBOSE:-}" == "1" -o "${DEBUG:-}" == "1" ]; then GetTime if [ "${2:-}" = "" ]; then echo -e $LOGSTAMP "$@" else local FUNC=${1:-} shift echo -e $LOGSTAMP $FUNC "-" "$@" fi fi } WriteLog() { # Param 1 - Logfile # Param 2 - FUNCNAME # We automatically call Verbose after shifting LOGFILE # We then shift FUNCNAME and write out to the log. GetTime local LOGFILE=${1:-} shift Verbose "$@" # shellcheck disable=SC2166 if [ ! "${VERBOSE:-}" = 1 -o ! "${DEBUG:-}" = 1 ]; then shift fi if [ ! "${LOGFILE:-}" = "" ]; then echo -e $LOGSTAMP "-" "$@" >> $LOGFILE fi } Stop() { # Echo error message and stop execution. ### TODO exit $1 } Error(){ #==== echo "" echo " Error in $0" echo " $*" echo "" return 1 } ######################### END OF GENERIC FUNCTIONS ######################### # Parse commandline options. ParseCommandLine() { set +x if [ $# -le 0 ]; then #ShowHelp return 2 fi eval set -- "$GETOPT" while [ -n "$1" ]; do case "$1" in -h|--help) return 2 ;; -b|--firebirdbin) if [ "$2" ] > /dev/null 2>&1; then export FIREBIRD_BIN="$2"; fi shift; ;; -c|--firebirdconf) if [ "$2" ] > /dev/null 2>&1; then export FIREBIRD_CONF="$2"; fi shift; ;; -d|--firebirddb) if [ "$2" ] > /dev/null 2>&1; then export FIREBIRD_DATA="$2"; fi shift; ;; -f|--firebird) if [ "$2" ] > /dev/null 2>&1; then export FIREBIRD="$2"; fi shift; ;; -i|--input) if [ "$2" ] > /dev/null 2>&1; then ALIAS="$2"; fi shift; ;; -s|-–savedb) if [ "$2" ] > /dev/null 2>&1; then export FB_BACKUP_PATH="$2"; fi shift; ;; -u|--user) if [ "$2" ] > /dev/null 2>&1; then export ISC_USER="$2"; fi shift; ;; -p|--pass) if [ "$2" ] > /dev/null 2>&1; then export ISC_PASSWORD="$2"; fi shift; ;; -z|--firebirdserverversion) if [ "$2" ] > /dev/null 2>&1; then export FIREBIRDMAJORVERSION=$(echo "$2" | cut --delimiter "." -f 1 ); export FIREBIRDMINORVERSION=$(echo "$2" | cut --delimiter "." -f 2 ); fi shift; ;; esac shift; done if [ -z "$FIREBIRD" ]; then export FIREBIRD=/opt/firebird fi if [ -z "$FIREBIRD_BIN" ]; then export FIREBIRD_BIN=/opt/firebird/bin fi if [ -z "$FB_DATA" ]; then export FB_DATA=/srv/data/active fi if [ -z "$FIREBIRD_CONF" ]; then export FIREBIRD_CONF=/opt/firebird fi set +x if [ -z "$ALIAS" ]; then return 1 fi if [ -z "$ISC_USER" ]; then ISC_USER=DBOWNER fi if [ -z "$ISC_PASSWORD" ]; then ISC_PASSWORD=masterkey fi #echo FIREBIRDMAJORVERSION is $FIREBIRDMAJORVERSION if [ $FIREBIRDMAJORVERSION -eq 0 ]; then #set -x FIREBIRDMAJORVERSION=$(GetFirebirdServerMajorVersion) echo FIREBIRDMAJORVERSION is "$FIREBIRDMAJORVERSION" #set +x fi if [ ${FIREBIRDMAJORVERSION:-0} -ge 3 ]; then DBCONF=databases.conf else DBCONF=aliases.conf fi #echo FIREBIRDMINORVERSION is $FIREBIRDMINORVERSION if [ "$FIREBIRDMINORVERSION" == "" ]; then FIREBIRDMINORVERSION=$(GetFirebirdServerMinorVersion) echo FIREBIRDMINORVERSION is "$FIREBIRDMINORVERSION" fi case "$FIREBIRDMAJORVERSION" in 2) ODS=112 ;; 3) ODS=120 ;; 4) ODS=130 ;; 5) ODS=140 ;; esac export ISC_USER export ISC_PASSWORD } GetFirebirdServerMajorVersion() { # This will return Firebird or Avalerion or ...? # echo $(${FIREBIRD_BIN}/firebird -z) | cut --delimiter " " -f 6 echo $(${FIREBIRD_BIN}/firebird -z) | cut --delimiter " " -f 7 | cut -d "." -f 1 } GetFirebirdServerMinorVersion() { echo $(${FIREBIRD_BIN}/firebird -z) | cut --delimiter " " -f 7 | cut -d "." -f 2 > /dev/null } #============ main() { BASE_NAME=$(basename $0 .sh ) ParseCommandLine $* case $? in 1) Error $*; exit;; 2) ShowHelp; exit;; esac if [[ -z $ISC_USER ]]; then export ISC_USER=SYSDBA; fi if [[ -z $ISC_PASSWORD ]]; then export ISC_PASSWORD=masterkey; fi echo "$(date) Started" #Delete old files for afile in autogrant.ddl grants_isql.txt $ALIAS.txt do if [ -f $afile ]; then rm $afile > /dev/null 2>&1 fi done # Check we have an alias for %1 # If it doesn't exist then check for FB_DATA and # try and create it. cat $FIREBIRD_CONF/$DBCONF | grep $ALIAS > /dev/null 2>&1 if [ $? -gt 0 ]; then echo "Adding $ALIAS to $FIREBIRD_CONF/$DBCONF" echo $ALIAS = $FB_DATA/ods$ODS/$ALIAS.fdb >> $FIREBIRD_CONF/$DBCONF else echo "Found $ALIAS in $FIREBIRD_CONF/$DBCONF" fi if [ $(whoami) = "root" ]; then mkdir -p $FB_DATA/ods$ODS chown firebird.firebird $FB_DATA/ods$ODS chmod 770 $FB_DATA/ods$ODS fi #run gbak on the existing database, if any. if [ -d "$FB_BACKUP_PATH" ]; then gbak -b -user $ISC_USER -pas $ISC_PASSWORD -se localhost:service_mgr $ALIAS \ $FB_BACKUP_PATH/$ALIAS.gbak else echo "Not backing up old database $ALIAS" fi echo "-- (Re)create empty database" > recreate_db.ddl echo "-- This file is automatically regenerated by $EXECFILENAME" >> recreate_db.ddl echo "-- Do not edit." >> recreate_db.ddl echo "-- " >> recreate_db.ddl #generate database (re)creation script. DBFILENAME=$(cat $FIREBIRD_CONF/$DBCONF | grep -v ^# | grep $ALIAS --max-count=1 | cut -d \= -f 2 | tr -d ' ') echo DBFILENAME is $DBFILENAME if [ -f $DBFILENAME ]; then # echo "connect 'localhost:$ALIAS';" >> recreate_db.ddl echo "connect '$ALIAS';" >> recreate_db.ddl echo "drop database;" >> recreate_db.ddl echo "" >> recreate_db.ddl fi #echo "create database 'localhost:$ALIAS';" >> recreate_db.ddl echo "create database '$ALIAS' SET NAMES 'UTF8';" >> recreate_db.ddl echo "commit;" >> recreate_db.ddl #echo "connect '$ALIAS';" >> recreate_db.ddl #echo "CREATE OR ALTER USER SYSDBA PASSWORD 'masterkey' using plugin Srp;" >> #recreate_db.ddl #echo "commit;" >> recreate_db.ddl #Pause #run creation script if [ -f $ALIAS.sql ]; then echo Running $ALIAS.sql... ${FIREBIRD_BIN}/isql -b -user DB_OWNER -pass masterkey -role RDB$ADMIN -e -i $ALIAS.sql -o $ALIAS.txt -m -m2 > /dev/null else echo Could not find $ALIAS.sql. echo Exiting. exit; fi # This should be part of recreate_db.ddl if [ $(whoami) = "root" ]; then chown firebird.firebird $DBFILENAME chmod 660 $DBFILENAME fi #print errors echo echo Checking for Errors... echo echo #cat $ALIAS.txt | grep -B 16 -A 16 "Statement failed" _err_count=$(cat $ALIAS.txt | grep -c "Statement failed") if [ $_err_count -eq 0 ]; then echo No errors found. echo Script completed successfully. echo echo ==================================== echo echo Here are the last lines from $ALIAS.txt echo tail -n 40 $ALIAS.txt else echo Script failed with the following errors: cat $ALIAS.txt | grep -B 5 -A 4 "Statement failed" fi echo echo echo "$(date) Completed." } main "$@"