X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=plc.d%2Fdb;h=ccf9bf6d7499669188a578d1aac0f8eeb662da78;hb=2fb2ab94189643bedabcef1b585671da5a01832e;hp=a295aadceab21393d003aefdb5910bfba04239be;hpb=5afb8089a48433612fb10bed3c609006882b9859;p=plcapi.git diff --git a/plc.d/db b/plc.d/db index a295aad..ccf9bf6 100755 --- a/plc.d/db +++ b/plc.d/db @@ -1,6 +1,4 @@ #!/bin/bash -# $Id$ -# $URL$ # # priority: 900 # @@ -20,102 +18,143 @@ set -x # Export so that we do not have to specify -p to psql invocations export PGPORT=$PLC_DB_PORT +# Install extensions +function extend_db() { + shopt -s nullglob + for file in /usr/share/plc_api/extensions/*-up*; do + script=${file##*/} + name=${script%-up*} + extension=${script##*.} + version=$(psql -U $PLC_DB_USER --quiet --tuples-only --no-align -c \ + "SELECT version FROM plc_db_extensions WHERE name='$name' LIMIT 1" \ + $PLC_DB_NAME 2>/dev/null | awk 'BEGIN { ver=0 } /^[0-9]+$/ { ver=$1 } END { print ver }') + if [ $version -eq 0 ]; then + if [ "$extension" = "sql" ]; then + dialog " - $script (dbdumped)" + dump_planetlab_db "before-$script" + psql -U $PLC_DB_USER -f $file $PLC_DB_NAME + elif [ -x $file ]; then + dialog " - $script (dbdumped)" + dump_planetlab_db "before-$script" + $file + else + dialog "\nWarning: extension $file not executable" + fi + check + fi + for file in /usr/share/plc_api/extensions/$name/migrations/[0-9]*-up-*; do + script=${file##*/} + index=${script%-up-*} + extension=${script##*.} + if [ $index -gt $version ]; then + if [ "$extension" = "sql" ]; then + dialog " - $script (dbdumped)" + dump_planetlab_db "before-$script" + psql -U $PLC_DB_USER -f $file $PLC_DB_NAME + elif [ -x $file ]; then + dialog " - $script (dbdumped)" + dump_planetlab_db "before-$script" + $file + else + dialog "\nWarning: migration $file not executable" + fi + check + fi + done + done +} + # Updates the database by applying all migration scripts in # /usr/share/plc_api/migrations/N-up-*, where N is greater than the # current subversion. At least one of the migration scripts with the # same N must update plc_db_version.subversion. -function migrate_db() -{ - subversion=$(psql -U $PLC_DB_USER --quiet --tuples-only --no-align -c \ - "SELECT subversion FROM plc_db_version LIMIT 1" \ - $PLC_DB_NAME 2>/dev/null || echo 0) - shopt -s nullglob - for file in /usr/share/plc_api/migrations/[0-9]*-up-* ; do - script=$(basename $file) - index=${script%-up*} - extension=${script##*.} - if [ $index -gt $subversion ] ; then - if [ "$extension" = "sql" ] ; then - dialog " - $script (dbdumped)" - dump_planetlab_db "before-$script" - psql -U $PLC_DB_USER -f $file $PLC_DB_NAME - elif [ -x $file ] ; then - dialog " - $script (dbdumped)" - dump_planetlab_db "before-$script" - $file - else - dialog "\nWarning: migration $file not executable" - fi - check - fi - done +function migrate_db() { + subversion=$(psql -U $PLC_DB_USER --quiet --tuples-only --no-align -c \ + "SELECT subversion FROM plc_db_version LIMIT 1" \ + $PLC_DB_NAME 2>/dev/null || echo 0) + shopt -s nullglob + for file in /usr/share/plc_api/migrations/[0-9]*-up-*; do + script=$(basename $file) + index=${script%-up*} + extension=${script##*.} + if [ $index -gt $subversion ]; then + if [ "$extension" = "sql" ]; then + dialog " - $script (dbdumped)" + dump_planetlab_db "before-$script" + psql -U $PLC_DB_USER -f $file $PLC_DB_NAME + elif [ -x $file ]; then + dialog " - $script (dbdumped)" + dump_planetlab_db "before-$script" + $file + else + dialog "\nWarning: migration $file not executable" + fi + check + fi + done } -function checkpoint_planetlab_db() -{ - dumpfile=$1 - pg_dump -U $PLC_DB_USER $PLC_DB_NAME > $dumpfile - check +function checkpoint_planetlab_db() { + dumpfile=$1 + pg_dump -U $PLC_DB_USER $PLC_DB_NAME >$dumpfile + check } -function restore_planetlab_db() -{ - dumpfile=$1 - if [ -n "$dumpfile" ] ; then - [ -f "$dumpfile" ] && psql -a -U $PLC_DB_USER $PLC_DB_NAME < $dumpfile - check - fi +function restore_planetlab_db() { + dumpfile=$1 + if [ -n "$dumpfile" ]; then + [ -f "$dumpfile" ] && psql -a -U $PLC_DB_USER $PLC_DB_NAME <$dumpfile + check + fi } # use a single date of this script invocation for the dump_*_db functions. DATE=$(date +"%Y-%m-%d-%H-%M-%S") # Dumps the database - optional argument to specify filename suffix -function dump_planetlab_db() -{ - if [ -n "$1" ] ; then suffix="-$1" ; else suffix="" ; fi - dumpfile=/var/lib/pgsql/backups/$(date +"${PLC_DB_NAME}.${DATE}${suffix}.sql") - checkpoint_planetlab_db $dumpfile +function dump_planetlab_db() { + if [ -n "$1" ]; then suffix="-$1"; else suffix=""; fi + dumpfile=/var/lib/pgsql/backups/$(date +"${PLC_DB_NAME}.${DATE}${suffix}.sql") + checkpoint_planetlab_db $dumpfile } -function restore_drupal_db() -{ - dumpfile=$1 - if [ -n "$dumpfile" ] ; then - [ -f "$dumpfile" ] && psql -a -U $PLC_DB_USER drupal < $1 - check - fi +function restore_drupal_db() { + dumpfile=$1 + if [ -n "$dumpfile" ]; then + [ -f "$dumpfile" ] && psql -a -U $PLC_DB_USER drupal <$1 + check + fi } -function checkpoint_drupal_db() -{ - dumpfile=$1 - pg_dump -U $PLC_DB_USER drupal > $dumpfile - check +function checkpoint_drupal_db() { + dumpfile=$1 + pg_dump -U $PLC_DB_USER drupal >$dumpfile + check } -function dump_drupal_db() -{ - dumpfile=/var/lib/pgsql/backups/$(date +"drupal.${DATE}.sql") - checkpoint_drupal_db $dumpfile - check +function dump_drupal_db() { + dumpfile=/var/lib/pgsql/backups/$(date +"drupal.${DATE}.sql") + checkpoint_drupal_db $dumpfile + check } # Clean up old backups -function clean_dumps() -{ - find /var/lib/pgsql/backups '(' -name "$PLC_DB_NAME.*.sql" -o -name "drupal.*.sql" ')' -a -atime +15 | xargs rm -f - check +function clean_dump() { + local days="$1"; shift + [[ -z "$days" ]] && days=15 + find /var/lib/pgsql/backups '(' -name "${PLC_DB_NAME}*.sql" -o -name "drupal*.sql" ')' -a -mtime +$days | xargs rm -f + check } [ $PLC_DB_ENABLED -ne 1 ] && exit 0 case "$1" in - start) +start) MESSAGE=$"Bootstrapping the database" dialog "$MESSAGE" # Apply schema updates migrate_db + extend_db # Update the maintenance account username. This can't be # done through the api-config script since it uses the @@ -141,7 +180,7 @@ EOF result "$MESSAGE" ;; - migrate) +migrate) MESSAGE=$"Migrating the database" dialog "$MESSAGE" @@ -149,8 +188,8 @@ EOF result "$MESSAGE" ;; - dump) - MESSAGE=$"Dumping the databases in /var/lib/pgsql/backups" +dump) + MESSAGE=$"Dumping the databases in /var/lib/pgsql/backups" dialog "$MESSAGE" dump_planetlab_db @@ -158,34 +197,34 @@ EOF result "$MESSAGE" ;; - checkpoint) +checkpoint) MESSAGE=$"Checkpointing the databases" checkpoint_planetlab_db $2 checkpoint_drupal_db $3 ;; - restore) +restore) MESSAGE=$"Restoring the databases from checkpoint files" restore_planetlab_db $2 restore_drupal_db $3 ;; - clean-dump) - MESSAGE=$"Cleaning old database dumps" +clean-dump) + MESSAGE=$"Cleaning old database dumps" dialog "$MESSAGE" - - clean_dumps + # clean_dump has a builtin default, so no problem + clean_dump $2 result "$MESSAGE" ;; - stop) +stop) MESSAGE="Ignoring request to stop myplc databases" dialog "$MESSAGE" result "" ;; - *) - echo "Usage: $0 [start|migrate|dump|checkpoint|restore|clean-dump|stop]" +*) + echo "Usage: $0 [start|migrate|dump|checkpoint|restore|clean-dump|stop]" exit 1 ;; esac