]> git.sur5r.net Git - openldap/blob - servers/slurpd/slurp.h
Added replica attr=<attribute list> support to filter replog content
[openldap] / servers / slurpd / slurp.h
1 /* $OpenLDAP$ */
2 /*
3  * Copyright 1998-2002 The OpenLDAP Foundation, All Rights Reserved.
4  * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
5  */
6 /*
7  * Copyright (c) 1996 Regents of the University of Michigan.
8  * All rights reserved.
9  *
10  * Redistribution and use in source and binary forms are permitted
11  * provided that this notice is preserved and that due credit is given
12  * to the University of Michigan at Ann Arbor. The name of the University
13  * may not be used to endorse or promote products derived from this
14  * software without specific prior written permission. This software
15  * is provided ``as is'' without express or implied warranty.
16  */
17
18 /* slurp.h - Standalone Ldap Update Replication Daemon (slurpd) */
19
20 #ifndef _SLURPD_H_
21 #define _SLURPD_H_
22
23 #ifndef LDAP_SYSLOG
24 #define LDAP_SYSLOG 1
25 #endif
26
27 #include <ac/errno.h>
28 #include <ac/param.h>
29 #include <ac/signal.h>
30 #include <ac/syslog.h>
31 #include <ac/time.h>
32
33 #include <sys/types.h>
34
35 #include <ldap.h>
36
37 #undef  ldap_debug
38 #define ldap_debug slurp_debug
39 #include "ldap_log.h"
40
41 #include "ldap_pvt_thread.h"
42 #include "ldap_defaults.h"
43 #include "ldif.h"
44
45
46 /* Default directory for slurpd's private copy of replication logs */
47 #define DEFAULT_SLURPD_REPLICA_DIR      LDAP_RUNDIR LDAP_DIRSEP "openldap-slurp"
48
49 /* Default name for slurpd's private copy of the replication log */
50 #define DEFAULT_SLURPD_REPLOGFILE       "slurpd.replog"
51
52 /* Name of file which stores saved slurpd state info, for restarting */
53 #define DEFAULT_SLURPD_STATUS_FILE      "slurpd.status"
54
55 /* slurpd dump file - contents of rq struct are written here (debugging) */
56 #define SLURPD_DUMPFILE                 LDAP_TMPDIR LDAP_DIRSEP "slurpd.dump"
57
58 /* default srvtab file.  Can be overridden */
59 #define SRVTAB                          "/etc/srvtab"
60
61 /* Amount of time to sleep if no more work to do */
62 #define DEFAULT_NO_WORK_INTERVAL        3
63
64 /* The time we wait between checks to see if the replog file needs trimming */
65 #define TRIMCHECK_INTERVAL              ( 60 * 5 )
66
67 /* Only try to trim slurpd replica files larger than this size */
68 #define MIN_TRIM_FILESIZE               ( 10L * 1024L )
69
70 /* Maximum line length we can read from replication log */
71 #define REPLBUFLEN                      256
72
73 /* TLS flags */
74 #define TLS_OFF                 0
75 #define TLS_ON                  1
76 #define TLS_CRITICAL    2
77
78 /* We support simple (plaintext password) and SASL authentication */
79 #define AUTH_SIMPLE     1
80 #define AUTH_KERBEROS   2
81 #define AUTH_SASL 3
82
83 /* Rejection records are prefaced with this string */
84 #define ERROR_STR       "ERROR"
85
86 /* Strings found in replication entries */
87 #define T_CHANGETYPESTR         "changetype"
88 #define T_CHANGETYPE            1
89 #define T_TIMESTR               "time"
90 #define T_TIME                  2
91 #define T_DNSTR                 "dn"
92 #define T_DN                    3
93
94 #define T_ADDCTSTR              "add"
95 #define T_ADDCT                 4
96 #define T_MODIFYCTSTR           "modify"
97 #define T_MODIFYCT              5
98 #define T_DELETECTSTR           "delete"
99 #define T_DELETECT              6
100 #define T_MODRDNCTSTR           "modrdn"
101 #define T_MODDNCTSTR            "moddn"
102 #define T_RENAMECTSTR           "rename"
103 #define T_MODRDNCT              7
104
105 #define T_MODOPADDSTR           "add"
106 #define T_MODOPADD              8
107 #define T_MODOPREPLACESTR       "replace"
108 #define T_MODOPREPLACE          9
109 #define T_MODOPDELETESTR        "delete"
110 #define T_MODOPDELETE           10
111 #define T_MODSEPSTR             "-"
112 #define T_MODSEP                11
113
114 #define T_NEWRDNSTR             "newrdn"
115 #define T_DELOLDRDNSTR  "deleteoldrdn"
116 #define T_NEWSUPSTR             "newsuperior"
117
118 #define T_ERR                   -1
119
120 /* Config file keywords */
121 #define HOSTSTR                 "host"
122 #define ATTRSTR                 "attr"
123 #define SUFFIXSTR               "suffix"
124 #define BINDDNSTR               "binddn"
125 #define BINDMETHSTR             "bindmethod"
126 #define KERBEROSSTR             "kerberos"
127 #define SIMPLESTR               "simple"
128 #define SASLSTR                 "sasl"
129 #define CREDSTR                 "credentials"
130 #define OLDAUTHCSTR             "bindprincipal"
131 #define AUTHCSTR                "authcID"
132 #define AUTHZSTR                "authzID"
133 #define SRVTABSTR               "srvtab"
134 #define SASLMECHSTR             "saslmech"
135 #define REALMSTR                "realm"
136 #define SECPROPSSTR             "secprops"
137 #define TLSSTR                  "tls"
138 #define TLSCRITICALSTR  "critical"
139
140 #define REPLICA_SLEEP_TIME      ( 10 )
141
142 /* Enumeration of various types of bind failures */
143 #define BIND_OK                                         0
144 #define BIND_ERR_BADLDP                         1
145 #define BIND_ERR_OPEN                           2
146 #define BIND_ERR_BAD_ATYPE                      3
147 #define BIND_ERR_SIMPLE_FAILED          4
148 #define BIND_ERR_KERBEROS_FAILED        5
149 #define BIND_ERR_BADRI                          6
150 #define BIND_ERR_VERSION                        7
151 #define BIND_ERR_REFERRALS                      8
152 #define BIND_ERR_MANAGEDSAIT            9
153 #define BIND_ERR_SASL_FAILED            10
154 #define BIND_ERR_TLS_FAILED                     11
155
156 /* Return codes for do_ldap() */
157 #define DO_LDAP_OK                      0
158 #define DO_LDAP_ERR_RETRYABLE           1
159 #define DO_LDAP_ERR_FATAL               2
160
161 /*
162  * Types of counts one can request from the Rq rq_getcount()
163  * member function
164  */
165 /* all elements */
166 #define RQ_COUNT_ALL                    1
167 /* all elements with nonzero refcnt */
168 #define RQ_COUNT_NZRC                   2
169
170 /* Amount of time, in seconds, for a thread to sleep when it encounters
171  * a retryable error in do_ldap().
172  */
173 #define RETRY_SLEEP_TIME                60
174
175
176 LDAP_BEGIN_DECL
177
178 /*
179  * ****************************************************************************
180  * Data types for replication queue and queue elements.
181  * ****************************************************************************
182  */
183
184
185 /*
186  * Replica host information.  An Ri struct will contain an array of these,
187  * with one entry for each replica.  The end of the array is signaled
188  * by a NULL value in the rh_hostname field.
189  */
190 typedef struct rh {
191     char        *rh_hostname;           /* replica hostname  */
192     int         rh_port;                /* replica port */
193 } Rh;
194
195
196 /*
197  * Per-replica information.
198  *
199  * Notes:
200  *  - Private data should not be manipulated expect by Ri member functions.
201  */
202 typedef struct ri Ri;
203 struct ri {
204     /* Private data */
205     char        *ri_hostname;           /* canonical hostname of replica */
206     int         ri_port;                /* port where slave slapd running */
207     LDAP        *ri_ldp;                /* LDAP struct for this replica */
208     int         ri_tls;                 /* TLS: 0=no, 1=yes, 2=critical */
209     int         ri_bind_method;         /* AUTH_SIMPLE or AUTH_KERBEROS */
210     char        *ri_bind_dn;            /* DN to bind as when replicating */
211     char        *ri_password;           /* Password for any method */
212     char        *ri_secprops;           /* SASL security properties */
213     char        *ri_realm;                      /* realm for any mechanism */
214     char        *ri_authcId;            /* authentication ID for any mechanism */
215     char        *ri_authzId;            /* authorization ID for any mechanism */
216     char        *ri_srvtab;             /* srvtab file for kerberos bind */
217     char        *ri_saslmech;           /* SASL mechanism to use */
218     struct re   *ri_curr;               /* current repl entry being processed */
219     struct stel *ri_stel;               /* pointer to Stel for this replica */
220     unsigned long
221                 ri_seq;                 /* seq number of last repl */
222     ldap_pvt_thread_t   ri_tid;                 /* ID of thread for this replica */
223
224     /* Member functions */
225     int (*ri_process) LDAP_P(( Ri * )); /* process the next repl entry */
226     void (*ri_wake)   LDAP_P(( Ri * )); /* wake up a sleeping thread */
227 };
228     
229
230
231
232 /*
233  * Information about one particular modification to make.  This data should
234  * be considered private to routines in re.c, and to routines in ri.c.
235  */
236 typedef struct mi {
237     
238     /* Private data */
239     char        *mi_type;               /* attr or type */
240     char        *mi_val;                /* value */
241     int         mi_len;                 /* length of mi_val */
242
243 } Mi;
244
245
246
247 /* 
248  * Information about one particular replication entry.  Only routines in
249  * re.c  and rq.c should touch the private data.  Other routines should
250  * only use member functions.
251  */
252 typedef struct re Re;
253 struct re {
254
255     /* Private data */
256     ldap_pvt_thread_mutex_t
257                 re_mutex;               /* mutex for this Re */
258     int         re_refcnt;              /* ref count, 0 = done */
259     time_t      re_timestamp;           /* timestamp of this re */
260     int         re_seq;                 /* sequence number */
261     Rh          *re_replicas;           /* array of replica info */
262     char        *re_dn;                 /* dn of entry being modified */
263     int         re_changetype;          /* type of modification */
264     Mi          *re_mods;               /* array of modifications to make */
265     struct re   *re_next;               /* pointer to next element */
266
267     /* Public functions */
268     int (*re_free)    LDAP_P(( Re * )); /* free an re struct */
269     Re *(*re_getnext) LDAP_P(( Re * )); /* return next Re in linked list */
270     int (*re_parse) LDAP_P(( Re *, char * )); /* parse replication log entry */
271     int (*re_write) LDAP_P(( Ri *, Re *, FILE * )); /* write repl. log entry */
272     void (*re_dump)  LDAP_P(( Re *, FILE * )); /* debugging - print contents */
273     int (*re_lock)   LDAP_P(( Re * ));    /* lock this re */
274     int (*re_unlock) LDAP_P(( Re * ));    /* unlock this re */
275     int (*re_decrefcnt) LDAP_P(( Re * )); /* decrement the refcnt */
276     int (*re_getrefcnt) LDAP_P(( Re * )); /* get the refcnt */
277 };
278
279
280
281
282 /* 
283  * Definition for the queue of replica information.  Private data is
284  * private to rq.c.  Other routines should only touch public data or
285  * use member functions.  Note that although we have a member function
286  * for locking the queue's mutex, we need to expose the rq_mutex
287  * variable so routines in ri.c can use it as a mutex for the
288  * rq_more condition variable.
289  */
290 typedef struct rq Rq;
291 struct rq {
292
293     /* Private data */
294     Re          *rq_head;               /* pointer to head */
295     Re          *rq_tail;               /* pointer to tail */
296     int         rq_nre;                 /* total number of Re's in queue */
297     int         rq_ndel;                /* number of deleted Re's in queue */
298     time_t      rq_lasttrim;            /* Last time we trimmed file */
299     
300     /* Public data */
301     ldap_pvt_thread_mutex_t
302                 rq_mutex;               /* mutex for whole queue */
303     ldap_pvt_thread_cond_t
304                 rq_more;                /* condition var - more work added */
305
306     /* Member functions */
307     Re * (*rq_gethead)  LDAP_P(( Rq * )); /* get the element at head */
308     Re * (*rq_getnext)  LDAP_P(( Re * )); /* get the next element */
309     int  (*rq_delhead)  LDAP_P(( Rq * )); /* delete the element at head */
310     int  (*rq_add)      LDAP_P(( Rq *, char * )); /* add at tail */
311     void (*rq_gc)       LDAP_P(( Rq * )); /* garbage-collect queue */
312     int  (*rq_lock)     LDAP_P(( Rq * )); /* lock the queue */
313     int  (*rq_unlock)   LDAP_P(( Rq * )); /* unlock the queue */
314     int  (*rq_needtrim) LDAP_P(( Rq * )); /* see if queue needs trimming */
315     int  (*rq_write)    LDAP_P(( Rq *, FILE * )); /*write Rq contents to file*/
316     int  (*rq_getcount) LDAP_P(( Rq *, int )); /* return queue counts */
317     void (*rq_dump)     LDAP_P(( Rq * )); /* debugging - print contents */
318 };
319
320
321 /*
322  * An Stel (status element) contains information about one replica.
323  * Stel structs are associated with the St (status) struct, defined 
324  * below.
325  */
326 typedef struct stel {
327     char        *hostname;              /* host name of replica */
328     int         port;                   /* port number of replica */
329     time_t      last;                   /* timestamp of last successful repl */
330     int         seq;                    /* Sequence number of last repl */
331 } Stel;
332
333
334 /*
335  * An St struct in an in-core structure which contains the current
336  * slurpd state.  Most importantly, it contains an array of Stel
337  * structs which contain the timestamp and sequence number of the last
338  * successful replication for each replica.  The st_write() member
339  * function is called periodically to flush status information to
340  * disk.  At startup time, slurpd checks for the status file, and
341  * if present, uses the timestamps to avoid "replaying" replications
342  * which have already been sent to a given replica.
343  */
344 typedef struct st St;
345 struct st {
346     /* Private data */
347     ldap_pvt_thread_mutex_t
348                 st_mutex;               /* mutex to serialize access */
349     Stel        **st_data;              /* array of pointers to Stel structs */
350     int         st_nreplicas;           /* number of repl hosts */
351     int         st_err_logged;          /* 1 if fopen err logged */
352     FILE        *st_fp;                 /* st file kept open */
353     FILE        *st_lfp;                /* lockfile fp */
354
355     /* Public member functions */
356     int  (*st_update) LDAP_P(( St *, Stel*, Re* ));/*update entry for a host*/
357     Stel*(*st_add)    LDAP_P(( St *, Ri * ));      /*add a new repl host*/
358     int  (*st_write)  LDAP_P(( St * )); /* write status to disk */
359     int  (*st_read)   LDAP_P(( St * )); /* read status info from disk */
360     int  (*st_lock)   LDAP_P(( St * )); /* read status info from disk */
361     int  (*st_unlock) LDAP_P(( St * )); /* read status info from disk */
362 };
363
364 #if defined( HAVE_LWP )
365 typedef struct tl {
366     thread_t    tl_tid;         /* thread being managed */
367     time_t      tl_wake;        /* time thread should be resumed */
368     struct tl   *tl_next;       /* next node in list */
369 } tl_t;
370
371 typedef struct tsl {
372     tl_t        *tsl_list;
373     mon_t       tsl_mon;
374 } tsl_t;
375 #endif /* HAVE_LWP */
376
377 /* 
378  * Public functions used to instantiate and initialize queue objects.
379  */
380 extern int Ri_init LDAP_P(( Ri **ri ));
381 extern int Rq_init LDAP_P(( Rq **rq ));
382 extern int Re_init LDAP_P(( Re **re ));
383
384 #include "proto-slurp.h"
385
386 LDAP_END_DECL
387
388 #endif /* _SLURPD_H_ */