ruby-ldap 0.9.18 → 0.9.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -7
- data/ChangeLog +5 -0
- data/NOTES +6 -0
- data/TODO +0 -3
- data/extconf.rb +3 -4
- data/lib/ldap/ldif.rb +11 -12
- data/rbldap.h +2 -2
- data/test/add.rb +3 -2
- data/test/add2.rb +3 -2
- data/test/add3.rb +3 -2
- data/test/compare.rb +5 -3
- data/test/conf.rb +2 -0
- data/test/openldap_tests/progs/ldif-filter.c +256 -0
- data/test/openldap_tests/progs/slapd-addel.c +435 -0
- data/test/openldap_tests/progs/slapd-auth.c +335 -0
- data/test/openldap_tests/progs/slapd-bind.c +609 -0
- data/test/openldap_tests/progs/slapd-common.c +300 -0
- data/test/openldap_tests/progs/slapd-common.h +44 -0
- data/test/openldap_tests/progs/slapd-modify.c +318 -0
- data/test/openldap_tests/progs/slapd-modrdn.c +310 -0
- data/test/openldap_tests/progs/slapd-mtread.c +837 -0
- data/test/openldap_tests/progs/slapd-read.c +568 -0
- data/test/openldap_tests/progs/slapd-search.c +618 -0
- data/test/openldap_tests/progs/slapd-tester.c +1197 -0
- data/test/search.rb +6 -8
- metadata +51 -33
@@ -0,0 +1,435 @@
|
|
1
|
+
/* $OpenLDAP$ */
|
2
|
+
/* This work is part of OpenLDAP Software <http://www.openldap.org/>.
|
3
|
+
*
|
4
|
+
* Copyright 1999-2016 The OpenLDAP Foundation.
|
5
|
+
* All rights reserved.
|
6
|
+
*
|
7
|
+
* Redistribution and use in source and binary forms, with or without
|
8
|
+
* modification, are permitted only as authorized by the OpenLDAP
|
9
|
+
* Public License.
|
10
|
+
*
|
11
|
+
* A copy of this license is available in file LICENSE in the
|
12
|
+
* top-level directory of the distribution or, alternatively, at
|
13
|
+
* <http://www.OpenLDAP.org/license.html>.
|
14
|
+
*/
|
15
|
+
/* ACKNOWLEDGEMENTS:
|
16
|
+
* This work was initially developed by Kurt Spanier for inclusion
|
17
|
+
* in OpenLDAP Software.
|
18
|
+
*/
|
19
|
+
|
20
|
+
#include "portable.h"
|
21
|
+
|
22
|
+
#include <stdio.h>
|
23
|
+
|
24
|
+
#include "ac/stdlib.h"
|
25
|
+
|
26
|
+
#include "ac/ctype.h"
|
27
|
+
#include "ac/param.h"
|
28
|
+
#include "ac/socket.h"
|
29
|
+
#include "ac/string.h"
|
30
|
+
#include "ac/unistd.h"
|
31
|
+
#include "ac/wait.h"
|
32
|
+
|
33
|
+
#include "ldap.h"
|
34
|
+
#include "lutil.h"
|
35
|
+
|
36
|
+
#include "slapd-common.h"
|
37
|
+
|
38
|
+
#define LOOPS 100
|
39
|
+
#define RETRIES 0
|
40
|
+
|
41
|
+
static char *
|
42
|
+
get_add_entry( char *filename, LDAPMod ***mods );
|
43
|
+
|
44
|
+
static void
|
45
|
+
do_addel( char *uri, char *manager, struct berval *passwd,
|
46
|
+
char *dn, LDAPMod **attrs, int maxloop, int maxretries, int delay,
|
47
|
+
int friendly, int chaserefs );
|
48
|
+
|
49
|
+
static void
|
50
|
+
usage( char *name )
|
51
|
+
{
|
52
|
+
fprintf( stderr,
|
53
|
+
"usage: %s "
|
54
|
+
"-H <uri> | ([-h <host>] -p <port>) "
|
55
|
+
"-D <manager> "
|
56
|
+
"-w <passwd> "
|
57
|
+
"-f <addfile> "
|
58
|
+
"[-i <ignore>] "
|
59
|
+
"[-l <loops>] "
|
60
|
+
"[-L <outerloops>] "
|
61
|
+
"[-r <maxretries>] "
|
62
|
+
"[-t <delay>] "
|
63
|
+
"[-F] "
|
64
|
+
"[-C]\n",
|
65
|
+
name );
|
66
|
+
exit( EXIT_FAILURE );
|
67
|
+
}
|
68
|
+
|
69
|
+
int
|
70
|
+
main( int argc, char **argv )
|
71
|
+
{
|
72
|
+
int i;
|
73
|
+
char *host = "localhost";
|
74
|
+
char *uri = NULL;
|
75
|
+
int port = -1;
|
76
|
+
char *manager = NULL;
|
77
|
+
struct berval passwd = { 0, NULL };
|
78
|
+
char *filename = NULL;
|
79
|
+
char *entry = NULL;
|
80
|
+
int loops = LOOPS;
|
81
|
+
int outerloops = 1;
|
82
|
+
int retries = RETRIES;
|
83
|
+
int delay = 0;
|
84
|
+
int friendly = 0;
|
85
|
+
int chaserefs = 0;
|
86
|
+
LDAPMod **attrs = NULL;
|
87
|
+
|
88
|
+
tester_init( "slapd-addel", TESTER_ADDEL );
|
89
|
+
|
90
|
+
while ( ( i = getopt( argc, argv, "CD:Ff:H:h:i:L:l:p:r:t:w:" ) ) != EOF )
|
91
|
+
{
|
92
|
+
switch ( i ) {
|
93
|
+
case 'C':
|
94
|
+
chaserefs++;
|
95
|
+
break;
|
96
|
+
|
97
|
+
case 'F':
|
98
|
+
friendly++;
|
99
|
+
break;
|
100
|
+
|
101
|
+
case 'H': /* the server's URI */
|
102
|
+
uri = strdup( optarg );
|
103
|
+
break;
|
104
|
+
|
105
|
+
case 'h': /* the servers host */
|
106
|
+
host = strdup( optarg );
|
107
|
+
break;
|
108
|
+
|
109
|
+
case 'i':
|
110
|
+
/* ignored (!) by now */
|
111
|
+
break;
|
112
|
+
|
113
|
+
case 'p': /* the servers port */
|
114
|
+
if ( lutil_atoi( &port, optarg ) != 0 ) {
|
115
|
+
usage( argv[0] );
|
116
|
+
}
|
117
|
+
break;
|
118
|
+
|
119
|
+
case 'D': /* the servers manager */
|
120
|
+
manager = strdup( optarg );
|
121
|
+
break;
|
122
|
+
|
123
|
+
case 'w': /* the server managers password */
|
124
|
+
passwd.bv_val = strdup( optarg );
|
125
|
+
passwd.bv_len = strlen( optarg );
|
126
|
+
memset( optarg, '*', passwd.bv_len );
|
127
|
+
break;
|
128
|
+
|
129
|
+
case 'f': /* file with entry search request */
|
130
|
+
filename = strdup( optarg );
|
131
|
+
break;
|
132
|
+
|
133
|
+
case 'l': /* the number of loops */
|
134
|
+
if ( lutil_atoi( &loops, optarg ) != 0 ) {
|
135
|
+
usage( argv[0] );
|
136
|
+
}
|
137
|
+
break;
|
138
|
+
|
139
|
+
case 'L': /* the number of outerloops */
|
140
|
+
if ( lutil_atoi( &outerloops, optarg ) != 0 ) {
|
141
|
+
usage( argv[0] );
|
142
|
+
}
|
143
|
+
break;
|
144
|
+
|
145
|
+
case 'r': /* number of retries */
|
146
|
+
if ( lutil_atoi( &retries, optarg ) != 0 ) {
|
147
|
+
usage( argv[0] );
|
148
|
+
}
|
149
|
+
break;
|
150
|
+
|
151
|
+
case 't': /* delay in seconds */
|
152
|
+
if ( lutil_atoi( &delay, optarg ) != 0 ) {
|
153
|
+
usage( argv[0] );
|
154
|
+
}
|
155
|
+
break;
|
156
|
+
|
157
|
+
default:
|
158
|
+
usage( argv[0] );
|
159
|
+
break;
|
160
|
+
}
|
161
|
+
}
|
162
|
+
|
163
|
+
if (( filename == NULL ) || ( port == -1 && uri == NULL ) ||
|
164
|
+
( manager == NULL ) || ( passwd.bv_val == NULL ))
|
165
|
+
usage( argv[0] );
|
166
|
+
|
167
|
+
entry = get_add_entry( filename, &attrs );
|
168
|
+
if (( entry == NULL ) || ( *entry == '\0' )) {
|
169
|
+
|
170
|
+
fprintf( stderr, "%s: invalid entry DN in file \"%s\".\n",
|
171
|
+
argv[0], filename );
|
172
|
+
exit( EXIT_FAILURE );
|
173
|
+
|
174
|
+
}
|
175
|
+
|
176
|
+
if (( attrs == NULL ) || ( *attrs == '\0' )) {
|
177
|
+
|
178
|
+
fprintf( stderr, "%s: invalid attrs in file \"%s\".\n",
|
179
|
+
argv[0], filename );
|
180
|
+
exit( EXIT_FAILURE );
|
181
|
+
|
182
|
+
}
|
183
|
+
|
184
|
+
uri = tester_uri( uri, host, port );
|
185
|
+
|
186
|
+
for ( i = 0; i < outerloops; i++ ) {
|
187
|
+
do_addel( uri, manager, &passwd, entry, attrs,
|
188
|
+
loops, retries, delay, friendly, chaserefs );
|
189
|
+
}
|
190
|
+
|
191
|
+
exit( EXIT_SUCCESS );
|
192
|
+
}
|
193
|
+
|
194
|
+
|
195
|
+
static void
|
196
|
+
addmodifyop( LDAPMod ***pmodsp, int modop, char *attr, char *value, int vlen )
|
197
|
+
{
|
198
|
+
LDAPMod **pmods;
|
199
|
+
int i, j;
|
200
|
+
struct berval *bvp;
|
201
|
+
|
202
|
+
pmods = *pmodsp;
|
203
|
+
modop |= LDAP_MOD_BVALUES;
|
204
|
+
|
205
|
+
i = 0;
|
206
|
+
if ( pmods != NULL ) {
|
207
|
+
for ( ; pmods[ i ] != NULL; ++i ) {
|
208
|
+
if ( strcasecmp( pmods[ i ]->mod_type, attr ) == 0 &&
|
209
|
+
pmods[ i ]->mod_op == modop ) {
|
210
|
+
break;
|
211
|
+
}
|
212
|
+
}
|
213
|
+
}
|
214
|
+
|
215
|
+
if ( pmods == NULL || pmods[ i ] == NULL ) {
|
216
|
+
if (( pmods = (LDAPMod **)realloc( pmods, (i + 2) *
|
217
|
+
sizeof( LDAPMod * ))) == NULL ) {
|
218
|
+
tester_perror( "realloc", NULL );
|
219
|
+
exit( EXIT_FAILURE );
|
220
|
+
}
|
221
|
+
*pmodsp = pmods;
|
222
|
+
pmods[ i + 1 ] = NULL;
|
223
|
+
if (( pmods[ i ] = (LDAPMod *)calloc( 1, sizeof( LDAPMod )))
|
224
|
+
== NULL ) {
|
225
|
+
tester_perror( "calloc", NULL );
|
226
|
+
exit( EXIT_FAILURE );
|
227
|
+
}
|
228
|
+
pmods[ i ]->mod_op = modop;
|
229
|
+
if (( pmods[ i ]->mod_type = strdup( attr )) == NULL ) {
|
230
|
+
tester_perror( "strdup", NULL );
|
231
|
+
exit( EXIT_FAILURE );
|
232
|
+
}
|
233
|
+
}
|
234
|
+
|
235
|
+
if ( value != NULL ) {
|
236
|
+
j = 0;
|
237
|
+
if ( pmods[ i ]->mod_bvalues != NULL ) {
|
238
|
+
for ( ; pmods[ i ]->mod_bvalues[ j ] != NULL; ++j ) {
|
239
|
+
;
|
240
|
+
}
|
241
|
+
}
|
242
|
+
if (( pmods[ i ]->mod_bvalues =
|
243
|
+
(struct berval **)ber_memrealloc( pmods[ i ]->mod_bvalues,
|
244
|
+
(j + 2) * sizeof( struct berval * ))) == NULL ) {
|
245
|
+
tester_perror( "ber_memrealloc", NULL );
|
246
|
+
exit( EXIT_FAILURE );
|
247
|
+
}
|
248
|
+
pmods[ i ]->mod_bvalues[ j + 1 ] = NULL;
|
249
|
+
if (( bvp = (struct berval *)ber_memalloc( sizeof( struct berval )))
|
250
|
+
== NULL ) {
|
251
|
+
tester_perror( "ber_memalloc", NULL );
|
252
|
+
exit( EXIT_FAILURE );
|
253
|
+
}
|
254
|
+
pmods[ i ]->mod_bvalues[ j ] = bvp;
|
255
|
+
|
256
|
+
bvp->bv_len = vlen;
|
257
|
+
if (( bvp->bv_val = (char *)malloc( vlen + 1 )) == NULL ) {
|
258
|
+
tester_perror( "malloc", NULL );
|
259
|
+
exit( EXIT_FAILURE );
|
260
|
+
}
|
261
|
+
AC_MEMCPY( bvp->bv_val, value, vlen );
|
262
|
+
bvp->bv_val[ vlen ] = '\0';
|
263
|
+
}
|
264
|
+
}
|
265
|
+
|
266
|
+
|
267
|
+
static char *
|
268
|
+
get_add_entry( char *filename, LDAPMod ***mods )
|
269
|
+
{
|
270
|
+
FILE *fp;
|
271
|
+
char *entry = NULL;
|
272
|
+
|
273
|
+
if ( (fp = fopen( filename, "r" )) != NULL ) {
|
274
|
+
char line[BUFSIZ];
|
275
|
+
|
276
|
+
if ( fgets( line, BUFSIZ, fp )) {
|
277
|
+
char *nl;
|
278
|
+
|
279
|
+
if (( nl = strchr( line, '\r' )) || ( nl = strchr( line, '\n' )))
|
280
|
+
*nl = '\0';
|
281
|
+
nl = line;
|
282
|
+
if ( !strncasecmp( nl, "dn: ", 4 ))
|
283
|
+
nl += 4;
|
284
|
+
entry = strdup( nl );
|
285
|
+
|
286
|
+
}
|
287
|
+
|
288
|
+
while ( fgets( line, BUFSIZ, fp )) {
|
289
|
+
char *nl;
|
290
|
+
char *value;
|
291
|
+
|
292
|
+
if (( nl = strchr( line, '\r' )) || ( nl = strchr( line, '\n' )))
|
293
|
+
*nl = '\0';
|
294
|
+
|
295
|
+
if ( *line == '\0' ) break;
|
296
|
+
if ( !( value = strchr( line, ':' ))) break;
|
297
|
+
|
298
|
+
*value++ = '\0';
|
299
|
+
while ( *value && isspace( (unsigned char) *value ))
|
300
|
+
value++;
|
301
|
+
|
302
|
+
addmodifyop( mods, LDAP_MOD_ADD, line, value, strlen( value ));
|
303
|
+
|
304
|
+
}
|
305
|
+
fclose( fp );
|
306
|
+
}
|
307
|
+
|
308
|
+
return( entry );
|
309
|
+
}
|
310
|
+
|
311
|
+
|
312
|
+
static void
|
313
|
+
do_addel(
|
314
|
+
char *uri,
|
315
|
+
char *manager,
|
316
|
+
struct berval *passwd,
|
317
|
+
char *entry,
|
318
|
+
LDAPMod **attrs,
|
319
|
+
int maxloop,
|
320
|
+
int maxretries,
|
321
|
+
int delay,
|
322
|
+
int friendly,
|
323
|
+
int chaserefs )
|
324
|
+
{
|
325
|
+
LDAP *ld = NULL;
|
326
|
+
int i = 0, do_retry = maxretries;
|
327
|
+
int rc = LDAP_SUCCESS;
|
328
|
+
int version = LDAP_VERSION3;
|
329
|
+
|
330
|
+
retry:;
|
331
|
+
ldap_initialize( &ld, uri );
|
332
|
+
if ( ld == NULL ) {
|
333
|
+
tester_perror( "ldap_initialize", NULL );
|
334
|
+
exit( EXIT_FAILURE );
|
335
|
+
}
|
336
|
+
|
337
|
+
(void) ldap_set_option( ld, LDAP_OPT_PROTOCOL_VERSION, &version );
|
338
|
+
(void) ldap_set_option( ld, LDAP_OPT_REFERRALS,
|
339
|
+
chaserefs ? LDAP_OPT_ON : LDAP_OPT_OFF );
|
340
|
+
|
341
|
+
if ( do_retry == maxretries ) {
|
342
|
+
fprintf( stderr, "PID=%ld - Add/Delete(%d): entry=\"%s\".\n",
|
343
|
+
(long) pid, maxloop, entry );
|
344
|
+
}
|
345
|
+
|
346
|
+
rc = ldap_sasl_bind_s( ld, manager, LDAP_SASL_SIMPLE, passwd, NULL, NULL, NULL );
|
347
|
+
if ( rc != LDAP_SUCCESS ) {
|
348
|
+
tester_ldap_error( ld, "ldap_sasl_bind_s", NULL );
|
349
|
+
switch ( rc ) {
|
350
|
+
case LDAP_BUSY:
|
351
|
+
case LDAP_UNAVAILABLE:
|
352
|
+
if ( do_retry > 0 ) {
|
353
|
+
do_retry--;
|
354
|
+
if ( delay != 0 ) {
|
355
|
+
sleep( delay );
|
356
|
+
}
|
357
|
+
goto retry;
|
358
|
+
}
|
359
|
+
/* fallthru */
|
360
|
+
default:
|
361
|
+
break;
|
362
|
+
}
|
363
|
+
exit( EXIT_FAILURE );
|
364
|
+
}
|
365
|
+
|
366
|
+
for ( ; i < maxloop; i++ ) {
|
367
|
+
|
368
|
+
/* add the entry */
|
369
|
+
rc = ldap_add_ext_s( ld, entry, attrs, NULL, NULL );
|
370
|
+
if ( rc != LDAP_SUCCESS ) {
|
371
|
+
tester_ldap_error( ld, "ldap_add_ext_s", NULL );
|
372
|
+
switch ( rc ) {
|
373
|
+
case LDAP_ALREADY_EXISTS:
|
374
|
+
/* NOTE: this likely means
|
375
|
+
* the delete failed
|
376
|
+
* during the previous round... */
|
377
|
+
if ( !friendly ) {
|
378
|
+
goto done;
|
379
|
+
}
|
380
|
+
break;
|
381
|
+
|
382
|
+
case LDAP_BUSY:
|
383
|
+
case LDAP_UNAVAILABLE:
|
384
|
+
if ( do_retry > 0 ) {
|
385
|
+
do_retry--;
|
386
|
+
goto retry;
|
387
|
+
}
|
388
|
+
/* fall thru */
|
389
|
+
|
390
|
+
default:
|
391
|
+
goto done;
|
392
|
+
}
|
393
|
+
}
|
394
|
+
|
395
|
+
#if 0
|
396
|
+
/* wait a second for the add to really complete */
|
397
|
+
/* This masks some race conditions though. */
|
398
|
+
sleep( 1 );
|
399
|
+
#endif
|
400
|
+
|
401
|
+
/* now delete the entry again */
|
402
|
+
rc = ldap_delete_ext_s( ld, entry, NULL, NULL );
|
403
|
+
if ( rc != LDAP_SUCCESS ) {
|
404
|
+
tester_ldap_error( ld, "ldap_delete_ext_s", NULL );
|
405
|
+
switch ( rc ) {
|
406
|
+
case LDAP_NO_SUCH_OBJECT:
|
407
|
+
/* NOTE: this likely means
|
408
|
+
* the add failed
|
409
|
+
* during the previous round... */
|
410
|
+
if ( !friendly ) {
|
411
|
+
goto done;
|
412
|
+
}
|
413
|
+
break;
|
414
|
+
|
415
|
+
case LDAP_BUSY:
|
416
|
+
case LDAP_UNAVAILABLE:
|
417
|
+
if ( do_retry > 0 ) {
|
418
|
+
do_retry--;
|
419
|
+
goto retry;
|
420
|
+
}
|
421
|
+
/* fall thru */
|
422
|
+
|
423
|
+
default:
|
424
|
+
goto done;
|
425
|
+
}
|
426
|
+
}
|
427
|
+
}
|
428
|
+
|
429
|
+
done:;
|
430
|
+
fprintf( stderr, " PID=%ld - Add/Delete done (%d).\n", (long) pid, rc );
|
431
|
+
|
432
|
+
ldap_unbind_ext( ld, NULL, NULL );
|
433
|
+
}
|
434
|
+
|
435
|
+
|
@@ -0,0 +1,335 @@
|
|
1
|
+
/* $OpenLDAP$ */
|
2
|
+
/* This work is part of OpenLDAP Software <http://www.openldap.org/>.
|
3
|
+
*
|
4
|
+
* Copyright 2006-2016 The OpenLDAP Foundation.
|
5
|
+
* All rights reserved.
|
6
|
+
*
|
7
|
+
* Redistribution and use in source and binary forms, with or without
|
8
|
+
* modification, are permitted only as authorized by the OpenLDAP
|
9
|
+
* Public License.
|
10
|
+
*
|
11
|
+
* A copy of this license is available in file LICENSE in the
|
12
|
+
* top-level directory of the distribution or, alternatively, at
|
13
|
+
* <http://www.OpenLDAP.org/license.html>.
|
14
|
+
*/
|
15
|
+
/* ACKNOWLEDGEMENTS:
|
16
|
+
* This work was initially developed by Howard Chu for inclusion
|
17
|
+
* in OpenLDAP Software.
|
18
|
+
*/
|
19
|
+
|
20
|
+
#include "portable.h"
|
21
|
+
|
22
|
+
#include <stdio.h>
|
23
|
+
|
24
|
+
#include <ac/stdlib.h>
|
25
|
+
|
26
|
+
#include <ac/ctype.h>
|
27
|
+
#include <ac/param.h>
|
28
|
+
#include <ac/socket.h>
|
29
|
+
#include <ac/string.h>
|
30
|
+
#include <ac/unistd.h>
|
31
|
+
#include <ac/wait.h>
|
32
|
+
#include <ac/time.h>
|
33
|
+
#include <ac/signal.h>
|
34
|
+
|
35
|
+
#include <ldap.h>
|
36
|
+
#include <ldap_pvt_thread.h>
|
37
|
+
#include <lutil.h>
|
38
|
+
|
39
|
+
static int
|
40
|
+
do_time( );
|
41
|
+
|
42
|
+
/* This program is a simplified version of SLAMD's WeightedAuthRate jobclass.
|
43
|
+
* It doesn't offer as much configurability, but it's a good starting point.
|
44
|
+
* When run without the -R option it will behave as a Standard AuthRate job.
|
45
|
+
* Eventually this will grow into a set of C-based load generators for the SLAMD
|
46
|
+
* framework. This code is anywhere from 2 to 10 times more efficient than the
|
47
|
+
* original Java code, allowing servers to be fully loaded without requiring
|
48
|
+
* anywhere near as much load-generation hardware.
|
49
|
+
*/
|
50
|
+
static void
|
51
|
+
usage( char *name )
|
52
|
+
{
|
53
|
+
fprintf( stderr, "usage: %s -H <uri> -b <baseDN> -w <passwd> -t <seconds> -r lo:hi\n\t"
|
54
|
+
"[-R %:lo:hi] [-f <filter-template>] [-n <threads>] [-D <bindDN>] [-i <seconds>]\n",
|
55
|
+
name );
|
56
|
+
exit( EXIT_FAILURE );
|
57
|
+
}
|
58
|
+
|
59
|
+
static char *filter = "(uid=user.%d)";
|
60
|
+
|
61
|
+
static char hname[1024];
|
62
|
+
static char *uri = "ldap:///";
|
63
|
+
static char *base;
|
64
|
+
static char *pass;
|
65
|
+
static char *binder;
|
66
|
+
|
67
|
+
static int tdur, r1per, r1lo, r1hi, r2per, r2lo, r2hi;
|
68
|
+
static int threads = 1;
|
69
|
+
|
70
|
+
static int interval = 30;
|
71
|
+
|
72
|
+
static volatile int *r1binds, *r2binds;
|
73
|
+
static int *r1old, *r2old;
|
74
|
+
static volatile int finish;
|
75
|
+
|
76
|
+
int
|
77
|
+
main( int argc, char **argv )
|
78
|
+
{
|
79
|
+
int i;
|
80
|
+
|
81
|
+
while ( (i = getopt( argc, argv, "b:D:H:w:f:n:i:t:r:R:" )) != EOF ) {
|
82
|
+
switch( i ) {
|
83
|
+
case 'b': /* base DN of a tree of user DNs */
|
84
|
+
base = strdup( optarg );
|
85
|
+
break;
|
86
|
+
|
87
|
+
case 'D':
|
88
|
+
binder = strdup( optarg );
|
89
|
+
break;
|
90
|
+
|
91
|
+
case 'H': /* the server uri */
|
92
|
+
uri = strdup( optarg );
|
93
|
+
break;
|
94
|
+
|
95
|
+
case 'w':
|
96
|
+
pass = strdup( optarg );
|
97
|
+
break;
|
98
|
+
|
99
|
+
case 't': /* the duration to run */
|
100
|
+
if ( lutil_atoi( &tdur, optarg ) != 0 ) {
|
101
|
+
usage( argv[0] );
|
102
|
+
}
|
103
|
+
break;
|
104
|
+
|
105
|
+
case 'i': /* the time interval */
|
106
|
+
if ( lutil_atoi( &interval, optarg ) != 0 ) {
|
107
|
+
usage( argv[0] );
|
108
|
+
}
|
109
|
+
break;
|
110
|
+
|
111
|
+
case 'r': /* the uid range */
|
112
|
+
if ( sscanf(optarg, "%d:%d", &r1lo, &r1hi) != 2 ) {
|
113
|
+
usage( argv[0] );
|
114
|
+
}
|
115
|
+
break;
|
116
|
+
|
117
|
+
case 'R': /* percentage:2nd uid range */
|
118
|
+
if ( sscanf(optarg, "%d:%d:%d", &r2per, &r2lo, &r2hi) != 3 ) {
|
119
|
+
usage( argv[0] );
|
120
|
+
}
|
121
|
+
break;
|
122
|
+
|
123
|
+
case 'f':
|
124
|
+
filter = optarg;
|
125
|
+
break;
|
126
|
+
|
127
|
+
case 'n':
|
128
|
+
if ( lutil_atoi( &threads, optarg ) != 0 || threads < 1 ) {
|
129
|
+
usage( argv[0] );
|
130
|
+
}
|
131
|
+
break;
|
132
|
+
|
133
|
+
default:
|
134
|
+
usage( argv[0] );
|
135
|
+
break;
|
136
|
+
}
|
137
|
+
}
|
138
|
+
|
139
|
+
if ( tdur == 0 || r1hi <= r1lo )
|
140
|
+
usage( argv[0] );
|
141
|
+
|
142
|
+
r1per = 100 - r2per;
|
143
|
+
if ( r1per < 1 )
|
144
|
+
usage( argv[0] );
|
145
|
+
|
146
|
+
r1binds = calloc( threads*4, sizeof( int ));
|
147
|
+
r2binds = r1binds + threads;
|
148
|
+
r1old = (int *)r2binds + threads;
|
149
|
+
r2old = r1old + threads;
|
150
|
+
|
151
|
+
do_time( );
|
152
|
+
|
153
|
+
exit( EXIT_SUCCESS );
|
154
|
+
}
|
155
|
+
|
156
|
+
static void *
|
157
|
+
my_task( void *my_num )
|
158
|
+
{
|
159
|
+
LDAP *ld = NULL, *sld = NULL;
|
160
|
+
ber_int_t msgid;
|
161
|
+
LDAPMessage *res, *msg;
|
162
|
+
char *attrs[] = { "1.1", NULL };
|
163
|
+
int rc = LDAP_SUCCESS;
|
164
|
+
int tid = *(int *)my_num;
|
165
|
+
|
166
|
+
ldap_initialize( &ld, uri );
|
167
|
+
if ( ld == NULL ) {
|
168
|
+
perror( "ldap_initialize" );
|
169
|
+
return NULL;
|
170
|
+
}
|
171
|
+
|
172
|
+
{
|
173
|
+
int version = LDAP_VERSION3;
|
174
|
+
(void) ldap_set_option( ld, LDAP_OPT_PROTOCOL_VERSION,
|
175
|
+
&version );
|
176
|
+
}
|
177
|
+
(void) ldap_set_option( ld, LDAP_OPT_REFERRALS, LDAP_OPT_OFF );
|
178
|
+
|
179
|
+
ldap_initialize( &sld, uri );
|
180
|
+
if ( sld == NULL ) {
|
181
|
+
perror( "ldap_initialize" );
|
182
|
+
return NULL;
|
183
|
+
}
|
184
|
+
|
185
|
+
{
|
186
|
+
int version = LDAP_VERSION3;
|
187
|
+
(void) ldap_set_option( sld, LDAP_OPT_PROTOCOL_VERSION,
|
188
|
+
&version );
|
189
|
+
}
|
190
|
+
(void) ldap_set_option( sld, LDAP_OPT_REFERRALS, LDAP_OPT_OFF );
|
191
|
+
if ( binder ) {
|
192
|
+
rc = ldap_bind_s( sld, binder, pass, LDAP_AUTH_SIMPLE );
|
193
|
+
if ( rc != LDAP_SUCCESS ) {
|
194
|
+
ldap_perror( sld, "ldap_bind" );
|
195
|
+
}
|
196
|
+
}
|
197
|
+
|
198
|
+
r1binds[tid] = 0;
|
199
|
+
|
200
|
+
for (;;) {
|
201
|
+
char dn[BUFSIZ], *ptr, fstr[256];
|
202
|
+
int j, isr1;
|
203
|
+
|
204
|
+
if ( finish )
|
205
|
+
break;
|
206
|
+
|
207
|
+
j = rand() % 100;
|
208
|
+
if ( j < r1per ) {
|
209
|
+
j = rand() % r1hi;
|
210
|
+
isr1 = 1;
|
211
|
+
} else {
|
212
|
+
j = rand() % (r2hi - r2lo + 1 );
|
213
|
+
j += r2lo;
|
214
|
+
isr1 = 0;
|
215
|
+
}
|
216
|
+
sprintf(fstr, filter, j);
|
217
|
+
|
218
|
+
rc = ldap_search_ext( sld, base, LDAP_SCOPE_SUB,
|
219
|
+
fstr, attrs, 0, NULL, NULL, 0, 0, &msgid );
|
220
|
+
if ( rc != LDAP_SUCCESS ) {
|
221
|
+
ldap_perror( sld, "ldap_search_ex" );
|
222
|
+
return NULL;
|
223
|
+
}
|
224
|
+
|
225
|
+
while (( rc=ldap_result( sld, LDAP_RES_ANY, LDAP_MSG_ONE, NULL, &res )) >0){
|
226
|
+
BerElement *ber;
|
227
|
+
struct berval bv;
|
228
|
+
char *ptr;
|
229
|
+
int done = 0;
|
230
|
+
|
231
|
+
for (msg = ldap_first_message( sld, res ); msg;
|
232
|
+
msg = ldap_next_message( sld, msg )) {
|
233
|
+
switch ( ldap_msgtype( msg )) {
|
234
|
+
case LDAP_RES_SEARCH_ENTRY:
|
235
|
+
rc = ldap_get_dn_ber( sld, msg, &ber, &bv );
|
236
|
+
strcpy(dn, bv.bv_val );
|
237
|
+
ber_free( ber, 0 );
|
238
|
+
break;
|
239
|
+
case LDAP_RES_SEARCH_RESULT:
|
240
|
+
done = 1;
|
241
|
+
break;
|
242
|
+
}
|
243
|
+
if ( done )
|
244
|
+
break;
|
245
|
+
}
|
246
|
+
ldap_msgfree( res );
|
247
|
+
if ( done ) break;
|
248
|
+
}
|
249
|
+
|
250
|
+
rc = ldap_bind_s( ld, dn, pass, LDAP_AUTH_SIMPLE );
|
251
|
+
if ( rc != LDAP_SUCCESS ) {
|
252
|
+
ldap_perror( ld, "ldap_bind" );
|
253
|
+
}
|
254
|
+
if ( isr1 )
|
255
|
+
r1binds[tid]++;
|
256
|
+
else
|
257
|
+
r2binds[tid]++;
|
258
|
+
}
|
259
|
+
|
260
|
+
ldap_unbind( sld );
|
261
|
+
ldap_unbind( ld );
|
262
|
+
|
263
|
+
return NULL;
|
264
|
+
}
|
265
|
+
|
266
|
+
static int
|
267
|
+
do_time( )
|
268
|
+
{
|
269
|
+
struct timeval tv;
|
270
|
+
time_t now, prevt, start;
|
271
|
+
|
272
|
+
int r1new, r2new;
|
273
|
+
int dt, dr1, dr2, rr1, rr2;
|
274
|
+
int dr10, dr20;
|
275
|
+
int i;
|
276
|
+
|
277
|
+
gethostname(hname, sizeof(hname));
|
278
|
+
printf("%s(tid)\tdeltaT\tauth1\tauth2\trate1\trate2\tRate1+2\n", hname);
|
279
|
+
srand(getpid());
|
280
|
+
|
281
|
+
prevt = start = time(0L);
|
282
|
+
|
283
|
+
for ( i = 0; i<threads; i++ ) {
|
284
|
+
ldap_pvt_thread_t thr;
|
285
|
+
r1binds[i] = i;
|
286
|
+
ldap_pvt_thread_create( &thr, 1, my_task, (void *)&r1binds[i] );
|
287
|
+
}
|
288
|
+
|
289
|
+
for (;;) {
|
290
|
+
tv.tv_sec = interval;
|
291
|
+
tv.tv_usec = 0;
|
292
|
+
|
293
|
+
select(0, NULL, NULL, NULL, &tv);
|
294
|
+
|
295
|
+
now = time(0L);
|
296
|
+
|
297
|
+
dt = now - prevt;
|
298
|
+
prevt = now;
|
299
|
+
|
300
|
+
dr10 = 0;
|
301
|
+
dr20 = 0;
|
302
|
+
|
303
|
+
for ( i = 0; i < threads; i++ ) {
|
304
|
+
r1new = r1binds[i];
|
305
|
+
r2new = r2binds[i];
|
306
|
+
|
307
|
+
dr1 = r1new - r1old[i];
|
308
|
+
dr2 = r2new - r2old[i];
|
309
|
+
rr1 = dr1 / dt;
|
310
|
+
rr2 = dr2 / dt;
|
311
|
+
|
312
|
+
printf("%s(%d)\t%d\t%d\t%d\t%d\t%d\t%d\n",
|
313
|
+
hname, i, dt, dr1, dr2, rr1, rr2, rr1 + rr2);
|
314
|
+
|
315
|
+
dr10 += dr1;
|
316
|
+
dr20 += dr2;
|
317
|
+
|
318
|
+
r1old[i] = r1new;
|
319
|
+
r2old[i] = r2new;
|
320
|
+
}
|
321
|
+
if ( i > 1 ) {
|
322
|
+
rr1 = dr10 / dt;
|
323
|
+
rr2 = dr20 / dt;
|
324
|
+
|
325
|
+
printf("%s(sum)\t%d\t%d\t%d\t%d\t%d\t%d\n",
|
326
|
+
hname, 0, dr10, dr20, rr1, rr2, rr1 + rr2);
|
327
|
+
}
|
328
|
+
|
329
|
+
if ( now - start >= tdur ) {
|
330
|
+
finish = 1;
|
331
|
+
break;
|
332
|
+
}
|
333
|
+
}
|
334
|
+
return 0;
|
335
|
+
}
|