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