1178825Sdfr#!/bin/sh
2178825Sdfr#
3178825Sdfr# Copyright (c) 2006 - 2007 Kungliga Tekniska H�gskolan
4178825Sdfr# (Royal Institute of Technology, Stockholm, Sweden). 
5178825Sdfr# All rights reserved. 
6178825Sdfr#
7178825Sdfr# Redistribution and use in source and binary forms, with or without 
8178825Sdfr# modification, are permitted provided that the following conditions 
9178825Sdfr# are met: 
10178825Sdfr#
11178825Sdfr# 1. Redistributions of source code must retain the above copyright 
12178825Sdfr#    notice, this list of conditions and the following disclaimer. 
13178825Sdfr#
14178825Sdfr# 2. Redistributions in binary form must reproduce the above copyright 
15178825Sdfr#    notice, this list of conditions and the following disclaimer in the 
16178825Sdfr#    documentation and/or other materials provided with the distribution. 
17178825Sdfr#
18178825Sdfr# 3. Neither the name of the Institute nor the names of its contributors 
19178825Sdfr#    may be used to endorse or promote products derived from this software 
20178825Sdfr#    without specific prior written permission. 
21178825Sdfr#
22178825Sdfr# THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND 
23178825Sdfr# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
24178825Sdfr# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
25178825Sdfr# ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE 
26178825Sdfr# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 
27178825Sdfr# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 
28178825Sdfr# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 
29178825Sdfr# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 
30178825Sdfr# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 
31178825Sdfr# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 
32178825Sdfr# SUCH DAMAGE. 
33178825Sdfr#
34178825Sdfr# $Id$
35178825Sdfr#
36178825Sdfr
37178825Sdfrsrcdir="@srcdir@"
38178825Sdfrobjdir="@objdir@"
39178825SdfrEGREP="@EGREP@"
40178825Sdfr
41178825Sdfr# If there is no useful db support compile in, disable test
42178825Sdfr../db/have-db || exit 77
43178825Sdfr
44178825Sdfr# Dont run this test in AFS, since it lacks support for AF_UNIX
45178825Sdfrexpr "X`/bin/pwd || pwd`" : "X/afs/.*" > /dev/null 2>/dev/null && exit 77
46178825Sdfr
47178825SdfrR=TEST.H5L.SE
48178825Sdfr
49178825Sdfrport=@port@
50178825Sdfr
51178825Sdfrcache="FILE:${objdir}/cache.krb5"
52178825Sdfrkeytabfile=${objdir}/iprop.keytab
53178825Sdfrkeytab="FILE:${keytabfile}"
54178825Sdfr
55178825Sdfrkdc="${TESTS_ENVIRONMENT} ../../kdc/kdc --addresses=localhost -P $port"
56178825Sdfrkadmin="${TESTS_ENVIRONMENT} ../../kadmin/kadmin -r $R"
57178825Sdfripropdslave="${TESTS_ENVIRONMENT} ../../lib/kadm5/ipropd-slave"
58178825Sdfripropdmaster="${TESTS_ENVIRONMENT} ../../lib/kadm5/ipropd-master"
59178825Sdfriproplog="${TESTS_ENVIRONMENT} ../../lib/kadm5/iprop-log"
60178825Sdfr
61178825Sdfrkinit="${TESTS_ENVIRONMENT} ../../kuser/kinit -c $cache --no-afslog"
62178825Sdfr
63178825SdfrKRB5_CONFIG="${objdir}/krb5.conf"
64178825Sdfrexport KRB5_CONFIG
65178825Sdfr
66178825Sdfrrm -f ${keytabfile}
67178825Sdfrrm -f current-db*
68178825Sdfrrm -f current*.log
69178825Sdfrrm -f out-*
70178825Sdfrrm -f mkey.file*
71178825Sdfrrm -f messages.log
72178825Sdfr
73178825Sdfr> messages.log
74178825Sdfr
75178825Sdfrecho Creating database
76178825Sdfr${kadmin} -l \
77178825Sdfr    init \
78178825Sdfr    --realm-max-ticket-life=1day \
79178825Sdfr    --realm-max-renewable-life=1month \
80178825Sdfr    ${R} || exit 1
81178825Sdfr
82178825Sdfr${kadmin} -l add -p foo --use-defaults user@${R} || exit 1
83178825Sdfr
84178825Sdfr${kadmin} -l add --random-key --use-defaults iprop/localhost@${R} || exit 1
85178825Sdfr${kadmin} -l ext -k ${keytab} iprop/localhost@${R} || exit 1
86178825Sdfr${kadmin} -l add --random-key --use-defaults iprop/slave@${R} || exit 1
87178825Sdfr${kadmin} -l ext -k ${keytab} iprop/slave@${R} || exit 1
88178825Sdfr
89178825Sdfrecho foo > ${objdir}/foopassword
90178825Sdfr
91178825Sdfr# -- foo
92178825Sdfripds=
93178825Sdfripdm=
94178825Sdfrkdcpid=
95178825Sdfr
96178825Sdfr> iprop-stats
97178825Sdfrtrap "echo 'killing ipropd s + m + kdc'; kill \${ipdm} \${ipds} \${kdcpid} >/dev/null 2>/dev/null; tail messages.log ; tail iprop-stats; exit 1;" EXIT
98178825Sdfr
99178825Sdfrecho Starting kdc
100178825Sdfr${kdc} &
101178825Sdfrkdcpid=$!
102178825Sdfr
103178825Sdfrsh ${srcdir}/wait-kdc.sh || exit 1
104178825Sdfr
105178825Sdfrecho "starting master"
106178825Sdfr${ipropdmaster} --hostname=localhost -k ${keytab} \
107178825Sdfr    --database=${objdir}/current-db &
108178825Sdfripdm=$!
109178825Sdfrsh ${srcdir}/wait-kdc.sh ipropd-master || exit 1
110178825Sdfr
111178825Sdfrecho "starting slave"
112178825SdfrKRB5_CONFIG="${objdir}/krb5-slave.conf" \
113178825Sdfr${ipropdslave} --hostname=slave -k ${keytab} localhost &
114178825Sdfripds=$!
115178825Sdfrsh ${srcdir}/wait-kdc.sh ipropd-slave || exit 1
116178825Sdfr
117178825Sdfrecho "checking slave is up"
118178825Sdfr${EGREP} 'iprop/slave@TEST.H5L.SE.*Up' iprop-stats >/dev/null || exit 1
119178825Sdfr
120178825Sdfr# ----------------- checking: pushing lives changes
121178825Sdfr
122178825Sdfrecho "Add host"
123178825Sdfr${kadmin} -l add --random-key --use-defaults host/foo@${R} || exit 1
124178825Sdfrsleep 2
125178825SdfrKRB5_CONFIG="${objdir}/krb5-slave.conf" \
126178825Sdfr${kadmin} -l get host/foo@${R} > /dev/null || exit 1
127178825Sdfr
128178825Sdfrecho "Rename host"
129178825Sdfr${kadmin} -l rename host/foo@${R} host/bar@${R} || exit 1
130178825Sdfrsleep 2
131178825SdfrKRB5_CONFIG="${objdir}/krb5-slave.conf" \
132178825Sdfr${kadmin} -l get host/foo@${R} > /dev/null 2>/dev/null && exit 1
133178825SdfrKRB5_CONFIG="${objdir}/krb5-slave.conf" \
134178825Sdfr${kadmin} -l get host/bar@${R} > /dev/null || exit 1
135178825Sdfr
136178825Sdfrecho "Delete host"
137178825Sdfr${kadmin} -l delete host/bar@${R} || exit 1
138178825Sdfrsleep 2
139178825SdfrKRB5_CONFIG="${objdir}/krb5-slave.conf" \
140178825Sdfr${kadmin} -l get host/bar@${R} > /dev/null 2>/dev/null && exit 1
141178825Sdfr
142178825Sdfrecho "kill slave"
143178825Sdfr> iprop-stats
144178825Sdfrkill ${ipds}
145178825Sdfrsleep 2
146178825Sdfr
147178825Sdfr${EGREP} 'iprop/slave@TEST.H5L.SE.*Down' iprop-stats >/dev/null || exit 1
148178825Sdfr
149178825Sdfr# ----------------- checking: slave is missing changes while down
150178825Sdfr
151178825Sdfrecho "doing changes while slave is down"
152178825Sdfr${kadmin} -l cpw --random-password user@${R} > /dev/null || exit 1
153178825Sdfr${kadmin} -l cpw --random-password user@${R} > /dev/null || exit 1
154178825Sdfr
155178825Sdfrecho "Makeing a copy of the master log file"
156178825Sdfrcp ${objdir}/current.log ${objdir}/current.log.tmp
157178825Sdfr
158178825Sdfr# ----------------- checking: checking that master and slaves resyncs
159178825Sdfr
160178825Sdfrecho "starting slave again"
161178825Sdfr> iprop-stats
162178825Sdfr> messages.log
163178825SdfrKRB5_CONFIG="${objdir}/krb5-slave.conf" \
164178825Sdfr${ipropdslave} --hostname=slave -k ${keytab} localhost &
165178825Sdfripds=$!
166178825Sdfrsh ${srcdir}/wait-kdc.sh ipropd-slave || exit 1
167178825Sdfr
168178825Sdfrecho "checking slave is up again"
169178825Sdfr${EGREP} 'iprop/slave@TEST.H5L.SE.*Up' iprop-stats >/dev/null || exit 1
170178825Sdfrecho "checking for replay problems"
171178825Sdfr${EGREP} 'Entry already exists in database' messages.log && exit 1
172178825Sdfr
173178825Sdfrecho "kill slave and remove log and database"
174178825Sdfrkill ${ipds}
175178825Sdfrsleep 2
176178825Sdfr
177178825Sdfrrm current.slave.log current-db.slave* || exit 1
178178825Sdfr> iprop-stats
179178825Sdfr> messages.log
180178825SdfrKRB5_CONFIG="${objdir}/krb5-slave.conf" \
181178825Sdfr${ipropdslave} --hostname=slave -k ${keytab} localhost &
182178825Sdfripds=$!
183178825Sdfrsh ${srcdir}/wait-kdc.sh ipropd-slave || exit 1
184178825Sdfr
185178825Sdfrecho "checking slave is up again"
186178825Sdfr${EGREP} 'iprop/slave@TEST.H5L.SE.*Up' iprop-stats >/dev/null || exit 1
187178825Sdfrecho "checking for replay problems"
188178825Sdfr${EGREP} 'Entry already exists in database' messages.log && exit 1
189178825Sdfr
190178825Sdfr# ----------------- checking: checking live truncation of master log
191178825Sdfr
192178825Sdfr${kadmin} -l cpw --random-password user@${R} > /dev/null || exit 1
193178825Sdfrsleep 2
194178825Sdfr
195178825Sdfrecho "live truncate on master log"
196178825Sdfr${iproplog} truncate || exit 1
197178825Sdfrsleep 2
198178825Sdfr
199178825Sdfrecho "Killing master and slave"
200178825Sdfrkill ${ipdm} ${ipds} >/dev/null 2>/dev/null
201178825Sdfr
202178825Sdfrsleep 2
203178825Sdfr${EGREP} "^master down at " iprop-stats > /dev/null || exit 1
204178825Sdfr
205178825Sdfrecho "compare versions on master and slave logs"
206178825SdfrKRB5_CONFIG=${objdir}/krb5-slave.conf \
207178825Sdfr${iproplog} last-version > slave-last.tmp
208178825Sdfr${iproplog} last-version > master-last.tmp
209178825Sdfrcmp master-last.tmp slave-last.tmp || exit 1
210178825Sdfr
211178825Sdfr# ----------------- checking: master going backward
212178825Sdfr> iprop-stats
213178825Sdfr> messages.log
214178825Sdfr
215178825Sdfrecho "Going back to old version of the master log file"
216178825Sdfrcp ${objdir}/current.log.tmp ${objdir}/current.log
217178825Sdfr
218178825Sdfrecho "starting master"
219178825Sdfr${ipropdmaster} --hostname=localhost -k ${keytab} \
220178825Sdfr    --database=${objdir}/current-db &
221178825Sdfripdm=$!
222178825Sdfrsh ${srcdir}/wait-kdc.sh ipropd-master || exit 1
223178825Sdfr
224178825Sdfrecho "starting slave"
225178825SdfrKRB5_CONFIG="${objdir}/krb5-slave.conf" \
226178825Sdfr${ipropdslave} --hostname=slave -k ${keytab} localhost &
227178825Sdfripds=$!
228178825Sdfrsh ${srcdir}/wait-kdc.sh ipropd-slave || exit 1
229178825Sdfr
230178825Sdfrecho "checking slave is up again"
231178825Sdfr${EGREP} 'iprop/slave@TEST.H5L.SE.*Up' iprop-stats >/dev/null || exit 1
232178825Sdfrecho "checking for replay problems"
233178825Sdfr${EGREP} 'Entry already exists in database' messages.log && exit 1
234178825Sdfr
235178825Sdfrecho "pushing one change"
236178825Sdfr${kadmin} -l cpw --random-password user@${R} > /dev/null || exit 1
237178825Sdfrsleep 2
238178825Sdfr
239178825Sdfrtrap "" EXIT
240178825Sdfrkill ${ipdm} ${ipds} ${kdcpid}
241178825Sdfr
242178825Sdfrecho "compare versions on master and slave logs"
243178825SdfrKRB5_CONFIG=${objdir}/krb5-slave.conf \
244178825Sdfr${iproplog} last-version > slave-last.tmp
245178825Sdfr${iproplog} last-version > master-last.tmp
246178825Sdfrcmp master-last.tmp slave-last.tmp || exit 1
247178825Sdfr
248178825Sdfrexit $ec
249