1#!/bin/sh 2 3# 4# Daily and hourly maintenance job 5# - database backup 6# - copy database to sandbox database 7# - garbage collect database 8# - spool expiration 9# 10# This script is meant to be run by cron, with entries such as: 11# 0 8-18 * * * netmagis /usr/local/sbin/netmagis-dbmaint hourly 12# 0 23 * * * netmagis /usr/local/sbin/netmagis-dbmaint daily 13# 14# History 15# 2002/06/04 : pda : design script to copy to development database 16# 2002/06/19 : pda : design backup script 17# 2002/07/25 : pda : merge in only one script 18# 2011/03/18 : pda : i18n 19# 2012/06/19 : pda : create copy database and simplify copying 20# 21 22usage () 23{ 24 echo "usage: $0 hourly|daily" >&2 25 exit 1 26} 27 28############################################################################## 29# Configuration file read 30############################################################################## 31 32init_env () 33{ 34 varlist="dnsdbhost dnsdbport dnsdbname dnsdbuser dnsdbpassword" 35 eval `%CONFPROG% -c $varlist` 36 37 if [ $? != 0 ] 38 then 39 usage 40 exit 1 41 fi 42 43 PGHOST="$dnsdbhost" 44 PGPORT="$dnsdbport" 45 PGDATABASE="$dnsdbname" 46 PGUSER="$dnsdbuser" 47 PGPASSWORD="$dnsdbpassword" 48 export PGHOST PGPORT PGDATABASE PGUSER PGPASSWORD 49 50 # these variables are searched in a second pass, since they can be 51 # empty (the first pass used the "-c" flag) 52 varlist="dumpdir dbcopy" 53 eval `%CONFPROG% $varlist` 54 55} 56 57backup () 58{ 59 if [ "$dumpdir" != "" ] 60 then 61 pg_dump --file=$dumpdir/dump.$NOW \ 62 --schema=global --schema=dns --schema=topo --schema=pgauth \ 63 $PGDATABASE 64 fi 65} 66 67copy () 68{ 69 if [ "$dumpdir" != "" -a "$dbcopy" != "" ] 70 then 71 # drop copy if it already exists 72 if psql -lAt | grep -q "^$dbcopy|" 73 then dropdb "$dbcopy" 74 fi 75 76 # create copy from the original database 77 createdb -E unicode --template="$PGDATABASE" "$dbcopy" 78 fi 79} 80 81vacuum () 82{ 83 vacuumdb --quiet --full $PGDATABASE 2>&1 \ 84 | grep -v "WARNING:.* only superuser can vacuum it" 85 return 0 86} 87 88get_config () 89{ 90 psql -Aqtc "SELECT value FROM global.config WHERE key = '\$1'" $PGDATABASE 91} 92 93clean_spools () 94{ 95 ifchangeexpire=`get_config ifchangeexpire` 96 if expr "$ifchangeexpire" : "[0-9][0-9]*$" > /dev/null 97 then 98 psql -d $PGDATABASE -q -c \ 99 "DELETE FROM topo.ifchanges 100 WHERE processed = 1 AND NOW()-reqdate > '\$ifchangexpire days'" 101 fi 102 103 modeqexpire=`get_config modeqexpire` 104 if expr "$modeqexpire" : "[0-9][0-9]*$" > /dev/null 105 then 106 psql -d $PGDATABASE -q -c \ 107 "DELETE FROM topo.modeq 108 WHERE processed = 1 AND NOW()-date > '\$modeqexpire days'" 109 fi 110} 111 112init_env 113NOW=`date +%a-%H` # day of week & hour 114 115case "$1" in 116 daily) 117 if backup && copy && clean_spools && vacuum 118 then exitcode=0 119 else exitcode=1 120 fi 121 ;; 122 hourly) 123 if backup 124 then exitcode=0 125 else exitcode=1 126 fi 127 ;; 128 *) 129 usage 130 ;; 131esac 132 133if [ $exitcode = 1 ] 134then echo "Error during daily $PGDATABASE database maintenance" >&2 135fi 136 137exit $exitcode 138