Compare commits
1 Commits
pre-5
...
tags/relea
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
71043f958f |
2840
mozilla/directory/perldap/API.pm
Normal file
2840
mozilla/directory/perldap/API.pm
Normal file
File diff suppressed because it is too large
Load Diff
1792
mozilla/directory/perldap/API.xs
Normal file
1792
mozilla/directory/perldap/API.xs
Normal file
File diff suppressed because it is too large
Load Diff
48
mozilla/directory/perldap/CREDITS
Normal file
48
mozilla/directory/perldap/CREDITS
Normal file
@@ -0,0 +1,48 @@
|
||||
This is a short list of people that have contributed to the success of
|
||||
this project.
|
||||
|
||||
|
||||
* Leif Hedstrom <leif@perldap.org>
|
||||
|
||||
- Project lead.
|
||||
- Wrote some of the API code, and most of OO layers (Conn.pm,
|
||||
Entry.pm etc.)
|
||||
- Unix portability test.
|
||||
- Port to Windows/NT and ActivePerl.
|
||||
|
||||
|
||||
* Clayton Donley
|
||||
|
||||
- Wrote a lot of the initial API code (API.xs and API.pm).
|
||||
|
||||
|
||||
* Kevin McCarthy <kmccarth@perldap.org>
|
||||
|
||||
- Bug fixes, tons of contribution, particularly to the API.xs file.
|
||||
|
||||
|
||||
* Michelle Wyner <mwyner@perldap.org>
|
||||
|
||||
- Testing, bug fixes, and documentation, as well as working on new
|
||||
modules for PerLDAP v2.0.
|
||||
|
||||
|
||||
* John Kristian <kristian@netscape.com>
|
||||
|
||||
- Rewrote the entire LDIF module, great stuff!
|
||||
|
||||
|
||||
* Netscape Netcenter team (Kevin Burns, Max Block, Mark Takacs etc.)
|
||||
|
||||
- Tons of ideas and requests for features.
|
||||
- Discovering bugs daily (great, thanks... ;-).
|
||||
|
||||
|
||||
* Bob Ferguson <rferguso@netscape.com>
|
||||
|
||||
- Primary guinea pig for all my NT builds.
|
||||
|
||||
|
||||
* Everyone else that I've forgot to mention:
|
||||
|
||||
- Thanks for testing and debugging this package!
|
||||
554
mozilla/directory/perldap/ChangeLog
Normal file
554
mozilla/directory/perldap/ChangeLog
Normal file
@@ -0,0 +1,554 @@
|
||||
1999-08-24 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* Merged v1.3.x into trunk, tagged it as v1.4, and released it!
|
||||
|
||||
1999-08-19 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* Changed internal version numbering again, just called this plain
|
||||
v1.4.
|
||||
|
||||
* Entry.pm (FIRSTKEY): Bug fix, we'd crap out if there are no
|
||||
attributes in the returned entry.
|
||||
(NEXTKEY): Ditto.
|
||||
|
||||
1999-08-18 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* Set version number to v1.4! Woohoo! Also tagged it as v1.3.4,
|
||||
last "development" release.
|
||||
|
||||
1999-08-17 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* Makefile.PL: Fixes for Windows/NT, cleaned out some code etc.
|
||||
(MY::postamble): Support for "make html".
|
||||
|
||||
* MANIFEST: Updated with all new files etc.
|
||||
|
||||
* test.pl: Renamed to oldtest.pl, to avoid "make test" to fail.
|
||||
|
||||
1999-08-16 Kevin McCarthy <kmccarth@perldap.org> and Leif Hedstrom
|
||||
|
||||
* API.xs: Cleaned most all the memory allocation changes, we are
|
||||
changing it to use the LDAP_OPT_MEMALLOC_FN_PTRS option in the
|
||||
C-SDK instead (much cleaner!).
|
||||
(perldap_init): New function, set up the memory management
|
||||
handlers. This is called when the API module is loaded.
|
||||
(perldap_malloc): New function, our memory management method(s).
|
||||
(perldap_calloc): Ditto.
|
||||
(perldap_realloc): Ditto.
|
||||
(perldap_free): Ditto.
|
||||
|
||||
1999-08-16 Kevin McCarthy <kmccarth@perldap.org>
|
||||
|
||||
* API.xs: Cleaned up prototypes, changed strdup() to use a
|
||||
Perl'ified version, change a number of free()'s to use Safefree.
|
||||
(ldap_value_free_perl): New function, similar to
|
||||
ldap_mods_free_perl(), to avoid memory problems (on NT and
|
||||
ActivePerl primarily).
|
||||
(StrDup): New function, to handle strdup() calls in a safe way.
|
||||
(ber_bvfree_perl): Ditto.
|
||||
(ber_bvecfree_perl): Ditto.
|
||||
|
||||
1999-08-15 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* API.xs (ldap_mods_free_perl): Modified version of
|
||||
ldap_mods_free(), which uses Perl native free method instead of
|
||||
the things from the LDAP SDK. This fixes some nasty issues with
|
||||
Windows/NT and ActiveState Perl. Woohoo!!!
|
||||
|
||||
1999-08-14 Leif Hedstrom <leif@netscape.com> and Kevin McCarthy
|
||||
|
||||
* Entry.pm (setValues): Implemented bug fix for bug id 7131, where
|
||||
the "_save_" structures weren't set properly when using setValues().
|
||||
|
||||
1999-08-14 Kevin McCarthy <kmccarth@perldap.org>
|
||||
|
||||
* Conn.pm (update): Rewrote to optimize add/remove vs replace
|
||||
operations. Basically, we'll try to do whatever seems to be the
|
||||
smallest amount of work for the LDAP server now.
|
||||
|
||||
1999-08-13 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* Makefile.PL: Cleaned up code, and added support for linking in
|
||||
the missing libraries need for some missing symbols.
|
||||
|
||||
1999-08-13 Michelle Wyner <mwyner@netscape.com>
|
||||
|
||||
* Entry.pm: Updated documentation, and cleaned it up.
|
||||
|
||||
* Conn.pm: Ditto.
|
||||
|
||||
1999-08-12 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* Entry.pm (move): Changed name, was rename(), is now move().
|
||||
|
||||
1999-08-10 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* Entry.pm (setValues): Renamed, used to be setValue(), which is
|
||||
now an alias to setValues().
|
||||
(getValues): New method, to get the array of values.
|
||||
(STORE): Fixed tests around DN handling, making sure it's not
|
||||
treated as an array. I also optimized a couple of tests, since we
|
||||
now filter out "DN" earlier in the funtion(s).
|
||||
(attrModified): Ditto.
|
||||
(attrClean): Ditto.
|
||||
(unRemove): Ditto.
|
||||
(removeValue): Ditto.
|
||||
(addValue): Ditto.
|
||||
|
||||
1999-08-08 Leif Hedstrom <leif@netscape.com> and Kevin McCarthy
|
||||
|
||||
* Entry.pm (setValue): Remove _delete_ flag, if set.
|
||||
|
||||
* Conn.pm (close): Fixed memory leak, moved code from the DESTROY
|
||||
method over here.
|
||||
(DESTROY): Call the close() method.
|
||||
(getErrorCode): We now return LDAP_SUCCESS if there is no LDAP
|
||||
connection handle.
|
||||
(getErrorString): Ditto.
|
||||
|
||||
* Entry.pm (STORE): Bug fix for large attribute sets.
|
||||
(attrModified): Ditto.
|
||||
(removeValue): Ditto.
|
||||
(addValue): Ditto.
|
||||
(EXISTS): Fix for bug 4368, cleaning up the code, and avoid the
|
||||
double calls.
|
||||
|
||||
1999-08-06 Leif Hedstrom <leif@netscape.com> and Kevin McCarthy
|
||||
|
||||
* API.xs: Added some more tests around free() statements. These
|
||||
are most likely never triggered, but better safe than sorrow (and
|
||||
the overhead of testing this is insignificant).
|
||||
|
||||
* Conn.pm (browse): Added this function, to make it easy to browse
|
||||
an entry.
|
||||
(compare): Compare an attribute value against a DN/entry, without
|
||||
having to do the search.
|
||||
|
||||
* Entry.pm (removeValue): Fixed loop bug.
|
||||
(addValue): Ditto.
|
||||
(hasValue): Ditto.
|
||||
(matchValue): Fixed loop bug, and also missing normalization in
|
||||
half of the case statement.
|
||||
(rename): Added this new method, to rename attributes.
|
||||
(copy): Added, to copy attributes.
|
||||
|
||||
* Merged v1.2.3 with v1.3 branch.
|
||||
|
||||
1999-08-06 Kevin McCarthy <kmccarth@perldap.org>
|
||||
|
||||
* Entry.pm (addDNValue): Bug fix, index for norm was wrong.
|
||||
|
||||
* Entry.pm (size): Optimzied for performance.
|
||||
|
||||
1999-07-25 Kevin McCarthy <kmccarth@perldap.org>
|
||||
|
||||
* API.xs: Fixed memory allocation problems in parsing and
|
||||
generating the LDAPMods structure.
|
||||
|
||||
1999-06-22 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* Conn.pm (add): Fixed bug 3342, thanks to Kevin McCarthy for
|
||||
debugging this, and providing a patch. This fixes the problem with
|
||||
adding new entries that has binary data.
|
||||
|
||||
1999-03-23 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* Changed versioning numbers for all .pm files.
|
||||
|
||||
1999-03-22 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* Entry.pm: Removed all _self_obj_ stuff...
|
||||
|
||||
* Conn.pm: Ditto.
|
||||
|
||||
* Conn.pm: Cleanup in use statements, and "use strict".
|
||||
(search): Avoid warnings of uninitialized variables.
|
||||
(searchURL): Ditto.
|
||||
(modifyRDN): Bugfix, we did not update the appropriate DN in the
|
||||
self object (very minor...).
|
||||
|
||||
* Entry.pm: Cleanup in use statements, and "use strict".
|
||||
(BEGIN): Added this initializer, to use the new LDIF module.
|
||||
(STORE): Fixed bug where we would not ignore the internal instance
|
||||
variables properly.
|
||||
|
||||
* Utils.pm: Cleanup in all use statements, and "use strict". Also
|
||||
enforces the VERSION control feature.
|
||||
|
||||
* Merged v1.2.1 to devel-branch-1_3, and tagged v1.3.1.
|
||||
|
||||
1999-03-21 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* Checked in v1.2.1(beta).
|
||||
|
||||
1999-03-19 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* Conn.pm (add): Fixed the code so that it will handle hash array,
|
||||
as the documentation indicates. (Pointed out by Kevin Burns).
|
||||
(add): Code cleanup in the add() method.
|
||||
|
||||
1999-03-18 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* Entry.pm: Changed back some of the "my" definitions, to make
|
||||
sure arrays are properly reset.
|
||||
(setValue): Added the _modified_ flag, from Stephen P. Schaefer
|
||||
<stephen@networks.com>.
|
||||
(addValue): Bug fix, when calling delete, and then
|
||||
addValue(). From Stephen P. Schaefer as well.
|
||||
|
||||
* Conn.pm: Ditto. This fixes the bug where qsearch/printLDIF()
|
||||
would print multiple values.
|
||||
|
||||
1999-03-12 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* Conn.pm: Changed docs for modifyRDN(), it was wrong...
|
||||
|
||||
1999-03-11 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* Entry.pm (new): Added this method, so that "new ...::Entry" will
|
||||
work as expected.
|
||||
|
||||
1999-03-09 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* Entry.pm: Tons of changes to handling the save/modified/deleted
|
||||
attribute values.
|
||||
(DESTROY): Added this destructor again, this time it does seem to
|
||||
help quite a lot! Whoohoo...
|
||||
|
||||
* Conn.pm (update): Bug fix for bug #2530, keeping sort order for
|
||||
attribute values.
|
||||
|
||||
1999-03-08 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* Entry.pm (unRemove): Bug fix, this was terribly horked, please
|
||||
let's try it to make sure it works...
|
||||
|
||||
* Conn.pm (newEntry): Bug fix, forgot to give it the self_obj
|
||||
member value... Sigh.
|
||||
|
||||
1999-03-05 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* Entry.pm (DELETE): We now handle the event that someone tries to
|
||||
delete an internal attribute.
|
||||
|
||||
* Conn.pm (update): Bug: We forgot to test for existance of
|
||||
"_save_" before trying to loop over it.
|
||||
|
||||
* Entry.pm (attrClean): Added this method, to make it easier to
|
||||
reset the internal state of en Entry. This is used primarily by
|
||||
the Conn.pm package.
|
||||
(unRemove): Bug Fix: $selfl changed to $self...
|
||||
|
||||
1999-02-28 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* Entry.pm (matchValue): Added support for the normalization,
|
||||
which should have been done before... Bug #2854.
|
||||
|
||||
* Conn.pm (printError): Changed to use ldap_err2string instead of
|
||||
ldap_perror.
|
||||
|
||||
* Utils.pm (ldapArgs): Changed "root" to "base" in the LD
|
||||
structure.
|
||||
(userCredentials): Ditto.
|
||||
|
||||
* Conn.pm: Changed documentation to reflect the "base/root"
|
||||
change.
|
||||
|
||||
1999-01-06 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* Conn.pm (nextEntry): Fixed (tried to fix...) the bug with
|
||||
missing attributes. I hope this will work, at a minimum I'm sure
|
||||
it won't hurt. The idea is to keep the case on the attribute type
|
||||
when requesting the values_len().
|
||||
|
||||
1999-01-11 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* API.xs: Added IF statements around all ldap_value_free() calls.
|
||||
|
||||
1999-01-05 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* Conn.pm (getRes): Ooops, didn't return the appropriate
|
||||
value... :(
|
||||
(init): Changed test for LDAP_SUCCESS, to always return 0 or 1.
|
||||
(close): Ditto.
|
||||
(delete): Ditto.
|
||||
(add): Ditto.
|
||||
(modifyRDN): Ditto.
|
||||
(update): Ditto.
|
||||
(simpleAuth): Ditto.
|
||||
|
||||
* Entry.pm (NEXTKEY): Don't return the last $key if it's one that
|
||||
should be hidden.
|
||||
|
||||
* Conn.pm (newEntry): New method, to create an empty LDAP::Entry
|
||||
object. It is properly "tied" into the appropriate object.
|
||||
|
||||
1999-01-04 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* Entry.pm (setDN): Added third optional argument, to enfoce DN
|
||||
normalization.
|
||||
(getDN): Ditto.
|
||||
(hasDNValue): Ditto.
|
||||
(matchDNValue): Ditto.
|
||||
|
||||
* Entry.pm (removeValue): Added support for DN normalization
|
||||
(optional argument).
|
||||
(addValue): Ditto
|
||||
(getDN): Ditto.
|
||||
|
||||
1998-12-31 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* Entry.pm (DESTROY): Added this method, don't know if it actually
|
||||
makes any sense at all... :(
|
||||
|
||||
* Conn.pm (add): Use _oc_order_ to find a list of attributes, to
|
||||
avoide calling the TIEHASH methods.
|
||||
(update): Ditto.
|
||||
(ALL): Clean out some "my" definitions.
|
||||
|
||||
* Entry.pm (unRemove): New function, to undo remove opertaions on
|
||||
an attribute.
|
||||
(DELETE): Bug-fix, don't undef the attribute, it would prevent us
|
||||
from updating it properly in the Conn::update() method.
|
||||
(remove): Ditto.
|
||||
|
||||
* Conn.pm (nextEntry): Return $obj instead of blessing the %entry
|
||||
(again).
|
||||
|
||||
1998-12-25 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* Conn.pm (POD): Changed examples from $conn -> $entry.
|
||||
|
||||
1998-12-17 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* Conn.pm (DESTROY): undef the Perl data after doing a
|
||||
ldap_msgfree(), bug #1964.
|
||||
(search): Ditto.
|
||||
(searchURL): Ditto.
|
||||
(nextEntry): Changed the order of setting numattr, to make sure
|
||||
it's zero if we don't find anything.
|
||||
|
||||
1998-12-16 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* Entry.pm (FIRSTKEY): Modified to honor the oc_order.
|
||||
(NEXTKEY): Ditto.
|
||||
(markModified): Made as an alias for attrModified().
|
||||
|
||||
* Conn.pm (nextEntry): Added code to handle internal counters for
|
||||
number of attributes in oc_order. This is used/needed for the
|
||||
FIRSTKEY and NEXTKEY methods in the Entry/Tie::Hash object.
|
||||
|
||||
* Entry.pm (isAttr): New method, to make sure an attribute name
|
||||
really is a valid LDAP attribute.
|
||||
(FIRSTKEY): Now we'll handle each() and keys() properly, whooohoo!
|
||||
(NEXTKEY): Ditto.
|
||||
|
||||
1998-12-15 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* Entry.pm (isDeleted): Added new method, almost identical to isModified().
|
||||
(EXISTS): New method, to implement the EXISTS functionality.
|
||||
|
||||
* API.xs (RET_CPP): Test for NULL pointers, bug #1387.
|
||||
(RET_BVPP): Ditto.
|
||||
|
||||
* Utils.pm (ldapArgs): Fixed bug where "-s 0" would not be honored
|
||||
(I'm an idiot, OK?).
|
||||
|
||||
1998-12-14 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* Conn.pm (getRes): New method, to return the internal result message.
|
||||
(getLD): Use defined() around test for existence.
|
||||
|
||||
1998-12-11 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* Conn.pm (new): Make sure binddn and bindpasswd are set to the
|
||||
empty string unless specified.
|
||||
(init): Make sure certdb is defined before trying to use it.
|
||||
(setDefaultRebindProc): Added default auth method, unless
|
||||
explicitly specified.
|
||||
|
||||
* Utils.pm (askPassword): Added support for Term::ReadKey.
|
||||
(askPassword): Moved the eval "use ..." here.
|
||||
(userCredentials): Removed verbose print statement.
|
||||
(askPassword): Added an optional argument to print a prompt;
|
||||
|
||||
* Conn.pm (setDefaultRebindProc): Added a default "auth" value, if
|
||||
not provided in the call.
|
||||
|
||||
1998-12-04 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* Makefile.PL: Modified so that "silent" install will actually
|
||||
echo what options it's setting.
|
||||
It will now croak() if the SDK dir specified doesn't exist.
|
||||
|
||||
* INSTALL: Updated to reflect new v1.1 stuff. Added links to the
|
||||
FAQ.
|
||||
|
||||
* README: Ditto. Also changed some of the binary install
|
||||
information, which might not be useful anyways...
|
||||
|
||||
* Makefile.PL: Added "filters" to remove .dll and .sl from shared
|
||||
libraries when creating link options. I also replaced the code to
|
||||
put the valid library extensions into a variable (bug #1344).
|
||||
|
||||
* Makefile.PL: Fixed some crap with the config parsing, and ENV
|
||||
handling (for silent installs).
|
||||
|
||||
1998-12-03 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* Conn.pm (update): Bug fix, now we empty the hash array before
|
||||
examining changed attributes (bug #1385).
|
||||
|
||||
* Makefile.PL: Added the "-nolinenumbers" XSUBS options (bug #1329).
|
||||
|
||||
1998-09-26 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* Conn.pm (init): Cleaned out _perror() calls.
|
||||
(delete): Added support for calling delete() with an Entry::
|
||||
object as paramter.
|
||||
(new): Cleaned out some dead code for $ref.
|
||||
|
||||
* Entry.pm (setValue): New method, to avoid having to use Perl
|
||||
assignment statements to set an entire attribute value.
|
||||
|
||||
1998-09-18 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* Conn.pm (init): Changed call to ldapssl_client_init() to pass a
|
||||
0 value as the handle pointer. This avoids a Perl compiler warning.
|
||||
|
||||
1998-09-12 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* LDIF.pm (readEntries): Changed tests for empty arguments, to use
|
||||
defined().
|
||||
|
||||
* Utils.pm (ldapArgs): Bug fix, we used the wrong option for the
|
||||
certificate (-P) when checking to set the LDAP port.
|
||||
(normalizeDN): Chagned tests for empty arguments, to use use defined().
|
||||
|
||||
* Entry.pm (STORE): Changed tests for empty arguments, to use
|
||||
defined().
|
||||
(DELETE): Ditto.
|
||||
(attrModified): Ditto.
|
||||
(isModified): Ditto.
|
||||
(remove): Ditto.
|
||||
(removeValue): Ditto.
|
||||
(addValue): Ditto.
|
||||
(hasValue): Ditto.
|
||||
(matchValue): Ditto.
|
||||
(setDN): Ditto.
|
||||
(size): Ditto.
|
||||
(exists): Ditto.
|
||||
|
||||
* Conn.pm (printError): Changed test for $str to see if it's defined.
|
||||
(delete): Cleaned up code around $dn.
|
||||
(modifyRDN): Cleaned up testes around $dn and $del.
|
||||
|
||||
1998-09-11 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* Conn.pm (modifyRDN): We now preserve the case of the DN/RDN, but
|
||||
still treat RDNs as CIS when comparing strings.
|
||||
|
||||
1998-09-08 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* Conn.pm (setDefaultRebindProc): Bug fix, it had the Ldapc:: crap
|
||||
stil in there... :-(.
|
||||
(simpleAuth): New method, to do simple authentication rebind.
|
||||
|
||||
1998-09-07 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* Makefile.PL: Changed all <> to <STDIN>, to support command line
|
||||
arguments for MakeMaker.
|
||||
|
||||
1998-09-03 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* Conn.pm (nextEntry): Fixed bug with case sensitivity.
|
||||
|
||||
1998-08-18 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* Conn.pm (setDefaultRebindProc): It's back!
|
||||
Officially released PerLDAP v1.0.
|
||||
|
||||
1998-08-13 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* Makefile.PL: Fixed so that automated installs works.
|
||||
|
||||
* Conn.pm (update): Fixed narly bug with ldap_modify()...
|
||||
|
||||
* All: Cleaned up some hash indexes, to make sure they are
|
||||
properly quoted, and there are no conflicts to resolve.
|
||||
|
||||
* Entry.pm (STORE): Fixed a bug with attribute names not being
|
||||
properly added to _oc_order_.
|
||||
(addValue): Ditto, added the same code as for STORE.
|
||||
|
||||
1998-08-06 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* Entry.pm (printLDIF): Copied/modified from the Utils.pm library.
|
||||
(isModified): Added this function, thought it might be useful.
|
||||
|
||||
1998-08-03 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* Conn.pm (modifyRDN): Fixed! It also has an option to take an
|
||||
"external" DN as an argument, if supplied.
|
||||
|
||||
1998-08-02 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* Conn.pm (getErrorCode): Now takes two optional arguments, to
|
||||
return the match string, and extra error string. Note that these
|
||||
two arguments are pointers to strings!
|
||||
|
||||
* API.xs(ldap_get_lderrno): Fixed this function, at least it seems
|
||||
to work now...
|
||||
|
||||
* Conn.pm (getLD): Added this function, convenient way to get the
|
||||
LD from the OO layer.
|
||||
|
||||
1998-07-30 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* Conn.pm (modifyRDN): New method, to rename the RDN of the entry.
|
||||
|
||||
* Utils.pm (answer): New function, from LdapUtils.pm.
|
||||
|
||||
* Conn.pm (delete): Fixed references to normalizeDN.
|
||||
|
||||
* Utils.pm (userCredentials): Added this function, to make it easy
|
||||
to get credentials when binding as a user.
|
||||
(normalizeDN): Fixed bugs, because of calling convention...
|
||||
|
||||
* Conn.pm (getError): Fixed bug with passing read-only argument.
|
||||
|
||||
1998-07-29 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* Utils.pm (unixCrypt): Moved from my LdapUtils.pm module.
|
||||
Added askPassword to the export tag.
|
||||
|
||||
* Conn.pm (new): Added support for passing a hash array of all the
|
||||
parameters, as returned by the ldapArgs() function.
|
||||
|
||||
* Utils.pm (str2Scope): New function, for converting strings
|
||||
(subtree) to a numerical scope value (2).
|
||||
(askPassword): Ditto, ask for a password, interactively.
|
||||
(ldapArgs): Ditto, handle common LDAP command line arguments.
|
||||
|
||||
* Makefile.PL: Minor change, to do regex match on OS version for
|
||||
MSWin.
|
||||
|
||||
* Entry.pm: Changed all _XXX hash values to also end with a _,
|
||||
hence making it easier to isolate them (/^_.*_$/).
|
||||
|
||||
* Conn.pm (nextEntry): Changed to accept that the attributes are
|
||||
now arrays, not pointers to arrays. We still consider them as
|
||||
pointers internally though, it's cleaner API.
|
||||
|
||||
* API.pm: Changed to use the native Exporter function to export
|
||||
tags into EXPORT_OK.
|
||||
|
||||
1998-07-22 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* LDIF.pm (readEntry): Moved from my LdapUtils.pm package.
|
||||
|
||||
* Utils.pm (printEntry): Moved from the ::Connection class, and
|
||||
marked it as "obsolete".
|
||||
(encodeBase64): Moved from my LdapUtils.pm package.
|
||||
(decodeBase64): Ditto.
|
||||
|
||||
1240
mozilla/directory/perldap/Conn.pm
Normal file
1240
mozilla/directory/perldap/Conn.pm
Normal file
File diff suppressed because it is too large
Load Diff
1203
mozilla/directory/perldap/Entry.pm
Normal file
1203
mozilla/directory/perldap/Entry.pm
Normal file
File diff suppressed because it is too large
Load Diff
98
mozilla/directory/perldap/INSTALL
Normal file
98
mozilla/directory/perldap/INSTALL
Normal file
@@ -0,0 +1,98 @@
|
||||
PerLDAP installation instructions
|
||||
==================================
|
||||
|
||||
Building this package is fairly straight forward, but requires some
|
||||
knowledge about using compilers and compiler tools on your system. If you
|
||||
are uncomfortable using these tools, we recommend you get one of the
|
||||
prebuilt binary distributions instead.
|
||||
|
||||
|
||||
Prerequisites
|
||||
=============
|
||||
|
||||
In order to build the module, you'll need
|
||||
|
||||
- Perl, version 5.003 or later. We definitely recommend you to use
|
||||
v5.004 or later.
|
||||
|
||||
- An ANSI-C compiler, e.g. gcc-2.x, or Visual C++ 5.0.
|
||||
|
||||
- The LDAP client libraries and include files, e.g. the SDK from
|
||||
Netscape Communications. See the README file for information on
|
||||
retrieving binaries.
|
||||
|
||||
You can download (or CVS checkout) the Directory SDK source, see further
|
||||
information available on
|
||||
|
||||
http://www.mozilla.org/directory/
|
||||
|
||||
and the FAQ at
|
||||
|
||||
http://www.mozilla.org/directory/faq/perldap-faq.html
|
||||
|
||||
|
||||
|
||||
Building
|
||||
========
|
||||
|
||||
This package uses the normal Perl5 MakeMaker installation system. To
|
||||
generate a Makefile appropriate for your platform, run perl on the
|
||||
provided Makefile.PL script, e.g.
|
||||
|
||||
% perl Makefile.PL
|
||||
|
||||
|
||||
You might have to use the command `perl5' or `perl-5.004', depending on
|
||||
how you installed Perl-5. The script will now ask you a few questions to
|
||||
find the necessary library and include files. A typical configuration
|
||||
session is
|
||||
|
||||
data 195% perl5 Makefile.PL
|
||||
|
||||
PerLDAP - Perl 5 Module for LDAP
|
||||
================================
|
||||
Directory containing 'include' and 'lib' directory of the Netscape
|
||||
LDAP Software Developer Kit (default: /usr): /opt/ldapsdk3
|
||||
Using LDAPv3 Developer Kit (default: yes)?
|
||||
Include SSL Support (default: yes)?
|
||||
Libraries to link with (default: -L/opt/pkg/ldapsdk3/lib -lldapssl30):
|
||||
Checking if your kit is complete...
|
||||
Looks good
|
||||
Writing Makefile for Mozilla::LDAP::API
|
||||
|
||||
|
||||
|
||||
The important question is where your LDAP SDK is installed, in the example
|
||||
above the base directory is /opt/ldapsdk3. This directory should have two
|
||||
subdirectories, named "lib" and "include". If you installed the SDK in the
|
||||
standard /usr hierarchy, use the default value as provided by the install
|
||||
script.
|
||||
|
||||
Assuming you get no errors or warning, proceed with the build and install:
|
||||
|
||||
% make
|
||||
% make install
|
||||
|
||||
|
||||
That should be it!
|
||||
|
||||
|
||||
Automated Configuration and Installs
|
||||
====================================
|
||||
|
||||
The Makefile.PL script also honors a set of environment variables to make
|
||||
it possible to do configuration and installs non-interactively. The
|
||||
variables are
|
||||
|
||||
LDAPSDKDIR - Full path to the C SDK base directory
|
||||
LDAPV3ON - Set to "N" to diable LDAP v3 (on by default)
|
||||
LDAPSDKSSL - Set to "N" to disable SSL (SSL is default)
|
||||
|
||||
|
||||
With these variables set, you will not be asked any of the questions above
|
||||
(but it will echo the paramaters). Just run the Makefile.PL script, and
|
||||
finish the build, e.g.
|
||||
|
||||
% perl5 Makefile.PL
|
||||
% make
|
||||
% make install
|
||||
1224
mozilla/directory/perldap/LDIF.pm
Normal file
1224
mozilla/directory/perldap/LDIF.pm
Normal file
File diff suppressed because it is too large
Load Diff
40
mozilla/directory/perldap/MANIFEST
Normal file
40
mozilla/directory/perldap/MANIFEST
Normal file
@@ -0,0 +1,40 @@
|
||||
ChangeLog
|
||||
API.pm
|
||||
API.xs
|
||||
MANIFEST
|
||||
Makefile.PL
|
||||
constant.h
|
||||
oldtest.pl
|
||||
typemap
|
||||
Entry.pm
|
||||
Conn.pm
|
||||
LDIF.pm
|
||||
Utils.pm
|
||||
README
|
||||
INSTALL
|
||||
CREDITS
|
||||
RELEASE
|
||||
MPL-1.0.txt
|
||||
test_api/search.pl
|
||||
test_api/write.pl
|
||||
test_api/api.pl
|
||||
t/conn.pl
|
||||
t/entry.pl
|
||||
t/ChangeLog
|
||||
t/api.t
|
||||
t/conn.t
|
||||
t/entry.t
|
||||
t/ldif.t
|
||||
t/utils.t
|
||||
examples/ChangeLog
|
||||
examples/lfinger.pl
|
||||
examples/qsearch.pl
|
||||
examples/monitor.pl
|
||||
examples/ldappasswd.pl
|
||||
examples/rmentry.pl
|
||||
examples/tabdump.pl
|
||||
examples/modattr.pl
|
||||
examples/rename.pl
|
||||
examples/psoftsync.pl
|
||||
examples/changes2ldif.pl
|
||||
examples/rand_mods.pl
|
||||
360
mozilla/directory/perldap/MPL-1.0.txt
Normal file
360
mozilla/directory/perldap/MPL-1.0.txt
Normal file
@@ -0,0 +1,360 @@
|
||||
MOZILLA PUBLIC LICENSE
|
||||
Version 1.0
|
||||
|
||||
----------------
|
||||
|
||||
1. Definitions.
|
||||
|
||||
1.1. ``Contributor'' means each entity that creates or contributes to
|
||||
the creation of Modifications.
|
||||
|
||||
1.2. ``Contributor Version'' means the combination of the Original
|
||||
Code, prior Modifications used by a Contributor, and the Modifications
|
||||
made by that particular Contributor.
|
||||
|
||||
1.3. ``Covered Code'' means the Original Code or Modifications or the
|
||||
combination of the Original Code and Modifications, in each case
|
||||
including portions thereof.
|
||||
|
||||
1.4. ``Electronic Distribution Mechanism'' means a mechanism generally
|
||||
accepted in the software development community for the electronic
|
||||
transfer of data.
|
||||
|
||||
1.5. ``Executable'' means Covered Code in any form other than Source
|
||||
Code.
|
||||
|
||||
1.6. ``Initial Developer'' means the individual or entity identified as
|
||||
the Initial Developer in the Source Code notice required by Exhibit A.
|
||||
|
||||
1.7. ``Larger Work'' means a work which combines Covered Code or
|
||||
portions thereof with code not governed by the terms of this License.
|
||||
|
||||
1.8. ``License'' means this document.
|
||||
|
||||
1.9. ``Modifications'' means any addition to or deletion from the
|
||||
substance or structure of either the Original Code or any previous
|
||||
Modifications. When Covered Code is released as a series of files, a
|
||||
Modification is:
|
||||
|
||||
A. Any addition to or deletion from the contents of a file
|
||||
containing Original Code or previous Modifications.
|
||||
|
||||
B. Any new file that contains any part of the Original Code or
|
||||
previous Modifications.
|
||||
|
||||
1.10. ``Original Code'' means Source Code of computer software code
|
||||
which is described in the Source Code notice required by Exhibit A as
|
||||
Original Code, and which, at the time of its release under this License
|
||||
is not already Covered Code governed by this License.
|
||||
|
||||
1.11. ``Source Code'' means the preferred form of the Covered Code for
|
||||
making modifications to it, including all modules it contains, plus any
|
||||
associated interface definition files, scripts used to control
|
||||
compilation and installation of an Executable, or a list of source code
|
||||
differential comparisons against either the Original Code or another
|
||||
well known, available Covered Code of the Contributor's choice. The
|
||||
Source Code can be in a compressed or archival form, provided the
|
||||
appropriate decompression or de-archiving software is widely available
|
||||
for no charge.
|
||||
|
||||
1.12. ``You'' means an individual or a legal entity exercising rights
|
||||
under, and complying with all of the terms of, this License or a future
|
||||
version of this License issued under Section 6.1. For legal entities,
|
||||
``You'' includes any entity which controls, is controlled by, or is
|
||||
under common control with You. For purposes of this definition,
|
||||
``control'' means (a) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (b) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares or beneficial ownership of such entity.
|
||||
|
||||
2. Source Code License.
|
||||
|
||||
2.1. The Initial Developer Grant.
|
||||
The Initial Developer hereby grants You a world-wide, royalty-free,
|
||||
non-exclusive license, subject to third party intellectual property
|
||||
claims:
|
||||
|
||||
(a) to use, reproduce, modify, display, perform, sublicense and
|
||||
distribute the Original Code (or portions thereof) with or without
|
||||
Modifications, or as part of a Larger Work; and
|
||||
|
||||
(b) under patents now or hereafter owned or controlled by Initial
|
||||
Developer, to make, have made, use and sell (``Utilize'') the
|
||||
Original Code (or portions thereof), but solely to the extent that
|
||||
any such patent is reasonably necessary to enable You to Utilize
|
||||
the Original Code (or portions thereof) and not to any greater
|
||||
extent that may be necessary to Utilize further Modifications or
|
||||
combinations.
|
||||
|
||||
2.2. Contributor Grant.
|
||||
Each Contributor hereby grants You a world-wide, royalty-free,
|
||||
non-exclusive license, subject to third party intellectual property
|
||||
claims:
|
||||
|
||||
(a) to use, reproduce, modify, display, perform, sublicense and
|
||||
distribute the Modifications created by such Contributor (or
|
||||
portions thereof) either on an unmodified basis, with other
|
||||
Modifications, as Covered Code or as part of a Larger Work; and
|
||||
|
||||
(b) under patents now or hereafter owned or controlled by
|
||||
Contributor, to Utilize the Contributor Version (or portions
|
||||
thereof), but solely to the extent that any such patent is
|
||||
reasonably necessary to enable You to Utilize the Contributor
|
||||
Version (or portions thereof), and not to any greater extent that
|
||||
may be necessary to Utilize further Modifications or combinations.
|
||||
|
||||
3. Distribution Obligations.
|
||||
|
||||
3.1. Application of License.
|
||||
The Modifications which You create or to which You contribute are
|
||||
governed by the terms of this License, including without limitation
|
||||
Section 2.2. The Source Code version of Covered Code may be distributed
|
||||
only under the terms of this License or a future version of this
|
||||
License released under Section 6.1, and You must include a copy of this
|
||||
License with every copy of the Source Code You distribute. You may not
|
||||
offer or impose any terms on any Source Code version that alters or
|
||||
restricts the applicable version of this License or the recipients'
|
||||
rights hereunder. However, You may include an additional document
|
||||
offering the additional rights described in Section 3.5.
|
||||
|
||||
3.2. Availability of Source Code.
|
||||
Any Modification which You create or to which You contribute must be
|
||||
made available in Source Code form under the terms of this License
|
||||
either on the same media as an Executable version or via an accepted
|
||||
Electronic Distribution Mechanism to anyone to whom you made an
|
||||
Executable version available; and if made available via Electronic
|
||||
Distribution Mechanism, must remain available for at least twelve (12)
|
||||
months after the date it initially became available, or at least six
|
||||
(6) months after a subsequent version of that particular Modification
|
||||
has been made available to such recipients. You are responsible for
|
||||
ensuring that the Source Code version remains available even if the
|
||||
Electronic Distribution Mechanism is maintained by a third party.
|
||||
|
||||
3.3. Description of Modifications.
|
||||
You must cause all Covered Code to which you contribute to contain a
|
||||
file documenting the changes You made to create that Covered Code and
|
||||
the date of any change. You must include a prominent statement that the
|
||||
Modification is derived, directly or indirectly, from Original Code
|
||||
provided by the Initial Developer and including the name of the Initial
|
||||
Developer in (a) the Source Code, and (b) in any notice in an
|
||||
Executable version or related documentation in which You describe the
|
||||
origin or ownership of the Covered Code.
|
||||
|
||||
3.4. Intellectual Property Matters
|
||||
|
||||
(a) Third Party Claims.
|
||||
If You have knowledge that a party claims an intellectual property
|
||||
right in particular functionality or code (or its utilization
|
||||
under this License), you must include a text file with the source
|
||||
code distribution titled ``LEGAL'' which describes the claim and
|
||||
the party making the claim in sufficient detail that a recipient
|
||||
will know whom to contact. If you obtain such knowledge after You
|
||||
make Your Modification available as described in Section 3.2, You
|
||||
shall promptly modify the LEGAL file in all copies You make
|
||||
available thereafter and shall take other steps (such as notifying
|
||||
appropriate mailing lists or newsgroups) reasonably calculated to
|
||||
inform those who received the Covered Code that new knowledge has
|
||||
been obtained.
|
||||
|
||||
(b) Contributor APIs.
|
||||
If Your Modification is an application programming interface and
|
||||
You own or control patents which are reasonably necessary to
|
||||
implement that API, you must also include this information in the
|
||||
LEGAL file.
|
||||
|
||||
3.5. Required Notices.
|
||||
You must duplicate the notice in Exhibit A in each file of the Source
|
||||
Code, and this License in any documentation for the Source Code, where
|
||||
You describe recipients' rights relating to Covered Code. If You
|
||||
created one or more Modification(s), You may add your name as a
|
||||
Contributor to the notice described in Exhibit A. If it is not possible
|
||||
to put such notice in a particular Source Code file due to its
|
||||
structure, then you must include such notice in a location (such as a
|
||||
relevant directory file) where a user would be likely to look for such
|
||||
a notice. You may choose to offer, and to charge a fee for, warranty,
|
||||
support, indemnity or liability obligations to one or more recipients
|
||||
of Covered Code. However, You may do so only on Your own behalf, and
|
||||
not on behalf of the Initial Developer or any Contributor. You must
|
||||
make it absolutely clear than any such warranty, support, indemnity or
|
||||
liability obligation is offered by You alone, and You hereby agree to
|
||||
indemnify the Initial Developer and every Contributor for any liability
|
||||
incurred by the Initial Developer or such Contributor as a result of
|
||||
warranty, support, indemnity or liability terms You offer.
|
||||
|
||||
3.6. Distribution of Executable Versions.
|
||||
You may distribute Covered Code in Executable form only if the
|
||||
requirements of Section 3.1-3.5 have been met for that Covered Code,
|
||||
and if You include a notice stating that the Source Code version of the
|
||||
Covered Code is available under the terms of this License, including a
|
||||
description of how and where You have fulfilled the obligations of
|
||||
Section 3.2. The notice must be conspicuously included in any notice in
|
||||
an Executable version, related documentation or collateral in which You
|
||||
describe recipients' rights relating to the Covered Code. You may
|
||||
distribute the Executable version of Covered Code under a license of
|
||||
Your choice, which may contain terms different from this License,
|
||||
provided that You are in compliance with the terms of this License and
|
||||
that the license for the Executable version does not attempt to limit
|
||||
or alter the recipient's rights in the Source Code version from the
|
||||
rights set forth in this License. If You distribute the Executable
|
||||
version under a different license You must make it absolutely clear
|
||||
that any terms which differ from this License are offered by You alone,
|
||||
not by the Initial Developer or any Contributor. You hereby agree to
|
||||
indemnify the Initial Developer and every Contributor for any liability
|
||||
incurred by the Initial Developer or such Contributor as a result of
|
||||
any such terms You offer.
|
||||
|
||||
3.7. Larger Works.
|
||||
You may create a Larger Work by combining Covered Code with other code
|
||||
not governed by the terms of this License and distribute the Larger
|
||||
Work as a single product. In such a case, You must make sure the
|
||||
requirements of this License are fulfilled for the Covered Code.
|
||||
|
||||
4. Inability to Comply Due to Statute or Regulation.
|
||||
|
||||
If it is impossible for You to comply with any of the terms of this
|
||||
License with respect to some or all of the Covered Code due to statute
|
||||
or regulation then You must: (a) comply with the terms of this License
|
||||
to the maximum extent possible; and (b) describe the limitations and
|
||||
the code they affect. Such description must be included in the LEGAL
|
||||
file described in Section 3.4 and must be included with all
|
||||
distributions of the Source Code. Except to the extent prohibited by
|
||||
statute or regulation, such description must be sufficiently detailed
|
||||
for a recipient of ordinary skill to be able to understand it.
|
||||
|
||||
5. Application of this License.
|
||||
|
||||
This License applies to code to which the Initial Developer has
|
||||
attached the notice in Exhibit A, and to related Covered Code.
|
||||
|
||||
6. Versions of the License.
|
||||
|
||||
6.1. New Versions.
|
||||
Netscape Communications Corporation (``Netscape'') may publish revised
|
||||
and/or new versions of the License from time to time. Each version will
|
||||
be given a distinguishing version number.
|
||||
|
||||
6.2. Effect of New Versions.
|
||||
Once Covered Code has been published under a particular version of the
|
||||
License, You may always continue to use it under the terms of that
|
||||
version. You may also choose to use such Covered Code under the terms
|
||||
of any subsequent version of the License published by Netscape. No one
|
||||
other than Netscape has the right to modify the terms applicable to
|
||||
Covered Code created under this License.
|
||||
|
||||
6.3. Derivative Works.
|
||||
If you create or use a modified version of this License (which you may
|
||||
only do in order to apply it to code which is not already Covered Code
|
||||
governed by this License), you must (a) rename Your license so that the
|
||||
phrases ``Mozilla'', ``MOZILLAPL'', ``MOZPL'', ``Netscape'', ``NPL'' or
|
||||
any confusingly similar phrase do not appear anywhere in your license
|
||||
and (b) otherwise make it clear that your version of the license
|
||||
contains terms which differ from the Mozilla Public License and
|
||||
Netscape Public License. (Filling in the name of the Initial Developer,
|
||||
Original Code or Contributor in the notice described in Exhibit A shall
|
||||
not of themselves be deemed to be modifications of this License.)
|
||||
|
||||
7. DISCLAIMER OF WARRANTY.
|
||||
|
||||
COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN ``AS IS'' BASIS,
|
||||
WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
|
||||
WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF
|
||||
DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING.
|
||||
THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE
|
||||
IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT,
|
||||
YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE
|
||||
COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER
|
||||
OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF
|
||||
ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
|
||||
|
||||
8. TERMINATION.
|
||||
|
||||
This License and the rights granted hereunder will terminate
|
||||
automatically if You fail to comply with terms herein and fail to cure
|
||||
such breach within 30 days of becoming aware of the breach. All
|
||||
sublicenses to the Covered Code which are properly granted shall
|
||||
survive any termination of this License. Provisions which, by their
|
||||
nature, must remain in effect beyond the termination of this License
|
||||
shall survive.
|
||||
|
||||
9. LIMITATION OF LIABILITY.
|
||||
|
||||
UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT
|
||||
(INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL THE INITIAL
|
||||
DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE,
|
||||
OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO YOU OR ANY OTHER
|
||||
PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
|
||||
OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF
|
||||
GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND
|
||||
ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE
|
||||
BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF
|
||||
LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY
|
||||
RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW
|
||||
PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE
|
||||
EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THAT
|
||||
EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU.
|
||||
|
||||
10. U.S. GOVERNMENT END USERS.
|
||||
|
||||
The Covered Code is a ``commercial item,'' as that term is defined in
|
||||
48 C.F.R. 2.101 (Oct. 1995), consisting of ``commercial computer
|
||||
software'' and ``commercial computer software documentation,'' as such
|
||||
terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48
|
||||
C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995),
|
||||
all U.S. Government End Users acquire Covered Code with only those
|
||||
rights set forth herein.
|
||||
|
||||
11. MISCELLANEOUS.
|
||||
|
||||
This License represents the complete agreement concerning subject
|
||||
matter hereof. If any provision of this License is held to be
|
||||
unenforceable, such provision shall be reformed only to the extent
|
||||
necessary to make it enforceable. This License shall be governed by
|
||||
California law provisions (except to the extent applicable law, if any,
|
||||
provides otherwise), excluding its conflict-of-law provisions. With
|
||||
respect to disputes in which at least one party is a citizen of, or an
|
||||
entity chartered or registered to do business in, the United States of
|
||||
America: (a) unless otherwise agreed in writing, all disputes relating
|
||||
to this License (excepting any dispute relating to intellectual
|
||||
property rights) shall be subject to final and binding arbitration,
|
||||
with the losing party paying all costs of arbitration; (b) any
|
||||
arbitration relating to this Agreement shall be held in Santa Clara
|
||||
County, California, under the auspices of JAMS/EndDispute; and (c) any
|
||||
litigation relating to this Agreement shall be subject to the
|
||||
jurisdiction of the Federal Courts of the Northern District of
|
||||
California, with venue lying in Santa Clara County, California, with
|
||||
the losing party responsible for costs, including without limitation,
|
||||
court costs and reasonable attorneys fees and expenses. The application
|
||||
of the United Nations Convention on Contracts for the International
|
||||
Sale of Goods is expressly excluded. Any law or regulation which
|
||||
provides that the language of a contract shall be construed against the
|
||||
drafter shall not apply to this License.
|
||||
|
||||
12. RESPONSIBILITY FOR CLAIMS.
|
||||
|
||||
Except in cases where another Contributor has failed to comply with
|
||||
Section 3.4, You are responsible for damages arising, directly or
|
||||
indirectly, out of Your utilization of rights under this License, based
|
||||
on the number of copies of Covered Code you made available, the
|
||||
revenues you received from utilizing such rights, and other relevant
|
||||
factors. You agree to work with affected parties to distribute
|
||||
responsibility on an equitable basis.
|
||||
|
||||
EXHIBIT A.
|
||||
|
||||
``The contents of this file are subject to the Mozilla Public License
|
||||
Version 1.0 (the "License"); you may not use this file except in
|
||||
compliance with the License. You may obtain a copy of the License at
|
||||
http://www.mozilla.org/MPL/
|
||||
|
||||
Software distributed under the License is distributed on an "AS IS"
|
||||
basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
|
||||
License for the specific language governing rights and limitations
|
||||
under the License.
|
||||
|
||||
The Original Code is ______________________________________.
|
||||
|
||||
The Initial Developer of the Original Code is ________________________.
|
||||
Portions created by ______________________ are Copyright (C) ______
|
||||
_______________________. All Rights Reserved.
|
||||
|
||||
Contributor(s): ______________________________________.''
|
||||
194
mozilla/directory/perldap/Makefile.PL
Normal file
194
mozilla/directory/perldap/Makefile.PL
Normal file
@@ -0,0 +1,194 @@
|
||||
#############################################################################
|
||||
# $Id: Makefile.PL,v 1.15 1999-08-24 22:30:46 leif%netscape.com Exp $
|
||||
#
|
||||
# The contents of this file are subject to the Mozilla Public License
|
||||
# Version 1.0 (the "License"); you may not use this file except in
|
||||
# compliance with the License. You may obtain a copy of the License at
|
||||
# http://www.mozilla.org/MPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS IS"
|
||||
# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing rights and limitations
|
||||
# under the License.
|
||||
#
|
||||
# The Original Code is PerLDAP. The Initial Developer of the Original
|
||||
# Code is Netscape Communications Corp. and Clayton Donley. Portions
|
||||
# created by Netscape are Copyright (C) Netscape Communications
|
||||
# Corp., portions created by Clayton Donley are Copyright (C) Clayton
|
||||
# Donley. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
#
|
||||
# DESCRIPTION
|
||||
# The Makefile "source".
|
||||
#
|
||||
#############################################################################
|
||||
|
||||
use ExtUtils::MakeMaker;
|
||||
use Config;
|
||||
use Carp;
|
||||
|
||||
$perlpath = $Config{'perlpath'};
|
||||
$osname = $Config{'osname'};
|
||||
|
||||
$ldapsdk_loc = $ENV{"LDAPSDKDIR"}; # Full Path to C SDK Top-Level
|
||||
$ldapsdk_ssl = $ENV{"LDAPSDKSSL"}; # N to exclude SSL
|
||||
$ldapsdk_ver = $ENV{"LDAPV3ON"}; # N to exclude LDAP v3 features
|
||||
|
||||
$libexts = "so|sl|a|lib";
|
||||
|
||||
|
||||
print "\nPerLDAP - Perl 5 Module for LDAP\n";
|
||||
print "================================\n";
|
||||
|
||||
$silent = 1;
|
||||
print "Directory containing 'include' and 'lib' directory of the Netscape\n";
|
||||
print "LDAP Software Developer Kit (default: /usr): ";
|
||||
if (!$ldapsdk_loc)
|
||||
{
|
||||
$silent = 0;
|
||||
chomp ($ldapsdk_loc = <STDIN>);
|
||||
$ldapsdk_loc = "/usr" unless $ldapsdk_loc =~ /\S/;
|
||||
} else {
|
||||
print "$ldapsdk_loc\n";
|
||||
}
|
||||
croak("Directory $ldapsdk_loc does not exist!") unless -d $ldapsdk_loc;
|
||||
|
||||
if ($osname =~ /mswin/i)
|
||||
{
|
||||
$dir_sep = "\\";
|
||||
} else {
|
||||
$dir_sep = "/";
|
||||
}
|
||||
|
||||
$include_ldap = $ldapsdk_loc . $dir_sep . "include";
|
||||
$lib_ldap = $ldapsdk_loc . $dir_sep . "lib";
|
||||
|
||||
print "Using LDAPv3 Developer Kit (default: yes)? ";
|
||||
if (!$ldapsdk_ver)
|
||||
{
|
||||
$silent = 0;
|
||||
chomp ($ldapsdk_ver = <STDIN>);
|
||||
} else {
|
||||
print "YES\n";
|
||||
}
|
||||
$v3_def = "-DLDAPV3" unless ($ldapsdk_ver =~ /^n/i);
|
||||
|
||||
|
||||
print "Include SSL Support (default: yes)? ";
|
||||
if (!$ldapsdk_ssl)
|
||||
{
|
||||
$silent = 0;
|
||||
chomp ($ldapsdk_ssl = <STDIN>);
|
||||
} else {
|
||||
print "YES\n";
|
||||
}
|
||||
$ssl_def = "-DUSE_SSL" unless ($ldapsdk_ssl =~ /^n/i);
|
||||
|
||||
|
||||
opendir(DIR,$lib_ldap);
|
||||
@files = grep{/ldap|lber/} readdir(DIR);
|
||||
closedir(DIR);
|
||||
|
||||
if (!((@ldaplib = grep{/ldapssl.*\.($libexts)$/} @files) && $ssl_def))
|
||||
{
|
||||
@ldaplib = grep{/ldap.*\.($libexts)$/} @files;
|
||||
@lberlib = grep{/lber.*\.($libexts)$/} @files;
|
||||
}
|
||||
|
||||
if ($#ldaplib < 0)
|
||||
{
|
||||
die "No LDAP libraries found.";
|
||||
}
|
||||
|
||||
if ($#ldaplib > 0)
|
||||
{
|
||||
print "Located multiple libraries:\n";
|
||||
foreach $alib (@ldaplib)
|
||||
{
|
||||
print " - $alib\n";
|
||||
}
|
||||
}
|
||||
|
||||
$lline_ldap = $ldaplib[0];
|
||||
$lline_ldap =~ s/^lib//;
|
||||
$lline_ldap =~ s/\.($libexts)$//;
|
||||
$lline = "-L$lib_ldap -l$lline_ldap";
|
||||
|
||||
if ($#lberlib >= 0 && $lline =~ /ldap$/)
|
||||
{
|
||||
$lline_lber = $lberlib[0];
|
||||
$lline_lber =~ s/^lib//;
|
||||
$lline_lber =~ s/\.($libexts)$//;
|
||||
$lline .= " -l$lline_lber";
|
||||
}
|
||||
|
||||
print "Libraries to link with (default: $lline): ";
|
||||
if (!$silent)
|
||||
{
|
||||
chomp ($lib_line = <STDIN>);
|
||||
$lib_line = $lline unless $lib_line =~ /\S/;
|
||||
} else {
|
||||
print "\n";
|
||||
}
|
||||
|
||||
|
||||
# Include directories etc.
|
||||
$my_includes = "";
|
||||
$my_includes .= " -I$include_ldap" unless ($include_ldap eq "/usr/include");
|
||||
|
||||
|
||||
# Add system dependant stuff here...
|
||||
@extras = ();
|
||||
if ($osname =~ /mswin/i)
|
||||
{
|
||||
$my_extlib = "$lib_ldap\\$ldaplib[0]";
|
||||
$my_extlib .= " $lib_ldap\\$lberlib[0]" if $lber_lib;
|
||||
push(@extras, 'dynamic_lib' => {
|
||||
'OTHERLDFLAGS' => "kernel32.lib oldnames.lib" });
|
||||
} else {
|
||||
$my_extlib = "";
|
||||
}
|
||||
|
||||
push(@extras,
|
||||
CAPI => 'TRUE')
|
||||
if ($] >= 5.005 and $^O eq 'MSWin32'
|
||||
and $Config{archname} =~ /-object\b/i);
|
||||
|
||||
push(@extras,
|
||||
ABSTRACT => 'Perl methods for LDAP C API calls',
|
||||
AUTHOR => 'Netscape Communications Corp., Inc. and Clayton Donley')
|
||||
if ($] >= 5.005);
|
||||
|
||||
#
|
||||
# Ok, let's do it!
|
||||
#
|
||||
WriteMakefile(
|
||||
'NAME' => 'Mozilla::LDAP::API',
|
||||
'DISTNAME' => 'PerLDAP',
|
||||
'VERSION_FROM' => 'API.pm',
|
||||
'INC' => $my_includes,
|
||||
'LIBS' => [$lib_line],
|
||||
'MYEXTLIB' => $my_extlib,
|
||||
'DEFINE' => "$v3_def $ssl_def",
|
||||
'XSOPT' => "-nolinenumbers",
|
||||
@extras
|
||||
);
|
||||
|
||||
|
||||
#
|
||||
# Generate a "make HTML" target
|
||||
#
|
||||
sub MY::postamble
|
||||
{
|
||||
'
|
||||
.SUFFIXES: .pm .html
|
||||
.PHONY: html
|
||||
|
||||
.pm.html:
|
||||
pod2html --netscape $< > $@
|
||||
|
||||
html: Entry.html Conn.html Utils.html API.html LDIF.html $(FIRST_MAKEFILE)
|
||||
@rm -f pod2html-itemcache pod2html-dircache
|
||||
'
|
||||
}
|
||||
131
mozilla/directory/perldap/README
Normal file
131
mozilla/directory/perldap/README
Normal file
@@ -0,0 +1,131 @@
|
||||
#############################################################################
|
||||
# #
|
||||
# PerLDAP v1.4 - A Perl Developers' Kit for LDAP #
|
||||
# #
|
||||
#############################################################################
|
||||
|
||||
|
||||
What is PerLDAP?
|
||||
================
|
||||
|
||||
PerLDAP is a set of modules written in Perl and C that allow developers to
|
||||
leverage their existing Perl knowledge to easily access and manage LDAP-
|
||||
enabled directories. PerLDAP makes it very easy to search, add, delete,
|
||||
and modify directory entries. For example, Perl developers can easily
|
||||
build web applications to access information stored in a directory or
|
||||
create directory sync tools between directories and other services.
|
||||
|
||||
PerLDAP is an open source development project, the result of a joint effort
|
||||
between Netscape and Clayton Donley, an open source developer. PerLDAP
|
||||
currently provides the basic functions to allow Perl users to access and
|
||||
manipulate directories easily. Based on developer feedback and
|
||||
involvement, PerLDAP will continue to evolve to include additional
|
||||
functionality in future releases.
|
||||
|
||||
|
||||
Compiling the PerLDAP Sources
|
||||
=============================
|
||||
|
||||
The source to PerLDAP is available on the Mozilla site at:
|
||||
|
||||
http://www.mozilla.org/directory/
|
||||
|
||||
You can either retrieve the .tar/zip file with the source distribution, or
|
||||
use CVS to checkout the module directly. The name of the CVS module is
|
||||
PerLDAP, and it checks out the directory
|
||||
|
||||
mozilla/directory/perldap
|
||||
|
||||
Further instructions for using CVS and Mozilla is available at
|
||||
|
||||
http://www.mozilla.org/cvs.html
|
||||
|
||||
and an FAQ for PerLDAP is at
|
||||
|
||||
http://www.mozilla.org/directory/faq/perldap-faq.html
|
||||
|
||||
|
||||
Instructions for building the source can be found in the INSTALL file
|
||||
in the source distribution. The latest stable release of PerLDAP is
|
||||
v1.4, the next version is planned to be v2.0 (development continues on the
|
||||
v1.9 development branch).
|
||||
|
||||
|
||||
Getting Started
|
||||
===============
|
||||
|
||||
Documentation for this module is in standard Perl 'pod' format. HTML
|
||||
versions of this documentation can also be found on the Netscape DevEdge
|
||||
site at: http://developer.netscape.com/tech/directory/.
|
||||
|
||||
Additionally, many good examples can be found in the 'examples' directory.
|
||||
|
||||
|
||||
Modules and Examples Included
|
||||
=============================
|
||||
|
||||
Mozilla::LDAP::API - Low level interface between Perl and the LDAP C API
|
||||
Mozilla::LDAP::Entry - Perl methods for manipulating entry objects
|
||||
Mozilla::LDAP::Conn - Perl methods for performing LDAP operations
|
||||
Mozilla::LDAP::LDIF - Perl methods for utilizing LDIF
|
||||
Mozilla::LDAP::Utils - Some convenient LDAP related utilities
|
||||
test_api/search.pl - Tests low level API search calls
|
||||
test_api/write.pl - Tests low level API write calls
|
||||
test_api/api.pl - Tests ALL low level LDAPv2 calls
|
||||
examples/lfinger.pl - LDAP version of the regular Unix finger command.
|
||||
examples/qsearch.pl - Simple ldapsearch replacement.
|
||||
examples/monitor.pl - Retrieve status information from an LDAP server.
|
||||
examples/ldappasswd.pl - Change the LDAP password for a user.
|
||||
examples/rmentry.pl - Remove an entire entry from the database.
|
||||
examples/rename.pl - Rename (modRDN) an entry.
|
||||
examples/tabdump.pl - Dump LDAP information into a tab separated file.
|
||||
examples/psoftsync.pl - Synchronize LDAP with a PeopleSoft "dump" file.
|
||||
|
||||
|
||||
All examples support the "standard" LDAP command line options, which are
|
||||
|
||||
-h hostname LDAP server name
|
||||
-p port # LDAP port, default is 389 (or 636 for SSL)
|
||||
-b base DN LDAP Base-DN
|
||||
-D bind DN LDAP bind DN (connect to server as this "user")
|
||||
-w bind pswd Password to bind to the server
|
||||
-P certfile Use SSL, with the publick keys from this file
|
||||
|
||||
|
||||
Note that the examples currently only support Simple Authentication
|
||||
(passwords), the Client Authentication features (using certificates) will
|
||||
be used in the next release. All examples also honors the environment
|
||||
variable LDAP_BASEDN, set it to your systems base DN, e.g.
|
||||
|
||||
% setenv LDAP_BASEDN 'dc=netscape,dc=com'
|
||||
|
||||
or for Bourne shell
|
||||
|
||||
# LDAP_BASEDN='dc=netscape,dc=com'; export LDAP_BASEDN
|
||||
|
||||
|
||||
Reporting problems and bugs
|
||||
===========================
|
||||
|
||||
Address all bug reports and comments to the Mozilla newsgroups at:
|
||||
|
||||
news://news.mozilla.org/netscape.public.mozilla.directory
|
||||
|
||||
|
||||
License/Copyright
|
||||
=================
|
||||
|
||||
Portions by Netscape (c) Copyright 1998 Netscape Communications Corp, Inc.
|
||||
Portions by Clayton Donley (c) Copyright 1998 Clayton Donley
|
||||
|
||||
Please read the MPL-1.0.txt file included for information on the Mozilla
|
||||
Public License, which covers all files in this distribution.
|
||||
|
||||
Known Bugs
|
||||
==========
|
||||
|
||||
There are a number of issues still outstanding at the time of release. Most
|
||||
of these are already in the process of being resolved.
|
||||
|
||||
- The Rebind operation on NT does NOT work properly when set to a Perl
|
||||
function. This is being investigated.
|
||||
79
mozilla/directory/perldap/RELEASE
Normal file
79
mozilla/directory/perldap/RELEASE
Normal file
@@ -0,0 +1,79 @@
|
||||
#############################################################################
|
||||
# #
|
||||
# PerLDAP Release Notes #
|
||||
# #
|
||||
#############################################################################
|
||||
|
||||
VERSION 1.4 - AUGUST 18, 1999
|
||||
=============================
|
||||
|
||||
This is primarily a bug fix release, however there are 5 new methods
|
||||
introduced as well. Brief descriptions follow in this document. To get
|
||||
full examples and a larger summary, see the PerLDAP Programmer's Guide.
|
||||
|
||||
|
||||
New Methods Added
|
||||
-----------------
|
||||
|
||||
Entry.pm:
|
||||
* getValues() - returns the array of values.
|
||||
* move() - move one attribute to another, and delete the original.
|
||||
* copy() - copy one attribute to another.
|
||||
|
||||
Conn.pm:
|
||||
* browse() - makes it easy to browse an entry.
|
||||
* compare() - compare an attribute value against a DN/entry
|
||||
without having to do the search.
|
||||
|
||||
|
||||
Bug Fixes and other changes
|
||||
---------------------------
|
||||
|
||||
Entry.pm:
|
||||
* addDNValue() - fixed wrong index for norm.
|
||||
* matchValue() - fixed missing normalization in half of case statement.
|
||||
* setValue() - remove _delete_ flag if set, fix for saving state.
|
||||
* STORE - fixed not ignoring the internal instance variables properly.
|
||||
* Fixed numerous bugs for large attribute sets.
|
||||
* Fixed bug 4368 ("exists vs. EXISTS").
|
||||
* Fixed several loop bugs.
|
||||
* Removed all _self_obj_ references, it's obsolete in this
|
||||
version.
|
||||
* We support each() and keys() now on the Entry object, to loop
|
||||
through all attribute names (types).
|
||||
|
||||
|
||||
Conn.pm:
|
||||
* close() - fixed memory leak.
|
||||
* modifyRDN() - fixed problem where we weren't updating the
|
||||
appropriate DN in the self object.
|
||||
* Fixed bug 3342 (problems adding entries with binary data).
|
||||
* getErrorCode()/getErrorString() - return LDAP_SUCCESS if no
|
||||
LDAP connection handle.
|
||||
* add() - fixed code to handle hash array as docs indicate.
|
||||
* update() - optimization for "replace" vs "add/delete", we try to
|
||||
use whatever LDAPMod is most efficient.
|
||||
|
||||
LDIF.pm:
|
||||
|
||||
* Complete rewrite, by John Kristian <kristian@netscape.com>.
|
||||
|
||||
API.xs:
|
||||
* Fixed memory allocation problems, replacing all memory management
|
||||
routines. This solves all known issues with ActiveState Perl.
|
||||
* More safety checks around calls to *_free().
|
||||
|
||||
|
||||
Miscellaneous
|
||||
-------------
|
||||
|
||||
* Various other optimizations on tests and such.
|
||||
* Fixed most (all?) known memory leaks.
|
||||
* Fixed a lot of problems with Makefile.PL, adding some new targets
|
||||
(like "make html"). Add a skeleton to "make test".
|
||||
* Fixed numerous small bugs, as reported to Mozilla.
|
||||
* We produce less warnings now, and try to "use strict" when
|
||||
appropriate.
|
||||
* We have a new versioning scheme, conforming to standard
|
||||
Perl. We'll change this again when Perl's new versioning system
|
||||
is in place (allowing versions like 1.2.3).
|
||||
387
mozilla/directory/perldap/Utils.pm
Normal file
387
mozilla/directory/perldap/Utils.pm
Normal file
@@ -0,0 +1,387 @@
|
||||
#############################################################################
|
||||
# $Id: Utils.pm,v 1.13 1999-08-24 22:30:48 leif%netscape.com Exp $
|
||||
#
|
||||
# The contents of this file are subject to the Mozilla Public License
|
||||
# Version 1.0 (the "License"); you may not use this file except in
|
||||
# compliance with the License. You may obtain a copy of the License at
|
||||
# http://www.mozilla.org/MPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS IS"
|
||||
# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing rights and limitations
|
||||
# under the License.
|
||||
#
|
||||
# The Original Code is PerLDAP. The Initial Developer of the Original
|
||||
# Code is Netscape Communications Corp. and Clayton Donley. Portions
|
||||
# created by Netscape are Copyright (C) Netscape Communications
|
||||
# Corp., portions created by Clayton Donley are Copyright (C) Clayton
|
||||
# Donley. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
#
|
||||
# DESCRIPTION
|
||||
# Lots of Useful Little Utilities, for LDAP related operations.
|
||||
#
|
||||
#############################################################################
|
||||
|
||||
package Mozilla::LDAP::Utils;
|
||||
|
||||
use Mozilla::LDAP::API 1.4 qw(:constant);
|
||||
use Mozilla::LDAP::Conn;
|
||||
use Exporter;
|
||||
|
||||
use strict;
|
||||
use vars qw($VERSION @ISA %EXPORT_TAGS);
|
||||
|
||||
@ISA = qw(Exporter);
|
||||
$VERSION = "1.4";
|
||||
|
||||
%EXPORT_TAGS = (
|
||||
all => [qw(normalizeDN
|
||||
isUrl
|
||||
printEntry
|
||||
printentry
|
||||
encodeBase64
|
||||
decodeBase64
|
||||
str2Scope
|
||||
askPassword
|
||||
ldapArgs
|
||||
unixCrypt
|
||||
userCredentials
|
||||
answer)]
|
||||
);
|
||||
|
||||
|
||||
# Add Everything in %EXPORT_TAGS to @EXPORT_OK
|
||||
Exporter::export_ok_tags('all');
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Normalize the DN string (first argument), and return the new, normalized,
|
||||
# string (DN). This is useful to make sure that two syntactically
|
||||
# identical DNs compare (eq) as the same string.
|
||||
#
|
||||
sub normalizeDN
|
||||
{
|
||||
my ($dn) = @_;
|
||||
my (@vals);
|
||||
|
||||
return "" unless (defined($dn) && ($dn ne ""));
|
||||
|
||||
@vals = Mozilla::LDAP::API::ldap_explode_dn(lc $dn, 0);
|
||||
|
||||
return join(",", @vals);
|
||||
}
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Checks if a string is a properly formed LDAP URL.
|
||||
#
|
||||
sub isURL
|
||||
{
|
||||
return ldap_is_ldap_url($_[0]);
|
||||
}
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Print an entry, in LDIF format. This is sort of obsolete, we encourage
|
||||
# you to use the :;LDAP::LDIF class instead.
|
||||
#
|
||||
sub printEntry
|
||||
{
|
||||
my $entry = $_[0];
|
||||
my ($attr);
|
||||
|
||||
local $_;
|
||||
|
||||
print "dn: ", $entry->{"dn"},"\n";
|
||||
foreach $attr (@{$entry->{"_oc_order_"}})
|
||||
{
|
||||
next if ($attr =~ /^_.+_$/);
|
||||
next if $entry->{"_${attr}_deleted_"};
|
||||
foreach (@{$entry->{$attr}})
|
||||
{
|
||||
print "$attr: $_\n";
|
||||
}
|
||||
}
|
||||
|
||||
print "\n";
|
||||
}
|
||||
*printentry = \*printEntry;
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Perform Base64 encoding, this is based on MIME::Base64.pm, written
|
||||
# by Gisle Aas <gisle@aas.no>. If possible, use the MIME:: package instead.
|
||||
#
|
||||
sub encodeBase64
|
||||
{
|
||||
my ($res) = "";
|
||||
my ($eol) = "$_[1]";
|
||||
my ($padding);
|
||||
|
||||
pos($_[0]) = 0; # ensure start at the beginning
|
||||
while ($_[0] =~ /(.{1,45})/gs) {
|
||||
$res .= substr(pack('u', $1), 1);
|
||||
chop($res);
|
||||
}
|
||||
|
||||
$res =~ tr|` -_|AA-Za-z0-9+/|; # `# help emacs
|
||||
$padding = (3 - length($_[0]) % 3) % 3;
|
||||
$res =~ s/.{$padding}$/'=' x $padding/e if $padding;
|
||||
|
||||
if (length $eol) {
|
||||
$res =~ s/(.{1,76})/$1$eol/g;
|
||||
}
|
||||
|
||||
return $res;
|
||||
}
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Perform Base64 decoding, this is based on MIME::Base64.pm, written
|
||||
# by Gisle Aas <gisle@aas.no>. If possible, use the MIME:: package instead.
|
||||
#
|
||||
sub decodeBase64
|
||||
{
|
||||
my ($str) = shift;
|
||||
my ($res) = "";
|
||||
my ($len);
|
||||
|
||||
$str =~ tr|A-Za-z0-9+=/||cd;
|
||||
Carp::croak("Base64 decoder requires string length to be a multiple of 4")
|
||||
if length($str) % 4;
|
||||
|
||||
$str =~ s/=+$//; # remove padding
|
||||
$str =~ tr|A-Za-z0-9+/| -_|; # convert to uuencoded format
|
||||
while ($str =~ /(.{1,60})/gs)
|
||||
{
|
||||
$len = chr(32 + length($1)*3/4);
|
||||
$res .= unpack("u", $len . $1 ); # uudecode
|
||||
}
|
||||
|
||||
return $res;
|
||||
}
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Convert a "human" readable string to an LDAP scope value
|
||||
#
|
||||
sub str2Scope
|
||||
{
|
||||
my ($str) = $_[0];
|
||||
|
||||
return $str if ($str =~ /^[0-9]+$/);
|
||||
|
||||
if ($str =~ /^sub/i)
|
||||
{
|
||||
return LDAP_SCOPE_SUBTREE;
|
||||
}
|
||||
elsif ($str =~ /^base/i)
|
||||
{
|
||||
return LDAP_SCOPE_BASE;
|
||||
}
|
||||
elsif ($str =~ /^one/i)
|
||||
{
|
||||
return LDAP_SCOPE_ONELEVEL;
|
||||
}
|
||||
|
||||
# Default...
|
||||
return LDAP_SCOPE_SUBTREE;
|
||||
}
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Ask for a password, without displaying it on the TTY.
|
||||
#
|
||||
sub askPassword
|
||||
{
|
||||
my ($prompt) = $_[0];
|
||||
my ($hasReadKey) = 0;
|
||||
|
||||
eval "use Term::ReadKey";
|
||||
$hasReadKey=1 unless ($@);
|
||||
|
||||
print "LDAP password: " if $prompt;
|
||||
if ($hasReadKey)
|
||||
{
|
||||
ReadMode(2);
|
||||
chop($_ = ReadLine(0));
|
||||
ReadMode(0);
|
||||
}
|
||||
else
|
||||
{
|
||||
system('/bin/stty -echo');
|
||||
chop($_ = <STDIN>);
|
||||
system('/bin/stty echo');
|
||||
}
|
||||
print "\n";
|
||||
|
||||
return $_;
|
||||
}
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Handle some standard LDAP options, and construct a nice little structure
|
||||
# that we can use later on. We really should have some appropriate defaults,
|
||||
# perhaps from an Mozilla::LDAP::Config module.
|
||||
#
|
||||
sub ldapArgs
|
||||
{
|
||||
my ($bind, $base) = @_;
|
||||
my (%ld);
|
||||
|
||||
$main::opt_v = $main::opt_n if defined($main::opt_n);
|
||||
$main::opt_p = LDAPS_PORT if (!defined($main::opt_p) &&
|
||||
defined($main::opt_P) &&
|
||||
($main::opt_P ne ""));
|
||||
|
||||
$ld{"host"} = $main::opt_h || "ldap";
|
||||
$ld{"port"} = $main::opt_p || LDAP_PORT;
|
||||
$ld{"base"} = $main::opt_b || $base || $ENV{'LDAP_BASEDN'};
|
||||
$ld{"root"} = $ld{"base"};
|
||||
$ld{"bind"} = $main::opt_D || $bind || "";
|
||||
$ld{"pswd"} = $main::opt_w || "";
|
||||
$ld{"cert"} = $main::opt_P || "";
|
||||
$ld{"scope"} = (defined($main::opt_s) ? $main::opt_s : LDAP_SCOPE_SUBTREE);
|
||||
|
||||
if (($ld{"bind"} ne "") && ($ld{"pswd"} eq ""))
|
||||
{
|
||||
$ld{pswd} = askPassword(1);
|
||||
}
|
||||
|
||||
return %ld;
|
||||
}
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Create a Unix-type password, using the "crypt" function. A random salt
|
||||
# is always generated, perhaps it should be an optional argument?
|
||||
#
|
||||
sub unixCrypt
|
||||
{
|
||||
my ($ascii) =
|
||||
"./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
|
||||
my ($salt) = substr($ascii, rand(62), 1) . substr($ascii, rand(62), 1);
|
||||
|
||||
srand(time ^ $$);
|
||||
crypt($_[0], $salt);
|
||||
}
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Try to find a user to bind as, and possibly ask for the password. Pass
|
||||
# a pointer to the hash array with LDAP parameters to this function.
|
||||
#
|
||||
sub userCredentials
|
||||
{
|
||||
my ($ld) = @_;
|
||||
my ($conn, $entry, $pswd, $search);
|
||||
|
||||
if ($ld->{"bind"} eq "")
|
||||
{
|
||||
my ($base) = $ld->{"base"} || $ld->{"root"};
|
||||
|
||||
$conn = new Mozilla::LDAP::Conn($ld);
|
||||
die "Could't connect to LDAP server " . $ld->{"host"} unless $conn;
|
||||
|
||||
$search = "(&(objectclass=inetOrgPerson)(uid=$ENV{USER}))";
|
||||
$entry = $conn->search($base, "subtree", $search, 0, ("uid"));
|
||||
return 0 if (!$entry || $conn->nextEntry());
|
||||
|
||||
$conn->close();
|
||||
$ld->{"bind"} = $entry->getDN();
|
||||
}
|
||||
|
||||
if ($ld->{"pswd"} eq "")
|
||||
{
|
||||
$ld->{"pswd"} = Mozilla::LDAP::Utils::askPassword(1);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Ask a Y/N question, return "Y" or "N".
|
||||
#
|
||||
sub answer
|
||||
{
|
||||
die "Default string must be Y or N."
|
||||
unless (($_[0] eq "Y") || ($_[0] eq "N"));
|
||||
|
||||
chop($_ = <STDIN>);
|
||||
|
||||
return $_[0] if /^$/;
|
||||
return "Y" if /^[yY]/;
|
||||
return "N" if /^[nN]/;
|
||||
}
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Mandatory TRUE return value.
|
||||
#
|
||||
1;
|
||||
|
||||
|
||||
#############################################################################
|
||||
# POD documentation...
|
||||
#
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
Mozilla::LDAP::Utils.pm - Collection of useful little utilities.
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
use Mozilla::LDAP::Utils;
|
||||
|
||||
=head1 ABSTRACT
|
||||
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
|
||||
=head1 OBJECT CLASS METHODS
|
||||
|
||||
=over 13
|
||||
|
||||
=item B<normalizeDN>
|
||||
|
||||
This function will remove all extraneous white spaces in the DN, and also
|
||||
change all upper case characters to lower case. The only argument is the
|
||||
DN string to normalize, and the return value is the new, clean DN.
|
||||
|
||||
=back
|
||||
|
||||
=head1 EXAMPLES
|
||||
|
||||
There are plenty of examples to look at, in the examples directory. We are
|
||||
adding more examples every day (almost).
|
||||
|
||||
=head1 INSTALLATION
|
||||
|
||||
Installing this package is part of the Makefile supplied in the
|
||||
package. See the installation procedures which are part of this package.
|
||||
|
||||
=head1 AVAILABILITY
|
||||
|
||||
This package can be retrieved from a number of places, including:
|
||||
|
||||
http://www.mozilla.org/directory/
|
||||
Your local CPAN server
|
||||
|
||||
=head1 CREDITS
|
||||
|
||||
Most of this code was developed by Leif Hedstrom, Netscape Communications
|
||||
Corporation.
|
||||
|
||||
=head1 BUGS
|
||||
|
||||
None. :)
|
||||
|
||||
=head1 SEE ALSO
|
||||
|
||||
L<Mozilla::LDAP::Conn>, L<Mozilla::LDAP::Entry>, L<Mozilla::LDAP::API>, and
|
||||
of course L<Perl>.
|
||||
|
||||
=cut
|
||||
954
mozilla/directory/perldap/constant.h
Normal file
954
mozilla/directory/perldap/constant.h
Normal file
@@ -0,0 +1,954 @@
|
||||
/*
|
||||
*******************************************************************************
|
||||
* $Id: constant.h,v 1.7 1998-08-13 09:14:14 leif Exp $
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public License
|
||||
* Version 1.0 (the "License"); you may not use this file except in
|
||||
* compliance with the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS"
|
||||
* basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing rights and limitations
|
||||
* under the License.
|
||||
*
|
||||
* The Original Code is PerLDAP. The Initial Developer of the Original
|
||||
* Code is Netscape Communications Corp. and Clayton Donley. Portions
|
||||
* created by Netscape are Copyright (C) Netscape Communications
|
||||
* Corp., portions created by Clayton Donley are Copyright (C) Clayton
|
||||
* Donley. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* DESCRIPTION
|
||||
* Constants.
|
||||
*
|
||||
*******************************************************************************/
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
#include "EXTERN.h"
|
||||
#include "perl.h"
|
||||
#include "XSUB.h"
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#include <ldap.h>
|
||||
|
||||
static int
|
||||
not_here(s)
|
||||
char *s;
|
||||
{
|
||||
croak("%s not implemented on this architecture", s);
|
||||
return -1;
|
||||
}
|
||||
|
||||
double
|
||||
constant(name, arg)
|
||||
char *name;
|
||||
int arg;
|
||||
{
|
||||
errno = 0;
|
||||
if (name[0] == 'L' && name[1] == 'D' && name[2] == 'A' && name[3] == 'P'
|
||||
&& name[4] == '_')
|
||||
{
|
||||
switch (name[5]) {
|
||||
case 'A':
|
||||
if (strEQ(name, "LDAP_ADMINLIMIT_EXCEEDED"))
|
||||
#ifdef LDAP_ADMINLIMIT_EXCEEDED
|
||||
return LDAP_ADMINLIMIT_EXCEEDED;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_AFFECTS_MULTIPLE_DSAS"))
|
||||
#ifdef LDAP_AFFECTS_MULTIPLE_DSAS
|
||||
return LDAP_AFFECTS_MULTIPLE_DSAS;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_ALIAS_DEREF_PROBLEM"))
|
||||
#ifdef LDAP_ALIAS_DEREF_PROBLEM
|
||||
return LDAP_ALIAS_DEREF_PROBLEM;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_ALIAS_PROBLEM"))
|
||||
#ifdef LDAP_ALIAS_PROBLEM
|
||||
return LDAP_ALIAS_PROBLEM;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_ALREADY_EXISTS"))
|
||||
#ifdef LDAP_ALREADY_EXISTS
|
||||
return LDAP_ALREADY_EXISTS;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_AUTH_METHOD_NOT_SUPPORTED"))
|
||||
#ifdef LDAP_AUTH_METHOD_NOT_SUPPORTED
|
||||
return LDAP_AUTH_METHOD_NOT_SUPPORTED;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_AUTH_NONE"))
|
||||
#ifdef LDAP_AUTH_NONE
|
||||
return LDAP_AUTH_NONE;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_AUTH_SASL"))
|
||||
#ifdef LDAP_AUTH_SASL
|
||||
return LDAP_AUTH_SASL;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_AUTH_SIMPLE"))
|
||||
#ifdef LDAP_AUTH_SIMPLE
|
||||
return LDAP_AUTH_SIMPLE;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_AUTH_UNKNOWN"))
|
||||
#ifdef LDAP_AUTH_UNKNOWN
|
||||
return LDAP_AUTH_UNKNOWN;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
break;
|
||||
case 'B':
|
||||
if (strEQ(name, "LDAP_BUSY"))
|
||||
#ifdef LDAP_BUSY
|
||||
return LDAP_BUSY;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
break;
|
||||
case 'C':
|
||||
if (strEQ(name, "LDAP_CACHE_CHECK"))
|
||||
#ifdef LDAP_CACHE_CHECK
|
||||
return LDAP_CACHE_CHECK;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_CACHE_LOCALDB"))
|
||||
#ifdef LDAP_CACHE_LOCALDB
|
||||
return LDAP_CACHE_LOCALDB;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_CACHE_POPULATE"))
|
||||
#ifdef LDAP_CACHE_POPULATE
|
||||
return LDAP_CACHE_POPULATE;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_CHANGETYPE_ADD"))
|
||||
#ifdef LDAP_CHANGETYPE_ADD
|
||||
return LDAP_CHANGETYPE_ADD;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_CHANGETYPE_ANY"))
|
||||
#ifdef LDAP_CHANGETYPE_ANY
|
||||
return LDAP_CHANGETYPE_ANY;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_CHANGETYPE_DELETE"))
|
||||
#ifdef LDAP_CHANGETYPE_DELETE
|
||||
return LDAP_CHANGETYPE_DELETE;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_CHANGETYPE_MODDN"))
|
||||
#ifdef LDAP_CHANGETYPE_MODDN
|
||||
return LDAP_CHANGETYPE_MODDN;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_CHANGETYPE_MODIFY"))
|
||||
#ifdef LDAP_CHANGETYPE_MODIFY
|
||||
return LDAP_CHANGETYPE_MODIFY;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_CLIENT_LOOP"))
|
||||
#ifdef LDAP_CLIENT_LOOP
|
||||
return LDAP_CLIENT_LOOP;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_COMPARE_FALSE"))
|
||||
#ifdef LDAP_COMPARE_FALSE
|
||||
return LDAP_COMPARE_FALSE;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_COMPARE_TRUE"))
|
||||
#ifdef LDAP_COMPARE_TRUE
|
||||
return LDAP_COMPARE_TRUE;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_CONFIDENTIALITY_REQUIRED"))
|
||||
#ifdef LDAP_CONFIDENTIALITY_REQUIRED
|
||||
return LDAP_CONFIDENTIALITY_REQUIRED;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_CONNECT_ERROR"))
|
||||
#ifdef LDAP_CONNECT_ERROR
|
||||
return LDAP_CONNECT_ERROR;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_CONSTRAINT_VIOLATION"))
|
||||
#ifdef LDAP_CONSTRAINT_VIOLATION
|
||||
return LDAP_CONSTRAINT_VIOLATION;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_DECODING_ERROR"))
|
||||
#ifdef LDAP_DECODING_ERROR
|
||||
return LDAP_DECODING_ERROR;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
break;
|
||||
case 'D':
|
||||
if (strEQ(name, "LDAP_DEREF_ALWAYS"))
|
||||
#ifdef LDAP_DEREF_ALWAYS
|
||||
return LDAP_DEREF_ALWAYS;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_DEREF_FINDING"))
|
||||
#ifdef LDAP_DEREF_FINDING
|
||||
return LDAP_DEREF_FINDING;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_DEREF_NEVER"))
|
||||
#ifdef LDAP_DEREF_NEVER
|
||||
return LDAP_DEREF_NEVER;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_DEREF_SEARCHING"))
|
||||
#ifdef LDAP_DEREF_SEARCHING
|
||||
return LDAP_DEREF_SEARCHING;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
break;
|
||||
case 'E':
|
||||
if (strEQ(name, "LDAP_ENCODING_ERROR"))
|
||||
#ifdef LDAP_ENCODING_ERROR
|
||||
return LDAP_ENCODING_ERROR;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
break;
|
||||
case 'F':
|
||||
if (strEQ(name, "LDAP_FILTER_ERROR"))
|
||||
#ifdef LDAP_FILTER_ERROR
|
||||
return LDAP_FILTER_ERROR;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_FILT_MAXSIZ"))
|
||||
#ifdef LDAP_FILT_MAXSIZ
|
||||
return LDAP_FILT_MAXSIZ;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
break;
|
||||
case 'I':
|
||||
if (strEQ(name, "LDAP_INAPPROPRIATE_AUTH"))
|
||||
#ifdef LDAP_INAPPROPRIATE_AUTH
|
||||
return LDAP_INAPPROPRIATE_AUTH;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_INAPPROPRIATE_MATCHING"))
|
||||
#ifdef LDAP_INAPPROPRIATE_MATCHING
|
||||
return LDAP_INAPPROPRIATE_MATCHING;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_INSUFFICIENT_ACCESS"))
|
||||
#ifdef LDAP_INSUFFICIENT_ACCESS
|
||||
return LDAP_INSUFFICIENT_ACCESS;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_INVALID_CREDENTIALS"))
|
||||
#ifdef LDAP_INVALID_CREDENTIALS
|
||||
return LDAP_INVALID_CREDENTIALS;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_INVALID_DN_SYNTAX"))
|
||||
#ifdef LDAP_INVALID_DN_SYNTAX
|
||||
return LDAP_INVALID_DN_SYNTAX;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_INVALID_SYNTAX"))
|
||||
#ifdef LDAP_INVALID_SYNTAX
|
||||
return LDAP_INVALID_SYNTAX;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_IS_LEAF"))
|
||||
#ifdef LDAP_IS_LEAF
|
||||
return LDAP_IS_LEAF;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
break;
|
||||
case 'L':
|
||||
if (strEQ(name, "LDAP_LOCAL_ERROR"))
|
||||
#ifdef LDAP_LOCAL_ERROR
|
||||
return LDAP_LOCAL_ERROR;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_LOOP_DETECT"))
|
||||
#ifdef LDAP_LOOP_DETECT
|
||||
return LDAP_LOOP_DETECT;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
break;
|
||||
case 'M':
|
||||
if (strEQ(name, "LDAP_MOD_ADD"))
|
||||
#ifdef LDAP_MOD_ADD
|
||||
return LDAP_MOD_ADD;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_MOD_BVALUES"))
|
||||
#ifdef LDAP_MOD_BVALUES
|
||||
return LDAP_MOD_BVALUES;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_MOD_DELETE"))
|
||||
#ifdef LDAP_MOD_DELETE
|
||||
return LDAP_MOD_DELETE;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_MOD_REPLACE"))
|
||||
#ifdef LDAP_MOD_REPLACE
|
||||
return LDAP_MOD_REPLACE;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_MORE_RESULTS_TO_RETURN"))
|
||||
#ifdef LDAP_MORE_RESULTS_TO_RETURN
|
||||
return LDAP_MORE_RESULTS_TO_RETURN;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_MSG_ALL"))
|
||||
#ifdef LDAP_MSG_ALL
|
||||
return LDAP_MSG_ALL;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_MSG_ONE"))
|
||||
#ifdef LDAP_MSG_ONE
|
||||
return LDAP_MSG_ONE;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_MSG_RECEIVED"))
|
||||
#ifdef LDAP_MSG_RECEIVED
|
||||
return LDAP_MSG_RECEIVED;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
break;
|
||||
case 'N':
|
||||
if (strEQ(name, "LDAP_NAMING_VIOLATION"))
|
||||
#ifdef LDAP_NAMING_VIOLATION
|
||||
return LDAP_NAMING_VIOLATION;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_NOT_ALLOWED_ON_NONLEAF"))
|
||||
#ifdef LDAP_NOT_ALLOWED_ON_NONLEAF
|
||||
return LDAP_NOT_ALLOWED_ON_NONLEAF;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_NOT_ALLOWED_ON_RDN"))
|
||||
#ifdef LDAP_NOT_ALLOWED_ON_RDN
|
||||
return LDAP_NOT_ALLOWED_ON_RDN;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_NOT_SUPPORTED"))
|
||||
#ifdef LDAP_NOT_SUPPORTED
|
||||
return LDAP_NOT_SUPPORTED;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_NO_LIMIT"))
|
||||
#ifdef LDAP_NO_LIMIT
|
||||
return LDAP_NO_LIMIT;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_NO_MEMORY"))
|
||||
#ifdef LDAP_NO_MEMORY
|
||||
return LDAP_NO_MEMORY;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_NO_OBJECT_CLASS_MODS"))
|
||||
#ifdef LDAP_NO_OBJECT_CLASS_MODS
|
||||
return LDAP_NO_OBJECT_CLASS_MODS;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_NO_RESULTS_RETURNED"))
|
||||
#ifdef LDAP_NO_RESULTS_RETURNED
|
||||
return LDAP_NO_RESULTS_RETURNED;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_NO_SUCH_ATTRIBUTE"))
|
||||
#ifdef LDAP_NO_SUCH_ATTRIBUTE
|
||||
return LDAP_NO_SUCH_ATTRIBUTE;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_NO_SUCH_OBJECT"))
|
||||
#ifdef LDAP_NO_SUCH_OBJECT
|
||||
return LDAP_NO_SUCH_OBJECT;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
break;
|
||||
case 'O':
|
||||
if (strEQ(name, "LDAP_OBJECT_CLASS_VIOLATION"))
|
||||
#ifdef LDAP_OBJECT_CLASS_VIOLATION
|
||||
return LDAP_OBJECT_CLASS_VIOLATION;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_OPERATIONS_ERROR"))
|
||||
#ifdef LDAP_OPERATIONS_ERROR
|
||||
return LDAP_OPERATIONS_ERROR;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_OPT_CACHE_ENABLE"))
|
||||
#ifdef LDAP_OPT_CACHE_ENABLE
|
||||
return LDAP_OPT_CACHE_ENABLE;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_OPT_CACHE_FN_PTRS"))
|
||||
#ifdef LDAP_OPT_CACHE_FN_PTRS
|
||||
return LDAP_OPT_CACHE_FN_PTRS;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_OPT_CACHE_STRATEGY"))
|
||||
#ifdef LDAP_OPT_CACHE_STRATEGY
|
||||
return LDAP_OPT_CACHE_STRATEGY;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_OPT_CLIENT_CONTROLS"))
|
||||
#ifdef LDAP_OPT_CLIENT_CONTROLS
|
||||
return LDAP_OPT_CLIENT_CONTROLS;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_OPT_DEREF"))
|
||||
#ifdef LDAP_OPT_DEREF
|
||||
return LDAP_OPT_DEREF;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_OPT_DESC"))
|
||||
#ifdef LDAP_OPT_DESC
|
||||
return LDAP_OPT_DESC;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_OPT_DNS"))
|
||||
#ifdef LDAP_OPT_DNS
|
||||
return LDAP_OPT_DNS;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_OPT_DNS_FN_PTRS"))
|
||||
#ifdef LDAP_OPT_DNS_FN_PTRS
|
||||
return LDAP_OPT_DNS_FN_PTRS;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_OPT_ERROR_NUMBER"))
|
||||
#ifdef LDAP_OPT_ERROR_NUMBER
|
||||
return LDAP_OPT_ERROR_NUMBER;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_OPT_ERROR_STRING"))
|
||||
#ifdef LDAP_OPT_ERROR_STRING
|
||||
return LDAP_OPT_ERROR_STRING;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_OPT_HOST_NAME"))
|
||||
#ifdef LDAP_OPT_HOST_NAME
|
||||
return LDAP_OPT_HOST_NAME;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_OPT_IO_FN_PTRS"))
|
||||
#ifdef LDAP_OPT_IO_FN_PTRS
|
||||
return LDAP_OPT_IO_FN_PTRS;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_OPT_MEMALLOC_FN_PTRS"))
|
||||
#ifdef LDAP_OPT_MEMALLOC_FN_PTRS
|
||||
return LDAP_OPT_MEMALLOC_FN_PTRS;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_OPT_PREFERRED_LANGUAGE"))
|
||||
#ifdef LDAP_OPT_PREFERRED_LANGUAGE
|
||||
return LDAP_OPT_PREFERRED_LANGUAGE;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_OPT_PROTOCOL_VERSION"))
|
||||
#ifdef LDAP_OPT_PROTOCOL_VERSION
|
||||
return LDAP_OPT_PROTOCOL_VERSION;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_OPT_REBIND_ARG"))
|
||||
#ifdef LDAP_OPT_REBIND_ARG
|
||||
return LDAP_OPT_REBIND_ARG;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_OPT_REBIND_FN"))
|
||||
#ifdef LDAP_OPT_REBIND_FN
|
||||
return LDAP_OPT_REBIND_FN;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_OPT_RECONNECT"))
|
||||
#ifdef LDAP_OPT_RECONNECT
|
||||
return LDAP_OPT_RECONNECT;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_OPT_REFERRALS"))
|
||||
#ifdef LDAP_OPT_REFERRALS
|
||||
return LDAP_OPT_REFERRALS;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_OPT_REFERRAL_HOP_LIMIT"))
|
||||
#ifdef LDAP_OPT_REFERRAL_HOP_LIMIT
|
||||
return LDAP_OPT_REFERRAL_HOP_LIMIT;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_OPT_RESTART"))
|
||||
#ifdef LDAP_OPT_RESTART
|
||||
return LDAP_OPT_RESTART;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_OPT_RETURN_REFERRALS"))
|
||||
#ifdef LDAP_OPT_RETURN_REFERRALS
|
||||
return LDAP_OPT_RETURN_REFERRALS;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_OPT_SERVER_CONTROLS"))
|
||||
#ifdef LDAP_OPT_SERVER_CONTROLS
|
||||
return LDAP_OPT_SERVER_CONTROLS;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_OPT_SIZELIMIT"))
|
||||
#ifdef LDAP_OPT_SIZELIMIT
|
||||
return LDAP_OPT_SIZELIMIT;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_OPT_SSL"))
|
||||
#ifdef LDAP_OPT_SSL
|
||||
return LDAP_OPT_SSL;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_OPT_THREAD_FN_PTRS"))
|
||||
#ifdef LDAP_OPT_THREAD_FN_PTRS
|
||||
return LDAP_OPT_THREAD_FN_PTRS;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_OPT_TIMELIMIT"))
|
||||
#ifdef LDAP_OPT_TIMELIMIT
|
||||
return LDAP_OPT_TIMELIMIT;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_OTHER"))
|
||||
#ifdef LDAP_OTHER
|
||||
return LDAP_OTHER;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
break;
|
||||
case 'P':
|
||||
if (strEQ(name, "LDAP_PARAM_ERROR"))
|
||||
#ifdef LDAP_PARAM_ERROR
|
||||
return LDAP_PARAM_ERROR;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_PARTIAL_RESULTS"))
|
||||
#ifdef LDAP_PARTIAL_RESULTS
|
||||
return LDAP_PARTIAL_RESULTS;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_PORT"))
|
||||
#ifdef LDAP_PORT
|
||||
return LDAP_PORT;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_PORT_MAX"))
|
||||
#ifdef LDAP_PORT_MAX
|
||||
return LDAP_PORT_MAX;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_PROTOCOL_ERROR"))
|
||||
#ifdef LDAP_PROTOCOL_ERROR
|
||||
return LDAP_PROTOCOL_ERROR;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
break;
|
||||
case 'R':
|
||||
if (strEQ(name, "LDAP_REFERRAL"))
|
||||
#ifdef LDAP_REFERRAL
|
||||
return LDAP_REFERRAL;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_REFERRAL_LIMIT_EXCEEDED"))
|
||||
#ifdef LDAP_REFERRAL_LIMIT_EXCEEDED
|
||||
return LDAP_REFERRAL_LIMIT_EXCEEDED;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_RESULTS_TOO_LARGE"))
|
||||
#ifdef LDAP_RESULTS_TOO_LARGE
|
||||
return LDAP_RESULTS_TOO_LARGE;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_RES_ADD"))
|
||||
#ifdef LDAP_RES_ADD
|
||||
return LDAP_RES_ADD;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_RES_ANY"))
|
||||
#ifdef LDAP_RES_ANY
|
||||
return LDAP_RES_ANY;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_RES_BIND"))
|
||||
#ifdef LDAP_RES_BIND
|
||||
return LDAP_RES_BIND;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_RES_COMPARE"))
|
||||
#ifdef LDAP_RES_COMPARE
|
||||
return LDAP_RES_COMPARE;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_RES_DELETE"))
|
||||
#ifdef LDAP_RES_DELETE
|
||||
return LDAP_RES_DELETE;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_RES_EXTENDED"))
|
||||
#ifdef LDAP_RES_EXTENDED
|
||||
return LDAP_RES_EXTENDED;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_RES_MODIFY"))
|
||||
#ifdef LDAP_RES_MODIFY
|
||||
return LDAP_RES_MODIFY;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_RES_MODRDN"))
|
||||
#ifdef LDAP_RES_MODRDN
|
||||
return LDAP_RES_MODRDN;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_RES_RENAME"))
|
||||
#ifdef LDAP_RES_RENAME
|
||||
return LDAP_RES_RENAME;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_RES_SEARCH_ENTRY"))
|
||||
#ifdef LDAP_RES_SEARCH_ENTRY
|
||||
return LDAP_RES_SEARCH_ENTRY;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_RES_SEARCH_REFERENCE"))
|
||||
#ifdef LDAP_RES_SEARCH_REFERENCE
|
||||
return LDAP_RES_SEARCH_REFERENCE;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_RES_SEARCH_RESULT"))
|
||||
#ifdef LDAP_RES_SEARCH_RESULT
|
||||
return LDAP_RES_SEARCH_RESULT;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
break;
|
||||
case 'S':
|
||||
if (strEQ(name, "LDAP_SASL_BIND_IN_PROGRESS"))
|
||||
#ifdef LDAP_SASL_BIND_IN_PROGRESS
|
||||
return LDAP_SASL_BIND_IN_PROGRESS;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_SASL_SIMPLE"))
|
||||
#ifdef LDAP_SASL_SIMPLE
|
||||
return LDAP_SASL_SIMPLE;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_SCOPE_BASE"))
|
||||
#ifdef LDAP_SCOPE_BASE
|
||||
return LDAP_SCOPE_BASE;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_SCOPE_ONELEVEL"))
|
||||
#ifdef LDAP_SCOPE_ONELEVEL
|
||||
return LDAP_SCOPE_ONELEVEL;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_SCOPE_SUBTREE"))
|
||||
#ifdef LDAP_SCOPE_SUBTREE
|
||||
return LDAP_SCOPE_SUBTREE;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_SECURITY_NONE"))
|
||||
#ifdef LDAP_SECURITY_NONE
|
||||
return LDAP_SECURITY_NONE;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_SERVER_DOWN"))
|
||||
#ifdef LDAP_SERVER_DOWN
|
||||
return LDAP_SERVER_DOWN;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_SIZELIMIT_EXCEEDED"))
|
||||
#ifdef LDAP_SIZELIMIT_EXCEEDED
|
||||
return LDAP_SIZELIMIT_EXCEEDED;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_SORT_CONTROL_MISSING"))
|
||||
#ifdef LDAP_SORT_CONTROL_MISSING
|
||||
return LDAP_SORT_CONTROL_MISSING;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_STRONG_AUTH_NOT_SUPPORTED"))
|
||||
#ifdef LDAP_STRONG_AUTH_NOT_SUPPORTED
|
||||
return LDAP_STRONG_AUTH_NOT_SUPPORTED;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_STRONG_AUTH_REQUIRED"))
|
||||
#ifdef LDAP_STRONG_AUTH_REQUIRED
|
||||
return LDAP_STRONG_AUTH_REQUIRED;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_SUCCESS"))
|
||||
#ifdef LDAP_SUCCESS
|
||||
return LDAP_SUCCESS;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
break;
|
||||
case 'T':
|
||||
if (strEQ(name, "LDAP_TIMELIMIT_EXCEEDED"))
|
||||
#ifdef LDAP_TIMELIMIT_EXCEEDED
|
||||
return LDAP_TIMELIMIT_EXCEEDED;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_TIMEOUT"))
|
||||
#ifdef LDAP_TIMEOUT
|
||||
return LDAP_TIMEOUT;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_TYPE_OR_VALUE_EXISTS"))
|
||||
#ifdef LDAP_TYPE_OR_VALUE_EXISTS
|
||||
return LDAP_TYPE_OR_VALUE_EXISTS;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
break;
|
||||
case 'U':
|
||||
if (strEQ(name, "LDAP_UNAVAILABLE"))
|
||||
#ifdef LDAP_UNAVAILABLE
|
||||
return LDAP_UNAVAILABLE;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_UNAVAILABLE_CRITICAL_EXTENSION"))
|
||||
#ifdef LDAP_UNAVAILABLE_CRITICAL_EXTENSION
|
||||
return LDAP_UNAVAILABLE_CRITICAL_EXTENSION;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_UNDEFINED_TYPE"))
|
||||
#ifdef LDAP_UNDEFINED_TYPE
|
||||
return LDAP_UNDEFINED_TYPE;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_UNWILLING_TO_PERFORM"))
|
||||
#ifdef LDAP_UNWILLING_TO_PERFORM
|
||||
return LDAP_UNWILLING_TO_PERFORM;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_URL_ERR_BADSCOPE"))
|
||||
#ifdef LDAP_URL_ERR_BADSCOPE
|
||||
return LDAP_URL_ERR_BADSCOPE;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_URL_ERR_MEM"))
|
||||
#ifdef LDAP_URL_ERR_MEM
|
||||
return LDAP_URL_ERR_MEM;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_URL_ERR_NODN"))
|
||||
#ifdef LDAP_URL_ERR_NODN
|
||||
return LDAP_URL_ERR_NODN;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_URL_ERR_NOTLDAP"))
|
||||
#ifdef LDAP_URL_ERR_NOTLDAP
|
||||
return LDAP_URL_ERR_NOTLDAP;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_URL_ERR_PARAM"))
|
||||
#ifdef LDAP_URL_ERR_PARAM
|
||||
return LDAP_URL_ERR_PARAM;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_URL_OPT_SECURE"))
|
||||
#ifdef LDAP_URL_OPT_SECURE
|
||||
return LDAP_URL_OPT_SECURE;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_USER_CANCELLED"))
|
||||
#ifdef LDAP_USER_CANCELLED
|
||||
return LDAP_USER_CANCELLED;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
break;
|
||||
case 'V':
|
||||
if (strEQ(name, "LDAP_VERSION"))
|
||||
#ifdef LDAP_VERSION
|
||||
return LDAP_VERSION;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_VERSION1"))
|
||||
#ifdef LDAP_VERSION1
|
||||
return LDAP_VERSION1;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_VERSION2"))
|
||||
#ifdef LDAP_VERSION2
|
||||
return LDAP_VERSION2;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_VERSION3"))
|
||||
#ifdef LDAP_VERSION3
|
||||
return LDAP_VERSION3;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
if (strEQ(name, "LDAP_VERSION_MAX"))
|
||||
#ifdef LDAP_VERSION_MAX
|
||||
return LDAP_VERSION_MAX;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
if (strEQ(name, "LDAPS_PORT"))
|
||||
#ifdef LDAPS_PORT
|
||||
return LDAPS_PORT;
|
||||
#else
|
||||
goto not_there;
|
||||
#endif
|
||||
}
|
||||
|
||||
errno = EINVAL;
|
||||
return 0;
|
||||
|
||||
not_there:
|
||||
errno = ENOENT;
|
||||
return 0;
|
||||
}
|
||||
35
mozilla/directory/perldap/examples/ChangeLog
Normal file
35
mozilla/directory/perldap/examples/ChangeLog
Normal file
@@ -0,0 +1,35 @@
|
||||
1999-06-30 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* rmentry.pl: Added support for "-p".
|
||||
|
||||
1999-01-05 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* psoftsync.pl (delAttr): Fixed annoying bug where I missed to
|
||||
"my" $entry.
|
||||
|
||||
1999-01-04 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* modattr.pl: Bug fixes for handling bad cases better (like
|
||||
missing attribute, adding empty values etc).
|
||||
|
||||
1998-12-11 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* modattr.pl: Modified slightly to enable the rebind proc.
|
||||
|
||||
1998-08-03 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* psoftsync.pl: New file, also merged in some modules from
|
||||
LdapUtils.pm, to make sure this works. NOTE: This script currently
|
||||
doesn't work, since all "modify" operations are horked.
|
||||
|
||||
1998-07-30 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* tabdump.pl: Actually works!
|
||||
|
||||
* ldappasswd.pl: Cleaned out some code, and moved it over to the
|
||||
::Utils module.
|
||||
|
||||
1998-07-29 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* qsearch.pl: First working version.
|
||||
|
||||
118
mozilla/directory/perldap/examples/changes2ldif.pl
Executable file
118
mozilla/directory/perldap/examples/changes2ldif.pl
Executable file
@@ -0,0 +1,118 @@
|
||||
#!/usr/bin/perl5
|
||||
#############################################################################
|
||||
# $Id: changes2ldif.pl,v 1.2 1999-01-21 23:52:46 leif%netscape.com Exp $
|
||||
#
|
||||
# The contents of this file are subject to the Mozilla Public License
|
||||
# Version 1.0 (the "License"); you may not use this file except in
|
||||
# compliance with the License. You may obtain a copy of the License at
|
||||
# http://www.mozilla.org/MPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS IS"
|
||||
# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing rights and limitations
|
||||
# under the License.
|
||||
#
|
||||
# The Original Code is PerLDAP. The Initial Developer of the Original
|
||||
# Code is Netscape Communications Corp. and Clayton Donley. Portions
|
||||
# created by Netscape are Copyright (C) Netscape Communications
|
||||
# Corp., portions created by Clayton Donley are Copyright (C) Clayton
|
||||
# Donley. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
#
|
||||
# DESCRIPTION
|
||||
# Search the changelog, and produce an LDIF file suitable for ldapmodify
|
||||
# for instance. This should be merged into LDIF.pm eventually.
|
||||
#
|
||||
#############################################################################
|
||||
|
||||
use Getopt::Std; # To parse command line arguments.
|
||||
use Mozilla::LDAP::Conn; # Main "OO" layer for LDAP
|
||||
use Mozilla::LDAP::Utils; # LULU, utilities.
|
||||
|
||||
use strict;
|
||||
no strict "vars";
|
||||
|
||||
|
||||
#################################################################################
|
||||
# Constants, shouldn't have to edit these...
|
||||
#
|
||||
$APPNAM = "changes2ldif";
|
||||
$USAGE = "$APPNAM [-nv] -b base -h host -D bind -w pswd -P cert [min [max]]";
|
||||
|
||||
|
||||
#################################################################################
|
||||
# Check arguments, and configure some parameters accordingly..
|
||||
#
|
||||
if (!getopts('nvb:h:D:p:s:w:P:'))
|
||||
{
|
||||
print "usage: $APPNAM $USAGE\n";
|
||||
exit;
|
||||
}
|
||||
%ld = Mozilla::LDAP::Utils::ldapArgs();
|
||||
$ld{root} = "cn=changelog" if (!defined($ld{root}) || $ld{root} eq "");
|
||||
|
||||
|
||||
#################################################################################
|
||||
# Instantiate an LDAP object, which also binds to the LDAP server.
|
||||
#
|
||||
$conn = new Mozilla::LDAP::Conn(\%ld);
|
||||
die "Could't connect to LDAP server $ld{host}" unless $conn;
|
||||
|
||||
|
||||
#################################################################################
|
||||
# Create the search filter.
|
||||
#
|
||||
$min = $ARGV[$[];
|
||||
$max = $ARGV[$[ + 1];
|
||||
|
||||
if ($min ne "")
|
||||
{
|
||||
if ($max ne "")
|
||||
{
|
||||
$search = "(&(changenumber>=$min)(changenumber<=$max))";
|
||||
}
|
||||
else
|
||||
{
|
||||
$search = "(changenumber>=$min)";
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$search = "(changenumber=*)";
|
||||
}
|
||||
|
||||
|
||||
#################################################################################
|
||||
# Do the searches, and print the results.
|
||||
#
|
||||
$entry = $conn->search($ld{root}, "ONE", "$search");
|
||||
while ($entry)
|
||||
{
|
||||
print "dn: ", $entry->{targetdn}[0], "\n";
|
||||
$type = $entry->{changetype}[0];
|
||||
print "changetype: $type\n";
|
||||
if ($type =~ /modify/i)
|
||||
{
|
||||
# Should we filter out modifiersname and modifytimestamp ? We do chop
|
||||
# off the trailing \0 though.
|
||||
chop($entry->{changes}[0]);
|
||||
print $entry->{changes}[0], "\n";
|
||||
}
|
||||
elsif ($type =~ /add/i)
|
||||
{
|
||||
print $entry->{changes}[0], "\n";
|
||||
}
|
||||
else
|
||||
{
|
||||
print "\n";
|
||||
}
|
||||
|
||||
$entry = $conn->nextEntry;
|
||||
}
|
||||
|
||||
|
||||
#################################################################################
|
||||
# Close the connection.
|
||||
#
|
||||
$ld{conn}->close if $ld{conn};
|
||||
104
mozilla/directory/perldap/examples/ldappasswd.pl
Executable file
104
mozilla/directory/perldap/examples/ldappasswd.pl
Executable file
@@ -0,0 +1,104 @@
|
||||
#!/usr/bin/perl5
|
||||
#############################################################################
|
||||
# $Id: ldappasswd.pl,v 1.6 1998-08-13 09:13:23 leif Exp $
|
||||
#
|
||||
# The contents of this file are subject to the Mozilla Public License
|
||||
# Version 1.0 (the "License"); you may not use this file except in
|
||||
# compliance with the License. You may obtain a copy of the License at
|
||||
# http://www.mozilla.org/MPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS IS"
|
||||
# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing rights and limitations
|
||||
# under the License.
|
||||
#
|
||||
# The Original Code is PerLDAP. The Initial Developer of the Original
|
||||
# Code is Netscape Communications Corp. and Clayton Donley. Portions
|
||||
# created by Netscape are Copyright (C) Netscape Communications
|
||||
# Corp., portions created by Clayton Donley are Copyright (C) Clayton
|
||||
# Donley. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
#
|
||||
# DESCRIPTION
|
||||
# This is an LDAP version of the normal passwd/yppasswd command found
|
||||
# on most Unix systems. Note that this will only use the {crypt}
|
||||
# encryption/hash algorithm (at this point).
|
||||
#
|
||||
#############################################################################
|
||||
|
||||
use Getopt::Std; # To parse command line arguments.
|
||||
use Mozilla::LDAP::Conn; # Main "OO" layer for LDAP
|
||||
use Mozilla::LDAP::Utils; # LULU, utilities.
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Constants, shouldn't have to edit these...
|
||||
#
|
||||
$APPNAM = "ldappasswd";
|
||||
$USAGE = "$APPNAM [-nv] -b base -h host -D bind -w pswd -P cert search ...";
|
||||
|
||||
@ATTRIBUTES = ("uid", "userpassword");
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Check arguments, and configure some parameters accordingly..
|
||||
#
|
||||
if (!getopts('nvb:s:h:D:w:P:')) {
|
||||
print "usage: $APPNAM $USAGE\n";
|
||||
exit;
|
||||
}
|
||||
%ld = Mozilla::LDAP::Utils::ldapArgs();
|
||||
Mozilla::LDAP::Utils::userCredentials(\%ld) unless $opt_n;
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Ask for the new password, and confirm it's correct.
|
||||
#
|
||||
do
|
||||
{
|
||||
print "New password: ";
|
||||
$new = Mozilla::LDAP::Utils::askPassword();
|
||||
print "New password (again): ";
|
||||
$new2 = Mozilla::LDAP::Utils::askPassword();
|
||||
print "Passwords didn't match, try again!\n\n" if ($new ne $new2);
|
||||
} until ($new eq $new2);
|
||||
print "\n";
|
||||
|
||||
$crypted = Mozilla::LDAP::Utils::unixCrypt("$new");
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Now do all the searches, one by one. If there are no search criteria, we
|
||||
# will change the password for the user running the script.
|
||||
#
|
||||
$conn = new Mozilla::LDAP::Conn(\%ld);
|
||||
die "Could't connect to LDAP server $ld{host}" unless $conn;
|
||||
|
||||
foreach $search ($#ARGV >= $[ ? @ARGV : $ld{bind})
|
||||
{
|
||||
$entry = $conn->search($search, "subtree", "ALL", 0, @ATTRIBUTES);
|
||||
$entry = $conn->search($ld{root}, "subtree", $search, 0, @ATTRIBUTES)
|
||||
unless $entry;
|
||||
print "No such user: $search\n" unless $entry;
|
||||
|
||||
while ($entry)
|
||||
{
|
||||
$entry->{userpassword} = ["{crypt}" . $crypted];
|
||||
print "Changing password for: $entry->{dn}\n" if $opt_v;
|
||||
|
||||
if (!$opt_n)
|
||||
{
|
||||
$conn->update($entry);
|
||||
$conn->printError() if $conn->getErrorCode();
|
||||
}
|
||||
|
||||
$entry = $conn->nextEntry();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Close the connection.
|
||||
#
|
||||
$conn->close if $conn;
|
||||
128
mozilla/directory/perldap/examples/lfinger.pl
Executable file
128
mozilla/directory/perldap/examples/lfinger.pl
Executable file
@@ -0,0 +1,128 @@
|
||||
#!/usr/bin/perl5
|
||||
#############################################################################
|
||||
# $Id: lfinger.pl,v 1.10 1998-08-13 09:13:08 leif Exp $
|
||||
#
|
||||
# The contents of this file are subject to the Mozilla Public License
|
||||
# Version 1.0 (the "License"); you may not use this file except in
|
||||
# compliance with the License. You may obtain a copy of the License at
|
||||
# http://www.mozilla.org/MPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS IS"
|
||||
# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing rights and limitations
|
||||
# under the License.
|
||||
#
|
||||
# The Original Code is PerLDAP. The Initial Developer of the Original
|
||||
# Code is Netscape Communications Corp. and Clayton Donley. Portions
|
||||
# created by Netscape are Copyright (C) Netscape Communications
|
||||
# Corp., portions created by Clayton Donley are Copyright (C) Clayton
|
||||
# Donley. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
#
|
||||
# DESCRIPTION
|
||||
# "finger" version using LDAP information (using RFC 2307 objectclass).
|
||||
#
|
||||
#############################################################################
|
||||
|
||||
use Getopt::Std; # To parse command line arguments.
|
||||
use Mozilla::LDAP::Conn; # Main "OO" layer for LDAP
|
||||
use Mozilla::LDAP::Utils; # LULU, utilities.
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Constants, shouldn't have to edit these... The HIDE mechanism is a very
|
||||
# Netscape internal specific feature. We use this objectclass to mark some
|
||||
# entries to be "hidden", and some of our applications will honor this. With
|
||||
# more recent versions of the Directory Server this can be accomplished more
|
||||
# effectively with appropriate ACI/ACLs.
|
||||
#
|
||||
$APPNAM = "lfinger";
|
||||
$USAGE = "$APPNAM -m -b base -h host -D bind -w pswd -P cert user_info";
|
||||
|
||||
@ATTRIBUTES = ("uid", "cn", "homedirectory", "loginshell", "pager",
|
||||
"telephonenumber", "facsimiletelephonenumber", "mobile");
|
||||
$HIDE = "(objectclass=nscphidethis)";
|
||||
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Print a "finger" entry.
|
||||
#
|
||||
sub printIt
|
||||
{
|
||||
my($entry) = @_;
|
||||
|
||||
print "Login name: $entry->{uid}[0]";
|
||||
print " " x (39 - 11 - length($entry->{uid}[0]));
|
||||
print "In real life: $entry->{cn}[0]\n";
|
||||
if ($entry->{homedirectory}[0] || $entry->{loginshell}[0])
|
||||
{
|
||||
print "Directory: $entry->{homedirectory}[0]";
|
||||
print " " x (39 - 10 - length($entry->{homedirectory}[0]));
|
||||
print "Shell: $entry->{loginshell}[0]\n";
|
||||
}
|
||||
|
||||
if ($entry->{telephonenumber}[0] || $entry->{pager}[0])
|
||||
{
|
||||
print "Phone: $entry->{telephonenumber}[0]";
|
||||
print " " x (39 - 6 - length($entry->{telephonenumber}[0]));
|
||||
print "Pager: $entry->{pager}[0]\n";
|
||||
}
|
||||
|
||||
if ($entry->{mobile}[0] || $entry->{facsimiletelephonenumber}[0])
|
||||
{
|
||||
print "Mobile: $entry->{mobile}[0]";
|
||||
print " " x (39 - 7 - length($entry->{mobile}[0]));
|
||||
print "Fax: $entry->{facsimiletelephonenumber}[0]\n";
|
||||
}
|
||||
|
||||
print "\n";
|
||||
}
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Check arguments, and configure some parameters accordingly..
|
||||
#
|
||||
if (!getopts('mb:h:D:p:w:P:') || !defined($ARGV[$[]))
|
||||
{
|
||||
print "usage: $APPNAM $USAGE\n";
|
||||
exit;
|
||||
}
|
||||
%ld = Mozilla::LDAP::Utils::ldapArgs();
|
||||
$user=$ARGV[$[];
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Instantiate an LDAP object, which also binds to the LDAP server.
|
||||
#
|
||||
$conn = new Mozilla::LDAP::Conn(\%ld);
|
||||
die "Could't connect to LDAP server $ld{host}" unless $conn;
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Ok, lets generate the filter, and do the search!
|
||||
#
|
||||
if ($opt_m)
|
||||
{
|
||||
$search = "(&(uid=$user)(!$HIDE))";
|
||||
}
|
||||
else
|
||||
{
|
||||
$search = "(&(|(cn=*$user*)(uid=*$user*)(telephonenumber=*$user*))(!$HIDE))";
|
||||
}
|
||||
|
||||
$entry = $conn->search($ld{root}, "subtree", $search, 0, @ATTRIBUTES);
|
||||
$conn->printError() if $conn->getErrorCode();
|
||||
|
||||
while($entry)
|
||||
{
|
||||
printIt($entry);
|
||||
$entry = $conn->nextEntry();
|
||||
}
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Close the connection.
|
||||
#
|
||||
$conn->close if $conn;
|
||||
331
mozilla/directory/perldap/examples/modattr.pl
Executable file
331
mozilla/directory/perldap/examples/modattr.pl
Executable file
@@ -0,0 +1,331 @@
|
||||
#!/usr/bin/perl5
|
||||
#############################################################################
|
||||
# $Id: modattr.pl,v 1.8 1999-01-21 23:52:46 leif%netscape.com Exp $
|
||||
#
|
||||
# The contents of this file are subject to the Mozilla Public License
|
||||
# Version 1.0 (the "License"); you may not use this file except in
|
||||
# compliance with the License. You may obtain a copy of the License at
|
||||
# http://www.mozilla.org/MPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS IS"
|
||||
# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing rights and limitations
|
||||
# under the License.
|
||||
#
|
||||
# The Original Code is PerLDAP. The Initial Developer of the Original
|
||||
# Code is Netscape Communications Corp. and Clayton Donley. Portions
|
||||
# created by Netscape are Copyright (C) Netscape Communications
|
||||
# Corp., portions created by Clayton Donley are Copyright (C) Clayton
|
||||
# Donley. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
#
|
||||
# DESCRIPTION
|
||||
# This script can be used to do a number of different modification
|
||||
# operations on a script. Like adding/deleting values, or entire
|
||||
# attributes.
|
||||
#
|
||||
#############################################################################
|
||||
|
||||
use Getopt::Std; # To parse command line arguments.
|
||||
use Mozilla::LDAP::Conn; # Main "OO" layer for LDAP
|
||||
use Mozilla::LDAP::Utils; # LULU, utilities.
|
||||
|
||||
use strict;
|
||||
no strict "vars";
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Constants, shouldn't have to edit these...
|
||||
#
|
||||
$APPNAM = "modattr";
|
||||
$USAGE = "$APPNAM [-dnvW] -b base -h host -D bind -w pswd -P cert attr=value filter";
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Check arguments, and configure some parameters accordingly..
|
||||
#
|
||||
if (!getopts('adnvWb:h:D:p:s:w:P:'))
|
||||
{
|
||||
print "usage: $APPNAM $USAGE\n";
|
||||
exit;
|
||||
}
|
||||
%ld = Mozilla::LDAP::Utils::ldapArgs();
|
||||
Mozilla::LDAP::Utils::userCredentials(\%ld) unless $opt_n;
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Let's process the changes requested, and commit them unless the "-n"
|
||||
# option was given.
|
||||
#
|
||||
$conn = new Mozilla::LDAP::Conn(\%ld);
|
||||
die "Could't connect to LDAP server $ld{host}" unless $conn;
|
||||
|
||||
$conn->setDefaultRebindProc($ld{bind}, $ld{pswd});
|
||||
|
||||
($change, $search) = @ARGV;
|
||||
if (($change eq "") || ($search eq ""))
|
||||
{
|
||||
print "usage: $APPNAM $USAGE\n";
|
||||
exit;
|
||||
}
|
||||
($attr, $value) = split(/=/, $change, 2);
|
||||
|
||||
$entry = $conn->search($ld{root}, $ld{scope}, $search);
|
||||
while ($entry)
|
||||
{
|
||||
$changed = 0;
|
||||
|
||||
if ($opt_d)
|
||||
{
|
||||
if (defined $entry->{$attr})
|
||||
{
|
||||
if ($value)
|
||||
{
|
||||
$changed = $entry->removeValue($attr, $value);
|
||||
if ($changed && $opt_v)
|
||||
{
|
||||
print "Removed value from ", $entry->getDN(), "\n" if $opt_v;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
delete $entry->{$attr};
|
||||
print "Deleted attribute $attr for ", $entry->getDN(), "\n" if $opt_v;
|
||||
$changed = 1;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
print "No attribute values for: $attr\n";
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!defined($value) || !$value)
|
||||
{
|
||||
print "No value provided for the attribute $attr\n";
|
||||
}
|
||||
elsif ($opt_a)
|
||||
{
|
||||
$changed = $entry->addValue($attr, $value);
|
||||
if ($changed && $opt_v)
|
||||
{
|
||||
print "Added attribute to ", $entry->getDN(), "\n" if $opt_v;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$entry->setValue($attr, $value);
|
||||
$changed = 1;
|
||||
print "Set attribute for ", $entry->getDN(), "\n" if $opt_v;
|
||||
}
|
||||
}
|
||||
if ($changed && ! $opt_n)
|
||||
{
|
||||
$conn->update($entry);
|
||||
$conn->printError() if $conn->getErrorCode();
|
||||
}
|
||||
|
||||
$entry = $conn->nextEntry();
|
||||
}
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Close the connection.
|
||||
#
|
||||
$conn->close if $conn;
|
||||
|
||||
|
||||
#############################################################################
|
||||
# POD documentation...
|
||||
#
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
modattr - Modify an attribute for one or more LDAP entries
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
modattr [-adnvW] -b base -h host -D bind DN -w pwd -P cert attr=value filter
|
||||
|
||||
=head1 ABSTRACT
|
||||
|
||||
This command line utility can be used to modify one attribute for one or
|
||||
more LDAP entries. As simple as this sounds, this turns out to be a very
|
||||
common operation. For instance, let's say you want to change "mailHost"
|
||||
for all users on a machine named I<dredd>, to be I<judge>. With this
|
||||
script all you have to do is
|
||||
|
||||
modattr mailHost=judge '(mailHost=dredd)'
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
There are four primary operations that can be made with this utility:
|
||||
|
||||
=over 4
|
||||
|
||||
=item *
|
||||
|
||||
Set an attribute to a (single) specified value.
|
||||
|
||||
=item *
|
||||
|
||||
Add a value to an attribute (for multi-value attributes).
|
||||
|
||||
=item *
|
||||
|
||||
Delete a value from an attribute. If it's the last value (or if it's a
|
||||
single value), this will remove the entire attribute.
|
||||
|
||||
=item *
|
||||
|
||||
Delete an entire attribute, even if it has multiple values.
|
||||
|
||||
=back
|
||||
|
||||
The first three requires an option of the form B<attr=value>, while the
|
||||
last one only takes the name of the attribute as the option. The last
|
||||
argument is always an LDAP search filter, specifying which entries the
|
||||
operation should be applied to.
|
||||
|
||||
=head1 OPTIONS
|
||||
|
||||
All but the first two command line options for this tool are standard LDAP
|
||||
options, to set parameters for the LDAP connection. The two new options
|
||||
are I<-a> and I<-d> to add and remove attribute values.
|
||||
|
||||
Without either of these two options specified (they are both optional),
|
||||
the default action is to set the attribute to the specified value. That
|
||||
will effectively remove any existing values for this attribute.
|
||||
|
||||
=over 12
|
||||
|
||||
=item -a
|
||||
|
||||
Specify that the operation is an I<add>, to add a value to the
|
||||
attribute. If there is no existing value for this attribute, we'll create
|
||||
a new attribute, otherwise we add the new value if it's not already there.
|
||||
|
||||
=item -d
|
||||
|
||||
Delete the attribute value, or the entire attribute if there's no value
|
||||
specified. As you can see this option has two forms, and it's function
|
||||
depends on the last arguments. Be careful here, if you forget to specify
|
||||
the value to delete, you will remove all of them.
|
||||
|
||||
=item -h <host>
|
||||
|
||||
Name of the LDAP server to connect to.
|
||||
|
||||
=item -p <port>
|
||||
|
||||
TCP port for the LDAP connection.
|
||||
|
||||
=item -b <DN>
|
||||
|
||||
Base DN for the search
|
||||
|
||||
=item -D <bind>
|
||||
|
||||
User (DN) to bind as. We support a few convenience shortcuts here, like
|
||||
I<root>, I<user> and I<repl>.
|
||||
|
||||
=item -w <passwd>
|
||||
|
||||
This specifies the password to use when connecting to the LDAP
|
||||
server. This is strongly discouraged, and without this option the script
|
||||
will ask for the password interactively.
|
||||
|
||||
=item -s <scope>
|
||||
|
||||
Search scope, default is I<sub>, the other possible values are I<base> and
|
||||
I<one>. You can also specify the numeric scopes, I<0>, I<1> or I<2>.
|
||||
|
||||
=item -P
|
||||
|
||||
Use SSL for the LDAP connection, using the specified cert.db file for
|
||||
certificate information.
|
||||
|
||||
=item -n
|
||||
|
||||
Don't do anything, only show the changes that would have been made. This
|
||||
is very convenient, and can save you from embarrassing mistakes.
|
||||
|
||||
=item -v
|
||||
|
||||
Verbose output.
|
||||
|
||||
=back
|
||||
|
||||
The last two arguments are special for this script. The first
|
||||
argument specifies the attribute (and possibly the value) to operate on,
|
||||
and the last argument is a properly formed LDAP search filter.
|
||||
|
||||
=head1 EXAMPLES
|
||||
|
||||
We'll give one example for each of the four operations this script can
|
||||
currently handle. Since the script itself is quite flexible, you'll
|
||||
probably find you can use this script for a lot of other applications, or
|
||||
call it from other scripts. Note that we don't specify any LDAP specific
|
||||
options here, we assume you have configured your defaults properly.
|
||||
|
||||
To set the I<description> attribute for user "leif", you would do
|
||||
|
||||
modattr 'description=Company Swede' '(uid=leif)'
|
||||
|
||||
The examples shows how to use this command without either of the I<-a> or
|
||||
the I<-d> argument. To add an e-mail alias (alternate address) to the same
|
||||
user, you would do
|
||||
|
||||
modattr -a 'mailAlternateAddress=theSwede@netscape.com' '(uid=leif)'
|
||||
|
||||
To remove an object class from all entries which uses it, you could do
|
||||
|
||||
modattr -d 'objectclass=dummyClass' '(objectclass=dummyClass)'
|
||||
|
||||
This example is not great, since unless you've assured that no entries
|
||||
uses any of the attributes in this class, you'll get schema
|
||||
violations. But don't despair, you can use this tool to clean up all
|
||||
entries first! To completely remove all usage of an attribute named
|
||||
I<dummyAttr>, you'd simply do
|
||||
|
||||
modattr -d dummyAttr '(dummyAttr=*)'
|
||||
|
||||
This shows the final format of this command, notice how we don't specify a
|
||||
value, to assure that the entire attribute is removed. This is potentially
|
||||
dangerous, so again be careful.
|
||||
|
||||
=head1 INSTALLATION
|
||||
|
||||
In order to use this script, you'll need Perl version 5.004 or later, the
|
||||
LDAP SDK, and also the LDAP Perl module (aka PerLDAP). Once you've installed
|
||||
these packages, just copy this file to where you keep your admin binaries,
|
||||
e.g. /usr/local/bin.
|
||||
|
||||
In order to get good performance, you should make sure you have indexes on
|
||||
the attributes you typically use with this script. Our experience has been
|
||||
that in most cases the standard indexes in the Directory Server are
|
||||
sufficient, e.g. I<CN>, I<UID> and I<MAIL>.
|
||||
|
||||
=head1 AVAILABILITY
|
||||
|
||||
This package can be retrieved from a number of places, including:
|
||||
|
||||
http://www.mozilla.org/directory/
|
||||
Your local CPAN server
|
||||
|
||||
=head1 CREDITS
|
||||
|
||||
This little tool was developed internally at Netscape, by Leif Hedstrom.
|
||||
|
||||
=head1 BUGS
|
||||
|
||||
None, of course...
|
||||
|
||||
=head1 SEE ALSO
|
||||
|
||||
L<Mozilla::LDAP::API> and L<Perl>
|
||||
|
||||
=cut
|
||||
67
mozilla/directory/perldap/examples/monitor.pl
Executable file
67
mozilla/directory/perldap/examples/monitor.pl
Executable file
@@ -0,0 +1,67 @@
|
||||
#!/usr/bin/perl5
|
||||
#############################################################################
|
||||
# $Id: monitor.pl,v 1.2 1998-08-13 09:12:05 leif Exp $
|
||||
#
|
||||
# The contents of this file are subject to the Mozilla Public License
|
||||
# Version 1.0 (the "License"); you may not use this file except in
|
||||
# compliance with the License. You may obtain a copy of the License at
|
||||
# http://www.mozilla.org/MPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS IS"
|
||||
# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing rights and limitations
|
||||
# under the License.
|
||||
#
|
||||
# The Original Code is PerLDAP. The Initial Developer of the Original
|
||||
# Code is Netscape Communications Corp. and Clayton Donley. Portions
|
||||
# created by Netscape are Copyright (C) Netscape Communications
|
||||
# Corp., portions created by Clayton Donley are Copyright (C) Clayton
|
||||
# Donley. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
#
|
||||
# DESCRIPTION
|
||||
# Ask the directory server for it's monitor entry, to see some
|
||||
# performance and usage stats.
|
||||
#
|
||||
#############################################################################
|
||||
|
||||
use Getopt::Std; # To parse command line arguments.
|
||||
use Mozilla::LDAP::Conn; # Main "OO" layer for LDAP
|
||||
use Mozilla::LDAP::Utils; # LULU, utilities.
|
||||
|
||||
|
||||
#################################################################################
|
||||
# Constants, shouldn't have to edit these...
|
||||
#
|
||||
$APPNAM = "monitor";
|
||||
$USAGE = "$APPNAM [-nv] -b base -h host -D bind -w pswd -P cert";
|
||||
|
||||
|
||||
#################################################################################
|
||||
# Check arguments, and configure some parameters accordingly..
|
||||
#
|
||||
if (!getopts('b:h:D:p:w:P:'))
|
||||
{
|
||||
print "usage: $APPNAM $USAGE\n";
|
||||
exit;
|
||||
}
|
||||
%ld = Mozilla::LDAP::Utils::ldapArgs("", "cn=monitor");
|
||||
|
||||
|
||||
#################################################################################
|
||||
# Instantiate an LDAP object, which also binds to the LDAP server, and then
|
||||
# do the simple search.
|
||||
#
|
||||
$conn = new Mozilla::LDAP::Conn(\%ld);
|
||||
die "Could't connect to LDAP server $ld{host}" unless $conn;
|
||||
|
||||
$entry = $conn->search($ld{root}, "base", "objectclass=*");
|
||||
Mozilla::LDAP::Utils::printEntry($entry)
|
||||
if ($entry);
|
||||
|
||||
|
||||
#################################################################################
|
||||
# Close the connection.
|
||||
#
|
||||
$conn->close if $conn;
|
||||
615
mozilla/directory/perldap/examples/psoftsync.pl
Executable file
615
mozilla/directory/perldap/examples/psoftsync.pl
Executable file
@@ -0,0 +1,615 @@
|
||||
#!/usr/bin/perl5
|
||||
#############################################################################
|
||||
# $Id: psoftsync.pl,v 1.5 1999-01-21 23:52:47 leif%netscape.com Exp $
|
||||
#
|
||||
# The contents of this file are subject to the Mozilla Public License
|
||||
# Version 1.0 (the "License"); you may not use this file except in
|
||||
# compliance with the License. You may obtain a copy of the License at
|
||||
# http://www.mozilla.org/MPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS IS"
|
||||
# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing rights and limitations
|
||||
# under the License.
|
||||
#
|
||||
# The Original Code is PerLDAP. The Initial Developer of the Original
|
||||
# Code is Netscape Communications Corp. and Clayton Donley. Portions
|
||||
# created by Netscape are Copyright (C) Netscape Communications
|
||||
# Corp., portions created by Clayton Donley are Copyright (C) Clayton
|
||||
# Donley. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
#
|
||||
# DESCRIPTION
|
||||
# Synchronise some LDAP info with a PeopleSoft "dump". This "dump" file
|
||||
# is a "tab" separated file, as generated by an SQL utility on the
|
||||
# Oracle server.
|
||||
#
|
||||
#############################################################################
|
||||
|
||||
use Getopt::Std; # To parse command line arguments.
|
||||
use Mozilla::LDAP::Conn; # Main "OO" layer for LDAP
|
||||
use Mozilla::LDAP::Utils; # LULU, utilities.
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Local configurations, check these out . Note that SYNCS and ORDER has to
|
||||
# have the same fields, this is because the hash array doesn't preserve
|
||||
# the order of it's entries... :-( The "codes" are bit fields, where the
|
||||
# three LSB are used as
|
||||
#
|
||||
# 1 Force the update, even if attribute is empty (i.e. delete it)
|
||||
# 2 The attribute is the base for a DN (e.g. "manager").
|
||||
# 4 The attribute should be deleted if the user is not in PeopleSoft.
|
||||
# 8 Don't warn if the attribute is missing in the Psoft file (-W option).
|
||||
# 16 Always delete this attribute in the PeopleSoft entry.
|
||||
# 32 Delete this attribute if the account has "expired".
|
||||
#
|
||||
%SYNCS = (
|
||||
"nscpharold" => 1 + 4,
|
||||
"uid" => 0,
|
||||
"" => 0,
|
||||
"" => 0,
|
||||
"employeenumber" => 1 + 4 + 32,
|
||||
"departmentnumber" => 1 + 4,
|
||||
"" => 0,
|
||||
"" => 0,
|
||||
"" => 0,
|
||||
"manager" => 1 + 2,
|
||||
"title" => 1 + 4 + 16 + 32,
|
||||
"ou" => 1 + 4 + 32,
|
||||
"businesscategory" => 1 + 4 + 32,
|
||||
"employeetype" => 0,
|
||||
"nscppersonexpdate" => 1 + 8
|
||||
);
|
||||
|
||||
@ORDER = (
|
||||
"nscpharold",
|
||||
"uid",
|
||||
"",
|
||||
"",
|
||||
"employeenumber",
|
||||
"departmentnumber",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"manager",
|
||||
"title",
|
||||
"ou",
|
||||
"businesscategory",
|
||||
"employeetype",
|
||||
"nscppersonexpdate"
|
||||
);
|
||||
|
||||
# This is used for mapping the employeeType attribute into a readable format.
|
||||
%EMPCODES = (
|
||||
"A" => "Applicant",
|
||||
"C" => "Contractor",
|
||||
"E" => "Employee",
|
||||
"O" => "OEM Partner",
|
||||
"T" => "Interim",
|
||||
"V" => "Vendor"
|
||||
);
|
||||
|
||||
# Expiration policy for other attributes, the EXPDELAY is a convenience
|
||||
# default setting.
|
||||
$EXPDELAY = 24 * 7;
|
||||
%EXPIRES = (
|
||||
"carlicense" => $EXPDELAY,
|
||||
"mailautoreplymode" => $EXPDELAY,
|
||||
"mailautoreplytext" => $EXPDELAY,
|
||||
"mailforwardingaddress" => $EXPDELAY,
|
||||
"facsimiletelephonenumber" => $EXPDELAY
|
||||
);
|
||||
|
||||
|
||||
$NOTYPE = "Unknown";
|
||||
$DELIMITER = "%%";
|
||||
$SENDMAIL = "/usr/lib/sendmail";
|
||||
|
||||
$SEARCH = "(&(uid=*)(!(objectclass=pseudoAccount)))";
|
||||
$MAILTO = "leif\@netscape.com";
|
||||
|
||||
#$LDAP_DEBUG = 1;
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Constants, shouldn't have to edit these...
|
||||
#
|
||||
$APPNAM = "psoftsync";
|
||||
$USAGE = "$APPNAM [-nvW] -b base -h host -D bind -w passwd -P cert PS_file";
|
||||
|
||||
@ATTRIBUTES = uniq(@ORDER);
|
||||
push(@ATTRIBUTES, "objectclass");
|
||||
|
||||
$TODAY = `/usr/bin/date '+%Y%m%d'`;
|
||||
chop($TODAY);
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Print an error for the PeopleSoft data. Note that we use the "__XXX__" fields
|
||||
# here, to avoid the problem when an attribute is "expired" or modified.
|
||||
#
|
||||
sub psoftError
|
||||
{
|
||||
my ($str, $entry) = @_;
|
||||
|
||||
print "Error: $str: ";
|
||||
print $entry->key(), " (";
|
||||
print $entry->{__employeenumber__}, ", ";
|
||||
print $entry->{__employeetype__}, ", ";
|
||||
print $entry->{__departmentnumber__}, ")\n";
|
||||
}
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Read in a PeopleSoft file, and create all the entries.
|
||||
#
|
||||
sub readDump
|
||||
{
|
||||
my ($file) = @_;
|
||||
my (@info, %entries);
|
||||
my $val;
|
||||
|
||||
if (!open(PSOFT, $file))
|
||||
{
|
||||
print "Error: Can't read file $file\n";
|
||||
|
||||
exit(1);
|
||||
}
|
||||
|
||||
while (<PSOFT>)
|
||||
{
|
||||
next unless /$DELIMITER/;
|
||||
|
||||
@info = split(/\s*%%\s*/);
|
||||
$entry = new PsoftEntry($info[$[]);
|
||||
foreach $attr (@ORDER)
|
||||
{
|
||||
$val = shift(@info);
|
||||
next if ($attr eq "");
|
||||
|
||||
$entry->add($attr, $val, $SYNCS{$attr});
|
||||
}
|
||||
#
|
||||
# Perhaps we should do some sanity checks here on the PeopleSoft data?
|
||||
#
|
||||
|
||||
# Clean up some data if the user has expired ("best before...")
|
||||
if ($entry->expired($entry->{nscppersonexpdate}))
|
||||
{
|
||||
foreach $attr (@ORDER)
|
||||
{
|
||||
next unless $attr;
|
||||
|
||||
delete($entry->{$attr}) if ($SYNCS{$attr} & 32);
|
||||
}
|
||||
}
|
||||
|
||||
if ($entry->{uid})
|
||||
{
|
||||
$entries{$entry->{uid}} = $entry;
|
||||
}
|
||||
elsif ($opt_W)
|
||||
{
|
||||
psoftError("No UID", $entry);
|
||||
}
|
||||
}
|
||||
close(PSOFT);
|
||||
|
||||
return %entries;
|
||||
}
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Make a list "uniq", just like the Unix command.
|
||||
#
|
||||
sub uniq { # uniq(elements[])
|
||||
my %tmp;
|
||||
|
||||
grep($tmp{$_}++, @_);
|
||||
return sort(keys(%tmp));
|
||||
}
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Delete an attribute from an entry.
|
||||
#
|
||||
sub delAttr { # delAttr(ENTRY, ATTR)
|
||||
my ($entry, $attr) = @_;
|
||||
|
||||
if (defined($entry->{$attr}))
|
||||
{
|
||||
$out->write("Deleted $attr for user: $entry->{uid}[0]") if $opt_v;
|
||||
delete($entry->{$attr});
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Check arguments, and configure some parameters accordingly..
|
||||
#
|
||||
if (!getopts('nvMWb:h:D:p:s:w:P:'))
|
||||
{
|
||||
print "usage: $APPNAM $USAGE\n";
|
||||
exit;
|
||||
}
|
||||
%ld = Mozilla::LDAP::Utils::ldapArgs();
|
||||
Mozilla::LDAP::Utils::userCredentials(\%ld) unless $opt_n;
|
||||
|
||||
$out = new Mail();
|
||||
if ($opt_M)
|
||||
{
|
||||
$out->set("to", $MAILTO);
|
||||
$out->set("subject", "Hoth: PeopleSoft synchronization report");
|
||||
}
|
||||
else
|
||||
{
|
||||
$out->echo();
|
||||
$out->nomail();
|
||||
}
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Read in all the PeopleSoft entries, and then instantiate an LDAP object,
|
||||
# which also binds to the LDAP server.
|
||||
#
|
||||
%psoft = readDump(@ARGV[$[]);
|
||||
$conn = new Mozilla::LDAP::Conn(\%ld);
|
||||
die "Could't connect to LDAP server $ld{host}" unless $conn;
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Now process all the users, one by one.
|
||||
#
|
||||
$entry = $conn->search($ld{root}, "subtree", $SEARCH, 0, @ATTRIBUTES);
|
||||
|
||||
while ($entry)
|
||||
{
|
||||
$uid = $entry->{"uid"}[0];
|
||||
$changed = 0;
|
||||
|
||||
$psent = $psoft{$uid};
|
||||
if (!$psent)
|
||||
{
|
||||
print "Error: LDAP user $uid: No entry in PeopleSoft\n" if $opt_W;
|
||||
foreach $attr (@ORDER)
|
||||
{
|
||||
next unless $attr;
|
||||
$changed += delAttr($entry, $attr) if ($SYNCS{$attr} & 4);
|
||||
}
|
||||
if ($entry->{employeetype}[0] ne "$NOTYPE")
|
||||
{
|
||||
$entry->{employeetype} = ["$NOTYPE"];
|
||||
$changed = 1;
|
||||
$out->write("Set employeeType to $NOTYPE for user: $uid") if $opt_v;
|
||||
}
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
$psent->handled(1);
|
||||
foreach $attr (@ORDER)
|
||||
{
|
||||
next unless $attr;
|
||||
|
||||
if (!defined($psent->{$attr}) || ($psent->{$attr} eq ""))
|
||||
{
|
||||
$changed += delAttr($entry, $attr) if ($SYNCS{$attr} & 1);
|
||||
}
|
||||
elsif ($entry->{$attr}[0] ne $psent->{$attr})
|
||||
{
|
||||
$entry->{$attr} = [$psent->{$attr}];
|
||||
$changed = 1;
|
||||
$out->write("Set $attr to $psent->{$attr} for user: $uid") if $opt_v;
|
||||
}
|
||||
}
|
||||
# Now handle the Expire date special case...
|
||||
if ($psent->expired() ne "")
|
||||
{
|
||||
if ($entry->addValue("objectclass", "nscphidethis"))
|
||||
{
|
||||
$changed = 1;
|
||||
$out->write("Expiring the user: $uid") if $opt_v;
|
||||
}
|
||||
|
||||
# Expire other attributes, IFF the expire is over a certain
|
||||
# treshhold (e.g. a week).
|
||||
}
|
||||
elsif ($entry->removeValue("objectclass", "nscphidethis"))
|
||||
{
|
||||
$changed = 1;
|
||||
$out->write("Enabling the user: $uid") if $opt_v;
|
||||
}
|
||||
}
|
||||
|
||||
$conn->update($entry) if ($changed && ! $opt_n);
|
||||
$entry = $conn->nextEntry();
|
||||
}
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Close the LDAP connection.
|
||||
#
|
||||
$conn->close if $conn;
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Post process, figure out which PSoft entries have no entry in LDAP.
|
||||
#
|
||||
if ($opt_W)
|
||||
{
|
||||
foreach (keys(%psoft))
|
||||
{
|
||||
$ent=$psoft{$_};
|
||||
|
||||
psoftError("No LDAP entry", $ent) unless $ent->handled();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Package to an entry from the PeopleSoft database.
|
||||
#
|
||||
package PsoftEntry;
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Creator.
|
||||
#
|
||||
sub new
|
||||
{
|
||||
my ($class, $key) = @_;
|
||||
my $self = {};
|
||||
|
||||
bless $self, ref $class || $class;
|
||||
$self->{__key__} = $key;
|
||||
|
||||
return $self;
|
||||
}
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Add an attribute/field to the entry.
|
||||
#
|
||||
sub add
|
||||
{
|
||||
my ($self, $attr, $val, $lev) = @_;
|
||||
|
||||
return if ($lev & 16);
|
||||
|
||||
$attr = lc $attr;
|
||||
if ($attr eq "employeetype")
|
||||
{
|
||||
if (defined($main::EMPCODES{$val}))
|
||||
{
|
||||
$self->{$attr} = $main::EMPCODES{$val};
|
||||
}
|
||||
else
|
||||
{
|
||||
$self->{$attr} = $main::NOTYPE;
|
||||
}
|
||||
$self->{__employeetype__} = $val;
|
||||
}
|
||||
elsif (!defined($val) || ($val eq ""))
|
||||
{
|
||||
main::psoftError("No attribute $attr", $self)
|
||||
if ($main::opt_W && ($lev & 1) && !($lev & 8));
|
||||
}
|
||||
else
|
||||
{
|
||||
$self->{$attr} = ($lev & 2) ? "uid=$val,$main::ld{root}" : $val;
|
||||
$self->{"__${attr}__"} = $val;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Return the value for an attribute/field.
|
||||
#
|
||||
sub get
|
||||
{
|
||||
my ($self, $attr) = @_;
|
||||
|
||||
return $self->{$attr};
|
||||
}
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Mark the entry as "expired". If there is no "date" argument, we'll return
|
||||
# the current entries expire status.
|
||||
#
|
||||
sub expired
|
||||
{
|
||||
my ($self, $date) = @_;
|
||||
|
||||
if ($date)
|
||||
{
|
||||
# Only expire entries with reasonable expire dates...
|
||||
if (length($date) != 8)
|
||||
{
|
||||
main::psoftError("Bad expire date", $self) if $main::opt_W;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
if ($date lt $main::TODAY)
|
||||
{
|
||||
$self->{employeetype} = "$main::NOTYPE";
|
||||
$self->{__expired__} = 1;
|
||||
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
return $self->{__expired__};
|
||||
}
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Mark the entry as "handled", i.e. it exists in LDAP.
|
||||
#
|
||||
sub handled
|
||||
{
|
||||
my ($self, $flag) = @_;
|
||||
|
||||
$self->{__handled__} = 1 if $flag;
|
||||
|
||||
return $self->{__handled__};
|
||||
}
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Return the "key" of this entry, typically the name field.
|
||||
#
|
||||
sub key
|
||||
{
|
||||
my ($self) = @_;
|
||||
|
||||
return $self->{__key__};
|
||||
}
|
||||
|
||||
|
||||
#################################################################################
|
||||
# This sub-package will send mail to some recipients, IFF there is anything to
|
||||
# send, or your force it to send. Note that the Subject doesn't qualify it to
|
||||
# send a message (force it to send if you have to).
|
||||
#
|
||||
package Mail;
|
||||
|
||||
|
||||
#################################################################################
|
||||
# The constructor, which optionally takes the TO, FROM and SUBJECT.
|
||||
#
|
||||
sub new
|
||||
{
|
||||
my ($class, $to, $from, $subject) = @_;
|
||||
my $self = {};
|
||||
|
||||
bless $self, ref $class || $class;
|
||||
|
||||
$self->{to} = $to || "root";
|
||||
$self->{from} = $from || "ldap";
|
||||
$self->{subject} = $subject || "Output from LDAP script\n";
|
||||
@{$self->{message}} = ();
|
||||
$self->{send} = 0;
|
||||
$self->{nomail} = 0;
|
||||
$self->{echo} = 0;
|
||||
|
||||
return $self;
|
||||
}
|
||||
|
||||
|
||||
#################################################################################
|
||||
# Destructor, which will also send the message, if appropriate.
|
||||
#
|
||||
sub DESTROY
|
||||
{
|
||||
my ($self) = @_;
|
||||
|
||||
if ($self->{send} && !$self->{nomail})
|
||||
{
|
||||
$self->send();
|
||||
$self->{send} = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#################################################################################
|
||||
# Set a field for this entry, e.g. From:, To: etc.
|
||||
#
|
||||
sub set
|
||||
{
|
||||
my ($self, $field, $string) = @_;
|
||||
|
||||
if ($field && $string)
|
||||
{
|
||||
$field = lc $field;
|
||||
$self->{$field} = $string;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#################################################################################
|
||||
# Add a line to the message, the argument is the string.
|
||||
#
|
||||
sub write
|
||||
{
|
||||
my ($self, $string) = @_;
|
||||
|
||||
if ($string ne "")
|
||||
{
|
||||
push(@{$self->{message}}, $string);
|
||||
print "$string\n" if $self->{echo};
|
||||
|
||||
$self->{send}++;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#################################################################################
|
||||
# Force the object to send the message, no matter if there's anything in the
|
||||
# body or not.
|
||||
#
|
||||
sub force
|
||||
{
|
||||
my ($self) = @_;
|
||||
|
||||
$self->{send} = 1;
|
||||
$self->{nomail} = 0;
|
||||
}
|
||||
|
||||
|
||||
#################################################################################
|
||||
# Don't send the mail, this is the oppositte to "force...
|
||||
#
|
||||
sub nomail
|
||||
{
|
||||
my ($self) = @_;
|
||||
|
||||
$self->{send} = 0;
|
||||
$self->{nomail} = 1;
|
||||
}
|
||||
|
||||
|
||||
#################################################################################
|
||||
# Enable echo-mode, where we will also print everything to STDOUT.
|
||||
#
|
||||
sub echo
|
||||
{
|
||||
my ($self) = @_;
|
||||
|
||||
$self->{echo} = 1;
|
||||
}
|
||||
|
||||
|
||||
#################################################################################
|
||||
# Actually send the message. This is automatically done by the DESTROY method,
|
||||
# but we can force it to do it this way.
|
||||
#
|
||||
sub send
|
||||
{
|
||||
my ($self) = @_;
|
||||
|
||||
if ($self->{send} && !$self->{nomail})
|
||||
{
|
||||
open(MAILER, "|$main::SENDMAIL -t");
|
||||
print MAILER "From: $self->{from}\n";
|
||||
print MAILER "To: $self->{to}\n";
|
||||
print MAILER "Subject: $self->{subject}\n\n";
|
||||
|
||||
foreach (@{$self->{message}})
|
||||
{
|
||||
print MAILER "$_\n";
|
||||
}
|
||||
print MAILER ".\n";
|
||||
|
||||
close(MAILER);
|
||||
$self->{send} = 0;
|
||||
}
|
||||
}
|
||||
98
mozilla/directory/perldap/examples/qsearch.pl
Executable file
98
mozilla/directory/perldap/examples/qsearch.pl
Executable file
@@ -0,0 +1,98 @@
|
||||
#!/usr/bin/perl5
|
||||
#############################################################################
|
||||
# $Id: qsearch.pl,v 1.8 1999-01-21 23:52:47 leif%netscape.com Exp $
|
||||
#
|
||||
# The contents of this file are subject to the Mozilla Public License
|
||||
# Version 1.0 (the "License"); you may not use this file except in
|
||||
# compliance with the License. You may obtain a copy of the License at
|
||||
# http://www.mozilla.org/MPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS IS"
|
||||
# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing rights and limitations
|
||||
# under the License.
|
||||
#
|
||||
# The Original Code is PerLDAP. The Initial Developer of the Original
|
||||
# Code is Netscape Communications Corp. and Clayton Donley. Portions
|
||||
# created by Netscape are Copyright (C) Netscape Communications
|
||||
# Corp., portions created by Clayton Donley are Copyright (C) Clayton
|
||||
# Donley. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
#
|
||||
# DESCRIPTION
|
||||
# Quick Search, like ldapsearch, but in Perl. Look how simple it is.
|
||||
#
|
||||
#############################################################################
|
||||
|
||||
use Getopt::Std; # To parse command line arguments.
|
||||
use Mozilla::LDAP::Conn; # Main "OO" layer for LDAP
|
||||
use Mozilla::LDAP::Utils; # LULU, utilities.
|
||||
|
||||
use strict;
|
||||
no strict "vars";
|
||||
|
||||
|
||||
#################################################################################
|
||||
# Constants, shouldn't have to edit these...
|
||||
#
|
||||
$APPNAM = "qsearch";
|
||||
$USAGE = "$APPNAM -b base -h host -D bind -w pswd -P cert filter [attr...]";
|
||||
|
||||
|
||||
#################################################################################
|
||||
# Check arguments, and configure some parameters accordingly..
|
||||
#
|
||||
if (!getopts('b:h:D:p:s:w:P:'))
|
||||
{
|
||||
print "usage: $APPNAM $USAGE\n";
|
||||
exit;
|
||||
}
|
||||
%ld = Mozilla::LDAP::Utils::ldapArgs();
|
||||
|
||||
|
||||
#################################################################################
|
||||
# Now do all the searches, one by one.
|
||||
#
|
||||
$conn = new Mozilla::LDAP::Conn(\%ld);
|
||||
die "Could't connect to LDAP server $ld{host}" unless $conn;
|
||||
|
||||
foreach (@ARGV)
|
||||
{
|
||||
if (/\=/)
|
||||
{
|
||||
push(@srch, $_);
|
||||
}
|
||||
else
|
||||
{
|
||||
push(@attr, $_);
|
||||
}
|
||||
}
|
||||
|
||||
foreach $search (@srch)
|
||||
{
|
||||
if ($#attr >= $[)
|
||||
{
|
||||
$entry = $conn->search($ld{root}, $ld{scope}, $search, 0, @attr);
|
||||
}
|
||||
else
|
||||
{
|
||||
$entry = $conn->search($ld{root}, $ld{scope}, "$search");
|
||||
}
|
||||
|
||||
print "Searched for `$search':\n\n";
|
||||
$conn->printError() if $conn->getErrorCode();
|
||||
|
||||
while ($entry)
|
||||
{
|
||||
$entry->printLDIF();
|
||||
$entry = $conn->nextEntry;
|
||||
}
|
||||
print "\n";
|
||||
}
|
||||
|
||||
|
||||
#################################################################################
|
||||
# Close the connection.
|
||||
#
|
||||
$conn->close if $conn;
|
||||
135
mozilla/directory/perldap/examples/rand_mods.pl
Executable file
135
mozilla/directory/perldap/examples/rand_mods.pl
Executable file
@@ -0,0 +1,135 @@
|
||||
#!/usr/bin/perl5
|
||||
#################################################################################
|
||||
# $Id: rand_mods.pl,v 1.2 1999-08-24 22:30:51 leif%netscape.com Exp $
|
||||
#
|
||||
# The contents of this file are subject to the Netscape Public License Version
|
||||
# 1.0 (the "License"); you may not use this file except in compliance with the
|
||||
# License. You may obtain a copy of the License at http://www.mozilla.org/NPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS IS" basis,
|
||||
# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
|
||||
# the specific language governing rights and limitations under the License.
|
||||
#
|
||||
# The Initial Developer of the Original Code is Netscape Communications
|
||||
# Corporation. Portions created by Netscape are Copyright (C) 1998 Netscape
|
||||
# Communications Corporation. All Rights Reserved.
|
||||
#
|
||||
# SYNOPSIS:
|
||||
# Modify an attribute for one or more entries, or possibly delete it.
|
||||
#
|
||||
# USAGE:
|
||||
# rand_mods [-adnvW] -b base -h host -D bind DN -w pwd -P cert filter loops
|
||||
# attribute ...
|
||||
#
|
||||
#################################################################################
|
||||
|
||||
|
||||
#################################################################################
|
||||
# Modules we need. Note that we depend heavily on the Ldapp module,
|
||||
# which needs to be built from the C code. It also requires an LDAP SDK.
|
||||
#
|
||||
use Getopt::Std; # To parse command line arguments.
|
||||
use Mozilla::LDAP::Conn; # Main "OO" layer for LDAP
|
||||
use Mozilla::LDAP::Utils; # LULU, utilities.
|
||||
use Carp;
|
||||
|
||||
use strict;
|
||||
no strict "vars";
|
||||
|
||||
|
||||
#################################################################################
|
||||
# Constants, shouldn't have to edit these...
|
||||
#
|
||||
$APPNAM = "rand_mods";
|
||||
$USAGE = "$APPNAM [-dnvW] -b base -h host -D bind -w pswd filter loops attr ...";
|
||||
$AUTHOR = "Leif Hedstrom <leif\@netscape.com>";
|
||||
|
||||
|
||||
#################################################################################
|
||||
# Check arguments, and configure some parameters accordingly..
|
||||
#
|
||||
if (!getopts('adnvWb:h:D:p:s:w:P:'))
|
||||
{
|
||||
print "usage: $APPNAM $USAGE\n";
|
||||
exit;
|
||||
}
|
||||
%ld = Mozilla::LDAP::Utils::ldapArgs();
|
||||
|
||||
|
||||
#################################################################################
|
||||
# Instantiate an LDAP object, which also binds to the LDAP server.
|
||||
#
|
||||
if (!getopts('b:h:D:p:s:w:P:'))
|
||||
{
|
||||
print "usage: $APPNAM $USAGE\n";
|
||||
exit;
|
||||
}
|
||||
%ld = Mozilla::LDAP::Utils::ldapArgs();
|
||||
$conn = new Mozilla::LDAP::Conn(\%ld);
|
||||
croak "Could't connect to LDAP server $ld{host}" unless $conn;
|
||||
|
||||
|
||||
#################################################################################
|
||||
# Parse some extra argumens
|
||||
#
|
||||
my $srch, $loop;
|
||||
my (@attrs) = ("givenName", "sn");
|
||||
|
||||
if (! ($srch = shift(@ARGV)))
|
||||
{
|
||||
print "Usage: $APPNAME $USAGE\n";
|
||||
exit;
|
||||
}
|
||||
$srch = "(&(!(objectclass=nscpHideThis))(uid=*))" if ($srch eq "");
|
||||
|
||||
if (! ($loops = shift(@ARGV)))
|
||||
{
|
||||
print "Usage: $APPNAME $USAGE\n";
|
||||
exit;
|
||||
}
|
||||
|
||||
@attrs = @ARGV if ($#ARGV > $[);
|
||||
$num_attrs = $#attrs;
|
||||
|
||||
|
||||
#################################################################################
|
||||
# Find all the argument
|
||||
#
|
||||
my $num = 0;
|
||||
$entry = $conn->search($ld{root}, $ld{scope}, $srch, 0, ("0.0"));
|
||||
while ($entry)
|
||||
{
|
||||
push(@users, $entry->getDN());
|
||||
$num++;
|
||||
$entry = $conn->nextEntry();
|
||||
}
|
||||
|
||||
print "Found $num users, randomizing changes now...\n";
|
||||
|
||||
srand(time ^ $$);
|
||||
|
||||
my $tmp, $tmp2, $dn, $loop2;
|
||||
while ($loops--)
|
||||
{
|
||||
$dn = $users[rand($num)];
|
||||
|
||||
print "$loops loops left...\n" if (($loops % 100) == 0);
|
||||
$entry = $conn->browse($dn, @attrs);
|
||||
|
||||
if ($entry)
|
||||
{
|
||||
$loop2 = $num_attrs + 1;
|
||||
while ($loop2--)
|
||||
{
|
||||
$tmp = $entry->{$attrs[$loop2]}[0];
|
||||
$tmp2 = rand($num_attrs);
|
||||
|
||||
$entry->{$attrs[$loop2]} = [ $entry->{$attrs[$tmp2]}[0] ];
|
||||
$entry->{$attrs[$tmp2]} = [ $tmp] ;
|
||||
|
||||
$entry->printLDIF();
|
||||
}
|
||||
|
||||
$conn->update($entry);
|
||||
}
|
||||
}
|
||||
98
mozilla/directory/perldap/examples/rename.pl
Executable file
98
mozilla/directory/perldap/examples/rename.pl
Executable file
@@ -0,0 +1,98 @@
|
||||
#!/usr/bin/perl5
|
||||
#############################################################################
|
||||
# $Id: rename.pl,v 1.4 1999-01-21 23:52:47 leif%netscape.com Exp $
|
||||
#
|
||||
# The contents of this file are subject to the Mozilla Public License
|
||||
# Version 1.0 (the "License"); you may not use this file except in
|
||||
# compliance with the License. You may obtain a copy of the License at
|
||||
# http://www.mozilla.org/MPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS IS"
|
||||
# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing rights and limitations
|
||||
# under the License.
|
||||
#
|
||||
# The Original Code is PerLDAP. The Initial Developer of the Original
|
||||
# Code is Netscape Communications Corp. and Clayton Donley. Portions
|
||||
# created by Netscape are Copyright (C) Netscape Communications
|
||||
# Corp., portions created by Clayton Donley are Copyright (C) Clayton
|
||||
# Donley. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
#
|
||||
# DESCRIPTION
|
||||
# Rename an LDAP entry, changing it's DN. Note that currently this only
|
||||
# works with RDNs.
|
||||
#
|
||||
#############################################################################
|
||||
|
||||
use Getopt::Std; # To parse command line arguments.
|
||||
use Mozilla::LDAP::Conn; # Main "OO" layer for LDAP
|
||||
use Mozilla::LDAP::Utils; # LULU, utilities.
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Constants, shouldn't have to edit these...
|
||||
#
|
||||
$APPNAM = "rename";
|
||||
$USAGE = "$APPNAM [-nvI] -b base -h host -D bind -w pswd -P cert filter new_rdn";
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Check arguments, and configure some parameters accordingly..
|
||||
#
|
||||
if (!getopts('nvIb:h:D:w:P:'))
|
||||
{
|
||||
print "usage: $APPNAM $USAGE\n";
|
||||
exit;
|
||||
}
|
||||
%ld = Mozilla::LDAP::Utils::ldapArgs();
|
||||
Mozilla::LDAP::Utils::userCredentials(\%ld) unless $opt_n;
|
||||
|
||||
($search, $rdn) = @ARGV;
|
||||
if (($search eq "") || ($rdn eq ""))
|
||||
{
|
||||
print "usage: $APPNAM $USAGE\n";
|
||||
exit;
|
||||
}
|
||||
|
||||
|
||||
#############################################################################
|
||||
# Instantiate an LDAP object, which also binds to the LDAP server.
|
||||
#
|
||||
$conn = new Mozilla::LDAP::Conn(\%ld);
|
||||
die "Could't connect to LDAP server $ld{host}" unless $conn;
|
||||
|
||||
$key = "Y" if $opt_I;
|
||||
$entry = $conn->search($ld{root}, $ld{scope}, $search, 0, @ATTRIBUTES);
|
||||
$conn->printError() if $conn->getErrorCode();
|
||||
|
||||
if (! $entry || $conn->nextEntry())
|
||||
{
|
||||
print "Error: The search did not return exactly one match, abort!\n";
|
||||
exit;
|
||||
}
|
||||
|
||||
if (! $opt_I)
|
||||
{
|
||||
print "Rename ", $entry->getDN(), " with $rdn [N]? ";
|
||||
$key = Mozilla::LDAP::Utils::answer("N") unless $opt_I;
|
||||
}
|
||||
|
||||
if ($key eq "Y")
|
||||
{
|
||||
# Note: I have to explicitly specify the original DN below, since the call
|
||||
# to nextEntry() above blows the DN away from the ::Conn object.
|
||||
if (! $opt_n)
|
||||
{
|
||||
$conn->modifyRDN($rdn, $entry->getDN());
|
||||
$conn->printError() if $conn->getErrorCode();
|
||||
}
|
||||
print "Renamed $entry->{dn}\n" if $opt_v;
|
||||
}
|
||||
|
||||
|
||||
#################################################################################
|
||||
# Close the connection.
|
||||
#
|
||||
$conn->close if $conn;
|
||||
95
mozilla/directory/perldap/examples/rmentry.pl
Executable file
95
mozilla/directory/perldap/examples/rmentry.pl
Executable file
@@ -0,0 +1,95 @@
|
||||
#!/usr/bin/perl5
|
||||
#############################################################################
|
||||
# $Id: rmentry.pl,v 1.5 1999-08-24 22:30:51 leif%netscape.com Exp $
|
||||
#
|
||||
# The contents of this file are subject to the Mozilla Public License
|
||||
# Version 1.0 (the "License"); you may not use this file except in
|
||||
# compliance with the License. You may obtain a copy of the License at
|
||||
# http://www.mozilla.org/MPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS IS"
|
||||
# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing rights and limitations
|
||||
# under the License.
|
||||
#
|
||||
# The Original Code is PerLDAP. The Initial Developer of the Original
|
||||
# Code is Netscape Communications Corp. and Clayton Donley. Portions
|
||||
# created by Netscape are Copyright (C) Netscape Communications
|
||||
# Corp., portions created by Clayton Donley are Copyright (C) Clayton
|
||||
# Donley. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
#
|
||||
# DESCRIPTION
|
||||
# Remove one or several LDAP objects. By default this tool is
|
||||
# interactive, which can be disabled with the "-I" option (but
|
||||
# please be careful...).
|
||||
#
|
||||
#############################################################################
|
||||
|
||||
use Getopt::Std; # To parse command line arguments.
|
||||
use Mozilla::LDAP::Conn; # Main "OO" layer for LDAP
|
||||
use Mozilla::LDAP::Utils; # LULU, utilities.
|
||||
|
||||
|
||||
#################################################################################
|
||||
# Constants, shouldn't have to edit these...
|
||||
#
|
||||
$APPNAM = "rmentry";
|
||||
$USAGE = "$APPNAM [-nvI] -b base -h host -p port -D bind -w pswd" .
|
||||
"-P cert filter ...";
|
||||
|
||||
@ATTRIBUTES = ("uid");
|
||||
|
||||
|
||||
#################################################################################
|
||||
# Check arguments, and configure some parameters accordingly..
|
||||
#
|
||||
if (!getopts('nvIb:h:p:D:w:P:'))
|
||||
{
|
||||
print "usage: $APPNAM $USAGE\n";
|
||||
exit;
|
||||
}
|
||||
%ld = Mozilla::LDAP::Utils::ldapArgs();
|
||||
Mozilla::LDAP::Utils::userCredentials(\%ld) unless $opt_n;
|
||||
|
||||
|
||||
#################################################################################
|
||||
# Do the search, and process all the entries.
|
||||
#
|
||||
$conn = new Mozilla::LDAP::Conn(\%ld);
|
||||
die "Could't connect to LDAP server $ld{host}" unless $conn;
|
||||
|
||||
$key = "Y" if $opt_I;
|
||||
foreach $search (@ARGV)
|
||||
{
|
||||
$entry = $conn->search($ld{root}, $ld{scope}, $search, 0, @ATTRIBUTES);
|
||||
$conn->printError() if $conn->getErrorCode();
|
||||
|
||||
while ($entry)
|
||||
{
|
||||
if (! $opt_I)
|
||||
{
|
||||
print "Delete $entry->{dn} [N]? ";
|
||||
$key = Mozilla::LDAP::Utils::answer("N") unless $opt_I;
|
||||
}
|
||||
|
||||
if ($key eq "Y")
|
||||
{
|
||||
if (! $opt_n)
|
||||
{
|
||||
$conn->delete($entry);
|
||||
$conn->printError() if $conn->getErrorCode();
|
||||
}
|
||||
print "Deleted $entry->{dn}\n" if $opt_v;
|
||||
}
|
||||
|
||||
$entry = $conn->nextEntry();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#################################################################################
|
||||
# Close the connection.
|
||||
#
|
||||
$conn->close if $conn;
|
||||
81
mozilla/directory/perldap/examples/tabdump.pl
Executable file
81
mozilla/directory/perldap/examples/tabdump.pl
Executable file
@@ -0,0 +1,81 @@
|
||||
#!/usr/bin/perl5
|
||||
#############################################################################
|
||||
# $Id: tabdump.pl,v 1.3 1998-08-13 09:11:10 leif Exp $
|
||||
#
|
||||
# The contents of this file are subject to the Mozilla Public License
|
||||
# Version 1.0 (the "License"); you may not use this file except in
|
||||
# compliance with the License. You may obtain a copy of the License at
|
||||
# http://www.mozilla.org/MPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS IS"
|
||||
# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing rights and limitations
|
||||
# under the License.
|
||||
#
|
||||
# The Original Code is PerLDAP. The Initial Developer of the Original
|
||||
# Code is Netscape Communications Corp. and Clayton Donley. Portions
|
||||
# created by Netscape are Copyright (C) Netscape Communications
|
||||
# Corp., portions created by Clayton Donley are Copyright (C) Clayton
|
||||
# Donley. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
#
|
||||
# DESCRIPTION
|
||||
# Generate a TAB separate "dump" of entries matching the search criteria,
|
||||
# using the list of attributes specified.
|
||||
#
|
||||
#############################################################################
|
||||
|
||||
use Getopt::Std; # To parse command line arguments.
|
||||
use Mozilla::LDAP::Conn; # Main "OO" layer for LDAP
|
||||
use Mozilla::LDAP::Utils; # LULU, utilities.
|
||||
|
||||
|
||||
#################################################################################
|
||||
# Constants, shouldn't have to edit these...
|
||||
#
|
||||
$APPNAM = "tabdump";
|
||||
$USAGE = "$APPNAM [-nv] -b base -h host -D bind -w pswd -P cert attr1,attr2,.. srch";
|
||||
|
||||
|
||||
#################################################################################
|
||||
# Check arguments, and configure some parameters accordingly..
|
||||
#
|
||||
if (!getopts('nvb:h:D:p:s:w:P:'))
|
||||
{
|
||||
print "usage: $APPNAM $USAGE\n";
|
||||
exit;
|
||||
}
|
||||
%ld = Mozilla::LDAP::Utils::ldapArgs();
|
||||
|
||||
$attributes = $ARGV[$[];
|
||||
$search = $ARGV[$[ + 1];
|
||||
die "Need to specify a list of attributes and the search filter.\n"
|
||||
unless ($attributes && $search);
|
||||
|
||||
|
||||
#################################################################################
|
||||
# Do the searches, and produce the output.
|
||||
#
|
||||
$conn = new Mozilla::LDAP::Conn(\%ld);
|
||||
die "Could't connect to LDAP server $ld{host}" unless $conn;
|
||||
|
||||
@attr = split(/,/, $attributes);
|
||||
$entry = $conn->search($ld{root}, $ld{scope}, $search, 0, @attr);
|
||||
$conn->printError() if $conn->getErrorCode();
|
||||
|
||||
while ($entry)
|
||||
{
|
||||
foreach (@attr)
|
||||
{
|
||||
print $entry->{$_}[0], "\t";
|
||||
}
|
||||
print "\n";
|
||||
$entry = $conn->nextEntry;
|
||||
}
|
||||
|
||||
|
||||
#################################################################################
|
||||
# Close the connection.
|
||||
#
|
||||
$conn->close if $conn;
|
||||
162
mozilla/directory/perldap/oldtest.pl
Normal file
162
mozilla/directory/perldap/oldtest.pl
Normal file
@@ -0,0 +1,162 @@
|
||||
#############################################################################
|
||||
# $Id: oldtest.pl,v 1.2 1999-08-24 22:30:48 leif%netscape.com Exp $
|
||||
#
|
||||
# The contents of this file are subject to the Mozilla Public License
|
||||
# Version 1.0 (the "License"); you may not use this file except in
|
||||
# compliance with the License. You may obtain a copy of the License at
|
||||
# http://www.mozilla.org/MPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS IS"
|
||||
# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing rights and limitations
|
||||
# under the License.
|
||||
#
|
||||
# The Original Code is PerLDAP. The Initial Developer of the Original
|
||||
# Code is Netscape Communications Corp. and Clayton Donley. Portions
|
||||
# created by Netscape are Copyright (C) Netscape Communications
|
||||
# Corp., portions created by Clayton Donley are Copyright (C) Clayton
|
||||
# Donley. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
#
|
||||
# DESCRIPTION
|
||||
# Before `make install' is performed this script should be runnable with
|
||||
# `make test'. After `make install' it should work as `perl test.pl'
|
||||
#
|
||||
#############################################################################
|
||||
|
||||
######################### We start with some black magic to print on failure.
|
||||
|
||||
# Change 1..1 below to 1..last_test_to_print .
|
||||
# (It may become useful if the test is moved to ./t subdirectory.)
|
||||
|
||||
BEGIN { $| = 1; print "1..8\n"; }
|
||||
END {print "modinit - not ok\n" unless $loaded;}
|
||||
use Mozilla::LDAP::API qw(:constant :api :ssl);
|
||||
$loaded = 1;
|
||||
print "modinit - ok\n";
|
||||
|
||||
######################### End of black magic.
|
||||
|
||||
|
||||
$attrs = [];
|
||||
|
||||
$ldap_host = $ENV{"LDAPHOST"};
|
||||
$filter = $ENV{"TESTFILTER"};
|
||||
$BASEDN = $ENV{"LDAPBASE"};
|
||||
|
||||
if (!$ldap_host)
|
||||
{
|
||||
print "\nEnter LDAP Server: ";
|
||||
chomp($ldap_host = <>);
|
||||
}
|
||||
|
||||
if (!$filter)
|
||||
{
|
||||
print "Enter Search Filter (ex. uid=abc123): ";
|
||||
chomp($filter = <>);
|
||||
}
|
||||
|
||||
if (!$BASEDN)
|
||||
{
|
||||
print "Enter LDAP Search Base (ex. o=Org, c=US): ";
|
||||
chomp($BASEDN = <>);
|
||||
}
|
||||
|
||||
print "\n";
|
||||
|
||||
|
||||
##
|
||||
## Initialize LDAP Connection
|
||||
##
|
||||
|
||||
if (($ld = ldap_init($ldap_host,LDAP_PORT)) == -1)
|
||||
{
|
||||
print "open - not ok\n";
|
||||
exit -1;
|
||||
}
|
||||
print "open - ok\n";
|
||||
|
||||
##
|
||||
## Bind as DN, PASSWORD (NULL,NULL) on LDAP connection $ld
|
||||
##
|
||||
|
||||
if (ldap_simple_bind_s($ld,"","") != LDAP_SUCCESS)
|
||||
{
|
||||
ldap_perror($ld,"bind_s");
|
||||
print "bind - not ok\n";
|
||||
exit -1;
|
||||
}
|
||||
print "bind - ok\n";
|
||||
|
||||
##
|
||||
## ldap_search_s - Synchronous Search
|
||||
##
|
||||
|
||||
if (ldap_search_s($ld,$BASEDN,LDAP_SCOPE_SUBTREE,$filter,$attrs,0,$result) != LDAP_SUCCESS)
|
||||
{
|
||||
ldap_perror($ld,"search_s");
|
||||
print "search - not ok\n";
|
||||
}
|
||||
print "search - ok\n";
|
||||
|
||||
##
|
||||
## ldap_count_entries - Count Matched Entries
|
||||
##
|
||||
|
||||
if (($count = ldap_count_entries($ld,$result)) == -1)
|
||||
{
|
||||
ldap_perror($ld,"count_entry");
|
||||
print "count - not ok\n";
|
||||
}
|
||||
print "count - ok - $count\n";
|
||||
|
||||
##
|
||||
## first_entry - Get First Matched Entry
|
||||
## next_entry - Get Next Matched Entry
|
||||
##
|
||||
|
||||
for ($ent = ldap_first_entry($ld,$result); $ent; $ent = ldap_next_entry($ld,$ent))
|
||||
{
|
||||
|
||||
##
|
||||
## ldap_get_dn - Get DN for Matched Entries
|
||||
##
|
||||
|
||||
if (($dn = ldap_get_dn($ld,$ent)) ne "")
|
||||
{
|
||||
print "getdn - ok - $dn\n";
|
||||
} else {
|
||||
ldap_perror($ld,"get_dn");
|
||||
print "getdn - not ok\n";
|
||||
}
|
||||
|
||||
for ($attr = ldap_first_attribute($ld,$ent,$ber); $attr; $attr = ldap_next_attribute($ld,$ent,$ber))
|
||||
{
|
||||
print "firstatt - ok - $attr\n";
|
||||
|
||||
##
|
||||
## ldap_get_values
|
||||
##
|
||||
|
||||
@vals = ldap_get_values($ld,$ent,$attr);
|
||||
if ($#vals >= 0)
|
||||
{
|
||||
foreach $val (@vals)
|
||||
{
|
||||
print "getvals - ok - $val\n";
|
||||
}
|
||||
} else {
|
||||
print "getvals - not ok\n";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
##
|
||||
## Unbind LDAP Connection
|
||||
##
|
||||
|
||||
ldap_unbind($ld);
|
||||
|
||||
14
mozilla/directory/perldap/t/ChangeLog
Normal file
14
mozilla/directory/perldap/t/ChangeLog
Normal file
@@ -0,0 +1,14 @@
|
||||
1999-08-06 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* conn.pl: Added support for browse() and compare().
|
||||
|
||||
1999-03-19 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* conn.pl: Added test for add() with a hash array.
|
||||
|
||||
1999-01-05 Leif Hedstrom <leif@netscape.com>
|
||||
|
||||
* entry.pl: New script, to test all Entry:: methods.
|
||||
|
||||
* conn.pl: Added test for modifyRDN().
|
||||
|
||||
4
mozilla/directory/perldap/t/api.t
Normal file
4
mozilla/directory/perldap/t/api.t
Normal file
@@ -0,0 +1,4 @@
|
||||
print "This is not a real test, yet...\n";
|
||||
print "1..1\n";
|
||||
|
||||
print "ok 1\n";
|
||||
BIN
mozilla/directory/perldap/t/conn.pl
Executable file
BIN
mozilla/directory/perldap/t/conn.pl
Executable file
Binary file not shown.
4
mozilla/directory/perldap/t/conn.t
Normal file
4
mozilla/directory/perldap/t/conn.t
Normal file
@@ -0,0 +1,4 @@
|
||||
print "This is not a real test, yet...\n";
|
||||
print "1..1\n";
|
||||
|
||||
print "ok 1\n";
|
||||
150
mozilla/directory/perldap/t/entry.pl
Executable file
150
mozilla/directory/perldap/t/entry.pl
Executable file
@@ -0,0 +1,150 @@
|
||||
#!/usr/bin/perl5
|
||||
#############################################################################
|
||||
# $Id: entry.pl,v 1.2 1999-01-21 23:52:50 leif%netscape.com Exp $
|
||||
#
|
||||
# The contents of this file are subject to the Mozilla Public License
|
||||
# Version 1.0 (the "License"); you may not use this file except in
|
||||
# compliance with the License. You may obtain a copy of the License at
|
||||
# http://www.mozilla.org/MPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS IS"
|
||||
# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing rights and limitations
|
||||
# under the License.
|
||||
#
|
||||
# The Original Code is PerLDAP. The Initial Developer of the Original
|
||||
# Code is Netscape Communications Corp. and Clayton Donley. Portions
|
||||
# created by Netscape are Copyright (C) Netscape Communications
|
||||
# Corp., portions created by Clayton Donley are Copyright (C) Clayton
|
||||
# Donley. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
#
|
||||
# DESCRIPTION
|
||||
# Test most (all?) of the LDAP::Mozilla::Conn methods.
|
||||
#
|
||||
#############################################################################
|
||||
|
||||
use Getopt::Std; # To parse command line arguments.
|
||||
use Mozilla::LDAP::Conn; # Main "OO" layer for LDAP
|
||||
use Mozilla::LDAP::Utils; # LULU, utilities.
|
||||
use Mozilla::LDAP::API;
|
||||
|
||||
use strict;
|
||||
no strict "vars";
|
||||
|
||||
|
||||
#################################################################################
|
||||
# Configurations, modify these as needed.
|
||||
#
|
||||
$BIND = "uid=ldapadmin";
|
||||
$BASE = "o=Netscape Communications Corp.,c=US";
|
||||
$PEOPLE = "ou=people";
|
||||
$GROUPS = "ou=groups";
|
||||
$UID = "leif-test";
|
||||
$CN = "test-group-1";
|
||||
|
||||
|
||||
#################################################################################
|
||||
# Constants, shouldn't have to edit these...
|
||||
#
|
||||
$APPNAM = "entry.pl";
|
||||
$USAGE = "$APPNAM -b base -h host -D bind -w pswd -P cert";
|
||||
|
||||
|
||||
#################################################################################
|
||||
# Check arguments, and configure some parameters accordingly..
|
||||
#
|
||||
if (!getopts('b:h:D:p:s:w:P:'))
|
||||
{
|
||||
print "usage: $APPNAM $USAGE\n";
|
||||
exit;
|
||||
}
|
||||
%ld = Mozilla::LDAP::Utils::ldapArgs($BIND, $BASE);
|
||||
|
||||
|
||||
#################################################################################
|
||||
# Get an LDAP connection
|
||||
#
|
||||
sub getConn
|
||||
{
|
||||
my $conn;
|
||||
|
||||
if ($main::reuseConn)
|
||||
{
|
||||
if (!defined($main::mainConn))
|
||||
{
|
||||
$main::mainConn = new Mozilla::LDAP::Conn(\%main::ld);
|
||||
die "Could't connect to LDAP server $main::ld{host}"
|
||||
unless $main::mainConn;
|
||||
}
|
||||
return $main::mainConn;
|
||||
}
|
||||
else
|
||||
{
|
||||
$conn = new Mozilla::LDAP::Conn(\%main::ld);
|
||||
die "Could't connect to LDAP server $main::ld{host}" unless $conn;
|
||||
}
|
||||
|
||||
return $conn;
|
||||
}
|
||||
|
||||
|
||||
#################################################################################
|
||||
# Some small help functions...
|
||||
#
|
||||
sub dotPrint
|
||||
{
|
||||
my $str = shift;
|
||||
|
||||
print $str . '.' x (20 - length($str));
|
||||
}
|
||||
|
||||
sub attributeEQ
|
||||
{
|
||||
my @a, @b;
|
||||
my $i;
|
||||
|
||||
@a = @{$_[0]};
|
||||
@b = @{$_[1]};
|
||||
return 1 if (($#a < 0) && ($#b < 0));
|
||||
return 0 unless ($#a == $#b);
|
||||
|
||||
@a = sort(@a);
|
||||
@b = sort(@b);
|
||||
for ($i = 0; $i <= $#a; $i++)
|
||||
{
|
||||
return 0 unless ($a[$i] eq $b[$i]);;
|
||||
}
|
||||
|
||||
return 1; # We passed all the tests, we're ok.
|
||||
}
|
||||
|
||||
|
||||
#################################################################################
|
||||
# Setup the test entries.
|
||||
#
|
||||
$filter = "(uid=$UID)";
|
||||
$conn = getConn();
|
||||
$nentry = $conn->newEntry();
|
||||
|
||||
$nentry->setDN("uid=$UID, $PEOPLE, $BASE");
|
||||
$nentry->{objectclass} = [ "top", "person", "inetOrgPerson", "mailRecipient" ];
|
||||
$nentry->addValue("uid", $UID);
|
||||
$nentry->addValue("sn", "Hedstrom");
|
||||
$nentry->addValue("givenName", "Leif");
|
||||
$nentry->addValue("cn", "Leif Hedstrom");
|
||||
$nentry->addValue("cn", "Leif P. Hedstrom");
|
||||
$nentry->addValue("cn", "The Swede");
|
||||
$nentry->addValue("description", "Test1");
|
||||
$nentry->addValue("description", "Test2");
|
||||
$nentry->addValue("description", "Test3");
|
||||
$nentry->addValue("description", "Test4");
|
||||
$nentry->addValue("description", "Test5");
|
||||
$nentry->addValue("mail", "leif\@ogre.com");
|
||||
|
||||
$ent = $conn->search($ld{root}, $ld{scope}, $filter);
|
||||
$conn->delete($ent->getDN()) if $ent;
|
||||
$conn->add($nentry);
|
||||
|
||||
$conn->close();
|
||||
4
mozilla/directory/perldap/t/entry.t
Normal file
4
mozilla/directory/perldap/t/entry.t
Normal file
@@ -0,0 +1,4 @@
|
||||
print "This is not a real test, yet...\n";
|
||||
print "1..1\n";
|
||||
|
||||
print "ok 1\n";
|
||||
4
mozilla/directory/perldap/t/ldif.t
Normal file
4
mozilla/directory/perldap/t/ldif.t
Normal file
@@ -0,0 +1,4 @@
|
||||
print "This is not a real test, yet...\n";
|
||||
print "1..1\n";
|
||||
|
||||
print "ok 1\n";
|
||||
4
mozilla/directory/perldap/t/utils.t
Normal file
4
mozilla/directory/perldap/t/utils.t
Normal file
@@ -0,0 +1,4 @@
|
||||
print "This is not a real test, yet...\n";
|
||||
print "1..1\n";
|
||||
|
||||
print "ok 1\n";
|
||||
280
mozilla/directory/perldap/test_api/api.pl
Executable file
280
mozilla/directory/perldap/test_api/api.pl
Executable file
@@ -0,0 +1,280 @@
|
||||
#!/usr/bin/perl -w
|
||||
#############################################################################
|
||||
# $Id: api.pl,v 1.7 1999-01-21 23:52:52 leif%netscape.com Exp $
|
||||
#
|
||||
# The contents of this file are subject to the Mozilla Public License
|
||||
# Version 1.0 (the "License"); you may not use this file except in
|
||||
# compliance with the License. You may obtain a copy of the License at
|
||||
# http://www.mozilla.org/MPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS IS"
|
||||
# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing rights and limitations
|
||||
# under the License.
|
||||
#
|
||||
# The Original Code is PerLDAP. The Initial Developer of the Original
|
||||
# Code is Netscape Communications Corp. and Clayton Donley. Portions
|
||||
# created by Netscape are Copyright (C) Netscape Communications
|
||||
# Corp., portions created by Clayton Donley are Copyright (C) Clayton
|
||||
# Donley. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
#
|
||||
# DESCRIPTION
|
||||
# api.pl - Test all LDAPv2 API function
|
||||
# Author: Clayton Donley <donley@wwa.com>
|
||||
#
|
||||
# Performs all API calls directly in order to test for possible issues
|
||||
# on a particular platform.
|
||||
#
|
||||
#############################################################################
|
||||
|
||||
use Mozilla::LDAP::API qw(:api :constant);
|
||||
use strict;
|
||||
|
||||
my $BASE = "ou=Test,o=Test,c=US";
|
||||
my $DN = "cn=Directory Manager";
|
||||
my $PASS = "abcd1234";
|
||||
my $HOST = "";
|
||||
my $PORT = 389;
|
||||
|
||||
if (!$HOST)
|
||||
{
|
||||
print "Please edit the variables at the top of this file.\n";
|
||||
exit -1;
|
||||
}
|
||||
|
||||
print "\nPerLDAP API TestSuite\n";
|
||||
print "\nNote: Failures in earlier tests will cause later tests to fail.\n";
|
||||
print "\n";
|
||||
|
||||
my $howmany = 10;
|
||||
|
||||
# Initialize the Connection
|
||||
{
|
||||
my $ld = ldap_init($HOST,$PORT);
|
||||
if ($ld <0)
|
||||
{
|
||||
print "init - Failed!\n";
|
||||
die;
|
||||
}
|
||||
print "init - OK\n";
|
||||
|
||||
# Set an LDAP Session Option
|
||||
if (ldap_set_option($ld,LDAP_OPT_PROTOCOL_VERSION,LDAP_VERSION3)
|
||||
!= LDAP_SUCCESS)
|
||||
{
|
||||
print "set_option - Failed!\n";
|
||||
} else {
|
||||
print "set_option - OK\n";
|
||||
}
|
||||
|
||||
# Get an LDAP Session Option
|
||||
my $option;
|
||||
ldap_get_option($ld,LDAP_OPT_REFERRALS,$option);
|
||||
|
||||
if ($option != 1)
|
||||
{
|
||||
print "get_option - Failed!\n";
|
||||
} else {
|
||||
print "get_option - OK\n";
|
||||
}
|
||||
|
||||
# Anonymous Bind
|
||||
if (ldap_simple_bind_s($ld,"","") != LDAP_SUCCESS)
|
||||
{
|
||||
print "anon_bind - Failed!\n";
|
||||
} else {
|
||||
print "anon_bind - OK\n";
|
||||
}
|
||||
|
||||
# Authenticated Simple Bind
|
||||
if (ldap_simple_bind_s($ld,$DN,$PASS) != LDAP_SUCCESS)
|
||||
{
|
||||
print "simple_bind - Failed!\n";
|
||||
} else {
|
||||
print "simple_bind - OK\n";
|
||||
}
|
||||
|
||||
# Set Rebind Process
|
||||
my $rebindproc = sub { return($DN,$PASS,LDAP_AUTH_SIMPLE); };
|
||||
ldap_set_rebind_proc($ld,$rebindproc);
|
||||
print "set_rebind - OK\n";
|
||||
|
||||
# Add an OrgUnit Entry
|
||||
my $entry = {
|
||||
"objectclass" => ["top","organizationalUnit"],
|
||||
"ou" => "Test",
|
||||
};
|
||||
|
||||
if (ldap_add_s($ld,$BASE,$entry) != LDAP_SUCCESS)
|
||||
{
|
||||
print "add_org - Failed!\n";
|
||||
} else {
|
||||
print "add_org - OK\n";
|
||||
}
|
||||
|
||||
|
||||
# Add People
|
||||
foreach my $number (1..$howmany)
|
||||
{
|
||||
$entry = {
|
||||
"objectclass" => ["top","person"],
|
||||
"cn" => "Mozilla $number",
|
||||
"sn" => ["$number"],
|
||||
};
|
||||
if (ldap_add_s($ld,"cn=Mozilla $number,$BASE",$entry)
|
||||
!= LDAP_SUCCESS)
|
||||
{
|
||||
print "add_user_$number - Failed!\n";
|
||||
} else {
|
||||
print "add_user_$number - OK\n";
|
||||
}
|
||||
}
|
||||
|
||||
# Modify People
|
||||
foreach my $number (1..$howmany)
|
||||
{
|
||||
$entry = {
|
||||
"sn" => {"ab",["Test"]},
|
||||
"telephoneNumber" => {"ab",[123.456]},
|
||||
# "telephoneNumber" => "800-555-111$number",
|
||||
};
|
||||
if (ldap_modify_s($ld,"cn=Mozilla $number,$BASE",$entry)
|
||||
!= LDAP_SUCCESS)
|
||||
{
|
||||
print "mod_user_$number - Failed!\n";
|
||||
} else {
|
||||
print "mod_user_$number - OK\n";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
# Search People
|
||||
my $filter = "(sn=Test)";
|
||||
my $attrs = ["cn","sn"];
|
||||
my $res;
|
||||
if (ldap_search_s($ld,$BASE,LDAP_SCOPE_SUBTREE,$filter,$attrs,0,$res)
|
||||
!= LDAP_SUCCESS)
|
||||
{
|
||||
print "search_user - Failed!\n";
|
||||
} else {
|
||||
print "search_user - OK\n";
|
||||
}
|
||||
|
||||
# Count Results
|
||||
if (ldap_count_entries($ld,$res) != $howmany)
|
||||
{
|
||||
print "count_res - Failed!\n";
|
||||
} else {
|
||||
print "count_res - OK\n";
|
||||
}
|
||||
|
||||
# Sort Results
|
||||
if (ldap_sort_entries($ld,$res,"sn") != LDAP_SUCCESS)
|
||||
{
|
||||
print "sort_ent - Failed!\n";
|
||||
} else {
|
||||
print "sort_ent - OK\n";
|
||||
}
|
||||
|
||||
# Multisort Results
|
||||
if (ldap_multisort_entries($ld,$res,["sn","telephoneNumber"]) != LDAP_SUCCESS)
|
||||
{
|
||||
print "multisort - Failed!\n";
|
||||
} else {
|
||||
print "multisort - OK\n";
|
||||
}
|
||||
|
||||
# Get First Entry
|
||||
my $ent = ldap_first_entry($ld,$res);
|
||||
if (!$ent)
|
||||
{
|
||||
print "first_entry - Failed!\n";
|
||||
} else {
|
||||
print "first_entry - OK\n";
|
||||
}
|
||||
|
||||
# Get Next Entry
|
||||
$ent = ldap_next_entry($ld,$ent);
|
||||
if (!$ent)
|
||||
{
|
||||
print "next_entry - Failed!\n";
|
||||
} else {
|
||||
print "next_entry - OK\n";
|
||||
}
|
||||
|
||||
# Get DN
|
||||
my $dn = ldap_get_dn($ld,$ent);
|
||||
if (!$dn)
|
||||
{
|
||||
print "get_dn - Failed!\n";
|
||||
} else {
|
||||
print "get_dn - OK\n";
|
||||
}
|
||||
|
||||
# Get First Attribute
|
||||
my $ber;
|
||||
my $attr = ldap_first_attribute($ld,$ent,$ber);
|
||||
if (!$attr)
|
||||
{
|
||||
print "first_attr - Failed!\n";
|
||||
} else {
|
||||
print "first_attr - OK\n";
|
||||
}
|
||||
|
||||
# Get Next Attribute
|
||||
$attr = ldap_next_attribute($ld,$ent,$ber);
|
||||
if (!$attr)
|
||||
{
|
||||
print "next_attr - Failed!\n";
|
||||
} else {
|
||||
print "next_attr - OK\n";
|
||||
}
|
||||
|
||||
# Get Attribute Values
|
||||
my @vals = ldap_get_values($ld,$ent,$attr);
|
||||
if ($#vals < 0)
|
||||
{
|
||||
print "get_values - Failed!\n";
|
||||
} else {
|
||||
print "get_values - OK\n";
|
||||
}
|
||||
|
||||
# Free structures pointed to by $ber and $res to prevent memory leak
|
||||
ldap_ber_free($ber,1);
|
||||
ldap_msgfree($res);
|
||||
|
||||
# Compare Attribute Values
|
||||
foreach my $number (1..$howmany)
|
||||
{
|
||||
if(ldap_compare_s($ld,"cn=Mozilla $number,$BASE","sn",$number)
|
||||
!= LDAP_COMPARE_TRUE)
|
||||
{
|
||||
print "comp_user_$number - Failed!\n";
|
||||
} else {
|
||||
print "comp_user_$number - OK\n";
|
||||
}
|
||||
}
|
||||
|
||||
# Delete Users
|
||||
foreach my $number (1..$howmany)
|
||||
{
|
||||
if (ldap_delete_s($ld,"cn=Mozilla $number,$BASE") != LDAP_SUCCESS)
|
||||
{
|
||||
print "del_user_$number - Failed!\n";
|
||||
} else {
|
||||
print "del_user_$number - OK\n";
|
||||
}
|
||||
}
|
||||
|
||||
if (ldap_delete_s($ld,"$BASE") != LDAP_SUCCESS)
|
||||
{
|
||||
print "del_org - Failed!\n";
|
||||
} else {
|
||||
print "del_org - OK\n";
|
||||
}
|
||||
|
||||
# Unbind
|
||||
ldap_unbind($ld);
|
||||
}
|
||||
131
mozilla/directory/perldap/test_api/search.pl
Executable file
131
mozilla/directory/perldap/test_api/search.pl
Executable file
@@ -0,0 +1,131 @@
|
||||
#!/usr/bin/perl
|
||||
#############################################################################
|
||||
# $Id: search.pl,v 1.4 1998-08-13 04:40:01 clayton Exp $
|
||||
#
|
||||
# The contents of this file are subject to the Mozilla Public License
|
||||
# Version 1.0 (the "License"); you may not use this file except in
|
||||
# compliance with the License. You may obtain a copy of the License at
|
||||
# http://www.mozilla.org/MPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS IS"
|
||||
# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing rights and limitations
|
||||
# under the License.
|
||||
#
|
||||
# The Original Code is PerlDAP. The Initial Developer of the Original
|
||||
# Code is Netscape Communications Corp. and Clayton Donley. Portions
|
||||
# created by Netscape are Copyright (C) Netscape Communications
|
||||
# Corp., portions created by Clayton Donley are Copyright (C) Clayton
|
||||
# Donley. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
#
|
||||
# DESCRIPTION
|
||||
# Test the search capabilities of the API, similar to write.pl.
|
||||
#
|
||||
#############################################################################
|
||||
|
||||
use Mozilla::LDAP::API qw(:api :constant);
|
||||
use strict;
|
||||
|
||||
|
||||
my $ldap_host = "";
|
||||
my $BASEDN = "o=Org,c=US";
|
||||
my $filter = $ARGV[0];
|
||||
|
||||
if (!$ldap_host)
|
||||
{
|
||||
print "Edit the top portion of this file before continuing.\n";
|
||||
exit -1;
|
||||
}
|
||||
|
||||
my $attrs = [];
|
||||
|
||||
my ($ld,$result,$count);
|
||||
|
||||
##
|
||||
## Initialize LDAP Connection
|
||||
##
|
||||
|
||||
if (($ld = ldap_init($ldap_host,LDAP_PORT)) == -1)
|
||||
{
|
||||
die "Can not open LDAP connection to $ldap_host";
|
||||
}
|
||||
|
||||
##
|
||||
## Bind as DN, PASSWORD (NULL,NULL) on LDAP connection $ld
|
||||
##
|
||||
|
||||
if (ldap_simple_bind_s($ld,"","") != LDAP_SUCCESS)
|
||||
{
|
||||
ldap_perror($ld,"bind_s");
|
||||
die;
|
||||
}
|
||||
|
||||
##
|
||||
## ldap_search_s - Synchronous Search
|
||||
##
|
||||
|
||||
if (ldap_search_s($ld,$BASEDN,LDAP_SCOPE_SUBTREE,$filter,$attrs,0,$result) != LDAP_SUCCESS)
|
||||
{
|
||||
ldap_perror($ld,"search_s");
|
||||
die;
|
||||
}
|
||||
|
||||
##
|
||||
## ldap_count_entries - Count Matched Entries
|
||||
##
|
||||
|
||||
if (($count = ldap_count_entries($ld,$result)) == -1)
|
||||
{
|
||||
ldap_perror($ld,"count_entry");
|
||||
die;
|
||||
}
|
||||
|
||||
##
|
||||
## first_entry - Get First Matched Entry
|
||||
## next_entry - Get Next Matched Entry
|
||||
##
|
||||
|
||||
for (my $ent = ldap_first_entry($ld,$result); $ent; $ent = ldap_next_entry($ld,$ent))
|
||||
{
|
||||
|
||||
##
|
||||
## ldap_get_dn - Get DN for Matched Entries
|
||||
##
|
||||
|
||||
my ($dn,$attr,@vals,$val,$ber);
|
||||
if (($dn = ldap_get_dn($ld,$ent)) ne "")
|
||||
{
|
||||
print "dn: $dn\n";
|
||||
} else {
|
||||
ldap_perror($ld,"get_dn");
|
||||
die;
|
||||
}
|
||||
|
||||
for ($attr = ldap_first_attribute($ld,$ent,$ber); $attr; $attr = ldap_next_attribute($ld,$ent,$ber))
|
||||
{
|
||||
|
||||
##
|
||||
## ldap_get_values
|
||||
##
|
||||
|
||||
@vals = ldap_get_values($ld,$ent,$attr);
|
||||
if ($#vals >= 0)
|
||||
{
|
||||
foreach $val (@vals)
|
||||
{
|
||||
print "$attr: $val\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
ldap_ber_free($ber,0);
|
||||
}
|
||||
ldap_msgfree($result);
|
||||
|
||||
##
|
||||
## Unbind LDAP Connection
|
||||
##
|
||||
|
||||
ldap_unbind($ld);
|
||||
|
||||
110
mozilla/directory/perldap/test_api/write.pl
Executable file
110
mozilla/directory/perldap/test_api/write.pl
Executable file
@@ -0,0 +1,110 @@
|
||||
#!/usr/bin/perl -w
|
||||
#############################################################################
|
||||
# $Id: write.pl,v 1.4 1998-08-13 04:40:02 clayton Exp $
|
||||
#
|
||||
# The contents of this file are subject to the Mozilla Public License
|
||||
# Version 1.0 (the "License"); you may not use this file except in
|
||||
# compliance with the License. You may obtain a copy of the License at
|
||||
# http://www.mozilla.org/MPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS IS"
|
||||
# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing rights and limitations
|
||||
# under the License.
|
||||
#
|
||||
# The Original Code is PerlDAP. The Initial Developer of the Original
|
||||
# Code is Netscape Communications Corp. and Clayton Donley. Portions
|
||||
# created by Netscape are Copyright (C) Netscape Communications
|
||||
# Corp., portions created by Clayton Donley are Copyright (C) Clayton
|
||||
# Donley. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
#
|
||||
# DESCRIPTION
|
||||
# write.pl - Test of LDAP Modify Operations in Perl5
|
||||
# Author: Clayton Donley <donley@wwa.com>
|
||||
#
|
||||
# This utility is mostly to demonstrate all the write operations
|
||||
# that can be done with LDAP through this PERL5 module.
|
||||
#
|
||||
#############################################################################
|
||||
|
||||
use strict;
|
||||
use Mozilla::LDAP::API qw(:constant :api);
|
||||
|
||||
|
||||
# This is the entry we will be adding. Do not use a pre-existing entry.
|
||||
my $ENTRYDN = "cn=Test Guy, o=Org, c=US";
|
||||
|
||||
# This is the DN and password for an Administrator
|
||||
my $ROOTDN = "cn=DSManager,o=Org,c=US";
|
||||
my $ROOTPW = "";
|
||||
|
||||
my $ldap_server = "";
|
||||
|
||||
if (!$ldap_server)
|
||||
{
|
||||
print "Edit the top portion of this file before continuing.\n";
|
||||
exit -1;
|
||||
}
|
||||
|
||||
my $ld = ldap_init($ldap_server,LDAP_PORT);
|
||||
|
||||
if ($ld == -1)
|
||||
{
|
||||
die "Connection to LDAP Server Failed";
|
||||
}
|
||||
|
||||
if (ldap_simple_bind_s($ld,$ROOTDN,$ROOTPW) != LDAP_SUCCESS)
|
||||
{
|
||||
ldap_perror($ld,"bind_s");
|
||||
die;
|
||||
}
|
||||
|
||||
my %testwrite = (
|
||||
"cn" => "Test User",
|
||||
"sn" => "User",
|
||||
"givenName" => "Test",
|
||||
"telephoneNumber" => "8475551212",
|
||||
"objectClass" => ["top","person","organizationalPerson",
|
||||
"inetOrgPerson"],
|
||||
"mail" => "tuser\@my.org",
|
||||
);
|
||||
|
||||
if (ldap_add_s($ld,$ENTRYDN,\%testwrite) != LDAP_SUCCESS)
|
||||
{
|
||||
ldap_perror($ld,"add_s");
|
||||
die;
|
||||
}
|
||||
|
||||
print "Entry Added.\n";
|
||||
|
||||
|
||||
%testwrite = (
|
||||
"telephoneNumber" => "7085551212",
|
||||
"mail" => {"a",["Test_User\@my.org"]},
|
||||
);
|
||||
|
||||
if (ldap_modify_s($ld,$ENTRYDN,\%testwrite) != LDAP_SUCCESS)
|
||||
{
|
||||
ldap_perror($ld,"modify_s");
|
||||
die;
|
||||
}
|
||||
|
||||
print "Entry Modified.\n";
|
||||
|
||||
#
|
||||
# Delete the entry for $ENTRYDN
|
||||
#
|
||||
if (ldap_delete_s($ld,$ENTRYDN) != LDAP_SUCCESS)
|
||||
{
|
||||
ldap_perror($ld,"delete_s");
|
||||
die;
|
||||
}
|
||||
|
||||
print "Entry Deleted.\n";
|
||||
|
||||
# Unbind to LDAP server
|
||||
ldap_unbind($ld);
|
||||
|
||||
exit;
|
||||
70
mozilla/directory/perldap/typemap
Normal file
70
mozilla/directory/perldap/typemap
Normal file
@@ -0,0 +1,70 @@
|
||||
#############################################################################
|
||||
# $Id: typemap,v 1.4 1998-08-13 09:15:00 leif Exp $
|
||||
#
|
||||
# The contents of this file are subject to the Mozilla Public License
|
||||
# Version 1.0 (the "License"); you may not use this file except in
|
||||
# compliance with the License. You may obtain a copy of the License at
|
||||
# http://www.mozilla.org/MPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS IS"
|
||||
# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing rights and limitations
|
||||
# under the License.
|
||||
#
|
||||
# The Original Code is PerLDAP. The Initial Developer of the Original
|
||||
# Code is Netscape Communications Corp. and Clayton Donley. Portions
|
||||
# created by Netscape are Copyright (C) Netscape Communications
|
||||
# Corp., portions created by Clayton Donley are Copyright (C) Clayton
|
||||
# Donley. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
#
|
||||
# DESCRIPTION
|
||||
# Typemap to declare XSUB data types.
|
||||
#
|
||||
#############################################################################
|
||||
|
||||
const int T_IV
|
||||
char * T_PV
|
||||
const char * T_PV
|
||||
char ** T_charptrptr
|
||||
LDAP * T_PTR
|
||||
LDAPMessage * T_PTR
|
||||
LDAPMessage ** T_PTR
|
||||
BerElement * T_PTR
|
||||
LDAPControl * T_PTR
|
||||
LDAPVersion * T_PTR
|
||||
struct berval T_berval
|
||||
struct berval ** T_bervalptrptr
|
||||
FriendlyMap * T_PTR
|
||||
LDAPsortkey ** T_PTR
|
||||
LDAPVirtualList * T_PTR
|
||||
LDAPURLDesc * T_PTR
|
||||
LDAPControl ** T_PTR
|
||||
LDAPFiltDesc * T_PTR
|
||||
LDAPFiltInfo * T_PTR
|
||||
LDAPMemCache * T_PTR
|
||||
LDAPMemCache ** T_PTR
|
||||
struct ldap_thread_fns * T_PTR
|
||||
LDAPMod ** T_PTR
|
||||
LDAP_CMP_CALLBACK * T_PTR
|
||||
LDAP_REBINDPROC_CALLBACK * T_PTR
|
||||
struct timeval T_timeval
|
||||
|
||||
#########
|
||||
INPUT
|
||||
T_timeval
|
||||
$var.tv_sec = atof((char *)SvPV($arg,na));
|
||||
$var.tv_usec = 0
|
||||
T_berval
|
||||
$var.bv_val = (char *)SvPV($arg,na);
|
||||
$var.bv_len = na
|
||||
T_charptrptr
|
||||
$var = (char **)avref2charptrptr($arg)
|
||||
T_bervalptrptr
|
||||
$var = (struct berval **)avref2berptrptr($arg)
|
||||
OUTPUT
|
||||
T_charptrptr
|
||||
$arg = charptrptr2avref($var);
|
||||
T_bervalptrptr
|
||||
$arg = berptrptr2avref((struct berval **)$var);
|
||||
@@ -1,46 +0,0 @@
|
||||
Mstone building instructions
|
||||
|
||||
For Unix, just "gmake" one of these
|
||||
release The usual optimized build
|
||||
debug Debug build includes some asserts
|
||||
|
||||
rpackage Build the release and package it
|
||||
dpackage Build the debug version and package it
|
||||
|
||||
all_OPT Build a multi-platform package
|
||||
all_DBG Build a multi-platform debug package
|
||||
|
||||
For NT, run autobuild.bat. This will build and package both the debug
|
||||
and optimized versions. Perl must already be built and installed in
|
||||
\. The NT build may be behind the Unix stuff. Pull the build/package/*
|
||||
subdirectories into the main build/package before doing a 'make all_???'.
|
||||
|
||||
You can build multiple OSes in the same tree. Debug and optimized
|
||||
builds are kept separately. The all_??? targets will combine whatever
|
||||
OSes are present into a multi-architecture package (including NT).
|
||||
Note that you have ot build and package each OS before doing the all_
|
||||
step.
|
||||
|
||||
|
||||
Helper components
|
||||
|
||||
Linux usually comes with workable versions of gnuplot and perl. Most
|
||||
other OSes don't. Mstone can build and package perl, gnuplot, and gd
|
||||
with the right settings. These will be automatically built and
|
||||
packaged if they are present.
|
||||
|
||||
Unpack gd1.3 or later in the mstone directory. You can probably find
|
||||
gd from here: http://www.boutell.com/gd/. The directory should look
|
||||
like gd?.*. Right now we need the (obsolete) version 1.3 to generate
|
||||
GIF files (without patented run-length coding). The scripts need to
|
||||
be updated to be able to handle PNG or GIF files.
|
||||
|
||||
Unpack gnuplot 3.7 or later in the mstone directory. You can probably
|
||||
find gnuplot from http://www.cs.dartmouth.edu/gnuplot_info.html. The
|
||||
directory should look like gnuplot-?.* (the exact version should not
|
||||
matter). Gnuplot requres gd to generate GIFs (which is what we need).
|
||||
|
||||
Unpack perl 5.005 or later in the mstone directory. You can probably
|
||||
find perl from http://www.perl.com/pub/language/info/software.html.
|
||||
The directory should look like perl5.* (the exact version should
|
||||
not matter).
|
||||
@@ -1,73 +0,0 @@
|
||||
2005-02-19 Dan Christian <robodan@idiom.com>
|
||||
|
||||
* Merge big Sendmail patch see ChangeLog-Sendmail for details
|
||||
|
||||
* src/bench.h (VERSION): Start working toward version 5.0 (now 4.9)
|
||||
|
||||
2004-09-07 Dan Christian <robodan@idiom.com>
|
||||
|
||||
* data/*.msg: Updated with more realistic messages
|
||||
|
||||
* bin/args.pl: Really fix doc link to be relative
|
||||
|
||||
* src/smtp.c (sendSMTPLoop): Handle file lists (random selection)
|
||||
(sendFile): New, send file with option offset and head/tail
|
||||
(SmtpFilePrep): Split a glob pattern to a list
|
||||
(SmtpFileInit): New, split out initial file scan
|
||||
|
||||
* src/bench.c (rangeNext): Get to last value in a random range
|
||||
|
||||
2004-06-14 Dan Christian <robodan@idiom.com>
|
||||
|
||||
* Makefile (VERSION): Bump version to 4.3
|
||||
|
||||
* Make build work on recent versions of Linux and Solaris
|
||||
|
||||
* Make ssh the default way to get a remote shell
|
||||
|
||||
* Support SVG graph output (not supported by all browsers)
|
||||
|
||||
* Use rfc822 style from addresses
|
||||
|
||||
* Fix documentation link on index page to be local
|
||||
|
||||
2000-04-28 Dan Christian <dac@x.cx>
|
||||
|
||||
* http and wmap now use common routines from http-util
|
||||
|
||||
* http is now separated from the pish command structure.
|
||||
|
||||
2000-04-27 Dan Christian <dac@x.cx>
|
||||
|
||||
* bin/genplot.pl: Support gnuplot generating images other than gif
|
||||
|
||||
* src/smtp.c (sendSMTPStart): Send domain name with HELO
|
||||
|
||||
2000-04-05 Dan Christian <robodan@netscape.com>
|
||||
* Fix bug in WMAP where the login field was reporting banner data.
|
||||
|
||||
* Add a reconnect concept to WMAP. This separates out the
|
||||
reconnect activity from the initial connections. There is still a
|
||||
bug/feature that the reconnect increments an error which can
|
||||
eventually hit the maxErrors limit. You have to record the error
|
||||
or else you could not get the "connections" graph right.
|
||||
|
||||
2000-03-31 Dan Christian <robodan@netscape.com>
|
||||
|
||||
* Merged setup and mstone into one script to reduce command
|
||||
namespace polution. "mstone setup" is the the same as "setup".
|
||||
|
||||
* Made setup try to be more tolerant of OSes that were not
|
||||
include in the distribution. SunOS 5.7 will fall back to 5.6.
|
||||
|
||||
* Now package conf/general.wld.in and only copy to general.wld if
|
||||
there isn't one already in place. This means that you can unpack
|
||||
new bits over old bits without blowing away your configuration.
|
||||
|
||||
* Added <includeOnce file> command to workloads. This allows
|
||||
tests to be used either as a stand alone or as part of another
|
||||
test (e.g. smtp).
|
||||
|
||||
* Converted ChangeLog to more common formating
|
||||
|
||||
* Spilt off old ChangeLog entries to ChangeLog.1 and ChangeLog.2
|
||||
@@ -1,86 +0,0 @@
|
||||
2005-02-03 Thom O'Connor <thom@sendmail.com>
|
||||
|
||||
* Merge Mozilla mstone HEAD with Sendmail,Inc. modifications. In
|
||||
particular, this included some hand-waving around the bitwise
|
||||
operators "leaveMailOnServer" in the Mozilla branch and the
|
||||
dinst_t struct pish->leaveMailOnServerDist.
|
||||
|
||||
2005-01-25 Thom O'Connor <thom@sendmail.com>
|
||||
|
||||
* Fix comments, properly attribute Sean O'Rourke's contributions.
|
||||
|
||||
2004-09-21 Thom O'Connor <thom@sendmail.com>
|
||||
|
||||
* Modified config/config.mk to build SSL version of mailclient.
|
||||
|
||||
2004-06-07 Thom O'Connor <thom@sendmail.com>
|
||||
|
||||
* Remove _thread_sys_poll defininition for poll in FreeBSD builds
|
||||
(bench.h).
|
||||
|
||||
2001-04-27 Sean O'Rourke <sean@sendmail.com>
|
||||
|
||||
* distributions can now be truncated. This is used to prevent
|
||||
0-recipient messages, and could be used to prevent enormous
|
||||
messages.
|
||||
|
||||
* throttling: Preload workloads use some additional mstone magic
|
||||
to throttle delivery rate based on server responsiveness. This is
|
||||
still in the experimental phase, and may change.
|
||||
|
||||
* fix for parsing bug exposed by distribution truncation notation.
|
||||
|
||||
2001-03-10 Sean O'Rourke <sean@sendmail.com>
|
||||
|
||||
* clients: Fixed up code for specifying client counts on a
|
||||
per-host or per-group basis. This eliminates the need to force
|
||||
the mozilla distribution code to do one's bidding.
|
||||
|
||||
* smtpsink.pl: Very basic threaded perl SMTP sink. This may go
|
||||
away to be replaced by the sink from smtpslam. Needs much better
|
||||
statistics.
|
||||
|
||||
2001-02-24 Sean O'Rourke <sean@sendmail.com>
|
||||
|
||||
* checksums added. See {checksum,md5}.{c,h}. Auto-generated
|
||||
messages can currently have checksums computed over the body, and
|
||||
pop and multipop retrieval will verify the sum.
|
||||
|
||||
2001-02-21 Sean O'Rourke <sean@sendmail.com>
|
||||
|
||||
* MIME generation changed to generate deep messages rather than
|
||||
several parts. This should be a better test of MIME parsers,
|
||||
forcing them to save more state.
|
||||
|
||||
2001-02-18 Sean O'Rourke <sean@sendmail.com>
|
||||
|
||||
* mstone_changes.html: update SSL documentation.
|
||||
|
||||
* wld, defaults.pm: divide the ever-expanding "config" section
|
||||
into more descriptive subparts: clients, server, sink, mstone.
|
||||
|
||||
* report: now in bin directory, where it should be.
|
||||
|
||||
2001-02-17 Sean O'Rourke <sean@sendmail.com>
|
||||
|
||||
* client.c, main.c, parse.c: removed old throttling code, as it
|
||||
wasn't being used.
|
||||
|
||||
* ALL: General code cleanup.
|
||||
|
||||
* sysdep.c: simplified rlimit-bumping code, added increase for
|
||||
RLIM_NPROC, as threads are procs on some systems.
|
||||
|
||||
* imap4.c: removed silliness of malloc()ing a buffer the size of
|
||||
the entire message every time we retrieve a message.
|
||||
|
||||
* xalloc.c, xalloc.h: consolidated memory allocation so everyone
|
||||
handles OOM the same way (for now, dump core).
|
||||
|
||||
* constants.h: various assumptions and limits, were in bench.h.
|
||||
|
||||
* events: added event-queue model to reduce thread requirements.
|
||||
Eventually, it would be nice for a consultant to be able to run
|
||||
this off a laptop to test a small- to medium-sized box. For
|
||||
now, at least, configuration remains the same. This doesn't
|
||||
work on NT. Oh, well.
|
||||
@@ -1,129 +0,0 @@
|
||||
MailStone 4.1: Changes to since version 4.0
|
||||
|
||||
* threads are used on all platforms reduces memory requirements by
|
||||
10x for large numbers of clients must run as root for maximum
|
||||
connections per process
|
||||
|
||||
* massive internal code and script cleanup / rewrite performance
|
||||
improvements for socket handling (blocking) and caching files and
|
||||
name lookups
|
||||
|
||||
* filename and path conventions restructuring '/mailstone'
|
||||
hardwired path no longer required mailstone/results/index.html
|
||||
(index of test runs) mailstone/results/<datestamp>/stderr (look
|
||||
here for errors) mailstone/results/<datestamp>/results.html
|
||||
mailstone/results/<datestamp>/results.txt
|
||||
mailstone/results/<datestamp>/work.wld (workload config used)
|
||||
mailstone/results/<datestamp>/testbed.tbd (testbed used)
|
||||
mailstone/results/<datestamp>/summary.csv (per client summary)
|
||||
mailstone/results/<datestamp>/*.gif (graphs)
|
||||
mailstone/tmp/<datestamp>/*.out (raw results from each client)
|
||||
mailstone/conf/*.wld (workload file) mailstone/conf/*.html
|
||||
(machine descriptions for reports) mailstone/data/*.msg (sample
|
||||
test messages)
|
||||
|
||||
* periodic statistics reporting allows for trend analysis of many
|
||||
variables per protocol. sampling rate is automatically determined
|
||||
by mailmaster Can now generate on-the-fly reports for above by
|
||||
running "process"
|
||||
|
||||
* The accountFormat directive is now obsolete. Use loginFormat
|
||||
and addressFormat instead.
|
||||
|
||||
* The numAccounts and beginAccounts directives are now obsolete.
|
||||
Use numLogins, firstLogin, numAddresses, and firstAddress instead.
|
||||
|
||||
* The sequentialLogins directive disables random account number
|
||||
selection. This insures a predictable account sequence.
|
||||
|
||||
* The checkMailInterval directive for IMAP is now obsolete. Use
|
||||
loopDelay instead.
|
||||
|
||||
* The directives idleTime, loopDelay, and numLoops now apply to
|
||||
all protocols. See the manual for how loopDelay and numLoops are
|
||||
used by each protocol.
|
||||
|
||||
* a command directive such as <SMTP> without HOSTS=xxx will now
|
||||
apply to all clients in the testbed
|
||||
|
||||
* <include> directive for workload and testbed files (e.g. for
|
||||
user profile)
|
||||
|
||||
* workloads are now passed to 'mailclient' through stdin no test
|
||||
specific files need to be copied to client machines more
|
||||
synchonized test startup
|
||||
|
||||
* 'setup' script will copy mailclient and test messages
|
||||
(data/*.msg) to each testbed machine in /var/tmp
|
||||
|
||||
* 'cleanup' form of setup will remove mailclient and test messages
|
||||
from each testbed machine in /var/tmp
|
||||
|
||||
* 'checktime' form of setup will (nearly) simultaneously retrieve
|
||||
time from each client. This lets you easily check for clock
|
||||
problems.
|
||||
|
||||
* 'timesync' form of setup will (nearly) simultaneously set time
|
||||
on each client. This only works on OSs that support setting
|
||||
seconds through the "date" command. rdate or ntpdate should be
|
||||
used if available. You must be the root user and be able to rsh
|
||||
as root for timesync to work.
|
||||
|
||||
* Improved reports in text and html (formatting and content)
|
||||
|
||||
* The text version of the report is now only displayed
|
||||
automatically if "-v" is given.
|
||||
|
||||
* Graphs with more than one protocol will also display a "Total"
|
||||
graph
|
||||
|
||||
* The graphs can now be customized for each test (see sample.wld
|
||||
for the default)
|
||||
|
||||
* You can now add graphs (in addition to the default or configured
|
||||
ones) by using "process timestamp -a conf/moregraph.wld".
|
||||
|
||||
* An informative index of test runs is now generated in
|
||||
results/index.html
|
||||
|
||||
* The index is updated while the run is in progress to make
|
||||
checking for errors easier.
|
||||
|
||||
* The error log now displays times relative to test start.
|
||||
|
||||
* Memory use while processing results has been greatly reduced.
|
||||
|
||||
* A summary of the data from each process is now saved in a
|
||||
Comma-separated-value (CSV) file. results/timestamp/clients.csv
|
||||
|
||||
* A summary of the data over time is now saved in a
|
||||
Comma-separated-value (CSV) file.
|
||||
results/timestamp/protocol-time.csv
|
||||
|
||||
* new gnuplot binary included, can output directly to gif format
|
||||
|
||||
* read and write performance numbers now reported separately
|
||||
|
||||
* new runtime banners and copyrights (ooh boy)
|
||||
|
||||
* idleTime option for IMAP fixed, plus now applies to all commands
|
||||
|
||||
* blockTime now sets a delay between command blocks
|
||||
|
||||
* Process model is as follows
|
||||
User runs the top-level 'mstone' script
|
||||
This calls 'conf/testname.pl' with command line arguments
|
||||
This calls 'mailmaster.pl' with config and command line arguments
|
||||
mailmaster uses 'rsh' or equivalent to launch mailclients
|
||||
mailclient runs on each testbed and forks numprocs
|
||||
each proc spawns numthreads (one per client)
|
||||
|
||||
<run tests> (note: results are being sent continuously)
|
||||
|
||||
threads send results back through sockets to top mailclient
|
||||
mailclient forwards results back over stdout via rsh pipe
|
||||
(for future work - do some data reduction/combining here)
|
||||
mailmaster directs output to each client-<hostname> file
|
||||
mailmaster launches report generator
|
||||
|
||||
* sample LDIF fragment for a postmaster entry included
|
||||
@@ -1,77 +0,0 @@
|
||||
MailStone 4.15: Changes to Mailstone since version 4.1
|
||||
|
||||
* Setup now checks license acceptance and configures a basic
|
||||
setup. By default, it will also create a user LDIF file with a
|
||||
'allusers' account.
|
||||
|
||||
* All parameters and and testbed information may now be specified
|
||||
in the workload files (*.wld). New sections: CONFIG, CLIENT,
|
||||
MONITOR, PRETEST, and POSTTEST. Command line parameters still
|
||||
override the files. A complete copy of the configuration is saved
|
||||
in results/<TIMESTAMP>/all.wld.
|
||||
|
||||
* The '*.pl', '*.tbd', and 'config*' files in ./conf/ are
|
||||
depreciated. These should still work, but the new sections are
|
||||
simpler and more flexible.
|
||||
|
||||
* Any CONFIG parameter can now be specified on the command line
|
||||
using the form: 'PARAMETER=value'. Note that PARAMETER is case
|
||||
insensitive. No whitespace is allowed before or after the '='.
|
||||
|
||||
* The new switch '-l' or CONFIG parameter 'ClientCount' can now
|
||||
specify the total number of clients. The 'MaxClients' and
|
||||
'MaxThreads' parameters in each CLIENT section control load
|
||||
balancing. If the 'processes' and 'threads' parameters are set,
|
||||
then the load for that CLIENT section will not be adjusted, but
|
||||
will be taken into account when calculating other CLIENT sections.
|
||||
If just 'processes' is set, then only the thread count will be
|
||||
adjusted. All hosts in a CLIENT section will run the same number
|
||||
of processes and threads.
|
||||
|
||||
* bin/makeusers.pl now creates users, broadcast account, etc.
|
||||
Numbered passwords are now suppored. The new user/password format
|
||||
now replaces '%ld' with the user number to match the rest of
|
||||
mailstone. The ldif/ directory is obsolete. Run "perl/bin/perl
|
||||
bin/makeusers.pl -h" for usage.
|
||||
|
||||
* NT client machines may now be used from a Unix test master. See
|
||||
conf/sample.wld for configuration details.
|
||||
|
||||
* Commands can now be run for a specified block count, error
|
||||
count, or time (whichever comes first). Set 'maxBlocks' and/or
|
||||
'maxErrors'.
|
||||
|
||||
* Telemetry logging to /var/tmp/mstone-log.pn.tn is now performed
|
||||
when "telemetry 1" is specified.
|
||||
|
||||
* The name used in the "CLIENT" section is now used to match
|
||||
"HOSTS=..." qualifier. Compatibility with "hostname" is no longer
|
||||
needed.
|
||||
|
||||
* Config values can now use quoted characters such as \n, \r, \t
|
||||
|
||||
* Config values can be continued using \ (backslash)
|
||||
|
||||
* System configuration information (SYSCONFIG) can now be
|
||||
specified entirely within a workload file by quoting the newlines.
|
||||
|
||||
* Config values get enclosing double-quotes stripped
|
||||
|
||||
* Preliminary support for HTTP and WMAP (WebMail) testing.
|
||||
|
||||
* New table formats are easier to interpret and allow more protocols.
|
||||
|
||||
* The new text format report is easier to machine processes.
|
||||
|
||||
* The following command line switches are now obsolete: -f, -g,
|
||||
-e, -p, and -l. The same functionality can be obtained by
|
||||
FREQUENCY=<interval>, GNUPLOT=<path>, RSH=<path>, RCP=<path>, and
|
||||
TEMPDIR=<directory> respectively.
|
||||
|
||||
* File backups are now created. When ./process is run multiple
|
||||
times, the old files are moved to the ./tmp/<TIMESTAMP>/
|
||||
directory.
|
||||
|
||||
* perl has been updated to include full perl5.005_03 install
|
||||
package. Perl support for each architecture is now under the
|
||||
perl/ directory.
|
||||
@@ -1,222 +0,0 @@
|
||||
|
||||
Mstone 4.15 Quick Installation
|
||||
|
||||
This version of Mstone runs on many current UNIX platforms and NT.
|
||||
Only a web browser and text editor are needed to view the results and
|
||||
configure tests.
|
||||
|
||||
|
||||
QUICK INSTALL
|
||||
-------------
|
||||
|
||||
IMPORTANT: If you have an existing mstone, save a copy of the
|
||||
mstone/conf directory to preserve any configuration files you may want
|
||||
to keep.
|
||||
|
||||
Unpack distribution:
|
||||
|
||||
tar xzf /tmp/mstone_OPT.tar.gz
|
||||
or
|
||||
gunzip -c /tmp/mstone_OPT.tar.gz | tar xf -
|
||||
or
|
||||
unzip /tmp/mstone_OPT.zip
|
||||
|
||||
cd mstone
|
||||
|
||||
Both the tar.gz file and the zip file are identical. Use whichever is
|
||||
more convenient for you.
|
||||
|
||||
This will create a sub-directory named "mstone" with files and
|
||||
directories under that.
|
||||
|
||||
cd mstone
|
||||
|
||||
NOTE: all scripts must be run from the mstone directory.
|
||||
|
||||
|
||||
Do initial configuration:
|
||||
|
||||
Run "mstone config". It will ask you about your system configuration.
|
||||
Fill in the appropriate values and create the optional user accounts
|
||||
and broadcast account. When it asks about client machines, enter them
|
||||
seperated by commas, with no spaces (e.g. host1,host2,host3). If you
|
||||
need to re-configure, run "mstone config".
|
||||
|
||||
The machine starting the test may also be a client. For accurate
|
||||
results, clients should not be run on the test mailserver machine (or
|
||||
its directory server). If all the client machines are not running
|
||||
the same operating system version, see "Configuring Client Machines"
|
||||
below to configure for different OSes.
|
||||
|
||||
When the test master is on NT, only the local machine may be a client
|
||||
and only one process is allowed. You will not be asked about client
|
||||
machines.
|
||||
|
||||
Setup only configures the most important parameters. If you have more
|
||||
advanced needs, edit conf/general.wld appropriately.
|
||||
|
||||
Run "mstone setup". It will now push the necessary files to each
|
||||
client machine. If there are problems (i.e. with rsh permissions),
|
||||
fix them and re-run "mstone setup" until everything works.
|
||||
|
||||
|
||||
Install test accounts:
|
||||
|
||||
Setup will create a file called conf/MAILHOST.ldif (where MAILHOST is the
|
||||
name of your mail server). If you are not using Netscape Messaging
|
||||
and Directory Servers, then you may have to edit the ldif file or use
|
||||
alternate means to create the user accounts.
|
||||
|
||||
To import these users into Netscape Messaging Server, use "add
|
||||
entries" from the directory console or use the ldapmodify command line
|
||||
utility.
|
||||
|
||||
Note: imports will go faster if access logging is disabled. For large
|
||||
user counts (more than 10,000 users), it may be much faster to export
|
||||
the current database, merge the files together manually, and then
|
||||
import the new database.
|
||||
|
||||
Here is how the ldapmodify supplied with Netscape Messaging Server
|
||||
would be used.
|
||||
|
||||
setenv LD_LIBRARY_PATH /usr/netscape/messaging/lib
|
||||
cd /usr/netscape/messaging
|
||||
shared/bin/ldapmodify -h mailhost -a -D 'cn=directory manager' -w d_m_password < conf/MAILHOST.ldif
|
||||
|
||||
|
||||
Check time consistency:
|
||||
|
||||
IMPORTANT: The system time on each client machine must be synchronized
|
||||
within one second of each other for accurate results graphs.
|
||||
|
||||
Run "checktime" to see the time on each client. There should not be
|
||||
more than two seconds difference among the displayed time.
|
||||
|
||||
The best way to synchronize clients is use NTP (Network Time Protocol)
|
||||
or similar protocols (like rdate or timeslave) that have sub second
|
||||
accuracy.
|
||||
|
||||
A simple utility called "timesync" is provide to push the local
|
||||
system time to all clients. You must be root and have root rsh
|
||||
permissions to use timesync. Timesync only works on OSs that support
|
||||
setting seconds using "date MMDDhhmmCCYY.ss". Timesync is only
|
||||
accurate to a second (at best) and should only be used if better
|
||||
protocols aren't available.
|
||||
|
||||
When running the test master on NT, "checktime" and "timesync" are
|
||||
never needed (because there is only one client machine). Timesync
|
||||
will be ignored for NT clients, another method must be used
|
||||
(e.g. timeserv or Dimension4).
|
||||
|
||||
|
||||
Run tests:
|
||||
|
||||
Try it out. Use small process and thread counts until everything is
|
||||
working.
|
||||
|
||||
mstone pop -t 30s
|
||||
|
||||
The script will tell you how many processes and threads it is running
|
||||
on each system and where errors are logged. At the end of the test,
|
||||
it will print out a URL for the test results and an indication of the
|
||||
size of the errorlog file (stderr).
|
||||
|
||||
The results of the mstone run will display statistics for each
|
||||
protocol that was tested. The results are presented in both a HTML
|
||||
web page and a text file. The text file is simple and uniform, while
|
||||
the web page is more user readable. The web page has links to the
|
||||
test configuration files, error log, and the text version.
|
||||
|
||||
For long tests run (e.g. 8 hours), the results can be updated while
|
||||
the test is running by using the "process" utility. Don't run
|
||||
"process" near the very end of the test.
|
||||
|
||||
If a test has to be aborted, then use "process" to generate a report
|
||||
using the available data.
|
||||
|
||||
|
||||
Customize tests:
|
||||
|
||||
Copy and edit the scripts (e.g. "conf/pop.wld") to define new tests.
|
||||
The CONFIG section specifies all the attributes used in the test.
|
||||
Other sections specify the protocols to be tested and the parameters
|
||||
for them.
|
||||
|
||||
All switches can be overridden on the command line to facilitate
|
||||
easier testing. The exact configuration (include command line
|
||||
overrides) is stored with the results from each test.
|
||||
|
||||
|
||||
Maintenance:
|
||||
|
||||
You can run "mstone setup" at any time (except during a test :-) to
|
||||
update the files on the client machines.
|
||||
|
||||
Use "mstone cleanup" to remove the files created by "mstone setup".
|
||||
|
||||
After the test is finished, the directories under "tmp/" can be
|
||||
compressed or deleted to save space. All the information about a test
|
||||
run is stored in the "results/" directories.
|
||||
|
||||
|
||||
Configuring client machines:
|
||||
|
||||
Edit conf/general.wld to include CLIENT sections for each machines to
|
||||
use.
|
||||
|
||||
You can also specify the OS type for each client machine. Set the
|
||||
"Arch" parameter in each CLIENT section as appropriate (e.g. SunOS5.6,
|
||||
Linux2.2_x86, AIX4.2, HP-UXB.11.00, IRIX6.5, OSF1V4.0, WINNT4.0). The
|
||||
directories under "bin" specify the available OS types.
|
||||
|
||||
For NT4.0 clients with a UNIX test master, you will need to configure
|
||||
"command" and "tempDir" for proper operation. See the "HOSTS=winnt01"
|
||||
example in conf/sample.wld.
|
||||
|
||||
The total number of processes and threads that can be supported on a
|
||||
client is dependent on the number of commands in the test, the OS, and
|
||||
available memory. Check the stderr log for messages about not being
|
||||
able to create processes or threads. Check on the client machines
|
||||
during the test and make sure they aren't running out of CPU. The
|
||||
UNIX programs "top" and "vmstat" are good for this. If the client CPU
|
||||
is more than 75% busy, use more machines.
|
||||
|
||||
Also watch out for network saturation. You may have to use machines
|
||||
with separate networks to the server to reach full server load.
|
||||
|
||||
|
||||
Know problems:
|
||||
|
||||
There can be extraneous errors or connections after the specified end
|
||||
of the test. These are most likely do to stopping the test and should
|
||||
be ignored.
|
||||
|
||||
At the end of the test, all current connections will logout without
|
||||
any delays. This can cause very high peak loads.
|
||||
|
||||
If one process exits early (due to misconfiguration or resource
|
||||
exhaustion) and the monitoring command did not specify a count (%c),
|
||||
then the monitoring tasks will be terminated early as well.
|
||||
|
||||
Monitoring commands that specify a count (%c), may take longer than
|
||||
predicted and delay the processing of test results. This is because
|
||||
vmstat actually delays the requested time plus the time needed to
|
||||
generate the statistics summary.
|
||||
|
||||
If you are doing tests with large thread counts, you may have to run
|
||||
as root to allow mailclient to raise its resource limits.
|
||||
|
||||
The telemetry logging for SMTP, POP3, and IMAP4 is incomplete. Most
|
||||
commands are captured, but banners and message contents may be missing.
|
||||
|
||||
The MaxBlocks parameter gets divided by the total number of processes
|
||||
before starting each client. This doesn't account for clients that
|
||||
don't have commands to run.
|
||||
|
||||
The HTTP protocol used by WMAP allows connections to be dropped and
|
||||
re-connected as needed. WMAP logs this as an error and an additional
|
||||
connect. The error log must be consulted to distinguish another types
|
||||
of connection errors (timeout or connection refused) from an automatic
|
||||
re-connect.
|
||||
|
||||
The HTTP protocol test is experimental and subject to change.
|
||||
@@ -1,19 +0,0 @@
|
||||
The contents of this software package are subject to the Netscape
|
||||
Public License Version 1.1 (the "License"); you may not use this
|
||||
software except in compliance with the License. You may obtain a copy
|
||||
of the License at http://www.mozilla.org/NPL/
|
||||
|
||||
Software distributed under the License is distributed on an "AS IS"
|
||||
basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
|
||||
the License for the specific language governing rights and limitations
|
||||
under the License.
|
||||
|
||||
Alternatively, the this software package may be used under the terms
|
||||
of the GNU Public License (the "GPL"), in which case the provisions of
|
||||
the GPL are applicable instead of those above. If you wish to allow
|
||||
use of your version of this file only under the terms of the GPL and
|
||||
not to allow others to use your version of this file under the NPL,
|
||||
indicate your decision by deleting the provisions above and replace
|
||||
them with the notice and other provisions required by the GPL. If you
|
||||
do not delete the provisions above, a recipient may use your version
|
||||
of this file under either the NPL or the GPL.
|
||||
@@ -1,535 +0,0 @@
|
||||
MOZILLA PUBLIC LICENSE
|
||||
Version 1.1
|
||||
|
||||
---------------
|
||||
|
||||
1. Definitions.
|
||||
|
||||
1.0.1. "Commercial Use" means distribution or otherwise making the
|
||||
Covered Code available to a third party.
|
||||
|
||||
1.1. "Contributor" means each entity that creates or contributes to
|
||||
the creation of Modifications.
|
||||
|
||||
1.2. "Contributor Version" means the combination of the Original
|
||||
Code, prior Modifications used by a Contributor, and the Modifications
|
||||
made by that particular Contributor.
|
||||
|
||||
1.3. "Covered Code" means the Original Code or Modifications or the
|
||||
combination of the Original Code and Modifications, in each case
|
||||
including portions thereof.
|
||||
|
||||
1.4. "Electronic Distribution Mechanism" means a mechanism generally
|
||||
accepted in the software development community for the electronic
|
||||
transfer of data.
|
||||
|
||||
1.5. "Executable" means Covered Code in any form other than Source
|
||||
Code.
|
||||
|
||||
1.6. "Initial Developer" means the individual or entity identified
|
||||
as the Initial Developer in the Source Code notice required by Exhibit
|
||||
A.
|
||||
|
||||
1.7. "Larger Work" means a work which combines Covered Code or
|
||||
portions thereof with code not governed by the terms of this License.
|
||||
|
||||
1.8. "License" means this document.
|
||||
|
||||
1.8.1. "Licensable" means having the right to grant, to the maximum
|
||||
extent possible, whether at the time of the initial grant or
|
||||
subsequently acquired, any and all of the rights conveyed herein.
|
||||
|
||||
1.9. "Modifications" means any addition to or deletion from the
|
||||
substance or structure of either the Original Code or any previous
|
||||
Modifications. When Covered Code is released as a series of files, a
|
||||
Modification is:
|
||||
A. Any addition to or deletion from the contents of a file
|
||||
containing Original Code or previous Modifications.
|
||||
|
||||
B. Any new file that contains any part of the Original Code or
|
||||
previous Modifications.
|
||||
|
||||
1.10. "Original Code" means Source Code of computer software code
|
||||
which is described in the Source Code notice required by Exhibit A as
|
||||
Original Code, and which, at the time of its release under this
|
||||
License is not already Covered Code governed by this License.
|
||||
|
||||
1.10.1. "Patent Claims" means any patent claim(s), now owned or
|
||||
hereafter acquired, including without limitation, method, process,
|
||||
and apparatus claims, in any patent Licensable by grantor.
|
||||
|
||||
1.11. "Source Code" means the preferred form of the Covered Code for
|
||||
making modifications to it, including all modules it contains, plus
|
||||
any associated interface definition files, scripts used to control
|
||||
compilation and installation of an Executable, or source code
|
||||
differential comparisons against either the Original Code or another
|
||||
well known, available Covered Code of the Contributor's choice. The
|
||||
Source Code can be in a compressed or archival form, provided the
|
||||
appropriate decompression or de-archiving software is widely available
|
||||
for no charge.
|
||||
|
||||
1.12. "You" (or "Your") means an individual or a legal entity
|
||||
exercising rights under, and complying with all of the terms of, this
|
||||
License or a future version of this License issued under Section 6.1.
|
||||
For legal entities, "You" includes any entity which controls, is
|
||||
controlled by, or is under common control with You. For purposes of
|
||||
this definition, "control" means (a) the power, direct or indirect,
|
||||
to cause the direction or management of such entity, whether by
|
||||
contract or otherwise, or (b) ownership of more than fifty percent
|
||||
(50%) of the outstanding shares or beneficial ownership of such
|
||||
entity.
|
||||
|
||||
2. Source Code License.
|
||||
|
||||
2.1. The Initial Developer Grant.
|
||||
The Initial Developer hereby grants You a world-wide, royalty-free,
|
||||
non-exclusive license, subject to third party intellectual property
|
||||
claims:
|
||||
(a) under intellectual property rights (other than patent or
|
||||
trademark) Licensable by Initial Developer to use, reproduce,
|
||||
modify, display, perform, sublicense and distribute the Original
|
||||
Code (or portions thereof) with or without Modifications, and/or
|
||||
as part of a Larger Work; and
|
||||
|
||||
(b) under Patents Claims infringed by the making, using or
|
||||
selling of Original Code, to make, have made, use, practice,
|
||||
sell, and offer for sale, and/or otherwise dispose of the
|
||||
Original Code (or portions thereof).
|
||||
|
||||
(c) the licenses granted in this Section 2.1(a) and (b) are
|
||||
effective on the date Initial Developer first distributes
|
||||
Original Code under the terms of this License.
|
||||
|
||||
(d) Notwithstanding Section 2.1(b) above, no patent license is
|
||||
granted: 1) for code that You delete from the Original Code; 2)
|
||||
separate from the Original Code; or 3) for infringements caused
|
||||
by: i) the modification of the Original Code or ii) the
|
||||
combination of the Original Code with other software or devices.
|
||||
|
||||
2.2. Contributor Grant.
|
||||
Subject to third party intellectual property claims, each Contributor
|
||||
hereby grants You a world-wide, royalty-free, non-exclusive license
|
||||
|
||||
(a) under intellectual property rights (other than patent or
|
||||
trademark) Licensable by Contributor, to use, reproduce, modify,
|
||||
display, perform, sublicense and distribute the Modifications
|
||||
created by such Contributor (or portions thereof) either on an
|
||||
unmodified basis, with other Modifications, as Covered Code
|
||||
and/or as part of a Larger Work; and
|
||||
|
||||
(b) under Patent Claims infringed by the making, using, or
|
||||
selling of Modifications made by that Contributor either alone
|
||||
and/or in combination with its Contributor Version (or portions
|
||||
of such combination), to make, use, sell, offer for sale, have
|
||||
made, and/or otherwise dispose of: 1) Modifications made by that
|
||||
Contributor (or portions thereof); and 2) the combination of
|
||||
Modifications made by that Contributor with its Contributor
|
||||
Version (or portions of such combination).
|
||||
|
||||
(c) the licenses granted in Sections 2.2(a) and 2.2(b) are
|
||||
effective on the date Contributor first makes Commercial Use of
|
||||
the Covered Code.
|
||||
|
||||
(d) Notwithstanding Section 2.2(b) above, no patent license is
|
||||
granted: 1) for any code that Contributor has deleted from the
|
||||
Contributor Version; 2) separate from the Contributor Version;
|
||||
3) for infringements caused by: i) third party modifications of
|
||||
Contributor Version or ii) the combination of Modifications made
|
||||
by that Contributor with other software (except as part of the
|
||||
Contributor Version) or other devices; or 4) under Patent Claims
|
||||
infringed by Covered Code in the absence of Modifications made by
|
||||
that Contributor.
|
||||
|
||||
3. Distribution Obligations.
|
||||
|
||||
3.1. Application of License.
|
||||
The Modifications which You create or to which You contribute are
|
||||
governed by the terms of this License, including without limitation
|
||||
Section 2.2. The Source Code version of Covered Code may be
|
||||
distributed only under the terms of this License or a future version
|
||||
of this License released under Section 6.1, and You must include a
|
||||
copy of this License with every copy of the Source Code You
|
||||
distribute. You may not offer or impose any terms on any Source Code
|
||||
version that alters or restricts the applicable version of this
|
||||
License or the recipients' rights hereunder. However, You may include
|
||||
an additional document offering the additional rights described in
|
||||
Section 3.5.
|
||||
|
||||
3.2. Availability of Source Code.
|
||||
Any Modification which You create or to which You contribute must be
|
||||
made available in Source Code form under the terms of this License
|
||||
either on the same media as an Executable version or via an accepted
|
||||
Electronic Distribution Mechanism to anyone to whom you made an
|
||||
Executable version available; and if made available via Electronic
|
||||
Distribution Mechanism, must remain available for at least twelve (12)
|
||||
months after the date it initially became available, or at least six
|
||||
(6) months after a subsequent version of that particular Modification
|
||||
has been made available to such recipients. You are responsible for
|
||||
ensuring that the Source Code version remains available even if the
|
||||
Electronic Distribution Mechanism is maintained by a third party.
|
||||
|
||||
3.3. Description of Modifications.
|
||||
You must cause all Covered Code to which You contribute to contain a
|
||||
file documenting the changes You made to create that Covered Code and
|
||||
the date of any change. You must include a prominent statement that
|
||||
the Modification is derived, directly or indirectly, from Original
|
||||
Code provided by the Initial Developer and including the name of the
|
||||
Initial Developer in (a) the Source Code, and (b) in any notice in an
|
||||
Executable version or related documentation in which You describe the
|
||||
origin or ownership of the Covered Code.
|
||||
|
||||
3.4. Intellectual Property Matters
|
||||
(a) Third Party Claims.
|
||||
If Contributor has knowledge that a license under a third party's
|
||||
intellectual property rights is required to exercise the rights
|
||||
granted by such Contributor under Sections 2.1 or 2.2,
|
||||
Contributor must include a text file with the Source Code
|
||||
distribution titled "LEGAL" which describes the claim and the
|
||||
party making the claim in sufficient detail that a recipient will
|
||||
know whom to contact. If Contributor obtains such knowledge after
|
||||
the Modification is made available as described in Section 3.2,
|
||||
Contributor shall promptly modify the LEGAL file in all copies
|
||||
Contributor makes available thereafter and shall take other steps
|
||||
(such as notifying appropriate mailing lists or newsgroups)
|
||||
reasonably calculated to inform those who received the Covered
|
||||
Code that new knowledge has been obtained.
|
||||
|
||||
(b) Contributor APIs.
|
||||
If Contributor's Modifications include an application programming
|
||||
interface and Contributor has knowledge of patent licenses which
|
||||
are reasonably necessary to implement that API, Contributor must
|
||||
also include this information in the LEGAL file.
|
||||
|
||||
(c) Representations.
|
||||
Contributor represents that, except as disclosed pursuant to
|
||||
Section 3.4(a) above, Contributor believes that Contributor's
|
||||
Modifications are Contributor's original creation(s) and/or
|
||||
Contributor has sufficient rights to grant the rights conveyed by
|
||||
this License.
|
||||
|
||||
3.5. Required Notices.
|
||||
You must duplicate the notice in Exhibit A in each file of the Source
|
||||
Code. If it is not possible to put such notice in a particular Source
|
||||
Code file due to its structure, then You must include such notice in a
|
||||
location (such as a relevant directory) where a user would be likely
|
||||
to look for such a notice. If You created one or more Modification(s)
|
||||
You may add your name as a Contributor to the notice described in
|
||||
Exhibit A. You must also duplicate this License in any documentation
|
||||
for the Source Code where You describe recipients' rights or ownership
|
||||
rights relating to Covered Code. You may choose to offer, and to
|
||||
charge a fee for, warranty, support, indemnity or liability
|
||||
obligations to one or more recipients of Covered Code. However, You
|
||||
may do so only on Your own behalf, and not on behalf of the Initial
|
||||
Developer or any Contributor. You must make it absolutely clear than
|
||||
any such warranty, support, indemnity or liability obligation is
|
||||
offered by You alone, and You hereby agree to indemnify the Initial
|
||||
Developer and every Contributor for any liability incurred by the
|
||||
Initial Developer or such Contributor as a result of warranty,
|
||||
support, indemnity or liability terms You offer.
|
||||
|
||||
3.6. Distribution of Executable Versions.
|
||||
You may distribute Covered Code in Executable form only if the
|
||||
requirements of Section 3.1-3.5 have been met for that Covered Code,
|
||||
and if You include a notice stating that the Source Code version of
|
||||
the Covered Code is available under the terms of this License,
|
||||
including a description of how and where You have fulfilled the
|
||||
obligations of Section 3.2. The notice must be conspicuously included
|
||||
in any notice in an Executable version, related documentation or
|
||||
collateral in which You describe recipients' rights relating to the
|
||||
Covered Code. You may distribute the Executable version of Covered
|
||||
Code or ownership rights under a license of Your choice, which may
|
||||
contain terms different from this License, provided that You are in
|
||||
compliance with the terms of this License and that the license for the
|
||||
Executable version does not attempt to limit or alter the recipient's
|
||||
rights in the Source Code version from the rights set forth in this
|
||||
License. If You distribute the Executable version under a different
|
||||
license You must make it absolutely clear that any terms which differ
|
||||
from this License are offered by You alone, not by the Initial
|
||||
Developer or any Contributor. You hereby agree to indemnify the
|
||||
Initial Developer and every Contributor for any liability incurred by
|
||||
the Initial Developer or such Contributor as a result of any such
|
||||
terms You offer.
|
||||
|
||||
3.7. Larger Works.
|
||||
You may create a Larger Work by combining Covered Code with other code
|
||||
not governed by the terms of this License and distribute the Larger
|
||||
Work as a single product. In such a case, You must make sure the
|
||||
requirements of this License are fulfilled for the Covered Code.
|
||||
|
||||
4. Inability to Comply Due to Statute or Regulation.
|
||||
|
||||
If it is impossible for You to comply with any of the terms of this
|
||||
License with respect to some or all of the Covered Code due to
|
||||
statute, judicial order, or regulation then You must: (a) comply with
|
||||
the terms of this License to the maximum extent possible; and (b)
|
||||
describe the limitations and the code they affect. Such description
|
||||
must be included in the LEGAL file described in Section 3.4 and must
|
||||
be included with all distributions of the Source Code. Except to the
|
||||
extent prohibited by statute or regulation, such description must be
|
||||
sufficiently detailed for a recipient of ordinary skill to be able to
|
||||
understand it.
|
||||
|
||||
5. Application of this License.
|
||||
|
||||
This License applies to code to which the Initial Developer has
|
||||
attached the notice in Exhibit A and to related Covered Code.
|
||||
|
||||
6. Versions of the License.
|
||||
|
||||
6.1. New Versions.
|
||||
Netscape Communications Corporation ("Netscape") may publish revised
|
||||
and/or new versions of the License from time to time. Each version
|
||||
will be given a distinguishing version number.
|
||||
|
||||
6.2. Effect of New Versions.
|
||||
Once Covered Code has been published under a particular version of the
|
||||
License, You may always continue to use it under the terms of that
|
||||
version. You may also choose to use such Covered Code under the terms
|
||||
of any subsequent version of the License published by Netscape. No one
|
||||
other than Netscape has the right to modify the terms applicable to
|
||||
Covered Code created under this License.
|
||||
|
||||
6.3. Derivative Works.
|
||||
If You create or use a modified version of this License (which you may
|
||||
only do in order to apply it to code which is not already Covered Code
|
||||
governed by this License), You must (a) rename Your license so that
|
||||
the phrases "Mozilla", "MOZILLAPL", "MOZPL", "Netscape",
|
||||
"MPL", "NPL" or any confusingly similar phrase do not appear in your
|
||||
license (except to note that your license differs from this License)
|
||||
and (b) otherwise make it clear that Your version of the license
|
||||
contains terms which differ from the Mozilla Public License and
|
||||
Netscape Public License. (Filling in the name of the Initial
|
||||
Developer, Original Code or Contributor in the notice described in
|
||||
Exhibit A shall not of themselves be deemed to be modifications of
|
||||
this License.)
|
||||
|
||||
7. DISCLAIMER OF WARRANTY.
|
||||
|
||||
COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
|
||||
WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF
|
||||
DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING.
|
||||
THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE
|
||||
IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT,
|
||||
YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE
|
||||
COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER
|
||||
OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF
|
||||
ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
|
||||
|
||||
8. TERMINATION.
|
||||
|
||||
8.1. This License and the rights granted hereunder will terminate
|
||||
automatically if You fail to comply with terms herein and fail to cure
|
||||
such breach within 30 days of becoming aware of the breach. All
|
||||
sublicenses to the Covered Code which are properly granted shall
|
||||
survive any termination of this License. Provisions which, by their
|
||||
nature, must remain in effect beyond the termination of this License
|
||||
shall survive.
|
||||
|
||||
8.2. If You initiate litigation by asserting a patent infringement
|
||||
claim (excluding declatory judgment actions) against Initial Developer
|
||||
or a Contributor (the Initial Developer or Contributor against whom
|
||||
You file such action is referred to as "Participant") alleging that:
|
||||
|
||||
(a) such Participant's Contributor Version directly or indirectly
|
||||
infringes any patent, then any and all rights granted by such
|
||||
Participant to You under Sections 2.1 and/or 2.2 of this License
|
||||
shall, upon 60 days notice from Participant terminate prospectively,
|
||||
unless if within 60 days after receipt of notice You either: (i)
|
||||
agree in writing to pay Participant a mutually agreeable reasonable
|
||||
royalty for Your past and future use of Modifications made by such
|
||||
Participant, or (ii) withdraw Your litigation claim with respect to
|
||||
the Contributor Version against such Participant. If within 60 days
|
||||
of notice, a reasonable royalty and payment arrangement are not
|
||||
mutually agreed upon in writing by the parties or the litigation claim
|
||||
is not withdrawn, the rights granted by Participant to You under
|
||||
Sections 2.1 and/or 2.2 automatically terminate at the expiration of
|
||||
the 60 day notice period specified above.
|
||||
|
||||
(b) any software, hardware, or device, other than such Participant's
|
||||
Contributor Version, directly or indirectly infringes any patent, then
|
||||
any rights granted to You by such Participant under Sections 2.1(b)
|
||||
and 2.2(b) are revoked effective as of the date You first made, used,
|
||||
sold, distributed, or had made, Modifications made by that
|
||||
Participant.
|
||||
|
||||
8.3. If You assert a patent infringement claim against Participant
|
||||
alleging that such Participant's Contributor Version directly or
|
||||
indirectly infringes any patent where such claim is resolved (such as
|
||||
by license or settlement) prior to the initiation of patent
|
||||
infringement litigation, then the reasonable value of the licenses
|
||||
granted by such Participant under Sections 2.1 or 2.2 shall be taken
|
||||
into account in determining the amount or value of any payment or
|
||||
license.
|
||||
|
||||
8.4. In the event of termination under Sections 8.1 or 8.2 above,
|
||||
all end user license agreements (excluding distributors and resellers)
|
||||
which have been validly granted by You or any distributor hereunder
|
||||
prior to termination shall survive termination.
|
||||
|
||||
9. LIMITATION OF LIABILITY.
|
||||
|
||||
UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT
|
||||
(INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL
|
||||
DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE,
|
||||
OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR
|
||||
ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY
|
||||
CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL,
|
||||
WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER
|
||||
COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN
|
||||
INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF
|
||||
LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY
|
||||
RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW
|
||||
PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE
|
||||
EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO
|
||||
THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU.
|
||||
|
||||
10. U.S. GOVERNMENT END USERS.
|
||||
|
||||
The Covered Code is a "commercial item," as that term is defined in
|
||||
48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer
|
||||
software" and "commercial computer software documentation," as such
|
||||
terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48
|
||||
C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995),
|
||||
all U.S. Government End Users acquire Covered Code with only those
|
||||
rights set forth herein.
|
||||
|
||||
11. MISCELLANEOUS.
|
||||
|
||||
This License represents the complete agreement concerning subject
|
||||
matter hereof. If any provision of this License is held to be
|
||||
unenforceable, such provision shall be reformed only to the extent
|
||||
necessary to make it enforceable. This License shall be governed by
|
||||
California law provisions (except to the extent applicable law, if
|
||||
any, provides otherwise), excluding its conflict-of-law provisions.
|
||||
With respect to disputes in which at least one party is a citizen of,
|
||||
or an entity chartered or registered to do business in the United
|
||||
States of America, any litigation relating to this License shall be
|
||||
subject to the jurisdiction of the Federal Courts of the Northern
|
||||
District of California, with venue lying in Santa Clara County,
|
||||
California, with the losing party responsible for costs, including
|
||||
without limitation, court costs and reasonable attorneys' fees and
|
||||
expenses. The application of the United Nations Convention on
|
||||
Contracts for the International Sale of Goods is expressly excluded.
|
||||
Any law or regulation which provides that the language of a contract
|
||||
shall be construed against the drafter shall not apply to this
|
||||
License.
|
||||
|
||||
12. RESPONSIBILITY FOR CLAIMS.
|
||||
|
||||
As between Initial Developer and the Contributors, each party is
|
||||
responsible for claims and damages arising, directly or indirectly,
|
||||
out of its utilization of rights under this License and You agree to
|
||||
work with Initial Developer and Contributors to distribute such
|
||||
responsibility on an equitable basis. Nothing herein is intended or
|
||||
shall be deemed to constitute any admission of liability.
|
||||
|
||||
13. MULTIPLE-LICENSED CODE.
|
||||
|
||||
Initial Developer may designate portions of the Covered Code as
|
||||
"Multiple-Licensed". "Multiple-Licensed" means that the Initial
|
||||
Developer permits you to utilize portions of the Covered Code under
|
||||
Your choice of the NPL or the alternative licenses, if any, specified
|
||||
by the Initial Developer in the file described in Exhibit A.
|
||||
|
||||
EXHIBIT A-Netscape Public License.
|
||||
|
||||
"The contents of this file are subject to the Netscape Public
|
||||
License Version 1.1 (the "License"); you may not use this file
|
||||
except in compliance with the License. You may obtain a copy of
|
||||
the License at http://www.mozilla.org/NPL/
|
||||
|
||||
Software distributed under the License is distributed on an "AS
|
||||
IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
implied. See the License for the specific language governing
|
||||
rights and limitations under the License.
|
||||
|
||||
The Original Code is the Netscape Mailstone code, released
|
||||
March 17, 2000.
|
||||
|
||||
The Initial Developer of the Original Code is Netscape
|
||||
Communications Corporation. Portions created by Netscape are
|
||||
Copyright (C) 1999-2000 Netscape Communications Corporation. All
|
||||
Rights Reserved.
|
||||
|
||||
Contributor(s): Dan Christian <robodan@netscape.com>
|
||||
Marcel DePaolis <marcel@netscape.com>
|
||||
Jim Salter <jsalter@netscape.com>
|
||||
Mike Blakely, David Shak, Brain Williams
|
||||
|
||||
Alternatively, the contents of this file may be used under the
|
||||
terms of the GNU General Public license Version 2 or later
|
||||
(the "GPL"), in which case the provisions of GPL are
|
||||
applicable instead of those above. If you wish to allow use
|
||||
of your version of this file only under the terms of the GPL
|
||||
and not to allow others to use your version of this file
|
||||
under the NPL, indicate your decision by deleting the
|
||||
provisions above and replace them with the notice and other
|
||||
provisions required by the GPL. If you do not delete the
|
||||
provisions above, a recipient may use your version of this
|
||||
file under either the NPL or the GPL License."
|
||||
|
||||
----------------------------------------------------------------------
|
||||
|
||||
AMENDMENTS
|
||||
|
||||
The Netscape Public License Version 1.1 ("NPL") consists of the
|
||||
Mozilla Public License Version 1.1 with the following Amendments,
|
||||
including Exhibit A-Netscape Public License. Files identified with
|
||||
"Exhibit A-Netscape Public License" are governed by the Netscape
|
||||
Public License Version 1.1.
|
||||
|
||||
Additional Terms applicable to the Netscape Public License.
|
||||
I. Effect.
|
||||
These additional terms described in this Netscape Public
|
||||
License -- Amendments shall apply to the Mozilla Communicator
|
||||
client code and to all Covered Code under this License.
|
||||
|
||||
II. "Netscape's Branded Code" means Covered Code that Netscape
|
||||
distributes and/or permits others to distribute under one or more
|
||||
trademark(s) which are controlled by Netscape but which are not
|
||||
licensed for use under this License.
|
||||
|
||||
III. Netscape and logo.
|
||||
This License does not grant any rights to use the trademarks
|
||||
"Netscape", the "Netscape N and horizon" logo or the "Netscape
|
||||
lighthouse" logo, "Netcenter", "Gecko", "Java" or "JavaScript",
|
||||
"Smart Browsing" even if such marks are included in the Original
|
||||
Code or Modifications.
|
||||
|
||||
IV. Inability to Comply Due to Contractual Obligation.
|
||||
Prior to licensing the Original Code under this License, Netscape
|
||||
has licensed third party code for use in Netscape's Branded Code.
|
||||
To the extent that Netscape is limited contractually from making
|
||||
such third party code available under this License, Netscape may
|
||||
choose to reintegrate such code into Covered Code without being
|
||||
required to distribute such code in Source Code form, even if
|
||||
such code would otherwise be considered "Modifications" under
|
||||
this License.
|
||||
|
||||
V. Use of Modifications and Covered Code by Initial Developer.
|
||||
V.1. In General.
|
||||
The obligations of Section 3 apply to Netscape, except to
|
||||
the extent specified in this Amendment, Section V.2 and V.3.
|
||||
|
||||
V.2. Other Products.
|
||||
Netscape may include Covered Code in products other than the
|
||||
Netscape's Branded Code which are released by Netscape
|
||||
during the two (2) years following the release date of the
|
||||
Original Code, without such additional products becoming
|
||||
subject to the terms of this License, and may license such
|
||||
additional products on different terms from those contained
|
||||
in this License.
|
||||
|
||||
V.3. Alternative Licensing.
|
||||
Netscape may license the Source Code of Netscape's Branded
|
||||
Code, including Modifications incorporated therein, without
|
||||
such Netscape Branded Code becoming subject to the terms of
|
||||
this License, and may license such Netscape Branded Code on
|
||||
different terms from those contained in this License.
|
||||
|
||||
VI. Litigation.
|
||||
Notwithstanding the limitations of Section 11 above, the
|
||||
provisions regarding litigation in Section 11(a), (b) and (c) of
|
||||
the License shall apply to all disputes relating to this License.
|
||||
|
||||
@@ -1,246 +0,0 @@
|
||||
# Makefile for mstone
|
||||
# use gmake
|
||||
# Builds each of the components and then packages everything
|
||||
|
||||
topsrcdir = .
|
||||
|
||||
CP := cp -p
|
||||
|
||||
ifndef INCLUDED_CONFIG_MK
|
||||
include $(topsrcdir)/config/config.mk
|
||||
endif
|
||||
|
||||
|
||||
# dynamically find the optional directories names
|
||||
LIBGD_DIR = $(wildcard gd?.*)
|
||||
GNUPLOT_DIR = $(wildcard gnuplot-?.*)
|
||||
PERL_DIR = $(wildcard perl5.*)
|
||||
|
||||
# file that we package
|
||||
GDFILES = gd.txt gd.html libgd.* gd.h demoin.gif gddemo giftogd webgif
|
||||
GNUPLOTFILES = gnuplot Copyright gnuplot_x11 gnuplot.1 gnuplot.gih
|
||||
|
||||
VERSION = 4.3
|
||||
TARBALL = mstone-$(VERSION)-$(NSARCH)$(OBJDIR_TAG).tar.gz
|
||||
ZIPFILE = mstone-$(VERSION)-$(NSARCH)$(OBJDIR_TAG).zip
|
||||
TARBALL_ALL = mstone-$(VERSION)-all$(OBJDIR_TAG).tar.gz
|
||||
ZIPFILE_ALL = mstone-$(VERSION)-all$(OBJDIR_TAG).zip
|
||||
|
||||
NTFILES = mstone.bat process.bat setup.bat
|
||||
|
||||
all:: usage
|
||||
|
||||
usage::
|
||||
@$(ECHO) "gmake [ release | rpackage | debug | dpackage ]"
|
||||
@$(ECHO) " [ DIST=/m/dist/mailstone/1999xxxx dist ]"
|
||||
@$(ECHO) " [ all_DBG | all_OPT ]"
|
||||
@$(ECHO) "perl is" $(PERL_DIR) ". gd is" $(LIBGD_DIR) ". gnuplot is" $(GNUPLOT_DIR) "."
|
||||
|
||||
targets:: $(OBJDIR) mailclient
|
||||
|
||||
ifneq (,$(LIBGD_DIR))
|
||||
targets:: libgd
|
||||
endif
|
||||
|
||||
ifneq (,$(GNUPLOT_DIR))
|
||||
targets:: gnuplot
|
||||
endif
|
||||
|
||||
ifneq (,$(PERL_DIR))
|
||||
targets:: perl
|
||||
endif
|
||||
|
||||
$(OBJDIR):
|
||||
-mkdir -p $(OBJDIR)
|
||||
|
||||
mailclient::
|
||||
@$(ECHO) "\n===== [`date`] making OS_CONFIG=$(NSARCH) BUILD_VARIANT=$(BUILD_VARIANT)\n"
|
||||
cd src; $(MAKE) BUILD_VARIANT=$(BUILD_VARIANT) OBJDIR=../$(OBJDIR) PKGDIR=../$(PKGDIR) all
|
||||
|
||||
# Use our top level makefiles to drive the component builds
|
||||
libgd $(OBJDIR)/gd/libgd.a::
|
||||
$(MAKE) -f gd.mk LIBGD_DIR=$(LIBGD_DIR) libgd
|
||||
|
||||
gnuplot $(OBJDIR)/gnuplot/gnuplot::
|
||||
$(MAKE) -f gnuplot.mk LIBGD_DIR=$(LIBGD_DIR) GNUPLOT_DIR=$(GNUPLOT_DIR) gnuplot
|
||||
|
||||
perl $(OBJDIR)/perl/perl::
|
||||
$(MAKE) -f perl.mk PERL_DIR=$(PERL_DIR) perl
|
||||
|
||||
# Create packaging binary directories
|
||||
# Note: dont make gd or gnuplot here. For multi-OS, they are links
|
||||
mkpkgdirs:: $(PKGDIR)/bin $(PKGDIR)/conf $(PKGDIR)/data $(PKGDIR)/doc
|
||||
|
||||
$(PKGDIR)/bin:
|
||||
mkdir -p $(PKGDIR)/bin
|
||||
|
||||
$(PKGDIR)/conf:
|
||||
mkdir -p $(PKGDIR)/conf
|
||||
|
||||
$(PKGDIR)/data:
|
||||
mkdir -p $(PKGDIR)/data
|
||||
|
||||
$(PKGDIR)/doc:
|
||||
mkdir -p $(PKGDIR)/doc
|
||||
|
||||
$(PKGDIR)/gd:
|
||||
mkdir -p $(PKGDIR)/gd
|
||||
|
||||
$(PKGDIR)/gnuplot:
|
||||
mkdir -p $(PKGDIR)/gnuplot
|
||||
|
||||
$(PKGDIR)/perl:
|
||||
mkdir -p $(PKGDIR)/perl
|
||||
|
||||
|
||||
# operating system independent share-files (at least for Unix)
|
||||
pkg-share-files:: mkpkgdirs
|
||||
@$(ECHO) "\n===== [`date`] making package share-files...\n"
|
||||
$(CP) mstone process $(PKGDIR)
|
||||
(cd $(PKGDIR); [ ! -f setup ] || rm -f setup; ln -s mstone setup)
|
||||
(cd $(PKGDIR); [ ! -f cleanup ] || rm -f cleanup; ln -s mstone cleanup)
|
||||
(cd $(PKGDIR); [ ! -f checktime ] || rm -f checktime; ln -s mstone checktime)
|
||||
(cd $(PKGDIR); [ ! -f timesync ] || rm -f timesync; ln -s mstone timesync)
|
||||
-$(CP) nsarch bin/*.pl $(PKGDIR)/bin
|
||||
-$(CP) conf/*.wld conf/*.wld.in conf/*.html $(PKGDIR)/conf
|
||||
-$(CP) data/*.msg $(PKGDIR)/data
|
||||
-$(CP) doc/*.html doc/*.gif $(PKGDIR)/doc
|
||||
-$(CP) INSTALL $(PKGDIR)
|
||||
-$(CP) README $(PKGDIR)
|
||||
-$(CP) ChangeLog $(PKGDIR)
|
||||
-$(CP) LICENSE $(PKGDIR)
|
||||
|
||||
# split out OS specific file so that combined packaging possible (set PKGDIR)
|
||||
pkg-arch-files-gd:: $(PKGDIR)/gd $(OBJDIR)/gd/libgd.a
|
||||
$(CP) $(addprefix $(OBJDIR)/gd/, $(GDFILES)) $(PKGDIR)/gd
|
||||
-$(STRIP) $(PKGDIR)/gd/webgif $(PKGDIR)/gd/giftogd $(PKGDIR)/gd/gddemo
|
||||
|
||||
pkg-arch-files-gnuplot:: $(PKGDIR)/gnuplot $(OBJDIR)/gnuplot/gnuplot
|
||||
$(CP) $(addprefix $(OBJDIR)/gnuplot/, $(GNUPLOTFILES)) $(PKGDIR)/gnuplot
|
||||
-$(STRIP) $(PKGDIR)/gnuplot/gnuplot $(PKGDIR)/gnuplot/gnuplot_x11
|
||||
|
||||
ifneq (,$(LIBGD_DIR))
|
||||
pkg-arch-files:: pkg-arch-files-gd
|
||||
endif
|
||||
|
||||
ifneq (,$(GNUPLOT_DIR))
|
||||
pkg-arch-files:: pkg-arch-files-gnuplot
|
||||
endif
|
||||
|
||||
pkg-arch-files:: $(PKGDIR)/bin $(OBJDIR)/mailclient
|
||||
@$(ECHO) "\n===== [`date`] making package arch-files...\n"
|
||||
$(CP) $(OBJDIR)/mailclient $(PKGDIR)/bin
|
||||
-$(STRIP) $(PKGDIR)/bin/mailclient
|
||||
|
||||
pkg-perl-files:: $(PKGDIR)/bin $(OBJDIR)/perl/perl
|
||||
@$(ECHO) "\n===== [`date`] making package perl-files...\n"
|
||||
$(MAKE) -f perl.mk PERL_DIR=$(PERL_DIR) \
|
||||
BUILD_VARIANT=$(BUILD_VARIANT) \
|
||||
OBJDIR=$(OBJDIR) PKGDIR=$(PKGDIR) package-perl
|
||||
find $(PKGDIR)/perl/lib -name .packlist -exec rm {} \; -print
|
||||
-$(STRIP) $(PKGDIR)/perl/bin/perl
|
||||
-$(STRIP) $(PKGDIR)/perl/bin/a2p
|
||||
|
||||
# for combined packaging, this should not be part of pkg-arch-files
|
||||
# perl is handled seperately do to its size
|
||||
ifneq (,$(PERL_DIR))
|
||||
pkg:: pkg-perl-files
|
||||
endif
|
||||
|
||||
pkg:: targets pkg-share-files pkg-arch-files
|
||||
|
||||
tarball: build/$(TARBALL)
|
||||
|
||||
build/$(TARBALL):
|
||||
@$(ECHO) "\n===== [`date`] making os tar file...\n"
|
||||
-rm -f build/$(TARBALL)
|
||||
cd $(dir $(PKGDIR)) && tar cf - . | gzip > ../../$(TARBALL)
|
||||
|
||||
zipfile: build/$(ZIPFILE)
|
||||
|
||||
build/$(ZIPFILE):
|
||||
@$(ECHO) "\n===== [`date`] making os zip file...\n"
|
||||
-rm -f build/$(ZIPFILE)
|
||||
cd $(dir $(PKGDIR)) && zip -r -q ../../$(ZIPFILE) .
|
||||
|
||||
|
||||
########################################################################
|
||||
# Generate a combined build for every Unix OS that is already packaged
|
||||
# NT has to be done seperately because it has different file names
|
||||
# We have to nuke some old parts, because permissions wont allow overwrites
|
||||
# Finally, dont ship perl development headers and libraries
|
||||
all_DBG all_OPT::
|
||||
@$(ECHO) "===== [`date`] unified packaging for $@..."
|
||||
$(MAKE) NSARCH=$@ OBJDIR_TAG='' \
|
||||
PKGDIR=$(topsrcdir)/build/package/$@.OBJ/mstone pkg-share-files
|
||||
./ospkg.sh $@.OBJ \
|
||||
$(notdir $(shell ls -d build/package/[A-Z]*$(subst all,,$@.OBJ)))
|
||||
[ -d $(topsrcdir)/build/package/$@.OBJ/mstone/bin/WINNT4.0 ] \
|
||||
&& cp -p $(NTFILES) $(topsrcdir)/build/package/$@.OBJ/mstone; :
|
||||
-rm -f ./build/mstone-$(VERSION)-$@.tar.gz
|
||||
cd ./build/package/$@.OBJ \
|
||||
&& tar cf - . | gzip > ../../mstone-$(VERSION)-$@.tar.gz
|
||||
-rm -f ./build/mstone-$(VERSION)-$@.zip
|
||||
cd ./build/package/$@.OBJ \
|
||||
&& zip -r -q ../../mstone-$(VERSION)-$@.zip .
|
||||
|
||||
|
||||
########################################################################
|
||||
# Copy all the packaged trees to the distribution site
|
||||
# Copy in the unified tarball and zip file
|
||||
# Link mstone to mailstone for Netscape back compatibility
|
||||
# Re-map short Linux name to standard Netscape convention
|
||||
dist::
|
||||
@[ "$(DIST)" != "" ] || ($(MAKE) usage && /bin/false)
|
||||
@[ ! -d "$(DIST)" ] || ($(ECHO) "Error: $(DIST) already exists" && \
|
||||
$(MAKE) usage && /bin/false)
|
||||
mkdir -p $(DIST)
|
||||
cp -p build/mstone-$(VERSION)-all_*.*[a-z] $(DIST)/
|
||||
(cd build/package; tar cf - *.OBJ) | (cd $(DIST); tar xf - )
|
||||
for l in $(DIST)/*_???.OBJ ; do \
|
||||
(cd $$l; ln -s mstone mailstone); done
|
||||
cd $(DIST); for l in Linux*_???.OBJ ; do \
|
||||
nn=`echo $$l | sed -e 's/_OPT/_glibc_PTH_OPT/' | sed -e 's/_DBG/_glibc_PTH_DBG/'`; \
|
||||
ln -s $$l $$nn; done
|
||||
|
||||
# since the default is release mode, this can just work off a dependency
|
||||
release:: targets
|
||||
#release::
|
||||
# @$(ECHO) "\n===== [`date`] making release build..."
|
||||
# $(MAKE) BUILD_VARIANT=release OBJDIR_TAG=_OPT targets
|
||||
@$(ECHO) "\n===== [`date`] making release build done."
|
||||
|
||||
rpackage:: release pkg #tarball zipfile
|
||||
#rpackage:: release
|
||||
# @$(ECHO) "\n===== [`date`] making release package..."
|
||||
# $(MAKE) BUILD_VARIANT=release OBJDIR_TAG=_OPT pkg tarball zipfile
|
||||
@$(ECHO) "\n===== [`date`] making release package done."
|
||||
|
||||
# since the default is release mode, start a make with the right mode
|
||||
debug::
|
||||
@$(ECHO) "\n===== [`date`] making debug build..."
|
||||
$(MAKE) BUILD_VARIANT=debug OBJDIR_TAG=_DBG targets
|
||||
@$(ECHO) "\n===== [`date`] making debug build done."
|
||||
|
||||
# We dont usually bother to tar up a debug build
|
||||
dpackage:: debug
|
||||
@$(ECHO) "\n===== [`date`] making debug package..."
|
||||
$(MAKE) BUILD_VARIANT=debug OBJDIR_TAG=_DBG pkg
|
||||
@$(ECHO) "\n===== [`date`] making debug package done."
|
||||
|
||||
# These are old and may be broken
|
||||
cleanvariant::
|
||||
(cd src; $(MAKE) OBJDIR=../$(OBJDIR) clean)
|
||||
rm -rf $(PKGDIR)
|
||||
|
||||
clean::
|
||||
$(MAKE) BUILD_VARIANT=release OBJDIR_TAG=_OPT cleanvariant
|
||||
$(MAKE) BUILD_VARIANT=debug OBJDIR_TAG=_DBG cleanvariant
|
||||
|
||||
distcleanvariant::
|
||||
(cd src; $(MAKE) OBJDIR=../$(OBJDIR) distclean)
|
||||
rm -rf $(OBJDIR) $(PKGDIR)
|
||||
|
||||
distclean:: clean
|
||||
$(MAKE) BUILD_VARIANT=release OBJDIR_TAG=_OPT distcleanvariant
|
||||
$(MAKE) BUILD_VARIANT=debug OBJDIR_TAG=_DBG distcleanvariant
|
||||
@@ -1,75 +0,0 @@
|
||||
|
||||
MSTONE 4.2
|
||||
|
||||
Mstone is a mail server performance testing tool designed to simulate
|
||||
the different types and volume of mail traffic a mail server would
|
||||
experience during a peak activity period. Mstone was formerly known
|
||||
as Mailstone.
|
||||
|
||||
A quick installation guide is available in INSTALL.
|
||||
|
||||
The full Mailstone 4.15 user manual is available at
|
||||
http://lxr.mozilla.org/mozilla/source/mstone/doc/MailStone.html
|
||||
|
||||
Testing strategy
|
||||
----------------
|
||||
|
||||
Mstone is capable of opening SMTP, POP3, IMAP4, and other protocol
|
||||
connections to mail servers. The number and type of connections made
|
||||
to the mail server is based on a weighted command list which provides
|
||||
the ability to test mail server implementation requirements.
|
||||
|
||||
A series of perl script allow you to setup client machines, run tests,
|
||||
and then cleanup client machine files. Each client machine has a copy
|
||||
of the mailclient program and SMTP message files. When the test is
|
||||
run, the mailclient is started with the proper command line and work load.
|
||||
|
||||
After experimenting with mstone loads, you will notice that there
|
||||
are a few factors that can distort server the byte and message
|
||||
throughput. You will find that the server byte throughput is related
|
||||
to the average SMTP message (file) size. Also, server throughput, in
|
||||
bytes and messages, is affected by larger than normal POP3/IMAP4
|
||||
mailboxes. So it is important to approach the mstone command
|
||||
configuration with data collected from existing mail server
|
||||
implementations, for example, a customer might say "during our peak
|
||||
activity in the morning, we handle up to two thousand employees
|
||||
sending an average of 5 messages of 20K average size and receiving 25
|
||||
messages of same size". With input like this, you can begin tuning
|
||||
mstone to generate relevant data.
|
||||
|
||||
There are two important things to consider when reviewing the results of
|
||||
mstone performance analysis: Was the test run on target for
|
||||
simulating the type and volume of mail traffic; and did the server, both
|
||||
software and machine, handle the load within an acceptable margin?
|
||||
|
||||
With this information, it can be determined: whether enough SMTP
|
||||
connections were made to the server during the run, and how many
|
||||
messages were downloaded over how many POP3/IMAP4 connections. If the
|
||||
number of SMTP connections is not in the acceptable range, then
|
||||
consider adding more client processes/machines or checking the server
|
||||
performance during the run. The message/connection ratio for
|
||||
POP3/IMAP4 should be checked for soundness, and adjustments should be
|
||||
made to the mailboxes before running the next test.
|
||||
|
||||
Monitoring the server performance during test runs is crucial in
|
||||
understanding the results. If the number of client connections is not
|
||||
being achieved and the server cpu usage and process run queue is not
|
||||
settling down after the initial spike, then modifications to the server
|
||||
architecture could be in order.
|
||||
|
||||
The analysis of mstone results is an iterative process of client
|
||||
(mstone client) and server tuning. The bottom line is to determine
|
||||
whether the messaging solution can handle the type of load expected in
|
||||
an acceptable manner.
|
||||
|
||||
|
||||
Server Log Tuning
|
||||
-----------------
|
||||
The Messaging and Directory server ship with access logging enabled by
|
||||
default. This gives the most information about what is going on in
|
||||
the system, but can reduce performance. You should test the way the
|
||||
system will be run.
|
||||
|
||||
Noticeable performance increases are often obtained by disabling access
|
||||
logging on the directory server and by reducing the logging level of
|
||||
the messaging servers from "Notice" to "Warning".
|
||||
@@ -1,16 +0,0 @@
|
||||
Under the terms of the Mozilla Public License, Version 1.1, granted
|
||||
by Mozilla, Sendmail Inc. is contributing the following Source Code
|
||||
changes to the Mozilla mstone source repository.
|
||||
|
||||
Sendmail, Inc. is making available these source code modifications
|
||||
according to the Distribution Obligations as listed in section 3
|
||||
of the Mozilla Public License, Version 1.1
|
||||
|
||||
The changes provided herein are described in the included files:
|
||||
|
||||
README.Sendmail-mstone_changes.html
|
||||
ChangeLog-Sendmail
|
||||
|
||||
All modifications are derived, directly or indirectly, from the original
|
||||
code as provided by Mozilla.
|
||||
|
||||
@@ -1,419 +0,0 @@
|
||||
<html>
|
||||
<head><title>Sendmail, Inc. Mstone changes</title></head>
|
||||
<body>
|
||||
|
||||
<h3>Mstone modifications</h3>
|
||||
|
||||
<ol>
|
||||
<li><h4>Random Variable Parameters</h4>
|
||||
|
||||
In addition to taking on constant values, some parameters can now be
|
||||
sampled from probability distributions. These variables are:
|
||||
<ul>
|
||||
<li><code>startDelay</code>
|
||||
<li><code>idleTime</code>
|
||||
<li><code>blockTime</code>
|
||||
<li><code>loopDelay</code>
|
||||
<li><code>numRecips</code>
|
||||
<li><code>size</code>
|
||||
<li><code>headers</code>
|
||||
<li><code>mime</code>
|
||||
<li><code>leaveMailOnServer</code>
|
||||
<li><code>bandwidth</code>
|
||||
<li><code>latency</code>
|
||||
</ul>
|
||||
|
||||
<p>
|
||||
The following distributions are currently implemented:
|
||||
<ul>
|
||||
<li>Uniform (~unif(a, b))
|
||||
<li>Normal (~normal(a, b))
|
||||
<li>Log-Normal (~lognormal(a, b))
|
||||
<li>Weibull (~weib(a, b, c))
|
||||
<li>Exponential (~exp(a))
|
||||
<li>Constant (~const(a))
|
||||
<li>Binomial (~binomial(a))
|
||||
</ul>
|
||||
|
||||
<p>
|
||||
Sampled values may also be constrained by a minimum and maximum value.
|
||||
This is particularly useful for e.g. the normal and lognormal
|
||||
distributions, though over-tight constraints will create a "lump" at
|
||||
the end of the generated distribution, and any constraints may change
|
||||
the distribution's characteristics (e.g. mean). To specify
|
||||
constraints, do the following:
|
||||
|
||||
<h5>getdist</h5>
|
||||
|
||||
<p>
|
||||
There is also a helper tool called "getdist" in the Sendmail mstone
|
||||
distribution. Building getdist:
|
||||
|
||||
<pre>
|
||||
file: mstone/src/idle.c
|
||||
# gcc -DTEST_PROB -Dxalloc=malloc -Dxfree=free -lm idle.c
|
||||
</pre>
|
||||
|
||||
<p>
|
||||
Rename the resulting binary to "getdist"
|
||||
|
||||
<p>
|
||||
<b>Using getdist</b>
|
||||
|
||||
<p>
|
||||
To run it interactively:
|
||||
|
||||
<ol>
|
||||
<li>Start up getdist</li>
|
||||
<li>Enter the distribution you want to see a sample and mean (ignore warning about 'gets()')</li>
|
||||
</ol>
|
||||
|
||||
<p>
|
||||
Example:
|
||||
|
||||
<pre>
|
||||
% getdist
|
||||
warning: this program uses gets(), which is unsafe.
|
||||
~lognormal(3,4.5)
|
||||
Samples:
|
||||
6.846493
|
||||
0.109578
|
||||
31.402784
|
||||
0.467486
|
||||
21.905714
|
||||
7.113645
|
||||
0.225102
|
||||
29.372181
|
||||
4.252427
|
||||
1.444493
|
||||
mean: 29.128932
|
||||
</pre>
|
||||
|
||||
<p>
|
||||
It will only OUTPUT 10 samples as examples but the mean
|
||||
is calculated based on 2000 samples by default. You can specify
|
||||
the mean sample size on the command line by giving it a -n option:
|
||||
|
||||
<pre>
|
||||
% getdist -n 1000000
|
||||
</pre>
|
||||
|
||||
<p>
|
||||
This will calculate the mean based on a sample of 1000000 entries.
|
||||
|
||||
<p>
|
||||
The above data was calculated with 2M samples.
|
||||
|
||||
<p>
|
||||
<i>Known Problems</i><BR>
|
||||
It appears (anecdotally) that the first set of samples returned by
|
||||
getdist are inaccurate. After starting the getdist program interactively,
|
||||
it may appear necessary to ignore the first set of output, but that entering
|
||||
the distribution again will return a more accurate result.<BR>
|
||||
|
||||
<p>
|
||||
For example:
|
||||
|
||||
<pre>
|
||||
# getdist
|
||||
~lognormal(10,2)
|
||||
Samples:
|
||||
670043.575395
|
||||
48.842052
|
||||
54.039792
|
||||
0.460849
|
||||
2.152179
|
||||
32.534664
|
||||
6.163511
|
||||
42.827706
|
||||
27.806642
|
||||
4.966444
|
||||
mean: 364.747532
|
||||
var: 224352671.855287
|
||||
stddev: 14978.406853
|
||||
~lognormal(10,2)
|
||||
Samples:
|
||||
1.842800
|
||||
39.760727
|
||||
4.798239
|
||||
10.722216
|
||||
27.052030
|
||||
28.923926
|
||||
61.504273
|
||||
20.743583
|
||||
5.373420
|
||||
42.195531
|
||||
mean: 25.510130
|
||||
var: 2674.124997
|
||||
stddev: 51.711942
|
||||
</pre>
|
||||
|
||||
|
||||
<dl>
|
||||
<dt><code>~dist(...) : [min,]</code>
|
||||
<dd>force all sampled values to be >= <code>min</code>
|
||||
<dt><code>~dist(...) : [min,max]</code>
|
||||
<dd>force all sampled values X to be <code>min</code> <= X <= <code>max</code>.
|
||||
<dt><code>~dist(...) : [,max]</code>
|
||||
<dd>force values to be <= <code>max</code>
|
||||
</dl>
|
||||
|
||||
<li><h4>Parsing Changes</h4>
|
||||
|
||||
All of the time-valued test parameters except <code>rampTime</code>
|
||||
and <code>time</code> now have millisecond values. In particular,
|
||||
this means that a value of "17" parses to 17
|
||||
<strong>milliseconds</strong>, not 17 seconds. Use "17s" instead.
|
||||
<p>
|
||||
|
||||
Size-valued parameters can have units of "k" or "m" to indicate
|
||||
kilobytes or megabytes, respectively.
|
||||
<p>
|
||||
|
||||
For parameters supporting random-variable values, a value starting
|
||||
with "~" will be interpreted as a random variable specification of the
|
||||
form "~NAME([ARGS ...])". Unit suffixes (e.g. "s", and "m") apply to
|
||||
random variable parameters as well as constant values. This implies
|
||||
that for unitless parameters, the suffixes corresponding to the random
|
||||
variable's units will still be recognized (i.e. the values will be
|
||||
multiplied by the appropriate factors). This is probably best
|
||||
considered as a "bug" rather than excercised as a "feature."
|
||||
<p>
|
||||
|
||||
<code>blockTime</code>, <code>loopDelay</code>, and
|
||||
<code>idleTime</code> now refer to the total amount of time a command
|
||||
block, loop, and initialization phase should take, respectively, not
|
||||
the amount of time the simulation should stall after completing each
|
||||
phase. For example, if a block takes 2 seconds to complete, and the
|
||||
block time is 4 seconds, the client thread will sleep for 2 seconds
|
||||
after finishing instead of the full 4.<p>
|
||||
|
||||
<code>rampTime</code> is now solely for the benefit of the client
|
||||
machines, to control the rate at which threads are started. The rate
|
||||
at which commands from a given protocol are started is now controlled
|
||||
by the <code>startDelay</code> variable, which is
|
||||
distribution-valued. Thus the actual command loop now looks like
|
||||
this:
|
||||
|
||||
<pre>
|
||||
wait for startDelay
|
||||
start counting idleTime
|
||||
start counting blockTime
|
||||
execute start function
|
||||
wait for remainder of idleTime
|
||||
for (1 ... numLoops)
|
||||
start counting loopDelay
|
||||
execute loop function
|
||||
wait for remainder of loopDelay
|
||||
execute end function
|
||||
wait for remainder of blockTime
|
||||
</pre>
|
||||
|
||||
<li><h4>Automatic Message Generation</h4>
|
||||
|
||||
Both MIME and text/plain messages can now be generated automatically.
|
||||
To enable automatic message generation, set the <code>file</code>
|
||||
attribute of an SMTP block to "auto". The messages will then have at
|
||||
least as many headers as the value of the <code>headers</code>
|
||||
attribute, have bodies <code>size</code> bytes long, and have
|
||||
<code>mime</code> MIME parts. To generate text/plain messages, set
|
||||
<code>mime</code> to zero.
|
||||
|
||||
<table border=1 cellpadding=2>
|
||||
<tr><th>Attribute</th><th>Description</th></tr>
|
||||
|
||||
<tr>
|
||||
<td><code>headers <i>N</i></code></td>
|
||||
<td>(optional; default=5) Each automatically generated message will
|
||||
have <code>min(<i>N</i>, min_hdrs)</code> headers, where
|
||||
<code>min_hdrs</code> is 5 for text/plain, and about 7 for MIME
|
||||
messages. Additional headers are named
|
||||
"X-generated-header-%d". </td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td><code>size <i>N</i></code></td>
|
||||
<td>(required) Each generated message will have a body be <i>N</i>
|
||||
bytes long.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td><code>mime <i>N</i></code></td>
|
||||
<td>Each generated message will have <code>N</code> MIME parts. If
|
||||
the value of <code>size</code> does not allow <code>N</code> parts,
|
||||
one part is generated. If <code>N</code> is zero, the message is
|
||||
text/plain.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td><code>checksum <i>{yes|no|save}</i></code></td>
|
||||
<td>For SMTP: each generated message will have the MD5 sum of the
|
||||
message body appended to the message unless the value is <i>no</i>.
|
||||
For retrieval protocols, checksums will be verified. (NOT
|
||||
IMPLEMENTED: if <code>checksum</code> is <i>save</i>, messages with
|
||||
incorrect checksums will be saved to temporary files for later
|
||||
examination.) </td>
|
||||
</tr>
|
||||
|
||||
</table>
|
||||
|
||||
<li><h4>Linespeed Emulation</h4>
|
||||
|
||||
SMTP, POP, and IMAP all support a form of linespeed emulation,
|
||||
controlled via the <code>latency</code> and <code>bandwidth</code>
|
||||
parameters.
|
||||
|
||||
<table border=1 cellpadding=2>
|
||||
<tr><th>Attribute</th><th>Description</th></tr>
|
||||
|
||||
<tr><td><code>latency <i>N</i></code></td>
|
||||
<td>Set the network latency to <code>N</code> milliseconds.</td></tr>
|
||||
|
||||
<tr><td><code>bandwidth <i>N</i></code></td>
|
||||
|
||||
<td>Transfer at most <code>N</code> bytes per second.</td></tr>
|
||||
|
||||
</table>
|
||||
|
||||
<li><h4>TLS support</h4>
|
||||
|
||||
If you have openssl, mstone now supports STARTTLS for SMTP and IMAP,
|
||||
and STLS for POP (both old-style and MULTIPOP), as well as SSL
|
||||
tunneling. This support is <strong>not</strong> well-tested, and TLS
|
||||
can be a bit tricky to set up, so use at your own risk. TLS
|
||||
introduces several new attributes to the protocol blocks:
|
||||
|
||||
<table border=1 cellpadding=2>
|
||||
<tr><th>Attribute</th><th>Description</th></tr>
|
||||
|
||||
<tr><td><code>sslcert <i>filename</i></code></td>
|
||||
<td>Read the client's cert from <i>filename</i>, which should be in
|
||||
PEM format. </td></tr>
|
||||
|
||||
<tr><td><code>sslkey <i>filename</i></code></td>
|
||||
|
||||
<td>Read the client's private key from <i>filename</i>, which should
|
||||
be in PEM format.</td></tr>
|
||||
|
||||
<tr><td><code>usetls {0|1}</code></td>
|
||||
|
||||
<td>Turn STARTTLS/STLS on or off (default: off). <b>Note</b>:
|
||||
<code>starttls</code> and <code>ssltunnel</code> are mutually
|
||||
exlcusive.</td></tr>
|
||||
|
||||
<tr><td><code>ssltunnel {0|1}</code></td>
|
||||
|
||||
<td>Turn SSL tunneling on or off (default: off).</td></tr>
|
||||
|
||||
</table>
|
||||
|
||||
<li><h4>"Multi-POP" protocol</h4>
|
||||
|
||||
<b>Note</b>: multipop, always a band-aid, is hopefully obsoleted by
|
||||
the new event-queue execution model. Though it has not been tested,
|
||||
it should be easier, more efficient, and more accurate to use the
|
||||
normal POP protocol with events to simulate a large number of users
|
||||
with a reasonable number of threads. Once this has been tested,
|
||||
automatically-generated workloads should revert to using POP.
|
||||
|
||||
<p>To simulate a large number of concurrently active POP users with
|
||||
Mstone's extravagant use of threads, and to simulate a period of
|
||||
activity comprised of several POP sessions one can use the MULTIPOP
|
||||
protocol to multiplex active users onto a single thread. The protocol
|
||||
has all the same parameters as POP, plus the following:
|
||||
|
||||
<table border=1 cellpadding=2>
|
||||
<tr><th>Attribute</th><th>Description</th></tr>
|
||||
|
||||
<tr><td><code>userSpacing</code></td>
|
||||
|
||||
<td>Total time for each user's session.</td>
|
||||
</tr>
|
||||
<tr><td><code>usersPerModem</code></td>
|
||||
|
||||
<td>The maximum number of concurrently connected users is limited
|
||||
to <code>users / usersPerModem</code></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<p>
|
||||
|
||||
The protocol functions are substantially different. Instead of
|
||||
simulating a single login-check-logout sequence, a protocol block
|
||||
simulates an entire active period for a set of users. Each user
|
||||
checks mail once in the initialization function, once each time the
|
||||
loop body is executed, and once more in the protocol conclusion
|
||||
function.
|
||||
<p>
|
||||
|
||||
<li><h4>"Event-queue" implementation</h4>
|
||||
|
||||
<p>
|
||||
Unless the "noevents" parameter in the "<config>" section is set to 1,
|
||||
or mailclient is not given the "-e" flag, mstone will run in
|
||||
"event-queue" mode. Instead of creating one thread per client, it
|
||||
will multiplex clients over a much smaller number of threads. This is
|
||||
intended to increase the tool's scalability.
|
||||
|
||||
<p>
|
||||
Note that I/O is still synchronous with this model, so the number of
|
||||
threads required will approximately equal the maximum number of
|
||||
concurrent operations. Also note that this change does not reduce the
|
||||
number of required file descriptors.
|
||||
|
||||
<p>
|
||||
|
||||
<li><h4>Other Minor Additions</h4>
|
||||
|
||||
<ul>
|
||||
|
||||
<li>IMAP now has a ramp-down time, enabled by defining
|
||||
<code>IMAP_RAMPDOWN</code>. IMAP threads now exit uniformly between
|
||||
the time the test is supposed to be over and the time Mstone starts
|
||||
killing them.
|
||||
|
||||
<li>Mstone used to always time out connections after 60 seconds. The
|
||||
timeout value can now be configured on a per-block basis via the
|
||||
<code>timeout</code> parameter. The value of the timeout parameter must
|
||||
be defined in milliseconds, so the following value would mean a timeout
|
||||
of one (1) hour:<BR>
|
||||
|
||||
timeout 3600000
|
||||
|
||||
<li>Simplified client allocation. It is now possible to specify the
|
||||
number of clients in each group by specifying a value for
|
||||
<code>clients</code> in each <code><CLIENT></code> section and
|
||||
<em>not</em> specifying a global <code>clientCount</code> in the
|
||||
<code><CONFIG></code> section.
|
||||
|
||||
</ul>
|
||||
|
||||
<li><h4>Bug Fixes</h4>
|
||||
|
||||
<ul>
|
||||
|
||||
<li>SMTP now ignores debugging output appearing over the connection.
|
||||
Before, Mstone would generate an error when talking to
|
||||
e.g. <code>sendmail -d64.5</code>.
|
||||
|
||||
<li>(now it works...) The old sequence of IMAP commands used by
|
||||
Mstone was incorrect. Instead of only downloading unread messages, it
|
||||
would download all messages received since the start of the session
|
||||
each time a new messages was received. Depending on what you were
|
||||
doing, this could have a serious effect on your results.
|
||||
|
||||
</ul>
|
||||
|
||||
<li><h4>Wish List</h4>
|
||||
|
||||
<ul>
|
||||
<li>Scriptable user behavior for POP and IMAP protocols. While we should
|
||||
probably not go overboard, adding more configuration options to Mstone
|
||||
is probably not the answer. There is already some support for more
|
||||
complex behaviors in the IMAP code -- we may or may not want to make
|
||||
use of it. More to the point, wider coverage of the IMAP
|
||||
protocol is vital to QA's use of the tool.
|
||||
</ul>
|
||||
|
||||
</ol>
|
||||
</body></html>
|
||||
@@ -1,189 +0,0 @@
|
||||
Mstone TODO List
|
||||
|
||||
Updated:
|
||||
3-20-2000 Dan Christian
|
||||
|
||||
======================================================================
|
||||
Minor improvements
|
||||
|
||||
Data reduction at each testbed client
|
||||
|
||||
Test message generator (plain and MIME styles)
|
||||
|
||||
More graphs for multiple runs
|
||||
|
||||
Option to drop a fraction of connections
|
||||
|
||||
IMAP delete without reading
|
||||
Just get the message list and delete everything. This could
|
||||
be the fastest way to drain out the store.
|
||||
|
||||
|
||||
Display MIN/MAX or standard deviation on graphs
|
||||
Gnuplot can do data points with error bars. You could either
|
||||
use MIN/MAX or the standard deviation for the error bars. There are
|
||||
issues with calculating the standard deviation numbers throughout the
|
||||
graph that need to be addressed.
|
||||
|
||||
|
||||
Statistics reset
|
||||
At least the MIN and MAX statistics could be easily reset
|
||||
during the test (after ramp up). This keeps the transients during
|
||||
startup and shutdown from dominating these numbers. The standard
|
||||
deviation statistics are much trickier to reset during the run. It
|
||||
may be better to isolate sections in post processing.
|
||||
|
||||
|
||||
Perl web server
|
||||
Sometimes it would be nice to include our own web server to
|
||||
provide the results (instead of using file: URLs). This would also be
|
||||
a gateway to form based test configuration editing and allow results
|
||||
to be interactively updated during tests. Perl with a socket library
|
||||
could handle this without too much trouble.
|
||||
|
||||
|
||||
Dynamic test loading
|
||||
Finalize an API for dynamically loading tests. This would
|
||||
allow tests to be added or updated separately from the core
|
||||
functionality. This may be needed for some types of security testing.
|
||||
|
||||
|
||||
Link graphs to the results tables
|
||||
There are already tags by each graph. You should be able to
|
||||
link the appropriate results table entry to each graph. This sort of
|
||||
tricky since graphs often combine multiple entries.
|
||||
|
||||
|
||||
Show statistics for every block
|
||||
Statistics are actually kept for every block in every thread.
|
||||
There should be a way to view information at this detail.
|
||||
|
||||
|
||||
Man pages
|
||||
The online docs are nice, but good 'ol man pages would be
|
||||
great in a different way.
|
||||
|
||||
|
||||
Reduce namespace polution
|
||||
Scripts names like setup and cleanup are too general. They
|
||||
|
||||
should be part of the main 'mstone' script (e.g. mstone setup).
|
||||
|
||||
Examples of script series
|
||||
Include example scripts to run entire series of tests in a
|
||||
sane way.
|
||||
|
||||
|
||||
Fix FORMAT clash
|
||||
At the start of a test, each client process outputs the
|
||||
information needed to report all its protocols. When there are
|
||||
multiple processes on one client, these FORMAT lines can intermix and
|
||||
cause parsing errors.
|
||||
|
||||
|
||||
Set connection drop rate
|
||||
Drop some percentage of the connections without a proper
|
||||
shutdown. This tests how well a server can detect and recover from
|
||||
hard disconnects.
|
||||
|
||||
|
||||
Improve randomness
|
||||
The way that we generate random numbers in a range may be not
|
||||
generate the proper randomness. We are using lrand48()%range we
|
||||
should use (lrand48/RAND_RANGE)*range. There are some end conditions
|
||||
that need to be thought about. All of this is in the sequence code;
|
||||
one change should fix (or break :) everything.
|
||||
|
||||
Also, we may be generating numbers that are never used. This
|
||||
may be costly, and can create holes in the proper sequence.
|
||||
|
||||
|
||||
Improve printing
|
||||
The color graphs are great on screen, but tend to print
|
||||
poorly. Either we need a better way to generate a printable version
|
||||
(maybe through a CGI button), or the seperate protocols need to be
|
||||
printed individually. Also, Communicator does a lousy job of keeping
|
||||
title with tables or graphs. Hopefully, Mozilla will do better.
|
||||
|
||||
|
||||
======================================================================
|
||||
Whole new protocol tests:
|
||||
|
||||
ICQ
|
||||
Test high volume instant messaging. Very useful for the
|
||||
bridges and gateways that people are considering using.
|
||||
|
||||
|
||||
WAP
|
||||
WAP is the emerging standard for mobile phones.
|
||||
|
||||
|
||||
WCAP
|
||||
Web based calendar services
|
||||
|
||||
|
||||
LDAP
|
||||
Use the LDAP SDK to do basic LDAP testing. The SDK probably
|
||||
isn't fast enough to call this a real performance test, but you can at
|
||||
least test performance degredation due to load from a real application
|
||||
(like a mail server).
|
||||
|
||||
|
||||
DNS
|
||||
Mail servers use DNS a lot. You should at least be able to
|
||||
see if performance is degrading due to load.
|
||||
|
||||
|
||||
Disk/filesystem
|
||||
Test read, write, sync, link, un-link, and append performance under
|
||||
multiple threads.
|
||||
|
||||
|
||||
Cert servers
|
||||
Test certificate authenticity checking performance
|
||||
|
||||
|
||||
======================================================================
|
||||
Possible dummy servers:
|
||||
|
||||
SMTP
|
||||
Receive mail via SMTP and ignore it. Usefull for SMTP relay
|
||||
testing.
|
||||
|
||||
|
||||
DNS
|
||||
Simulate slow DNS server lookups. Usefull for SMTP relay testing.
|
||||
|
||||
|
||||
======================================================================
|
||||
Major changes
|
||||
|
||||
Throttling
|
||||
Monitor and control transaction rates so that specific load
|
||||
levels can be easily specified. The rates should be able to vary to
|
||||
simulate peek hour usage and disconnect-restore.
|
||||
|
||||
|
||||
NSPR threading
|
||||
Use NSPR for threading and sockets. This may allow other OSes
|
||||
to be used as clients. This might be easy, since mstone does not need
|
||||
any locking, just simple thread creation and harvesting. NSPR
|
||||
argument parsing and hashes may also be useful.
|
||||
|
||||
|
||||
SSL
|
||||
Support SSL on the protocols that allow it. May require NSPR.
|
||||
|
||||
|
||||
Line speed emulation
|
||||
Simulate the variable delays and limited throughput of dial up
|
||||
connections.
|
||||
|
||||
|
||||
Scripting
|
||||
Allow more detailed control of protocol tests. It looks
|
||||
difficult to make this scalable and fast.
|
||||
|
||||
|
||||
Combined tests
|
||||
Deliver mail over SMTP and then see when it arrives using IMAP.
|
||||
@@ -1,462 +0,0 @@
|
||||
#!/bin/ksh
|
||||
########################################################################
|
||||
# buildall - automated multi-platform build tool
|
||||
#
|
||||
# 10/09/97 - marcel - created
|
||||
# 10/13/97 - marcel - support shared build tree
|
||||
# 2/11/98 - marcel - updated for 4.0 Beta builds (need -update)
|
||||
# 2/26/98 - marcel - added -r, -t and host specifiers
|
||||
# 7/01/99 - robodan - added VAR=value ability
|
||||
# 8/01/99 - robodan - explicitly know about building on localhost
|
||||
# 10/15/99 - robodan - remove older OSes from build list
|
||||
# 2000/4/7 - robodan - Created mstone version
|
||||
########################################################################
|
||||
#
|
||||
# This script is intended to do a set of UNIX builds for a
|
||||
# given CVS module. It is designed to use 'rsh' between a
|
||||
# set of trusting hosts and use shared NFS storage with common
|
||||
# mount points (e.g. /u/username/...)
|
||||
#
|
||||
# To check if you have rights to rsh to a particular host, try:
|
||||
# rsh hostname "echo $PATH"
|
||||
# You may have to edit your .rhosts or /etc/hosts.equiv
|
||||
#
|
||||
# A target directory will be created based on the current date.
|
||||
#
|
||||
# A set of global build logs plus a log per platform are kept
|
||||
# in a log directory under the target
|
||||
#
|
||||
# It will checkout a copy of the source, duplicate it for
|
||||
# each platform and perform a set of remote builds in parallel.
|
||||
# The script will exit when all the work has been completed.
|
||||
#
|
||||
# Example usage:
|
||||
# cd ~/src; buildall msg
|
||||
# Result:
|
||||
# ~/src/19980210_40.1/
|
||||
# ~/src/19980210_40.1/logs/...
|
||||
# ~/src/19980210_40.1/src/...
|
||||
# ...
|
||||
#
|
||||
|
||||
# Buildhosts
|
||||
DEFAULT_BUILDHOSTS="kimo nugget vsync shave purgatory trex0"
|
||||
|
||||
usage() {
|
||||
echo ""
|
||||
echo "usage: buildall [ make assigns... ] < -t | target > [ -r ] [ buildhosts... ]"
|
||||
echo " [ -t | --test]: just test rsh and report OS versions."
|
||||
echo " [-r | --respin]: rebuild in place using existing source."
|
||||
echo " [-p | --postbuild]: Execute post build command too."
|
||||
echo " [make assigns]: e.g. VARIANT=release"
|
||||
echo " <target>: one of: mstone42"
|
||||
echo " [buildhosts...]: default [$DEFAULT_BUILDHOSTS]"
|
||||
echo ""
|
||||
exit 1
|
||||
}
|
||||
|
||||
########################################################################
|
||||
# Set these defaults and options for your desired build
|
||||
########################################################################
|
||||
|
||||
# Target base destination directory
|
||||
DESTBASE=`pwd`
|
||||
|
||||
# Can we do multiple ARCH builds in same source tree
|
||||
SHARESRC=yes
|
||||
|
||||
DESCRIPTION=""
|
||||
BUILDHOSTS=""
|
||||
RESPIN="no"
|
||||
POSTBUILD="no"
|
||||
JUST_TEST="no"
|
||||
DESTTYPE=""
|
||||
CO_CMD="cvs -d $CVSROOT -q checkout"
|
||||
CHECKOUT=""
|
||||
CHECKOUT2=""
|
||||
#MOZCVSROOT=':pserver:anonymous@cvs.mozilla.org:/cvsroot'
|
||||
MOZCVSROOT=':pserver:robodan%netscape.com@cvs.mozilla.org:/cvsroot'
|
||||
|
||||
MAKE="gmake"
|
||||
MK_ARG=""
|
||||
|
||||
ARGS="$@"
|
||||
|
||||
for ARG in "$@"; do
|
||||
|
||||
# If this is a make assignment (FOO=whatever), add it to make command
|
||||
# Arguments with quotes in them dont go all the way through.
|
||||
# Make args trick: 'FOO=nop -j 2'
|
||||
# The pre-post arg stuff uses hostnames as a switch, ugly calling syntax.
|
||||
if [[ -n "`echo z$ARG | egrep '^z[A-Z0-9_]+=[^ ]'`" ]] ; then
|
||||
if [[ -n "$DESCRIPTION" ]] ; then
|
||||
echo "Arg after target is ignored! ($ARG)"
|
||||
continue
|
||||
fi
|
||||
if [[ -z "$BUILDHOSTS" ]] ; then # pre args
|
||||
MAKE="$MAKE $ARG"
|
||||
else # post args
|
||||
MK_ARG="$MK_ARG $ARG"
|
||||
fi
|
||||
continue
|
||||
fi
|
||||
|
||||
# should we just rebuild todays latest source...
|
||||
if [[ "$ARG" = "-r" || "$ARG" = "--respin" || "$ARG" = "respin" ]]; then
|
||||
RESPIN="yes"
|
||||
continue
|
||||
fi
|
||||
|
||||
# should we just run post build command...
|
||||
if [[ "$ARG" = "-p" || "$ARG" = "--postbuild" || "$ARG" = "postbuild" ]]; then
|
||||
POSTBUILD="yes"
|
||||
continue
|
||||
fi
|
||||
|
||||
# should we just test remote connectivity and execute permissions...
|
||||
if [[ "$ARG" = "-t" || "$ARG" = "--test" ]]; then
|
||||
JUST_TEST="yes"
|
||||
RESPIN="yes"
|
||||
continue
|
||||
fi
|
||||
|
||||
# We will pull source using: "$CHECKOUT"
|
||||
# And build on each machine: "cd $BUILDDIR && $BUILDCMD"
|
||||
|
||||
|
||||
# expand targets (but dont confuse hosts for targets (msg7))
|
||||
|
||||
# These will build just mstone
|
||||
# expand targets (but dont confuse hosts for targets (msg7))
|
||||
if [[ "$BUILDCMD" = "" && "$ARG" = mailstone* ]]; then
|
||||
case ${ARG#mstone} in
|
||||
"")
|
||||
"42")
|
||||
DESTTYPE=_MSTONE42
|
||||
MS_BRANCH=""
|
||||
#BUILDCMD="$MAKE $MK_ARG debug release"
|
||||
#POSTCMD="$MAKE $MK_ARG all_DBG.OBJ all_OPT.OBJ"
|
||||
BUILDCMD="$MAKE $MK_ARG rpackage"
|
||||
POSTCMD="$MAKE $MK_ARG all_OPT"
|
||||
;;
|
||||
*)
|
||||
echo "Unknown mstone version in $ARG"
|
||||
echo "Try mstone42"
|
||||
exit 1;;
|
||||
esac
|
||||
|
||||
DESCRIPTION="Mstone $MS_BRANCH"
|
||||
BUILDDIR=./mozilla/mstone
|
||||
CVSROOT=$MOZCVSROOT
|
||||
CHECKOUT="$CO_CMD $MS_BRANCH mozilla/mstone"
|
||||
# BUG No way to unpack perl, gd, and gnuplot before building
|
||||
continue
|
||||
fi
|
||||
|
||||
#########################
|
||||
# Other...
|
||||
#########################
|
||||
|
||||
# These will print some tools info
|
||||
if [[ "$ARG" = "tools" ]]; then
|
||||
CHECKOUT="$CO_CMD modules"
|
||||
BUILDDIR=.
|
||||
BUILDCMD="which gcc && ls -l /tools/ns/bin/gcc && which gcc-2.7.2.1 && ls -l /tools/ns/bin/gcc-2.7.2.1"
|
||||
continue
|
||||
fi
|
||||
|
||||
#########################
|
||||
# Everything else is assumed to be a hostname
|
||||
#########################
|
||||
|
||||
BUILDHOSTS="$ARG $BUILDHOSTS"
|
||||
|
||||
done # for ARG in $*; do
|
||||
|
||||
if [[ "$BUILDHOSTS" = "" ]]; then
|
||||
BUILDHOSTS=$DEFAULT_BUILDHOSTS
|
||||
fi
|
||||
|
||||
if [[ "$BUILDCMD" = "" && "$JUST_TEST" = "no" ]]; then
|
||||
usage
|
||||
fi
|
||||
|
||||
########################################################################
|
||||
# You shouldn't have to modify stuff below here too much
|
||||
########################################################################
|
||||
|
||||
# Who and Where are we
|
||||
PROG=buildall
|
||||
RSH=rsh
|
||||
SYS=`uname -s`
|
||||
echo SYS=$SYS
|
||||
if [[ "$SYS" = "HP-UX" ]]; then
|
||||
RSH=remsh
|
||||
fi
|
||||
|
||||
########################################################################
|
||||
# Simple log output function
|
||||
########################################################################
|
||||
|
||||
log() {
|
||||
# echo "[`date +\"%Y/%m/%d %H:%M:%S\"`] $PROG: $*"
|
||||
echo "`date +\"%H:%M:%S\"` $PROG: $*"
|
||||
}
|
||||
|
||||
########################################################################
|
||||
# Error
|
||||
########################################################################
|
||||
|
||||
quit() {
|
||||
log "$* (exiting)..."
|
||||
exit 1
|
||||
}
|
||||
|
||||
# Where should the work be done
|
||||
REV=1
|
||||
WORKDIR=$DESTBASE/`date +"%Y%m%d"`$DESTTYPE.$REV
|
||||
LASTWORKDIR=$WORKDIR
|
||||
LASTREV=$REV
|
||||
|
||||
while [[ -d $WORKDIR ]]; do
|
||||
LASTREV=$REV
|
||||
let "REV= REV + 1"
|
||||
LASTWORKDIR=$WORKDIR
|
||||
WORKDIR=$DESTBASE/`date +"%Y%m%d"`$DESTTYPE.$REV
|
||||
done
|
||||
|
||||
if [[ "$RESPIN" = "yes" ]]; then
|
||||
WORKDIR=$LASTWORKDIR
|
||||
REV=$LASTREV
|
||||
fi
|
||||
BUILDREV=$REV
|
||||
|
||||
if [[ ! -d $WORKDIR && "$RESPIN" = "yes" ]]; then
|
||||
quit "missing expected respin workdir ($WORKDIR)"
|
||||
fi
|
||||
|
||||
mkdir -p $WORKDIR
|
||||
|
||||
# Where to send logs
|
||||
LOGDIR=$WORKDIR/logs
|
||||
[[ -d $LOGDIR ]] || mkdir $LOGDIR
|
||||
|
||||
# What tool to use for compressed tar
|
||||
if [[ -x /tools/ns/bin/tar ]] ; then # ROBDAN 9-15-98 for Linux
|
||||
TAR=/tools/ns/bin/tar
|
||||
else
|
||||
TAR=tar
|
||||
fi
|
||||
|
||||
SRCDIR=$WORKDIR/src
|
||||
SRCTAR=$WORKDIR/src.tar.gz
|
||||
|
||||
########################################################################
|
||||
# The function which extracts the source and prepares for copies
|
||||
########################################################################
|
||||
|
||||
prepare_source() {
|
||||
log "Preparing source code..."
|
||||
mkdir $SRCDIR
|
||||
(cd $SRCDIR;
|
||||
log "Extracting source in $SRCDIR...";
|
||||
log "$CHECKOUT > $LOGDIR/cvs-co.txt";
|
||||
$CHECKOUT > $LOGDIR/cvs-co.txt;
|
||||
RET=$?
|
||||
if [[ $RET -ne 0 ]]; then quit "### Failed($RET): $CHECKOUT"; fi
|
||||
if [[ "$CHECKOUT2" != "" ]]; then
|
||||
log "$CHECKOUT2 >> $LOGDIR/cvs-co.txt";
|
||||
$CHECKOUT2 >> $LOGDIR/cvs-co.txt;
|
||||
RET=$?
|
||||
if [[ $RET -ne 0 ]]; then quit "### Failed($RET): $CHECKOUT2"; fi
|
||||
fi
|
||||
log "Listing source...";
|
||||
ls -Rl > $LOGDIR/src-ls-Rl.txt
|
||||
log "Archiving source..."
|
||||
$TAR czf $SRCTAR .
|
||||
)
|
||||
RET=$?
|
||||
if [[ $RET -ne 0 ]]; then
|
||||
quit "### Failed($RET): cannot prepare source";
|
||||
else
|
||||
log "Source extraction complete";
|
||||
fi
|
||||
}
|
||||
|
||||
########################################################################
|
||||
# The function which does a build
|
||||
########################################################################
|
||||
|
||||
do_rbuild() {
|
||||
OSDEST=$1
|
||||
|
||||
if [ "$SHARESRC" = "yes" ]; then
|
||||
RSRCDIR=$SRCDIR
|
||||
else
|
||||
RSRCDIR=$WORKDIR/$OSDEST
|
||||
fi
|
||||
|
||||
[[ -d $RSRCDIR ]] || mkdir -p $RSRCDIR
|
||||
|
||||
cd $RSRCDIR;
|
||||
|
||||
# do any late variable expansions
|
||||
RAWCMD=$BUILDCMD
|
||||
BUILDCMD=$(eval echo $RAWCMD)
|
||||
|
||||
if [[ $RHOST = localhost ]] ; then
|
||||
log "Build locally for $OSDEST ($BUILDCMD)...";
|
||||
cd $BUILDDIR && pwd && $BUILDCMD && echo $PROG: Success
|
||||
RET=$?
|
||||
if [[ $RET -ne 0 ]]; then quit "### Failed($RET): $OSDEST build"; fi
|
||||
|
||||
log "Completed local build..."
|
||||
return
|
||||
fi
|
||||
|
||||
if [[ "$SHARESRC" != "yes" ]]; then
|
||||
log "Extracting source for $OSDEST...";
|
||||
$RSH $RHOST -n "cd $RSRCDIR && pwd && $TAR xzf $SRCTAR";
|
||||
RET=$?
|
||||
if [[ $RET -ne 0 ]]; then quit "### Failed($RET): $OSDEST source extraction"; fi
|
||||
else
|
||||
log "Using common source in $RSRCDIR";
|
||||
fi
|
||||
|
||||
log "Building for $OSDEST ($BUILDCMD)...";
|
||||
$RSH $RHOST -n "cd $RSRCDIR/$BUILDDIR && pwd && $BUILDCMD && echo $PROG: Success"
|
||||
RET=$?
|
||||
if [[ $RET -ne 0 ]]; then quit "### Failed($RET): $OSDEST build"; fi
|
||||
|
||||
log "Completed $OSDEST...";
|
||||
}
|
||||
|
||||
buildhost() {
|
||||
RHOST=$1
|
||||
|
||||
log "Query $RHOST configuration...";
|
||||
|
||||
if [[ $RHOST = localhost ]] ; then
|
||||
uname -s > /tmp/$$.$RHOST 2>&1
|
||||
else
|
||||
$RSH $RHOST -n "uname -s" > /tmp/$$.$RHOST 2>&1
|
||||
RET=$?
|
||||
if [[ $RET -ne 0 ]]; then
|
||||
quit "..[$RHOST] ### Failed($RET): $RSH $RHOST -n \"uname -s\"";
|
||||
fi
|
||||
fi
|
||||
ROSTYPE=`tail -1 /tmp/$$.$RHOST`
|
||||
|
||||
if [[ "$ROSTYPE" = "AIX" ]]; then
|
||||
$RSH $RHOST -n "uname -v" > /tmp/$$.$RHOST 2>&1
|
||||
ROSTYPE=${ROSTYPE}`tail -1 /tmp/$$.$RHOST`
|
||||
fi
|
||||
|
||||
if [[ $RHOST = localhost ]] ; then
|
||||
uname -r > /tmp/$$.$RHOST 2>&1
|
||||
else
|
||||
$RSH $RHOST -n "uname -r" > /tmp/$$.$RHOST 2>&1
|
||||
fi
|
||||
ROSREV=`tail -1 /tmp/$$.$RHOST`
|
||||
rm /tmp/$$.$RHOST
|
||||
|
||||
if [[ $RHOST = localhost ]] ; then
|
||||
OSDEST=`hostname | cut -f1 -d.`-${ROSTYPE}${ROSREV}
|
||||
else
|
||||
OSDEST=${RHOST}-${ROSTYPE}${ROSREV}
|
||||
fi
|
||||
log "..Building on [$OSDEST]..."
|
||||
|
||||
REV=1 # find unique logfile name
|
||||
OSLOG=$LOGDIR/$OSDEST.$REV
|
||||
while [[ -f $OSLOG ]]; do
|
||||
let "REV = REV + 1"
|
||||
OSLOG=$LOGDIR/$OSDEST.$REV
|
||||
done
|
||||
|
||||
if [[ "$JUST_TEST" = "yes" ]]; then
|
||||
echo "$PROG: Success" > $OSLOG
|
||||
else
|
||||
( do_rbuild $OSDEST ) > $OSLOG 2>&1
|
||||
fi
|
||||
|
||||
grep "$PROG: Success" $OSLOG > /dev/null
|
||||
RET=$?
|
||||
if [[ $RET -eq 0 ]]; then
|
||||
RESULT="SUCCESS";
|
||||
else
|
||||
RESULT="FAILURE($RET)";
|
||||
fi
|
||||
log "..Completed [$OSDEST] <$RESULT>.";
|
||||
}
|
||||
|
||||
########################################################################
|
||||
# The function which initiates all the builds
|
||||
########################################################################
|
||||
|
||||
do_builds() {
|
||||
log "Launching builds..."
|
||||
|
||||
for HOST in $BUILDHOSTS; do
|
||||
buildhost $HOST &
|
||||
done
|
||||
}
|
||||
|
||||
########################################################################
|
||||
# main
|
||||
########################################################################
|
||||
|
||||
main() {
|
||||
if [[ "$JUST_TEST" = "yes" ]]; then
|
||||
log "Automated test starting..."
|
||||
else
|
||||
log "Automated build of [$DESCRIPTION] starting..."
|
||||
fi
|
||||
log ""
|
||||
log " ARGS = $ARGS"
|
||||
log " BUILDHOSTS = $BUILDHOSTS"
|
||||
log " WORKDIR = $WORKDIR"
|
||||
log " SRCDIR = $SRCDIR"
|
||||
log " LOGDIR = $LOGDIR"
|
||||
log " CHECKOUT = $CHECKOUT"
|
||||
log " BUILDDIR = $BUILDDIR"
|
||||
log " BUILDCMD = $BUILDCMD"
|
||||
log " RESPIN = $RESPIN"
|
||||
log ""
|
||||
|
||||
[[ "$RESPIN" = "no" ]] && prepare_source
|
||||
do_builds
|
||||
log "Waiting for all builds to complete..."
|
||||
wait
|
||||
log "All builds completed."
|
||||
|
||||
if [[ -n "$POSTCMD" && "$POSTBUILD" = "yes" ]] ; then
|
||||
log "Running post build command."
|
||||
|
||||
REV=1 # find unique logfile name
|
||||
POSTLOG=$LOGDIR/postbuild.$REV
|
||||
while [[ -f $POSTLOG ]]; do
|
||||
let "REV = REV + 1"
|
||||
POSTLOG=$LOGDIR/postbuild.$REV
|
||||
done
|
||||
|
||||
echo "Dir $SRCDIR/$BUILDDIR" > $POSTLOG
|
||||
echo "Cmd $POSTCMD" >> $POSTLOG
|
||||
(cd $SRCDIR/$BUILDDIR && $POSTCMD && echo $PROG: Success) >> $POSTLOG 2>&1
|
||||
|
||||
log "Post build command completed."
|
||||
elif [[ -n "$POSTCMD" ]] ; then
|
||||
echo "Skipping post build command: $POSTCMD"
|
||||
fi
|
||||
}
|
||||
|
||||
REV=1
|
||||
PROGLOG=$LOGDIR/$PROG.$REV
|
||||
|
||||
while [[ -f $PROGLOG ]]; do
|
||||
REV=`expr $REV + 1`
|
||||
PROGLOG=$LOGDIR/$PROG.$REV
|
||||
done
|
||||
|
||||
main | tee $PROGLOG 2>&1
|
||||
exit 0
|
||||
@@ -1,164 +0,0 @@
|
||||
@if not "%echo%" == "on" echo off
|
||||
|
||||
REM ************ simple autobuild for mailstone
|
||||
|
||||
setlocal
|
||||
|
||||
set BOTH=0
|
||||
|
||||
if not "%1" == "" goto GetTag
|
||||
|
||||
set BOTH=1
|
||||
set TAG=_OPT
|
||||
goto SetConfig
|
||||
|
||||
:GetTag
|
||||
|
||||
if %1 == dbg set TAG=_DBG
|
||||
if %1 == DBG set TAG=_DBG
|
||||
if %1 == Debug set TAG=_DBG
|
||||
if %1 == debug set TAG=_DBG
|
||||
if %1 == Release set TAG=_OPT
|
||||
if %1 == release set TAG=_OPT
|
||||
if %1 == opt set TAG=_OPT
|
||||
if %1 == OPT set TAG=_OPT
|
||||
if %1 == optimize set TAG=_OPT
|
||||
if %1 == Optimize set TAG=_OPT
|
||||
if %1 == optimized set TAG=_OPT
|
||||
if %1 == Optimized set TAG=_OPT
|
||||
if %1 == clean goto CleanBoth
|
||||
|
||||
:SetConfig
|
||||
|
||||
if %TAG% == _DBG set Config=Debug
|
||||
if %TAG% == _OPT set Config=Release
|
||||
|
||||
set ARCH=WINNT4.0%TAG%.OBJ
|
||||
|
||||
set FINAL_PATH=built\package\%ARCH%\mailstone
|
||||
|
||||
if not "%2" == "clean" if not exist %FINAL_PATH%\nul mkdir %FINAL_PATH%
|
||||
|
||||
|
||||
REM ************ first, clean the binary release
|
||||
nmake /f mailstone.mak CFG="mailstone - Win32 %Config%" /nologo NO_EXTERNAL_DEPS=1 CLEAN
|
||||
|
||||
if not "%2" == "clean" goto BuildMailstone
|
||||
|
||||
if exist src\%Config%\nul echo y | rd /s src\%Config% > nul
|
||||
if exist src\gnuplot-3.7\%Config%\nul echo y | rd /s src\gnuplot-3.7\%Config% > nul
|
||||
if exist src\gd1.3\%Config%\nul echo y | rd /s src\gd1.3\%Config% > nul
|
||||
if exist built\%ARCH%\nul echo y | rd /s built\%ARCH% > nul
|
||||
if exist %FINAL_PATH%\nul echo y | rd /s %FINAL_PATH% > nul
|
||||
|
||||
goto done
|
||||
|
||||
:BuildMailstone
|
||||
|
||||
REM **************** next, build it
|
||||
nmake /f mailstone.mak CFG="mailstone - Win32 %Config%" /nologo NO_EXTERNAL_DEPS=1
|
||||
if errorlevel 1 goto BadBuild
|
||||
|
||||
REM ************ next, copy the top-level files
|
||||
copy mstone.bat %FINAL_PATH%
|
||||
copy setup.bat %FINAL_PATH%
|
||||
copy CHANGELOG %FINAL_PATH%
|
||||
copy INSTALL %FINAL_PATH%
|
||||
copy README %FINAL_PATH%
|
||||
copy LICENSE %FINAL_PATH%
|
||||
|
||||
REM ************ now, copy the files for running mailstone into bin
|
||||
if not exist %FINAL_PATH%\bin\nul mkdir %FINAL_PATH%\bin
|
||||
copy built\%ARCH%\mailclient.exe %FINAL_PATH%\bin
|
||||
if exist built\package\%ARCH%\mailclient.exe copy built\package\%ARCH%\mailclient.exe %FINAL_PATH%\bin
|
||||
if exist built\package\%ARCH%\mailclient.exe del /f /q built\package\%ARCH%\mailclient.exe
|
||||
copy bin\*.pl %FINAL_PATH%\bin
|
||||
|
||||
REM ************ now, copy the configuration files into conf
|
||||
if not exist %FINAL_PATH%\conf\nul mkdir %FINAL_PATH%\conf
|
||||
copy conf\*.* %FINAL_PATH%\conf
|
||||
|
||||
REM ************ now, copy the data files into data
|
||||
if not exist %FINAL_PATH%\data\nul mkdir %FINAL_PATH%\data
|
||||
copy data\*.msg %FINAL_PATH%\data
|
||||
|
||||
REM ************ now, copy the gd files into gd
|
||||
if not exist %FINAL_PATH%\gd\nul mkdir %FINAL_PATH%\gd
|
||||
copy src\gd1.3\index.html %FINAL_PATH%\gd\gd.html
|
||||
|
||||
REM ************ now, copy the gnuplot files into gnuplot
|
||||
if not exist %FINAL_PATH%\gnuplot\nul mkdir %FINAL_PATH%\gnuplot
|
||||
copy built\%ARCH%\gnuplot\gnuplot.exe %FINAL_PATH%\gnuplot
|
||||
copy src\gnuplot-3.7\Copyright %FINAL_PATH%\gnuplot
|
||||
copy src\gnuplot-3.7\docs\gnuplot.1 %FINAL_PATH%\gnuplot
|
||||
|
||||
REM ************ now, copy the perl files into perl
|
||||
if not exist %FINAL_PATH%\perl\nul mkdir %FINAL_PATH%\perl
|
||||
if not exist %FINAL_PATH%\perl\bin\nul mkdir %FINAL_PATH%\perl\bin
|
||||
if not exist %FINAL_PATH%\perl\lib\nul mkdir %FINAL_PATH%\perl\lib
|
||||
if not exist %FINAL_PATH%\perl\lib\5.00503\nul mkdir %FINAL_PATH%\perl\lib\5.00503
|
||||
if not exist %FINAL_PATH%\perl\lib\5.00503\MSWin32-x86\nul mkdir %FINAL_PATH%\perl\lib\5.00503\MSWin32-x86
|
||||
#copy built\%ARCH%\perl\perl.exe %FINAL_PATH%\perl\bin
|
||||
#rcp -b sandpit:/share/builds/components/perl5/WINNT-perl5/perl.exe %FINAL_PATH%\perl\bin\perl.exe
|
||||
#if errorlevel 1 goto BadRcp
|
||||
#if not exist %FINAL_PATH%\perl\perl.exe goto BadRcp
|
||||
#rcp -b sandpit:/share/builds/components/perl5/WINNT-perl5/perl300.dll %FINAL_PATH%\perl\bin\perl300.dll
|
||||
#if errorlevel 1 goto BadRcp
|
||||
#if not exist %FINAL_PATH%\perl\perl300.dll goto BadRcp
|
||||
|
||||
copy src\perl5.005_03\Artistic %FINAL_PATH%\perl
|
||||
copy c:\perl\5.00503\bin\MSWin32-x86\perl.exe %FINAL_PATH%\perl\bin
|
||||
copy c:\perl\5.00503\bin\MSWin32-x86\perl.dll %FINAL_PATH%\perl\bin
|
||||
copy c:\perl\5.00503\lib\*.pm %FINAL_PATH%\perl\lib\5.00503
|
||||
copy c:\perl\5.00503\lib\*.pl %FINAL_PATH%\perl\lib\5.00503
|
||||
copy c:\perl\5.00503\lib\MSWin32-x86\*.pm %FINAL_PATH%\perl\lib\5.00503\MSWin32-x86
|
||||
|
||||
|
||||
goto end
|
||||
|
||||
:CleanBoth
|
||||
|
||||
echo.
|
||||
echo NOTICE: CLEANING debug build
|
||||
call autobuild.bat debug clean
|
||||
|
||||
echo NOTICE: CLEANING optimized build
|
||||
call autobuild.bat release clean
|
||||
|
||||
echo NOTICE: Removing generated dependency files
|
||||
del /s *.dep
|
||||
|
||||
if exist built\nul echo y | rd /s built > nul
|
||||
|
||||
goto done
|
||||
|
||||
:BadRcp
|
||||
|
||||
echo.
|
||||
echo ERROR: Failed to rcp perl files over to mailstone packaging
|
||||
echo ERROR: Two common causes of this are .rhosts permissions or a broken rcp.exe
|
||||
echo ERROR: Make sure you are not using rcp.exe from NT4.0 SP4
|
||||
echo ERROR: The SP5 version is available in \\cobra\engineering\bin\rcp_sp5.exe
|
||||
echo ERROR: Use this version to replace ...\system32\rcp.exe
|
||||
goto done
|
||||
|
||||
:BadBuild
|
||||
|
||||
echo.
|
||||
echo ERROR: Failed to build mailstone
|
||||
goto done
|
||||
|
||||
:end
|
||||
|
||||
echo.
|
||||
|
||||
if %BOTH% == 0 goto done
|
||||
if %TAG% == _DBG goto done
|
||||
|
||||
set TAG=_DBG
|
||||
goto SetConfig
|
||||
|
||||
:done
|
||||
|
||||
endlocal
|
||||
|
||||
@@ -1,64 +0,0 @@
|
||||
# The contents of this file are subject to the Netscape Public
|
||||
# License Version 1.1 (the "License"); you may not use this file
|
||||
# except in compliance with the License. You may obtain a copy of
|
||||
# the License at http://www.mozilla.org/NPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS
|
||||
# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
# implied. See the License for the specific language governing
|
||||
# rights and limitations under the License.
|
||||
#
|
||||
# The Original Code is the Netscape Mailstone utility,
|
||||
# released March 17, 2000.
|
||||
#
|
||||
# The Initial Developer of the Original Code is Netscape
|
||||
# Communications Corporation. Portions created by Netscape are
|
||||
# Copyright (C) 1997-2000 Netscape Communications Corporation. All
|
||||
# Rights Reserved.
|
||||
#
|
||||
# Contributor(s): Dan Christian <robodan@netscape.com>
|
||||
# Marcel DePaolis <marcel@netcape.com>
|
||||
#
|
||||
# Alternatively, the contents of this file may be used under the
|
||||
# terms of the GNU Public License (the "GPL"), in which case the
|
||||
# provisions of the GPL are applicable instead of those above.
|
||||
# If you wish to allow use of your version of this file only
|
||||
# under the terms of the GPL and not to allow others to use your
|
||||
# version of this file under the NPL, indicate your decision by
|
||||
# deleting the provisions above and replace them with the notice
|
||||
# and other provisions required by the GPL. If you do not delete
|
||||
# the provisions above, a recipient may use your version of this
|
||||
# file under either the NPL or the GPL.
|
||||
#####################################################
|
||||
|
||||
# This file does argument processing, file IO, and other utility routines
|
||||
|
||||
# Where the online docs live
|
||||
#$mailstoneURL =
|
||||
# "http://home.netscape.com/eng/server/messaging/4.1/mailston/stone.htm";
|
||||
#$mailstoneURL =
|
||||
# "http://lxr.mozilla.org/mozilla/source/mstone/doc/MailStone.html";
|
||||
#$mailstoneURL =
|
||||
# "http://docs.iplanet.com/docs/manuals/messaging/nms415/mailstone/stone.htm"
|
||||
$mailstoneURL = "doc/MailStone.html";
|
||||
|
||||
# Subdirs for results (each under a timestamp dir). Should just hardwire.
|
||||
$tmpbase = "tmp";
|
||||
$resultbase = "results";
|
||||
|
||||
# This holds everything about the test and system configuration
|
||||
@workload = ();
|
||||
# Setup the special CONFIG section
|
||||
$params{"sectionTitle"} = "CONFIG";
|
||||
$params{"sectionParams"} = "";
|
||||
$params{"lineList"} = ();
|
||||
push @workload, \%params;
|
||||
|
||||
# Get the lists discribing the data we process
|
||||
do 'protoconf.pl' || die "$@\n";
|
||||
|
||||
%includedFiles = (); # array of included files
|
||||
|
||||
do 'util.pl' || die "$@\n";
|
||||
|
||||
return 1;
|
||||
@@ -1,310 +0,0 @@
|
||||
# The contents of this file are subject to the Netscape Public
|
||||
# License Version 1.1 (the "License"); you may not use this file
|
||||
# except in compliance with the License. You may obtain a copy of
|
||||
# the License at http://www.mozilla.org/NPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS
|
||||
# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
# implied. See the License for the specific language governing
|
||||
# rights and limitations under the License.
|
||||
#
|
||||
# The Original Code is the Netscape Mailstone utility,
|
||||
# released March 17, 2000.
|
||||
#
|
||||
# The Initial Developer of the Original Code is Netscape
|
||||
# Communications Corporation. Portions created by Netscape are
|
||||
# Copyright (C) 1997-2000 Netscape Communications Corporation. All
|
||||
# Rights Reserved.
|
||||
#
|
||||
# Contributor(s): Dan Christian <robodan@netscape.com>
|
||||
# Marcel DePaolis <marcel@netcape.com>
|
||||
# Sean O'Rourke <sean@sendmail.com>
|
||||
#
|
||||
# Alternatively, the contents of this file may be used under the
|
||||
# terms of the GNU Public License (the "GPL"), in which case the
|
||||
# provisions of the GPL are applicable instead of those above.
|
||||
# If you wish to allow use of your version of this file only
|
||||
# under the terms of the GPL and not to allow others to use your
|
||||
# version of this file under the NPL, indicate your decision by
|
||||
# deleting the provisions above and replace them with the notice
|
||||
# and other provisions required by the GPL. If you do not delete
|
||||
# the provisions above, a recipient may use your version of this
|
||||
# file under either the NPL or the GPL.
|
||||
#####################################################
|
||||
|
||||
# This file deals with the graphs data only
|
||||
# Interfaces to gnuplot to generate gifs for HTML inclusion.
|
||||
|
||||
do 'util.pl';
|
||||
sub warn_system;
|
||||
sub die_system;
|
||||
|
||||
# Type of images to hold plots (e.g. png, gif, jpeg, svg, tiff, pbm, etc)
|
||||
unless ($params{IMAGETYPE}) {
|
||||
# Should probe gnuplot and see if it can generate one of:
|
||||
# png, gif, jpeg, svg, tiff, or pbm.
|
||||
# Not all the programs that use args.pl need this (or have gnuplot, yet)
|
||||
my $outfile = "$tmpbase/termtypes.out";
|
||||
my %types = (); # hash of interesting types that we spot
|
||||
|
||||
unless (open(NEW, "<$outfile")) { # re-use old file if present
|
||||
($params{DEBUG}) &&
|
||||
print "Asking gnuplot what output types it supports\n";
|
||||
|
||||
# SEAN: this appears to do what they want:
|
||||
warn_system "echo 'set term' | $params{GNUPLOT} > $outfile";
|
||||
|
||||
open(NEW, "<$outfile") ||
|
||||
warn ": Could not open gnuplot output for parsing ($outfile): $!";
|
||||
}
|
||||
|
||||
# now check through the output for terminal types we can use.
|
||||
# I havent verified the jpeg or tiff types. e-mail me success or failure
|
||||
while (<NEW>) {
|
||||
(/\spng\s/) && ++$types{"png"} && next;
|
||||
(/\sgif\s/) && ++$types{"gif"} && next;
|
||||
(/\sjpeg\s/) && ++$types{"jpeg"} && next;
|
||||
(/\ssvg\s/) && ++$types{"svg"} && next;
|
||||
(/\stiff\s/) && ++$types{"tiff"} && next;
|
||||
(/\spbm\s/) && ++$types{"pbm"} && next;
|
||||
}
|
||||
close (NEW);
|
||||
|
||||
($params{DEBUG}) &&
|
||||
print "Found these gnuplot types: " . (join " ", (keys %types)) . "\n";
|
||||
|
||||
# The ordering here determines our preferences
|
||||
# This list is by likely browser compatibility and image compactness
|
||||
# png is about 10x smaller than gif
|
||||
# svg is smooth and scalable but usually requires a plug-in
|
||||
# jpeg will probably look bad, but will be directly supported
|
||||
if ($types{"png"}) { $params{IMAGETYPE}="png"; }
|
||||
elsif ($types{"gif"}) { $params{IMAGETYPE}="gif"; }
|
||||
elsif ($types{"jpeg"}) { $params{IMAGETYPE}="jpeg"; }
|
||||
elsif ($types{"svg"}) { $params{IMAGETYPE}="svg"; }
|
||||
elsif ($types{"tiff"}) { $params{IMAGETYPE}="tiff"; }
|
||||
elsif ($types{"pbm"}) { $params{IMAGETYPE}="pbm"; }
|
||||
else {
|
||||
warn "Gnuplot doesn't support any good image types. Check $outfile.\n";
|
||||
$params{IMAGETYPE} = undef;
|
||||
}
|
||||
# leave the output file around to speed up repeat runs
|
||||
}
|
||||
|
||||
# sub function to write data files, fire off gnuscript, and clean up
|
||||
# Uses global startTime and endTime figured above
|
||||
# genPlot counterName title label \@protocols \@variables
|
||||
sub genPlot {
|
||||
my $name = shift;
|
||||
my $title = shift;
|
||||
my $label = shift;
|
||||
my $protos = shift || die "genPlot: '$name' missing protocols";
|
||||
my $f = shift;
|
||||
my $vars = shift || die "genPlot: '$name' missing vars";
|
||||
|
||||
my $runlist = "";
|
||||
my $totPoints = 0;
|
||||
my $totProtos = 0;
|
||||
my @realProtos;
|
||||
my @goodProtos;
|
||||
|
||||
# user fewer data points than pixels to look good.
|
||||
# on 640x480 gif, the graph is about 579x408
|
||||
my $maxData = int (($params{CHARTWIDTH}-60) * 0.9);
|
||||
my $averageCnt = int (($endTime - $startTime + ($maxData - 1))/$maxData);
|
||||
if ($averageCnt < 1) { $averageCnt = 1; } # must be a positive int
|
||||
|
||||
($params{DEBUG}) && print "$name: averageCnt=$averageCnt vars = @$vars \n";
|
||||
|
||||
foreach $p (@$protos) { # First see if there is anything to graph
|
||||
($p =~ /^Total$/o) && next; # derived if needed
|
||||
my $pPoints = 0;
|
||||
my $gp = $graphs{$p};
|
||||
ALLVAR: foreach $vm (@$vars) {
|
||||
my $vp = ($f) ? $gp->{$vm}->{$f} : $gp->{$vm};
|
||||
|
||||
unless (($vp) && (scalar %$vp)) {
|
||||
#print "genplot Checking: $p $vm $f => NO\n";
|
||||
next;
|
||||
}
|
||||
#print "genplot Checking: $p $vm $f => ";
|
||||
foreach $time (keys %$vp) {
|
||||
next unless ($vp->{$time} != 0);
|
||||
$totPoints++;
|
||||
$pPoints++;
|
||||
#print "VALUES\n";
|
||||
last ALLVAR;
|
||||
}
|
||||
#print "nothing\n"
|
||||
}
|
||||
if ($pPoints > 0) { # count how many protocols have non 0
|
||||
$totProtos++;
|
||||
push @goodProtos, $p;
|
||||
}
|
||||
}
|
||||
($params{DEBUG}) && print "\tprotocols: @goodProtos\n";
|
||||
|
||||
if ($totPoints == 0) { # nothing in any protocol
|
||||
print "No data for graph '$name', variables '@$vars'\n";
|
||||
return 0;
|
||||
}
|
||||
|
||||
foreach $p (@$protos) {
|
||||
unlink ("$tmpdir/$name.$p"); # remove any previous runs
|
||||
|
||||
(($p =~ /^Total$/o) && ($totProtos <= 1))
|
||||
&& next; # skip Totally if only 1 protocol plus total
|
||||
|
||||
($p !~ /^Total$/o) && push @realProtos, $p; # everything but Total
|
||||
|
||||
# if ($p =~ /^Total$/o) { # move from last to first
|
||||
# $runlist = "\'$name.$p\' with lines, " . $runlist;
|
||||
# next;
|
||||
# }
|
||||
|
||||
$runlist .= ", " if ($runlist); # later ones
|
||||
|
||||
$runlist .= "\'$name.$p\' with lines";
|
||||
}
|
||||
|
||||
$totPoints = 0;
|
||||
foreach $p (@realProtos) { # create the plot data files
|
||||
open(DATA, ">$tmpdir/$name.$p") ||
|
||||
die "Can't open $tmpdir/$name.$p:$!";
|
||||
my $gp = $graphs{$p};
|
||||
my $n = 0;
|
||||
my $s = 0.0;
|
||||
my $sTime = 0.0;
|
||||
my $vp = ($f) ? $gp->{$vars->[0]}->{$f} : $gp->{$vars->[0]};
|
||||
|
||||
# foreach $time (sort numeric keys %$vp) {
|
||||
for (my $tm = $startTime; $tm <= $endTime; $tm++) {
|
||||
my $v = 0.0;
|
||||
foreach $vm (@$vars) {
|
||||
$vp = ($f) ? $gp->{$vm}->{$f} : $gp->{$vm};
|
||||
|
||||
$totPoints++;
|
||||
|
||||
# due to optimization in updateDelta,
|
||||
# 0 entries are undefined (also avoids warning)
|
||||
$v += ($vp->{$tm}) ? $vp->{$tm} : 0;
|
||||
|
||||
# if ($vp->{$tm} < 0) {
|
||||
# print $name, ": proto=", $p, " var=", $vm,
|
||||
# " value=", $vp->{$tm}, "\n";
|
||||
# }
|
||||
}
|
||||
$s += $v;
|
||||
$n += 1;
|
||||
if ($n == 1) { # NOTE: shifts left in sliding window
|
||||
$sTime = $tm-$startTime;
|
||||
}
|
||||
if ($n >= $averageCnt) {
|
||||
printf (DATA "%d %f\n", $sTime * $timeStep, $s/$n);
|
||||
$n = 0;
|
||||
$s = 0.0;
|
||||
}
|
||||
}
|
||||
if ($n > 0) { # handle end case
|
||||
printf (DATA "%d %f\n", $sTime * $timeStep, $s/$n);
|
||||
}
|
||||
close(DATA);
|
||||
}
|
||||
#($params{DEBUG}) && print "\tpoints: $totPoints\n";
|
||||
|
||||
# need to handle "Total" case
|
||||
# read the other files and write out the sum
|
||||
# FIX: total my be mis-aligned with data
|
||||
if (($#$protos > $#realProtos) && ($totProtos > 1)) {
|
||||
unlink ("$tmpdir/$name.Total");
|
||||
open(DATA, ">$tmpdir/$name.Total") ||
|
||||
die "Can't open $tmpdir/$name.Total:$!";
|
||||
|
||||
foreach $r (@goodProtos) { # get file handles
|
||||
open($r, "$tmpdir/$name.$r")
|
||||
|| die "Couldn't open $tmpdir/$name.$r: $!";
|
||||
}
|
||||
# ASSUMES files are identical in order
|
||||
my $first = shift @goodProtos;
|
||||
# print "First protocol: $first Rest: @realProtos\n";
|
||||
while (<$first>) {
|
||||
my ($t, $s) = split ' ', $_;
|
||||
foreach $r (@goodProtos) { # get file handles
|
||||
$l = <$r>;
|
||||
if ($l) {
|
||||
my ($tt, $v) = split ' ', $l;
|
||||
$t = $tt unless ($t); # in case first proto missing time
|
||||
$s += $v;
|
||||
}
|
||||
}
|
||||
printf (DATA "%d %f\n", $t, $s);
|
||||
}
|
||||
|
||||
foreach $r (@goodProtos) { close($r); }
|
||||
close (DATA);
|
||||
}
|
||||
|
||||
# SEAN: don't even try if we aren't generating images:
|
||||
return 0 unless $params{IMAGETYPE};
|
||||
|
||||
# Create a script to feed to gnuplot, which creates a .gif graph.
|
||||
$runTime = ($endTime - $startTime + 1) * $timeStep;
|
||||
unlink("$tmpdir/$name.gpt");
|
||||
open(SCRIPT, ">$tmpdir/$name.gpt")
|
||||
|| die "Can't open $tmpdir/$name.gpt:$!";
|
||||
|
||||
$gnuplot = $params{GNUPLOT};
|
||||
return 1 unless $gnuplot;
|
||||
if ($gnuplot !~ /^\//) { # if not absolute, adjust for cd $tmpbase
|
||||
$gnuplot = "../../$gnuplot"; # ASSUME $tmpbase is single dir
|
||||
}
|
||||
#print "gnuplot is $gnuplot $params{GNUPLOT}\n";
|
||||
|
||||
my $varstring = ""; # create display version of names
|
||||
foreach $t (@$vars) {
|
||||
$varstring .= ", " if ($varstring);
|
||||
$varstring .= ($timerNames{$t}) ? $timerNames{$t} : $t;
|
||||
}
|
||||
|
||||
# Setup output "terminal type"
|
||||
if ($params{IMAGETYPE} eq "gif") { # gif type has different arguments
|
||||
print SCRIPT "set terminal $params{IMAGETYPE} small size $params{CHARTWIDTH},$params{CHARTHEIGHT}\n";
|
||||
} elsif ($params{IMAGETYPE} eq "svg") { # svg type has different args too
|
||||
print SCRIPT "set terminal $params{IMAGETYPE} size $params{CHARTWIDTH} $params{CHARTHEIGHT}\n";
|
||||
} else { # most types work like this
|
||||
print SCRIPT "set terminal $params{IMAGETYPE} small color\n";
|
||||
if (($params{CHARTWIDTH} != 640) || ($params{CHARTHEIGHT} != 480)) {
|
||||
my $xscale = $params{CHARTWIDTH} / 640;
|
||||
my $yscale = $params{CHARTHEIGHT} / 480;
|
||||
print SCRIPT "set size $xscale,$yscale\n";
|
||||
}
|
||||
}
|
||||
print SCRIPT<<"!GROK!THIS!";
|
||||
set output "../../$resultdir/$name.$params{IMAGETYPE}" # ASSUME $tmpbase is single dir
|
||||
set autoscale
|
||||
set xlabel "Test time (seconds)"
|
||||
set ylabel "$label"
|
||||
set title "$title ($varstring) -- $params{TSTAMP}"
|
||||
plot [0:$runTime] $runlist
|
||||
!GROK!THIS!
|
||||
close(SCRIPT);
|
||||
|
||||
# run script from tmpbase to clean up line labeling
|
||||
# my $olddir=getcwd();
|
||||
chdir $tmpdir;
|
||||
warn_system (split (/\s/, $gnuplot), "$name.gpt");
|
||||
chdir "../..";
|
||||
# chdir $olddir;
|
||||
|
||||
unless ($params{DEBUG}) {
|
||||
# cleanup the plot data (or leave around for debugging)
|
||||
foreach $p (@$protos) {
|
||||
unlink("$tmpdir/$name.$p");
|
||||
}
|
||||
unlink("$tmpdir/$name.gpt");
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
return 1;
|
||||
@@ -1,629 +0,0 @@
|
||||
#!/usr/bin/env perl
|
||||
# The contents of this file are subject to the Netscape Public
|
||||
# License Version 1.1 (the "License"); you may not use this file
|
||||
# except in compliance with the License. You may obtain a copy of
|
||||
# the License at http://www.mozilla.org/NPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS
|
||||
# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
# implied. See the License for the specific language governing
|
||||
# rights and limitations under the License.
|
||||
#
|
||||
# The Original Code is the Netscape Mailstone utility,
|
||||
# released March 17, 2000.
|
||||
#
|
||||
# The Initial Developer of the Original Code is Netscape
|
||||
# Communications Corporation. Portions created by Netscape are
|
||||
# Copyright (C) 1997-2000 Netscape Communications Corporation. All
|
||||
# Rights Reserved.
|
||||
#
|
||||
# Contributor(s): Dan Christian <robodan@netscape.com>
|
||||
# Marcel DePaolis <marcel@netcape.com>
|
||||
# Mike Blakely
|
||||
#
|
||||
# Alternatively, the contents of this file may be used under the
|
||||
# terms of the GNU Public License (the "GPL"), in which case the
|
||||
# provisions of the GPL are applicable instead of those above.
|
||||
# If you wish to allow use of your version of this file only
|
||||
# under the terms of the GPL and not to allow others to use your
|
||||
# version of this file under the NPL, indicate your decision by
|
||||
# deleting the provisions above and replace them with the notice
|
||||
# and other provisions required by the GPL. If you do not delete
|
||||
# the provisions above, a recipient may use your version of this
|
||||
# file under either the NPL or the GPL.
|
||||
#####################################################
|
||||
|
||||
# see setup.pl for full usage
|
||||
# mailmaster [-d] [-c <config file>] ...
|
||||
|
||||
# This script reads in the client configuration files and will
|
||||
# fork children to rsh the mailclient process on network clients,
|
||||
# each child will write test results to /mailstone directory before
|
||||
# dying. The parent will the read and combine the results.
|
||||
#
|
||||
# Make sure the user running this script has rsh privilege across
|
||||
# all client machines
|
||||
|
||||
print "Netscape Mailstone version 4.2\n";
|
||||
print "Copyright (c) Netscape Communications Corp. 1997-2000\n";
|
||||
|
||||
# this parses the command line and config file
|
||||
do 'args.pl'|| die "$@\n";
|
||||
sub die_system;
|
||||
sub warn_system;
|
||||
|
||||
parseArgs(); # parse command line
|
||||
|
||||
{ # get unique date string
|
||||
my ($sec, $min, $hour, $mday, $mon, $year) = localtime;
|
||||
my $tstamp = sprintf ("%04d%02d%02d.%02d%02d",
|
||||
1900+$year, 1+$mon, $mday, $hour, $min);
|
||||
|
||||
if ( -d "$resultbase/$tstamp") { # check for runs within a minute
|
||||
my $tail = 'a';
|
||||
while ( -d "$resultbase/$tstamp$tail" ) { $tail++; }
|
||||
$tstamp .= $tail;
|
||||
}
|
||||
$params{TSTAMP} = $tstamp;
|
||||
}
|
||||
|
||||
$resultdir = "$resultbase/$params{TSTAMP}";
|
||||
$tmpdir = "$tmpbase/$params{TSTAMP}";
|
||||
$resultstxt = "$resultdir/results.txt";
|
||||
$resultshtml = "$resultdir/results.html";
|
||||
mkdir ("$resultbase", 0775);
|
||||
mkdir ("$tmpbase", 0775);
|
||||
mkdir ("$resultdir", 0775);
|
||||
mkdir ("$tmpdir", 0775);
|
||||
|
||||
# Make sure we have everything
|
||||
die "Must specify the test time" unless $params{TIME};
|
||||
die "Must specify a workload file" unless $params{WORKLOAD};
|
||||
|
||||
if ($params{TESTBED}) { # BACK COMPATIBILITY
|
||||
readTestbedFile ($params{TESTBED}) || die "Error reading testbed: $@\n";
|
||||
}
|
||||
|
||||
$testsecs = figureTimeSeconds ($params{TIME}, "seconds");
|
||||
|
||||
# figure out the processes and thread, given the desired number
|
||||
# takes into account all the constraints. todo can be a float.
|
||||
sub figurePT {
|
||||
my $sec = shift;
|
||||
my $todo = shift;
|
||||
my $p = 1; # first guess
|
||||
my $t = 1;
|
||||
my $start = 1; # initial process guess
|
||||
my $end = 250; # highest process guess
|
||||
|
||||
if ($todo < 1) { # mark this client as inactive
|
||||
$sec->{PROCESSES} = 0;
|
||||
$sec->{THREADS} = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (($section->{MAXCLIENTS}) && ($todo > $section->{MAXCLIENTS})) {
|
||||
$todo = $section->{MAXCLIENTS}; # trim to max client per host
|
||||
}
|
||||
if ($section->{PROCESSES}) { # they set this part already
|
||||
$start = int ($section->{PROCESSES});
|
||||
$end = $start;
|
||||
$p = $start;
|
||||
my $slist = $section->{sectionParams};
|
||||
$slist =~ s/HOSTS=\s*//; # strip off initial bit
|
||||
print "Using specified $p processes for clients $slist\n";
|
||||
}
|
||||
|
||||
$end = int ($section->{MAXPROCESSES})
|
||||
if ($section->{MAXPROCESSES}); # they set a max
|
||||
|
||||
if (($params{NT}) || ($section->{ARCH} eq "NT4.0")) {
|
||||
$end = 1; # # NT is currently limited to 1 process
|
||||
$start = 1;
|
||||
$p = 1;
|
||||
}
|
||||
|
||||
# step through some process counts
|
||||
# it should first reduce errors due to MAXTHREADS,
|
||||
# the it will reduce errors due to integer math.
|
||||
# not optimal, just good enough
|
||||
my $misses = 0;
|
||||
for (my $n = $start; $n <= $end; $n++) { # try some process counts
|
||||
my $tryt = int ($todo / $n);
|
||||
if (($sec->{MAXTHREADS}) && ($tryt > $sec->{MAXTHREADS})) {
|
||||
$tryt = $sec->{MAXTHREADS};
|
||||
}
|
||||
# see if this is a better match than the last one
|
||||
if (abs ($todo - ($n * $tryt)) < abs ($todo - ($p * $t))) {
|
||||
$p = $n;
|
||||
$t = $tryt;
|
||||
$misses = 0;
|
||||
} else {
|
||||
$misses++;
|
||||
last if ($misses > 1); # getting worse
|
||||
}
|
||||
}
|
||||
$sec->{PROCESSES} = $p;
|
||||
$sec->{THREADS} = $t;
|
||||
return $p * $t;
|
||||
}
|
||||
|
||||
# Allocate CLIENTCOUNT to the client machines
|
||||
# try NOT to turn this into a massive linear programming project
|
||||
# works best to put bigger machines last
|
||||
if ($params{CLIENTCOUNT}) {
|
||||
my $todo = $params{CLIENTCOUNT};
|
||||
my $softcli = 0; # how many can we play with
|
||||
|
||||
foreach $section (@workload) { # see which are already fixed
|
||||
next unless ($section->{sectionTitle} =~ /CLIENT/i);
|
||||
unless (($section->{PROCESSES}) && ($section->{THREADS})) {
|
||||
$softcli++;
|
||||
next;
|
||||
}
|
||||
my $slist = $section->{sectionParams};
|
||||
$slist =~ s/HOSTS=\s*//; # strip off initial bit
|
||||
my @hlist = split /[\s,]/, $slist;
|
||||
my $hcnt = (1 + $#hlist);
|
||||
|
||||
# subtract fixed entries
|
||||
my $tcount = ($section->{THREADS}) ? $section->{THREADS} : 1;
|
||||
$todo -= $tcount * $section->{PROCESSES} * $hcnt;
|
||||
$clientProcCount += $section->{PROCESSES} * $hcnt; # total processes
|
||||
$params{DEBUG} &&
|
||||
print "Fixed load group with $hcnt hosts: $section->{PROCESSES} x $tcount\n";
|
||||
}
|
||||
|
||||
$params{DEBUG} &&
|
||||
print "Allocating $todo clients over $softcli groups\n";
|
||||
if ($softcli) {
|
||||
foreach $section (@workload) {
|
||||
next unless ($section->{sectionTitle} =~ /CLIENT/i);
|
||||
next if (($section->{PROCESSES}) && ($section->{THREADS}));
|
||||
my $slist = $section->{sectionParams};
|
||||
$slist =~ s/HOSTS=\s*//; # strip off initial bit
|
||||
my @hlist = split /[\s,]/, $slist;
|
||||
my $hcnt = (1 + $#hlist);
|
||||
|
||||
#print "todo=$todo softcli=$softcli hcnt=$hcnt\n";
|
||||
$todo -= $hcnt * figurePT ($section, $todo / ($softcli * $hcnt));
|
||||
$clientProcCount += $hcnt * $section->{PROCESSES}; # total procs
|
||||
|
||||
$softcli--;
|
||||
last if ($softcli <= 0); # should not happen
|
||||
}
|
||||
}
|
||||
if ($todo) {
|
||||
print "Warning: Could not allocate $todo of $params{CLIENTCOUNT} clients.\n";
|
||||
$params{CLIENTCOUNT} -= $todo;
|
||||
}
|
||||
|
||||
|
||||
} else { # figure out the client count
|
||||
my $cnt = 0;
|
||||
foreach $section (@workload) { # see which are already fixed
|
||||
next unless ($section->{sectionTitle} =~ /CLIENT/i);
|
||||
# next unless ($section->{PROCESSES});
|
||||
next unless $section->{CLIENTS};
|
||||
|
||||
my $clients = $section->{CLIENTS};
|
||||
my $slist = $section->{sectionParams};
|
||||
$slist =~ s/HOSTS=\s*//; # strip off initial bit
|
||||
my @hlist = split /[\s,]/, $slist;
|
||||
my $hcnt = scalar @hlist;
|
||||
|
||||
$clients /= $hcnt;
|
||||
my $maxp = ($section->{MAXPROCESSES} || 10000);
|
||||
my $maxt = ($section->{MAXTHREADS} || 10000);
|
||||
if ($maxp * $maxt < $clients) {
|
||||
die <<EOS;
|
||||
Too many clients for hosts $section->{sectionParams}:
|
||||
clients = $section->{CLIENTS}
|
||||
maxThreads = $section->{MAXTHREADS}
|
||||
maxProcesses = $section->{MAXPROCESSES}
|
||||
EOS
|
||||
}
|
||||
my ($nt, $np);
|
||||
if ($maxt >= $clients) {
|
||||
$nt = $clients;
|
||||
$np = 1;
|
||||
} else {
|
||||
$np = int (($clients / $maxt) + (($clients % $maxt) ? 1 : 0));
|
||||
$nt = int ($clients / $np);
|
||||
}
|
||||
|
||||
$section->{THREADS} = $nt;
|
||||
$section->{PROCESSES} = $np;
|
||||
# $section->{CLIENTS} = $np * $nt * $hcnt;
|
||||
$cnt += $nt * $np * $hcnt;
|
||||
$clientProcCount += $np * $hcnt; # total processes
|
||||
}
|
||||
$params{CLIENTCOUNT} = $cnt;
|
||||
die "No clients configured!\n" unless ($cnt > 0);
|
||||
}
|
||||
|
||||
# This has to be written into save workload file for later processing
|
||||
unless ($params{FREQUENCY}) { # unless frequency set on command line
|
||||
my $chartp = ($params{CHARTPOINTS}) ? $params{CHARTPOINTS} : 464;
|
||||
|
||||
# approximate data points for good graphs (up to 2 times this)
|
||||
$params{FREQUENCY} = int ($testsecs / $chartp);
|
||||
if ($params{FREQUENCY} < 2) { # fastest is every 2 seconds
|
||||
$params{FREQUENCY} = 2;
|
||||
} elsif ($params{FREQUENCY} > 60) { # slowest is every minute
|
||||
$params{FREQUENCY} = 60;
|
||||
}
|
||||
}
|
||||
|
||||
{ # set a unique block id on every section
|
||||
my $id = 0;
|
||||
my $configSeen = 0;
|
||||
my $defaultSeen = 0;
|
||||
foreach $section (@workload) {
|
||||
if ($section->{"sectionTitle"} =~ /^CONFIG$/) {
|
||||
next if $configSeen;
|
||||
$configSeen++;
|
||||
}
|
||||
if ($section->{"sectionTitle"} =~ /^DEFAULT$/) {
|
||||
next if $defaultSeen;
|
||||
$defaultSeen++;
|
||||
}
|
||||
$id++; # number 1, 2, ...
|
||||
if ($section->{"sectionTitle"} =~ /^(CONFIG|CLIENT)$/) {
|
||||
$section->{BLOCKID} = $id;
|
||||
} else {
|
||||
push @{$section->{"lineList"}}, "blockID\t$id\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# Write the version we pass to mailclient
|
||||
writeWorkloadFile ("$resultdir/work.wld", \@workload,
|
||||
\@scriptWorkloadSections);
|
||||
|
||||
# Write the complete inclusive version
|
||||
writeWorkloadFile ("$resultdir/all.wld", \@workload);
|
||||
|
||||
# SEAN: copy the wld.in file to the result directory for later
|
||||
# statistics gathering.
|
||||
my $wld = $params{WORKLOAD};
|
||||
if (-f "$wld.in") {
|
||||
die_system "cp $wld.in $resultdir/wld.in";
|
||||
} else {
|
||||
unless ($wld !~ /\.preload_(new|old|touch)$/) {
|
||||
warn "Can't find wld.in file for `$wld'\n" unless -f "$wld.in";
|
||||
}
|
||||
}
|
||||
|
||||
setConfigDefaults(); # pick up any missing defaults
|
||||
|
||||
unless ($#protocolsAll > 0) {
|
||||
die "No protocols found. Test Failed!\n";
|
||||
}
|
||||
|
||||
print "Starting: ", scalar(localtime), "\n";
|
||||
|
||||
# redirect STDERR
|
||||
open SAVEERR, ">&STDERR";
|
||||
open(STDERR, ">$resultdir/stderr") || warn "Can't redirect STDERR:$!\n";
|
||||
|
||||
$totalProcs = 0; # number of clients started
|
||||
|
||||
# iterate over every client in the testbed, complete the cmd and rsh
|
||||
if ($params{NT}) { # single client on local host
|
||||
pathprint ("Starting clients (errors logged to $resultdir/stderr)\n");
|
||||
|
||||
foreach $section (@workload) {
|
||||
next unless ($section->{sectionTitle} =~ /CLIENT/i);
|
||||
my $tcount = ($section->{THREADS}) ? $section->{THREADS} : 1;
|
||||
|
||||
|
||||
# Build the initial Mailclient command line
|
||||
my $preCmd = ($section->{COMMAND})
|
||||
? $section->{COMMAND} : $params{CLIENTCOMMAND};
|
||||
$preCmd .= " -s -t $params{TIME} -f $params{FREQUENCY}";
|
||||
$preCmd .= " -d" if ($params{DEBUG});
|
||||
$preCmd .= " -r" if ($params{TELEMETRY});
|
||||
$preCmd .= " -R $params{RAMPTIME}" if ($params{RAMPTIME});
|
||||
$preCmd .= " -m $params{MAXERRORS}" if ($params{MAXERRORS});
|
||||
$preCmd .= " -M $params{MAXBLOCKS}" if ($params{MAXBLOCKS});
|
||||
$preCmd .= " -n 1 -N $tcount";
|
||||
$preCmd .= ($params{USEGROUPS} && $section->{GROUP})
|
||||
? " -H $section->{GROUP}" : " -H $cli";
|
||||
|
||||
my $stdout = "$tmpdir/localhost.out";
|
||||
|
||||
$totalProcs += $tcount;
|
||||
do 'makeindex.pl' || warn "$@\n"; # html index
|
||||
|
||||
printf "\nTest duration: %d %s. Rampup time: %d %s. Number of clients: %d\n",
|
||||
figureTimeNumber ($params{TIME}),
|
||||
figureTimeUnits ($params{TIME}, "seconds"),
|
||||
figureTimeNumber ($params{RAMPTIME}),
|
||||
figureTimeUnits ($params{RAMPTIME}, "seconds"),
|
||||
$totalProcs;
|
||||
|
||||
print STDERR "localhost: cd $params{TEMPDIR}; $preCmd\n";
|
||||
|
||||
# Redirect STDIN, and STDOUT
|
||||
#open SAVEIN, "<STDIN";
|
||||
open STDIN, "<$resultdir/work.wld"
|
||||
|| die "Coundn't open $resultdir/work.wld for input\n";
|
||||
open SAVEOUT, ">&STDOUT";
|
||||
open STDOUT, ">$stdout"
|
||||
|| die "Couldnt open $stdout for output\n";
|
||||
|
||||
chdir $params{TEMPDIR} || die "Could not cd $params{TEMPDIR}: $!\n";
|
||||
warn_system $preCmd;
|
||||
close STDOUT;
|
||||
open STDOUT, ">&SAVEOUT";
|
||||
printf "Test done.\n";
|
||||
|
||||
chdir $cwd || die "Could not cd $cwd: $!\n";
|
||||
last; # only do the first one
|
||||
}
|
||||
} else { # not NT (forking works)
|
||||
|
||||
foreach $section (@workload) { # do pre run commands
|
||||
next unless ($section->{sectionTitle} =~ /PRETEST/i);
|
||||
unless ($section->{COMMAND}) {
|
||||
print "PreTest with no Command for $section->{sectionParams}\n";
|
||||
next;
|
||||
}
|
||||
|
||||
my $slist = $section->{sectionParams};
|
||||
$slist =~ s/HOSTS=\s*//; # strip off initial bit
|
||||
my $myCmd = $section->{COMMAND};
|
||||
$myCmd =~ s/%f/$params{FREQUENCY}/; # fill in frequency variable
|
||||
if ($myCmd =~ m/%c/o) { # dont force down if count is used
|
||||
$count = $testsecs / $params{FREQUENCY};
|
||||
$myCmd =~ s/%c/$count/; # fill in count variable
|
||||
}
|
||||
my $rsh = ($section->{RSH}) ? $section->{RSH} : $params{RSH};
|
||||
|
||||
foreach $cli (split /[\s,]/, $slist) {
|
||||
print "Running pre test command on $cli\n";
|
||||
open PRE, ">>$resultdir/$cli-pre.log";
|
||||
print PRE "========\n";
|
||||
print PRE "$myCmd\n";
|
||||
print PRE "========\n";
|
||||
close PRE;
|
||||
print STDERR "$cli: $myCmd\n"; # log the actual command
|
||||
forkproc ($rsh, $cli, $myCmd,
|
||||
"/dev/null", "$resultdir/$cli-pre.log");
|
||||
}
|
||||
foreach $cli (split /[\s,]/, $slist) {
|
||||
wait(); # run multiple PRETEST section sequentially
|
||||
}
|
||||
}
|
||||
|
||||
foreach $section (@workload) { # start monitors
|
||||
next unless ($section->{sectionTitle} =~ /MONITOR/i);
|
||||
|
||||
my $slist = $section->{sectionParams};
|
||||
$slist =~ s/HOSTS=\s*//; # strip off initial bit
|
||||
my $myCmd = ($section->{COMMAND})
|
||||
? $section->{COMMAND} : $params{MONITORCOMMAND};
|
||||
my $forceDown = 0;
|
||||
$myCmd =~ s/,/ /g; # turn commas into spaces BACK COMPATIBIILITY
|
||||
$myCmd =~ s/%f/$params{FREQUENCY}/; # fill in frequency variable
|
||||
|
||||
if ($myCmd =~ m/%c/o) { # dont force down if count is used
|
||||
$count = $testsecs / $params{FREQUENCY};
|
||||
$myCmd =~ s/%c/$count/; # fill in count variable
|
||||
} else {
|
||||
$forceDown = 1;
|
||||
}
|
||||
my $rsh = ($section->{RSH}) ? $section->{RSH} : $params{RSH};
|
||||
|
||||
foreach $cli (split /[\s,]/, $slist) {
|
||||
printf "Monitoring on $cli\n";
|
||||
open PRE, ">>$resultdir/$cli-run.log";
|
||||
print PRE "========\n";
|
||||
print PRE "$myCmd\n";
|
||||
print PRE "========\n";
|
||||
close PRE;
|
||||
print STDERR "$cli: $myCmd\n"; # log the actual command
|
||||
$pid = forkproc ($rsh, $cli, $myCmd,
|
||||
"/dev/null", "$resultdir/$cli-run.log");
|
||||
push @forceDownPids, $pid if ($forceDown); # save PID for shutdown
|
||||
}
|
||||
}
|
||||
|
||||
print "Starting clients (errors logged to $resultdir/stderr)\n";
|
||||
foreach $section (@workload) {
|
||||
next unless ($section->{sectionTitle} =~ /CLIENT/i);
|
||||
next unless ($section->{PROCESSES}); # unused client
|
||||
|
||||
my $slist = $section->{sectionParams};
|
||||
$slist =~ s/HOSTS=\s*//; # strip off initial bit
|
||||
my $rsh = ($section->{RSH}) ? $section->{RSH} : $params{RSH};
|
||||
my $pcount = $section->{PROCESSES};
|
||||
my $tcount = ($section->{THREADS}) ? $section->{THREADS} : 0;
|
||||
my $tempdir;
|
||||
if ($section->{TEMPDIR}) {
|
||||
$tempdir = $section->{TEMPDIR};
|
||||
} elsif ($params{TEMPDIR}) {
|
||||
$tempdir = $params{TEMPDIR};
|
||||
}
|
||||
my $preCmd = "./" . (($section->{COMMAND})
|
||||
? $section->{COMMAND} : $params{CLIENTCOMMAND});
|
||||
$preCmd .= " -e" unless ($params{NOEVENTS});
|
||||
$preCmd .= " -s -t $params{TIME} -f $params{FREQUENCY}";
|
||||
$preCmd .= " -d" if ($params{DEBUG});
|
||||
$preCmd .= " -r" if ($params{TELEMETRY});
|
||||
$preCmd .= " -R $params{RAMPTIME}" if ($params{RAMPTIME});
|
||||
if ($params{MAXERRORS}) {
|
||||
# distribute error count over processes, rounding up
|
||||
my $n = int (($params{MAXERRORS} + $clientProcCount - 1)
|
||||
/ $clientProcCount);
|
||||
$n = 1 if ($n < 1);
|
||||
$preCmd .= " -m $n";
|
||||
}
|
||||
if ($params{MAXBLOCKS}) {
|
||||
# distribute block count over processes, rounding up
|
||||
my $n = int (($params{MAXBLOCKS} + $clientProcCount - 1)
|
||||
/ $clientProcCount);
|
||||
$n = 1 if ($n < 1);
|
||||
$preCmd .= " -M $n";
|
||||
}
|
||||
$preCmd = "cd $tempdir; " . $preCmd if ($tempdir);
|
||||
$preCmd =~ s!/!\\!g if ($section->{ARCH} eq "NT4.0");
|
||||
$preCmd =~ s/;/&&/g if ($section->{ARCH} eq "NT4.0");
|
||||
|
||||
my $total_clients = $section->{CLIENTS};
|
||||
my $residue = $total_clients - ($tcount * $pcount);
|
||||
foreach $cli (split /[\s,]/, $slist) {
|
||||
my $stdout = getClientFilename ($cli, $section);
|
||||
my $myCmd = $preCmd;
|
||||
$myCmd .= ($params{USEGROUPS} && $section->{GROUP})
|
||||
? " -H $section->{GROUP}" : " -H $cli";
|
||||
my $foo = ($params{USEGROUPS} && $section->{GROUP})
|
||||
? $section->{GROUP} : undef;
|
||||
|
||||
if ($tcount) {
|
||||
my $nt = $tcount;
|
||||
if ($residue > 0) {
|
||||
++$nt;
|
||||
$residue -= $pcount;
|
||||
}
|
||||
$myCmd .= " -n $pcount -N $nt";
|
||||
printf "Starting $pcount x $nt on $cli%s\n",
|
||||
$foo?" (group = $foo)":'';
|
||||
$totalProcs += $pcount * $nt;
|
||||
} else {
|
||||
my $np = $pcount;
|
||||
if ($residue > 0) {
|
||||
++$np;
|
||||
--$residue;
|
||||
}
|
||||
$myCmd .= " -n $np";
|
||||
printf "Starting $np processes on $foo\n";
|
||||
$totalProcs += $np;
|
||||
}
|
||||
|
||||
print STDERR "$cli: $myCmd\n"; # log the actual command
|
||||
$pid = forkproc ($rsh, $cli, $myCmd,
|
||||
"$resultdir/work.wld", $stdout);
|
||||
push @localPids, $pid if ($cli =~ /^localhost$/i);
|
||||
}
|
||||
}
|
||||
|
||||
if (@localPids) {
|
||||
# print "Trapping extraneous local signals\n";
|
||||
# This doesnt trap quite right. We dont die, but shell returns...
|
||||
$SIG{ALRM} = 'IGNORE'; # in case we get an ALRM from the mailclient
|
||||
}
|
||||
|
||||
printf "\nTest duration: %d %s. Rampup time: %d %s. Number of clients: %d\n",
|
||||
figureTimeNumber ($params{TIME}),
|
||||
figureTimeUnits ($params{TIME}, "seconds"),
|
||||
figureTimeNumber ($params{RAMPTIME}),
|
||||
figureTimeUnits ($params{RAMPTIME}, "seconds"),
|
||||
$totalProcs;
|
||||
|
||||
do 'makeindex.pl' || warn "$@\n"; # html index
|
||||
|
||||
print "Waiting for test to finish.\n";
|
||||
print "Waiting: ", scalar(localtime), "\n";
|
||||
# wait for children to finish
|
||||
$pid = wait();
|
||||
if (@forceDownPids) { # shut down after the first return.
|
||||
print "Shutting down @forceDownPids\n";
|
||||
kill 1 => @forceDownPids; # sigHUP
|
||||
# kill 9 => @forceDownPids; # sigTERM
|
||||
}
|
||||
while ($pid != -1) { # wait for all children
|
||||
$pid = wait();
|
||||
}
|
||||
|
||||
foreach $section (@workload) { # do post test commands
|
||||
next unless ($section->{sectionTitle} =~ /POSTTEST/i);
|
||||
unless ($section->{COMMAND}) {
|
||||
print "PostTest with no command for $section->{sectionParams}\n";
|
||||
next;
|
||||
}
|
||||
|
||||
my $slist = $section->{sectionParams};
|
||||
$slist =~ s/HOSTS=\s*//; # strip off initial bit
|
||||
my $myCmd = $section->{COMMAND};
|
||||
$myCmd =~ s/%f/$params{FREQUENCY}/; # fill in frequency variable
|
||||
if ($myCmd =~ m/%c/o) { # dont force down if count is used
|
||||
$count = $testsecs / $params{FREQUENCY};
|
||||
$myCmd =~ s/%c/$count/; # fill in count variable
|
||||
}
|
||||
my $rsh = ($section->{RSH}) ? $section->{RSH} : $params{RSH};
|
||||
|
||||
foreach $cli (split /[\s,]/, $slist) {
|
||||
printf "Running post test command on $cli\n";
|
||||
open PRE, ">>$resultdir/$cli-post.log";
|
||||
print PRE "========\n";
|
||||
print PRE "$myCmd\n";
|
||||
print PRE "========\n";
|
||||
close PRE;
|
||||
print STDERR "$cli: $myCmd\n"; # log the actual command
|
||||
forkproc ($rsh, $cli, $myCmd,
|
||||
"/dev/null", "$resultdir/$cli-post.log");
|
||||
}
|
||||
foreach $cli (split /[\s,]/, $slist) {
|
||||
wait(); # run multiple POSTTEST section sequentially
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
print STDERR "\nDone.\n";
|
||||
close(STDERR);
|
||||
open STDERR, ">&SAVEERR";
|
||||
|
||||
print "\nClients done: ", scalar(localtime), "\n";
|
||||
print "Collecting results\n";
|
||||
|
||||
do 'reduce.pl' || die "$@\n"; # generate graphs and sums
|
||||
|
||||
print "Generating results pages\n";
|
||||
|
||||
do 'report.pl' || die "$@\n";
|
||||
|
||||
# Now display that data to console
|
||||
if ($params{VERBOSE}) {
|
||||
fileShow ($resultstxt);
|
||||
print "\n";
|
||||
}
|
||||
print "Processing done: ", scalar (localtime), "\n";
|
||||
|
||||
pathprint ("\nResults (text):\t$resultstxt\n");
|
||||
pathprint ( "Results (HTML):\t$resultshtml\n");
|
||||
print "Index of runs: \tfile://$cwd/$resultbase/index.html\n";
|
||||
|
||||
|
||||
# Now check for major problems in the stderr file
|
||||
if (open(RESULTSTXT, "$resultdir/stderr")) {
|
||||
$ERRCNT=0;
|
||||
while (<RESULTSTXT>) { $ERRCNT++; }
|
||||
close(RESULTSTXT);
|
||||
pathprint ("Error log ($ERRCNT lines):\t$resultdir/stderr\n");
|
||||
}
|
||||
|
||||
{ # list user requested logging
|
||||
my @logfiles = <$resultdir/*-pre.log>;
|
||||
if (@logfiles) {
|
||||
foreach $f (@logfiles) {
|
||||
print "Pre test log: \t$f\n";
|
||||
}
|
||||
}
|
||||
@logfiles = <$resultdir/*-run.log>;
|
||||
if (@logfiles) {
|
||||
foreach $f (@logfiles) {
|
||||
print "Monitoring log: \t$f\n";
|
||||
}
|
||||
}
|
||||
@logfiles = <$resultdir/*-post.log>;
|
||||
if (@logfiles) {
|
||||
foreach $f (@logfiles) {
|
||||
print "Post test log: \t$f\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
print "Mailmaster done: ", scalar(localtime), "\n"; exit 0;
|
||||
@@ -1,115 +0,0 @@
|
||||
#!/usr/bin/env perl
|
||||
# The contents of this file are subject to the Netscape Public
|
||||
# License Version 1.1 (the "License"); you may not use this file
|
||||
# except in compliance with the License. You may obtain a copy of
|
||||
# the License at http://www.mozilla.org/NPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS
|
||||
# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
# implied. See the License for the specific language governing
|
||||
# rights and limitations under the License.
|
||||
#
|
||||
# The Original Code is the Netscape Mailstone utility,
|
||||
# released March 17, 2000.
|
||||
#
|
||||
# The Initial Developer of the Original Code is Netscape
|
||||
# Communications Corporation. Portions created by Netscape are
|
||||
# Copyright (C) 1997-2000 Netscape Communications Corporation. All
|
||||
# Rights Reserved.
|
||||
#
|
||||
# Contributor(s): Dan Christian <robodan@netscape.com>
|
||||
# Marcel DePaolis <marcel@netcape.com>
|
||||
#
|
||||
# Alternatively, the contents of this file may be used under the
|
||||
# terms of the GNU Public License (the "GPL"), in which case the
|
||||
# provisions of the GPL are applicable instead of those above.
|
||||
# If you wish to allow use of your version of this file only
|
||||
# under the terms of the GPL and not to allow others to use your
|
||||
# version of this file under the NPL, indicate your decision by
|
||||
# deleting the provisions above and replace them with the notice
|
||||
# and other provisions required by the GPL. If you do not delete
|
||||
# the provisions above, a recipient may use your version of this
|
||||
# file under either the NPL or the GPL.
|
||||
#####################################################
|
||||
|
||||
# usage: perl -Ibin makeindex.pl
|
||||
# Look at all the results files and create a top level index
|
||||
|
||||
unless ($resultbase) { # pick up systematic defaults, if needed
|
||||
do 'args.pl'|| die $@;
|
||||
parseArgs(); # parse command line
|
||||
}
|
||||
|
||||
($testname = $params{WORKLOAD}) =~ s:conf/::;
|
||||
$testname =~ s:.wld::;
|
||||
|
||||
my $entry = "";
|
||||
|
||||
$entry .= "<TR><TD><BR><A HREF=\"$params{TSTAMP}/results.html\">$params{TSTAMP}</A></TD>";
|
||||
$entry .= "<TD>$testname</TD>\n";
|
||||
$entry .= "<TD>$params{TITLE}</TD>\n";
|
||||
$entry .= "<TD>$params{TIME}</TD>\n";
|
||||
$entry .= "<TD>$params{CLIENTCOUNT}</TD>\n";
|
||||
$entry .= "<TD><A HREF=\"$params{TSTAMP}/all.wld\">workload</A></TD>\n";
|
||||
$entry .= "<TD><A HREF=\"$params{TSTAMP}/stderr\">stderr</A></TD></TR>\n";
|
||||
|
||||
if (-r "$resultbase/index.html") {
|
||||
fileInsertAfter ("$resultbase/index.html",
|
||||
"^<!-- INSERT TAGS HERE",
|
||||
$entry);
|
||||
} else { # create index from scratch
|
||||
system ("cd $resultbase; ln -s ../doc .");
|
||||
open(INDEXNEW, ">$resultbase/index.new") ||
|
||||
die "Couldn't open $resultbase/index.new: $!";
|
||||
|
||||
print INDEXNEW <<END;
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
|
||||
<HTML>
|
||||
<TITLE>
|
||||
MailStone Results
|
||||
</TITLE>
|
||||
<HEAD>
|
||||
</HEAD>
|
||||
<BODY TEXT="#000000" BGCOLOR="#FFFFFF" LINK="#0000FF" VLINK="#FF0000" ALINK="#000088">
|
||||
<A HREF=$mailstoneURL>Mailstone documentation</A><BR>
|
||||
<TABLE BORDER=2>
|
||||
<CAPTION> Mozilla MailStone Results Index </CAPTION>
|
||||
<TR>
|
||||
<TH>Run</TH> <TH>Testname</TH> <TH> Title </TH>
|
||||
<TH>Duration</TH> <TH>Clients</TH> <TH>Details</TH> <TH>Error log</TH>
|
||||
</TR>
|
||||
<!-- INSERT TAGS HERE - DO NOT DELETE THIS LINE -->
|
||||
END
|
||||
|
||||
print INDEXNEW $entry; # put in this entry
|
||||
|
||||
# Add in any existing entries
|
||||
# get a list of all the results files
|
||||
@resall = <$resultbase/*/results.html>;
|
||||
# Write out all the links
|
||||
# This could be rather slow, but we only do it when index.html is missing
|
||||
foreach $filefull (reverse @resall) {
|
||||
my $file = $filefull;
|
||||
$file =~ s:$resultbase/::;
|
||||
if ($file eq $params{TSTAMP}) { next; } # written above
|
||||
my $dir = $file;
|
||||
$dir =~ s:/results.html::;
|
||||
# dont read in old workloads, it will override the current one
|
||||
print INDEXNEW "<TR><TD><BR><A HREF=\"$file\">$dir</A></TD>\n";
|
||||
print INDEXNEW "<TD> </TD><TD> </TD><TD> </TD><TD> </TD>\n";
|
||||
print INDEXNEW "<TD><A HREF=\"$dir/all.wld\">workload</A></TD>\n";
|
||||
print INDEXNEW "<TD><A HREF=\"$dir/stderr\">stderr</A></TD></TR>\n";
|
||||
}
|
||||
|
||||
print INDEXNEW <<END;
|
||||
</TABLE>
|
||||
</BODY>
|
||||
</HTML>
|
||||
END
|
||||
close (INDEXNEW);
|
||||
fileBackup ("$resultbase/index.html");
|
||||
rename ("$resultbase/index.new", "$resultbase/index.html");
|
||||
print "Created $resultbase/index.html\n";
|
||||
}
|
||||
|
||||
return 1;
|
||||
@@ -1,414 +0,0 @@
|
||||
#!/usr/bin/perl
|
||||
# The contents of this file are subject to the Netscape Public
|
||||
# License Version 1.1 (the "License"); you may not use this file
|
||||
# except in compliance with the License. You may obtain a copy of
|
||||
# the License at http://www.mozilla.org/NPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS
|
||||
# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
# implied. See the License for the specific language governing
|
||||
# rights and limitations under the License.
|
||||
#
|
||||
# The Original Code is the Netscape Mailstone utility,
|
||||
# released March 17, 2000.
|
||||
#
|
||||
# The Initial Developer of the Original Code is Netscape
|
||||
# Communications Corporation. Portions created by Netscape are
|
||||
# Copyright (C) 1997-2000 Netscape Communications Corporation. All
|
||||
# Rights Reserved.
|
||||
#
|
||||
# Contributor(s): Dan Christian <robodan@netscape.com>
|
||||
# Marcel DePaolis <marcel@netcape.com>
|
||||
#
|
||||
# Alternatively, the contents of this file may be used under the
|
||||
# terms of the GNU Public License (the "GPL"), in which case the
|
||||
# provisions of the GPL are applicable instead of those above.
|
||||
# If you wish to allow use of your version of this file only
|
||||
# under the terms of the GPL and not to allow others to use your
|
||||
# version of this file under the NPL, indicate your decision by
|
||||
# deleting the provisions above and replace them with the notice
|
||||
# and other provisions required by the GPL. If you do not delete
|
||||
# the provisions above, a recipient may use your version of this
|
||||
# file under either the NPL or the GPL.
|
||||
#####################################################
|
||||
|
||||
# script to create test user accounts for Netscape Messaging Server 3, 4
|
||||
#
|
||||
# Given a set of parameters, this script will create an LDIF file
|
||||
# for a number of email users of the form:
|
||||
# test1, test2, test3, ...
|
||||
#
|
||||
# usage: perl create_accounts_ldif [users] [broadcast] [postmaster] [ options ]
|
||||
# [ -a allUsersAlias ]
|
||||
# [ -b basedn ]
|
||||
# [ -d maildomain ]
|
||||
# [ -f firstaccount ]
|
||||
# [ -k ]
|
||||
# [ -m mailhost ]
|
||||
# [ -n numaccounts ]
|
||||
# [ -o outputfile ]
|
||||
# [ -p password ]
|
||||
# [ -s storebase ]
|
||||
# [ -u username ]
|
||||
# [ -v ]
|
||||
# [ -w workload ]
|
||||
# [ -x maxstores ]
|
||||
# [ -3 ]
|
||||
#
|
||||
#perl -Ibin -- bin/makeusers.pl -d mailhost.example.com -m mailhost.example.com -b 'o=example.com' -u mailhost-test -n 100 -4 -o mailhost100.ldif
|
||||
|
||||
# Create the ldif for the user accounts and/or broadcast, postmaster account.
|
||||
#
|
||||
# The ldif then must be added to
|
||||
# the directory by hand (ldapadd, or through the dir admin server's
|
||||
# Database Mgmt->Add entries from an ldif file).
|
||||
|
||||
# A faster way
|
||||
# is to export the existing directory, append the results of
|
||||
# this script, and re-import the combined file. This can be
|
||||
# done using the following Netscape Directory Server commands:
|
||||
# stop-slapd
|
||||
# db2ldif outputfile
|
||||
# [ merge files ]
|
||||
# ldif2db inputfile # for DS4 you would typically use -noconfig
|
||||
# start-sladp
|
||||
#
|
||||
|
||||
print "Netscape Mailstone.\nCopyright (c) 1998,1999 Netscape Communications Corp.\n";
|
||||
|
||||
# server to be used in the internet mail address of the users
|
||||
$domain = "newdomain.example.net";
|
||||
|
||||
# machine that will act as the user's mailhost
|
||||
$mailhost = "mailhost.example.net";
|
||||
|
||||
# base dn for the user entries, e.g. o=Ace Industry,c=US
|
||||
$basedn = "o=Benchmark Lab, c=US";
|
||||
|
||||
# name of broadcast account
|
||||
$bcastacct = "allusers";
|
||||
|
||||
# name of broadcast account
|
||||
$postmasteraddr = "root\@localhost";
|
||||
|
||||
# base name to build user names, will construct test0, test1, ...
|
||||
$username = "test%ld";
|
||||
|
||||
# user passwds, in SHA format, the passwd below is 'netscape'
|
||||
#$userpassword = "{SHA}aluWfd0LYY9ImsJb3h4afrI4AXk=";
|
||||
# these can also be imported as cleartext
|
||||
$userpassword = "netscape";
|
||||
|
||||
# 0: no numbered passwords, 1: number with userID
|
||||
$maxpass = 0;
|
||||
|
||||
# first account to use
|
||||
$firstaccount = 0;
|
||||
|
||||
# number of user accounts to create ($first - $first+$num-1)
|
||||
$numaccounts = 1_000;
|
||||
|
||||
# For larger systems, spreading the users over multiple partitions
|
||||
# is usually a good idea. This example assumes you have
|
||||
# created partitions named p0, p1, etc.
|
||||
|
||||
# store partition base name
|
||||
$storebase = "p%ld";
|
||||
|
||||
# max store number (0 - maxstores-1), skip if 0
|
||||
$maxstores = 0;
|
||||
|
||||
#default to msg 4 schemas
|
||||
$usemsg4schema = 1;
|
||||
|
||||
#default to writing to stdout
|
||||
$outfile = STDOUT;
|
||||
|
||||
# Initial UID for genpasswd
|
||||
$firstuid = 1000;
|
||||
|
||||
sub usage {
|
||||
print "Usage: perl -Ibin -- makeusers [users] [broadcast] [postmaster]\n";
|
||||
print "\t[ -w workload ] [ -o outputFile ]\n";
|
||||
print "\t[ -d mailDomain ] [ -m mailHost ] [ -b baseDN ]\n";
|
||||
print "\t[ -u username ] [ -f firstAccount ] [ -n numAccounts ]\n";
|
||||
print "\t[ -p password ] [ -k ]\n";
|
||||
print "\t[ -s storeBase ] [ -x numStores ]\n";
|
||||
print "\t[ -a allUsersAlias ] [ -t postmasterAddress ]\n";
|
||||
print "\t[ -3 ]|[ -4 ]\n";
|
||||
}
|
||||
|
||||
sub readWorkConfig { # read the workload in, parse our params
|
||||
my $workloadfile = shift || die "Workload file name expected\n";
|
||||
|
||||
do 'args.pl'|| die $@;
|
||||
readWorkloadFile ($workloadfile, \@workload)
|
||||
|| die "Error reading workload: $@\n";
|
||||
# assign all the parameters from the config
|
||||
$mailhost = $defaultSection->{SERVER}
|
||||
if ($defaultSection->{SERVER});
|
||||
if ($defaultSection->{ADDRESSFORMAT}) {
|
||||
my $addr = $defaultSection->{ADDRESSFORMAT};
|
||||
$addr =~ s/^.*@//;
|
||||
$domain = $addr;
|
||||
}
|
||||
if ($defaultSection->{LOGINFORMAT}) {
|
||||
my $user = $defaultSection->{LOGINFORMAT};
|
||||
#$user =~ s/%ld$//;
|
||||
$username = $user;
|
||||
}
|
||||
$numaccounts = $defaultSection->{NUMLOGINS}
|
||||
if ($defaultSection->{NUMLOGINS});
|
||||
$firstaccount = $defaultSection->{FIRSTLOGINS}
|
||||
if ($defaultSection->{FIRSTLOGINS});
|
||||
|
||||
$userpassword = $defaultSection->{PASSWDFORMAT}
|
||||
if ($defaultSection->{SERVER});
|
||||
|
||||
if ($userpassword =~ m/%ld/) { # see if numbered passwords
|
||||
$maxpass++;
|
||||
#$userpassword =~ s/%ld//g;
|
||||
}
|
||||
|
||||
# what isnt set: basedn, storebase, maxstores, usemsg4schema
|
||||
}
|
||||
|
||||
while (@ARGV) {
|
||||
$arg = shift(@ARGV);
|
||||
|
||||
if ($arg =~ /^-a$/i) { # allusers (broadcast) user name
|
||||
$bcastacct = shift(@ARGV);
|
||||
next;
|
||||
}
|
||||
if ($arg =~ /^-b$/i) { # LDAP base DN
|
||||
$basedn = shift(@ARGV);
|
||||
next;
|
||||
}
|
||||
if ($arg =~ /^-d$/i) { # mail domain
|
||||
$domain = shift(@ARGV);
|
||||
next;
|
||||
}
|
||||
if ($arg =~ /^-f$/i) { # initial account
|
||||
$firstaccount = shift(@ARGV);
|
||||
next;
|
||||
}
|
||||
if ($arg =~ /^-k$/i) { # use numbered passwords
|
||||
$maxpass++;
|
||||
next;
|
||||
}
|
||||
if ($arg =~ /^-h$/i) { # help
|
||||
usage();
|
||||
exit 0;
|
||||
}
|
||||
if ($arg =~ /^-m$/i) { # mail server name
|
||||
$mailhost = shift(@ARGV);
|
||||
next;
|
||||
}
|
||||
if ($arg =~ /^-n$/i) { # number of accounts
|
||||
$numaccounts = shift(@ARGV);
|
||||
next;
|
||||
}
|
||||
if ($arg =~ /^-o$/i) { # name output file
|
||||
my $fname = shift || die "File name expected\n";
|
||||
open OUTFILE, ">$fname" || die "Error opening file $@\n";
|
||||
$outfile = OUTFILE;
|
||||
next; # use msg4 user admin schema
|
||||
}
|
||||
if ($arg =~ /^-p$/i) { # password
|
||||
$userpassword = shift(@ARGV);
|
||||
next;
|
||||
}
|
||||
if ($arg =~ /^-s$/i) { # base name for above
|
||||
$storebase = shift(@ARGV);
|
||||
next;
|
||||
}
|
||||
if ($arg =~ /^-t$/i) { # postmaster address
|
||||
$postmasteraddress = shift(@ARGV);
|
||||
next;
|
||||
}
|
||||
if ($arg =~ /^-u$/i) { # user name base
|
||||
$username = shift(@ARGV);
|
||||
next;
|
||||
}
|
||||
if ($arg =~ /^-v$/i) { # be verbose
|
||||
$verbose++;
|
||||
next;
|
||||
}
|
||||
# do this when read, so that later switches can override
|
||||
if ($arg =~ /^-w$/i) { # get a workload file
|
||||
readWorkConfig (shift(@ARGV));
|
||||
next;
|
||||
}
|
||||
if ($arg =~ /^-x$/i) { # number of partitions (0 to skip)
|
||||
$maxstores = shift(@ARGV);
|
||||
next;
|
||||
}
|
||||
if ($arg =~ /^-3$/) { # no msg4 schema
|
||||
$usemsg4schema = 0;
|
||||
next;
|
||||
}
|
||||
if ($arg =~ /^-4$/) { # use msg4 user admin schema
|
||||
$usemsg4schema = 1;
|
||||
next;
|
||||
}
|
||||
if ($arg =~ /^users$/i) {
|
||||
$genusers++;
|
||||
next;
|
||||
}
|
||||
if ($arg =~ /^broadcast$/i) {
|
||||
$genbroadcast++;
|
||||
next;
|
||||
}
|
||||
if ($arg =~ /^passwd$/i) {
|
||||
$genpasswd++;
|
||||
next;
|
||||
}
|
||||
if ($arg =~ /^postmaster$/i) {
|
||||
$genpostmaster++;
|
||||
next;
|
||||
}
|
||||
|
||||
print STDERR "Unknown argument $arg. Use -h for help.\n";
|
||||
exit 1;
|
||||
}
|
||||
|
||||
unless (($genusers) || ($genbroadcast) || ($genpasswd) || ($genpostmaster)) {
|
||||
print STDERR "Must specify mode [users] [broadcast] [postmaster] ...\n";
|
||||
usage();
|
||||
exit 0;
|
||||
}
|
||||
|
||||
# specify number fields, if needed
|
||||
unless ($username =~ /%ld/) {
|
||||
$username .= '%ld';
|
||||
}
|
||||
if (($maxpass) && !($userpassword =~ /%ld/)) {
|
||||
$userpassword .= '%ld';
|
||||
}
|
||||
if (($maxstores) && !($storename =~ /%ld/)) {
|
||||
$storename .= '%ld';
|
||||
}
|
||||
|
||||
if ($verbose) {
|
||||
print STDERR "Here is the configuration:\n";
|
||||
print STDERR "baseDN='$basedn' \t";
|
||||
print STDERR (($usemsg4schema) ? "-4\n" : "-3\n");
|
||||
print STDERR "mailHost='$mailhost' \tdomain='$domain'\n";
|
||||
print STDERR "userName='$username' \tnumAccounts=$numaccounts \tfirstAccount=$firstaccount\n";
|
||||
print STDERR "userPassword='$userpassword'\n";
|
||||
print STDERR "allUsersAccount='$bcastacct'\n" if ($genbroadcast);
|
||||
print STDERR "postmasterAddress='$postmasterAddress'\n" if ($genpostmaster);
|
||||
}
|
||||
|
||||
|
||||
if ($genusers) { # Create the user accounts
|
||||
$storenum=0;
|
||||
for ($i = $firstaccount; $i < $firstaccount+$numaccounts; $i++) {
|
||||
# build user account name
|
||||
my $acctname = $username;
|
||||
$acctname =~ s/%ld/$i/; # insert user number
|
||||
my $password = $userpassword;
|
||||
$password =~ s/%ld/$i/; # insert user number
|
||||
|
||||
|
||||
|
||||
# MAKE SURE THERE ARE NO TRAILING SPACES IN THE LDIF
|
||||
my $extradata = "";
|
||||
|
||||
if ($maxstores > 0) { # assign them to a store
|
||||
my $storename = $storebase;
|
||||
$storename =~ s/%ld/$storenum/;
|
||||
$extradata .= "mailmessagestore: $storename\n";
|
||||
$storenum++;
|
||||
$storenum=0 if ($storenum >= $maxstores);
|
||||
}
|
||||
|
||||
$extradata .= "objectclass: nsMessagingServerUser\n"
|
||||
if ($usemsg4schema);
|
||||
|
||||
print $outfile <<END;
|
||||
dn: uid=$acctname, $basedn
|
||||
userpassword: $password
|
||||
givenname: $acctname
|
||||
sn: $acctname
|
||||
cn: $acctname
|
||||
uid: $acctname
|
||||
mail: $acctname\@$domain
|
||||
mailhost: $mailhost
|
||||
maildeliveryoption: mailbox
|
||||
objectclass: top
|
||||
objectclass: person
|
||||
objectclass: organizationalPerson
|
||||
objectclass: inetOrgPerson
|
||||
objectclass: mailRecipient
|
||||
$extradata
|
||||
END
|
||||
}
|
||||
}
|
||||
|
||||
if ($genbroadcast) { # Create the broadcast account
|
||||
# MAKE SURE THERE ARE NO TRAILING SPACES IN THE LDIF
|
||||
my $password = $userpassword;
|
||||
$password =~ s/%ld//; # strip user number
|
||||
# initial part
|
||||
print $outfile <<END;
|
||||
dn: uid=$bcastacct, $basedn
|
||||
userpassword: $password
|
||||
givenname: $bcastacct
|
||||
sn: $bcastacct
|
||||
cn: $bcastacct
|
||||
uid: $bcastacct
|
||||
mail: $bcastacct\@$domain
|
||||
mailhost: $mailhost
|
||||
maildeliveryoption: forward
|
||||
END
|
||||
|
||||
# now put in each address
|
||||
for ($i = $firstaccount; $i < $firstaccount+$numaccounts; $i++) {
|
||||
# build user account name
|
||||
my $acctname = $username;
|
||||
$acctname =~ s/%ld/$i/; # insert user number
|
||||
|
||||
print $outfile "mailforwardingaddress: $acctname\@$domain\n";
|
||||
}
|
||||
|
||||
# final part
|
||||
print $outfile <<END;
|
||||
objectclass: top
|
||||
objectclass: person
|
||||
objectclass: organizationalPerson
|
||||
objectclass: inetOrgPerson
|
||||
objectclass: mailRecipient
|
||||
|
||||
END
|
||||
}
|
||||
|
||||
if ($genpostmaster) { # Create the postmaster account
|
||||
# MAKE SURE THERE ARE NO TRAILING SPACES IN THE LDIF
|
||||
print $outfile <<END;
|
||||
dn: cn=postmaster, $basedn
|
||||
cn: postmaster
|
||||
mail: postmaster\@$domain
|
||||
mailalternateaddress: postmaster\@$mailhost
|
||||
mgrprfc822mailmember: $postmasterAddress
|
||||
objectclass: top
|
||||
objectclass: mailGroup
|
||||
objectclass: groupOfUniqueNames
|
||||
|
||||
END
|
||||
}
|
||||
|
||||
# mixing passwd output with the ldif output above would be quite silly
|
||||
if ($genpasswd) { # Create passwd entries for makeusers
|
||||
for ($i = $firstaccount; $i < $firstaccount+$numaccounts; $i++) {
|
||||
# build user account name
|
||||
my $acctname = $username;
|
||||
$acctname =~ s/%ld/$i/; # insert user number
|
||||
my $password = $userpassword;
|
||||
$password =~ s/%ld/$i/; # insert user number
|
||||
my $uid = $firstuid + $i;
|
||||
print $outfile "$acctname:$password:$uid:$uid:Mail user $acctname:/home/$acctname:/bin/sh\n";
|
||||
}
|
||||
}
|
||||
|
||||
exit 0;
|
||||
@@ -1,147 +0,0 @@
|
||||
#!/bin/sh
|
||||
# The contents of this file are subject to the Netscape Public
|
||||
# License Version 1.1 (the "License"); you may not use this file
|
||||
# except in compliance with the License. You may obtain a copy of
|
||||
# the License at http://www.mozilla.org/NPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS
|
||||
# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
# implied. See the License for the specific language governing
|
||||
# rights and limitations under the License.
|
||||
#
|
||||
# The Original Code is the Netscape Mailstone utility,
|
||||
# released March 17, 2000.
|
||||
#
|
||||
# The Initial Developer of the Original Code is Netscape
|
||||
# Communications Corporation. Portions created by Netscape are
|
||||
# Copyright (C) 1999-2000 Netscape Communications Corporation. All
|
||||
# Rights Reserved.
|
||||
#
|
||||
# Contributor(s): Dan Christian <robodan@netscape.com>
|
||||
# Marcel DePaolis <marcel@netcape.com>
|
||||
#
|
||||
# Alternatively, the contents of this file may be used under the
|
||||
# terms of the GNU Public License (the "GPL"), in which case the
|
||||
# provisions of the GPL are applicable instead of those above.
|
||||
# If you wish to allow use of your version of this file only
|
||||
# under the terms of the GPL and not to allow others to use your
|
||||
# version of this file under the NPL, indicate your decision by
|
||||
# deleting the provisions above and replace them with the notice
|
||||
# and other provisions required by the GPL. If you do not delete
|
||||
# the provisions above, a recipient may use your version of this
|
||||
# file under either the NPL or the GPL.
|
||||
#####################################################
|
||||
|
||||
# Figure out standard system names
|
||||
|
||||
UNAME_REPORTS=`uname`
|
||||
UNAME_OS_ARCH=`uname -s`
|
||||
UNAME_OS_RELEASE=`uname -r`
|
||||
|
||||
OS_ARCH=$UNAME_OS_ARCH
|
||||
OS_RELEASE=$UNAME_OS_RELEASE
|
||||
OS_CONFIG=${OS_ARCH}${OS_RELEASE}
|
||||
|
||||
if [ "$UNAME_OS_ARCH" = "SunOS" ]; then
|
||||
PROCESSOR=`uname -p`
|
||||
if [ "$PROCESSOR" = "i386" ]; then
|
||||
BUILD_ARCH=x86
|
||||
else
|
||||
BUILD_ARCH=SPARC
|
||||
fi
|
||||
BUILD_OS=SOLARIS
|
||||
if [ "$UNAME_OS_RELEASE" = "5.5" ]; then
|
||||
BUILD_VER=2.5
|
||||
elif [ "$UNAME_OS_RELEASE" = "5.5.1" ]; then
|
||||
BUILD_VER=2.5
|
||||
elif [ "$UNAME_OS_RELEASE" = "5.6" ]; then
|
||||
BUILD_VER=2.6
|
||||
elif [ "$UNAME_OS_RELEASE" = "5.7" ]; then
|
||||
BUILD_VER=7
|
||||
elif [ "$UNAME_OS_RELEASE" = "5.8" ]; then
|
||||
BUILD_VER=8
|
||||
fi
|
||||
|
||||
elif [ "$UNAME_OS_ARCH" = "HP-UX" ]; then
|
||||
BUILD_ARCH=HPPA
|
||||
BUILD_OS=$UNAME_OS_ARCH
|
||||
BUILD_VER=$OS_RELEASE
|
||||
|
||||
elif [ "$UNAME_OS_ARCH" = "AIX" ]; then
|
||||
BUILD_ARCH=POWER
|
||||
BUILD_OS=$UNAME_OS_ARCH
|
||||
BUILD_VER=`uname -v`.`uname -r`
|
||||
OS_CONFIG=${BUILD_OS}${BUILD_VER}
|
||||
|
||||
elif [ "$UNAME_OS_ARCH" = "OSF1" ]; then
|
||||
BUILD_ARCH=ALPHA
|
||||
BUILD_OS=$UNAME_OS_ARCH
|
||||
BUILD_VER=$OS_RELEASE
|
||||
|
||||
elif [ "$UNAME_OS_ARCH" = "IRIX64" -o "$UNAME_OS_ARCH" = "IRIX" ]; then
|
||||
BUILD_ARCH=MIPS
|
||||
BUILD_OS=IRIX
|
||||
BUILD_VER=$OS_RELEASE
|
||||
OS_CONFIG=${BUILD_OS}${OS_RELEASE}
|
||||
|
||||
elif [ "$UNAME_OS_ARCH" = "BSD/386" ]; then
|
||||
BUILD_ARCH=x86
|
||||
BUILD_OS=BSDI
|
||||
BUILD_VER=$OS_RELEASE
|
||||
|
||||
elif [ "$UNAME_OS_ARCH" = "FreeBSD" ]; then
|
||||
BUILD_ARCH=`uname -p`
|
||||
BUILD_OS=$UNAME_OS_ARCH
|
||||
BUILD_VER=$UNAME_OS_RELEASE
|
||||
if [ "$BUILD_ARCH" = "i386" ]; then
|
||||
BUILD_ARCH=x86
|
||||
fi
|
||||
OS_CONFIG=${BUILD_OS}${BUILD_VER}_${BUILD_ARCH}
|
||||
|
||||
elif [ "$UNAME_OS_ARCH" = "SCO_SV" ]; then
|
||||
BUILD_ARCH=x86
|
||||
BUILD_OS=SCO
|
||||
BUILD_VER=$OS_RELEASE
|
||||
|
||||
elif [ "$UNAME_OS_ARCH" = "UNIX_SV" ]; then
|
||||
# Check for braindamage
|
||||
grep NCR /etc/bcheckrc > /dev/null 2>&1
|
||||
BUILD_ARCH=x86
|
||||
if [ $? = 0 ]; then
|
||||
BUILD_OS=NCR
|
||||
else
|
||||
BUILD_OS=UNIXWARE
|
||||
fi
|
||||
BUILD_VER=$OS_RELEASE
|
||||
|
||||
elif [ "$UNAME_OS_ARCH" = "NEWS-OS" ]; then
|
||||
BUILD_ARCH=`uname -p`
|
||||
BUILD_OS=SONY
|
||||
BUILD_VER=$OS_RELEASE
|
||||
|
||||
elif [ "$UNAME_OS_ARCH" = "UNIX_System_V" ]; then
|
||||
BUILD_ARCH=`uname -p`
|
||||
BUILD_OS=NEC
|
||||
BUILD_VER=$OS_RELEASE
|
||||
|
||||
elif [ $UNAME_OS_ARCH = Linux ]; then
|
||||
BUILD_ARCH=`uname -m`
|
||||
if [ -n "`echo $BUILD_ARCH | grep -e '86$'`" ] ; then
|
||||
BUILD_ARCH=x86
|
||||
fi
|
||||
BUILD_OS=$UNAME_OS_ARCH
|
||||
BUILD_VER=`echo $OS_RELEASE | cut -f1,2 -d.`
|
||||
OS_CONFIG=${BUILD_OS}${BUILD_VER}_${BUILD_ARCH}
|
||||
fi
|
||||
|
||||
case "$UNAME_OS_ARCH" in
|
||||
SINIX*|ReliantUNIX*)
|
||||
BUILD_ARCH=`uname -p`
|
||||
BUILD_OS="ReliantUNIX"
|
||||
BUILD_VER=$OS_RELEASE
|
||||
;;
|
||||
esac
|
||||
|
||||
#PLATFORM=${BUILD_ARCH}_${BUILD_OS}_${BUILD_VER}
|
||||
#echo $PLATFORM
|
||||
echo $OS_CONFIG
|
||||
@@ -1,70 +0,0 @@
|
||||
#!/bin/sh
|
||||
# The conZtents of this file are subject to the Netscape Public
|
||||
# License Version 1.1 (the "License"); you may not use this file
|
||||
# except in compliance with the License. You may obtain a copy of
|
||||
# the License at http://www.mozilla.org/NPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS
|
||||
# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
# implied. See the License for the specific language governing
|
||||
# rights and limitations under the License.
|
||||
#
|
||||
# The Original Code is the Netscape Mailstone utility,
|
||||
# released March 17, 2000.
|
||||
#
|
||||
# The Initial Developer of the Original Code is Netscape
|
||||
# Communications Corporation. Portions created by Netscape are
|
||||
# Copyright (C) 1999-2000 Netscape Communications Corporation. All
|
||||
# Rights Reserved.
|
||||
#
|
||||
# Contributor(s): Dan Christian <robodan@netscape.com>
|
||||
# Marcel DePaolis <marcel@netcape.com>
|
||||
#
|
||||
# Alternatively, the contents of this file may be used under the
|
||||
# terms of the GNU Public License (the "GPL"), in which case the
|
||||
# provisions of the GPL are applicable instead of those above.
|
||||
# If you wish to allow use of your version of this file only
|
||||
# under the terms of the GPL and not to allow others to use your
|
||||
# version of this file under the NPL, indicate your decision by
|
||||
# deleting the provisions above and replace them with the notice
|
||||
# and other provisions required by the GPL. If you do not delete
|
||||
# the provisions above, a recipient may use your version of this
|
||||
# file under either the NPL or the GPL.
|
||||
#####################################################
|
||||
|
||||
# re-process a data run
|
||||
# by default, use the most recent one
|
||||
# Usage: process
|
||||
# or
|
||||
# Usage: process TIMESTAMP [args...]
|
||||
# or
|
||||
# Usage: process results/TIMESTAMP [args...]
|
||||
|
||||
if [ ! -x perl/bin/perl -o ! -f .license ] ; then # see if setup was ever run
|
||||
echo "Critical files are missing. Run setup."
|
||||
exit 2;
|
||||
fi
|
||||
|
||||
if [ $# -lt 1 ] ; then # do most recent run
|
||||
# since the directories are time stamps with fixed fields,
|
||||
# alphabetical order is also time order
|
||||
dir=`ls -d results/[0-9]*.[0-9]* | tail -1`
|
||||
else # use specified run
|
||||
if [ -d results/$1 ] ; then # timestamp
|
||||
dir=results/$1
|
||||
shift
|
||||
elif [ -d $1 ] ; then # results/timestamp
|
||||
dir=$1
|
||||
shift
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ -n "$dir" ] ; then
|
||||
if [ -f $dir/all.wld ] ; then # unified workload file
|
||||
perl/bin/perl -Ibin -- bin/process.pl -w $dir/all.wld "$@"
|
||||
else # BACK COMPATIBILITY form
|
||||
perl/bin/perl -Ibin -- bin/process.pl -c $dir/config.cfg "$@"
|
||||
fi
|
||||
else # pass in whatever they gave us
|
||||
perl/bin/perl -Ibin -- bin/process.pl "$@"
|
||||
fi
|
||||
@@ -1,371 +0,0 @@
|
||||
#!/usr/bin/env perl
|
||||
# The contents of this file are subject to the Netscape Public
|
||||
# License Version 1.1 (the "License"); you may not use this file
|
||||
# except in compliance with the License. You may obtain a copy of
|
||||
# the License at http://www.mozilla.org/NPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS
|
||||
# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
# implied. See the License for the specific language governing
|
||||
# rights and limitations under the License.
|
||||
#
|
||||
# The Original Code is the Netscape Mailstone utility,
|
||||
# released March 17, 2000.
|
||||
#
|
||||
# The Initial Developer of the Original Code is Netscape
|
||||
# Communications Corporation. Portions created by Netscape are
|
||||
# Copyright (C) 1997-2000 Netscape Communications Corporation. All
|
||||
# Rights Reserved.
|
||||
#
|
||||
# Contributor(s): Dan Christian <robodan@netscape.com>
|
||||
# Marcel DePaolis <marcel@netcape.com>
|
||||
#
|
||||
# Alternatively, the contents of this file may be used under the
|
||||
# terms of the GNU Public License (the "GPL"), in which case the
|
||||
# provisions of the GPL are applicable instead of those above.
|
||||
# If you wish to allow use of your version of this file only
|
||||
# under the terms of the GPL and not to allow others to use your
|
||||
# version of this file under the NPL, indicate your decision by
|
||||
# deleting the provisions above and replace them with the notice
|
||||
# and other provisions required by the GPL. If you do not delete
|
||||
# the provisions above, a recipient may use your version of this
|
||||
# file under either the NPL or the GPL.
|
||||
#####################################################
|
||||
|
||||
# Generate reports independently of mailmaster
|
||||
# Can be used during a run or after mailmaster has finished
|
||||
|
||||
print "Netscape Mailstone\n";
|
||||
print "Copyright (c) 1997-2000 Netscape Communications Corp.\n";
|
||||
|
||||
# this parses the command line and config file
|
||||
do 'args.pl'|| die $@;
|
||||
parseArgs(); # parse command line
|
||||
setConfigDefaults(); # pick up any missing defaults
|
||||
|
||||
$resultdir = "$resultbase/$params{TSTAMP}";
|
||||
$tmpdir = "$tmpbase/$params{TSTAMP}";
|
||||
$resultstxt = "$resultdir/results.txt";
|
||||
$resultshtml = "$resultdir/results.html";
|
||||
|
||||
if ($params{TESTBED}) { # BACK COMPATIBILITY
|
||||
$params{TESTBED} = "$resultdir/testbed.tbd"; # use saved testbed
|
||||
# open the saved testbed conf file
|
||||
readTestbedFile($params{TESTBED}) || die "$@\n";
|
||||
}
|
||||
|
||||
# Convert old style to new. Write the complete inclusive workload
|
||||
writeWorkloadFile ("$resultdir/all.wld", \@workload)
|
||||
unless ((-r "$resultdir/all.wld") || (-r "$resultdir/all.wld.gz"));
|
||||
|
||||
$testsecs = figureTimeSeconds ($params{TIME}, "minutes");
|
||||
|
||||
print "Starting data reduction\n";
|
||||
|
||||
sub readClientCSV {
|
||||
my $file = shift;
|
||||
my @fields;
|
||||
my $line;
|
||||
|
||||
print "Reading client summary: $file\n";
|
||||
open(CSV, "<$file") || # Summary of all clients
|
||||
open(CSV, "gunzip -c $file.gz |") ||
|
||||
return 0; # failed
|
||||
|
||||
# Title line: Verify that arguments are in the same order
|
||||
$line = <CSV>;
|
||||
unless ($line) {
|
||||
print "readClientCSV: Error reading $file. \n";
|
||||
return 0;
|
||||
}
|
||||
chomp $line; # strip newline
|
||||
@fields = split /,/, $line; # turn into an array
|
||||
my $cli = shift @fields; # pull off client header
|
||||
my $cn = shift @fields; # pull off num header
|
||||
my $pro = shift @fields; # pull off protocol header
|
||||
|
||||
# Client array, per variable, per protocol
|
||||
foreach $p (@protocols) {
|
||||
# This hash will hold the timers
|
||||
$clidata{$p} = ArrayInstance->new();
|
||||
foreach $t (@timers) {
|
||||
# This hash will hold the values in the timer
|
||||
$clidata{$p}->{$t} = ArrayInstance->new();
|
||||
foreach $f (@{$timerFields{$t}}) {
|
||||
# This hash that will hold the actual values per client
|
||||
$clidata{$p}->{$t}->{$f} = ArrayInstance->new();
|
||||
}
|
||||
}
|
||||
foreach $t (@scalarClientFields) { # non-timer fields
|
||||
# This hash that will hold the actual values per client
|
||||
$clidata{$p}->{$t} = ArrayInstance->new();
|
||||
}
|
||||
}
|
||||
|
||||
foreach $f (@commClientFields) { # proto independent
|
||||
my $v = shift @fields;
|
||||
if ($v !~ m/$f/i) {
|
||||
print "readClientCSV: Protocol order mismatch '$v', '$f' \n";
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
foreach $t (@timers) { # timers
|
||||
foreach $f (@{$timerFields{$t}}) {
|
||||
my $v = shift @fields;
|
||||
if ($v !~ m/$t:$f/i) {
|
||||
print "readClientCSV: Protocol order mismatch '$v', '$t:$f' \n";
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
foreach $t (@scalarClientFields) { # scalars
|
||||
my $v = shift @fields;
|
||||
if ($v !~ m/$t/i) {
|
||||
print "readClientCSV: Protocol order mismatch '$v', '$t' \n";
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
# Now read actual data
|
||||
while (<CSV>) {
|
||||
chomp; # strip newline
|
||||
@fields = split /,/; # turn into an array
|
||||
my $cli = shift @fields; # pull off client header
|
||||
my $cn = shift @fields; # pull off num header
|
||||
my $p = shift @fields; # pull off protocol header
|
||||
my $cp = $clidata{$p};
|
||||
|
||||
# Create the needed finals arrays
|
||||
unless ($finals{$p}) {
|
||||
#print "Creating finals{$p}\n"; # DEBUG
|
||||
$finals{$p} = ArrayInstance->new();
|
||||
foreach $t (@timers) {
|
||||
$finals{$p}->{$t} = ArrayInstance->new();
|
||||
}
|
||||
}
|
||||
|
||||
foreach $f (@commClientFields) { # proto independent
|
||||
$cliGen{$f}->{$cn} = shift @fields;
|
||||
}
|
||||
foreach $t (@timers) { # timers
|
||||
foreach $f (@{$timerFields{$t}}) {
|
||||
$cp->{$t}->{$f}->{$cn} = shift @fields;
|
||||
$finals{$p}->{$t}->{$f} += $cp->{$t}->{$f}->{$cn};
|
||||
}
|
||||
}
|
||||
foreach $t (@scalarClientFields) { # scalars
|
||||
$cp->{$t}->{$cn} = shift @fields;
|
||||
$finals{$p}->{$t} += $cp->{$t}->{$cn};
|
||||
}
|
||||
|
||||
foreach $section (@workload) { # find thread count for this client
|
||||
next unless ($section->{sectionTitle} =~ /CLIENT/i);
|
||||
next unless ($section->{sectionParams} =~ /$cli/);
|
||||
#print "Process $cli has threads $section->{THREADS}\n";
|
||||
$reportingClients += ($section->{THREADS})
|
||||
? $section->{THREADS} : 1;
|
||||
last;
|
||||
}
|
||||
}
|
||||
|
||||
close (CSV);
|
||||
return 1; # success
|
||||
}
|
||||
|
||||
sub readTimeCSV {
|
||||
my $file = shift;
|
||||
my $p = shift;
|
||||
my $gp = $graphs{$p};
|
||||
my $line;
|
||||
|
||||
print "Reading time $p summary: $file\n";
|
||||
open(CSV, "<$file") || # Summary over time
|
||||
open(CSV, "gunzip -c $file.gz |") ||
|
||||
return 0; # failed
|
||||
|
||||
# Verify that arguments are in the same order
|
||||
$line = <CSV>;
|
||||
unless ($line) {
|
||||
print "readTimeCSV: Error reading $file. \n";
|
||||
return 0;
|
||||
}
|
||||
chomp $line; # strip newline
|
||||
@fields = split /,/, $line;
|
||||
my $t = shift @fields; # pull off time header
|
||||
foreach $t (@timers) {
|
||||
foreach $f (@{$timerFields{$t}}) {
|
||||
my $v = shift @fields;
|
||||
if ($v !~ m/$t:$f/i) {
|
||||
print "readTimeCSV: Protocol order mismatch '$v', '$t:$f' \n";
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
foreach $t (@scalarGraphFields) {
|
||||
my $v = shift @fields;
|
||||
if ($v !~ m/$t/i) {
|
||||
print "readTimeCSV: Protocol order mismatch '$v', '$t' \n";
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
while (<CSV>) {
|
||||
chomp;
|
||||
#print "LINE: $_\n";
|
||||
@fields = split /,/;
|
||||
my $tm = shift @fields; # pull off time header
|
||||
#print "t=$t ";
|
||||
foreach $t (@timers) {
|
||||
foreach $f (@{$timerFields{$t}}) {
|
||||
$gp->{$t}->{$f}->{$tm} = shift @fields;
|
||||
#print "$v=$gp->{$v}->{$tm} ";
|
||||
}
|
||||
}
|
||||
foreach $t (@scalarGraphFields) {
|
||||
$gp->{$t}->{$tm} = shift @fields;
|
||||
#print "$v=$gp->{$v}->{$tm} ";
|
||||
}
|
||||
#print "\n";
|
||||
}
|
||||
close (CSV);
|
||||
return 1; # success
|
||||
}
|
||||
|
||||
sub loadCSV {
|
||||
my @csvs = <$resultdir/time-*.csv>;
|
||||
@csvs = <$resultdir/time-*.csv.gz> unless (@csvs);
|
||||
return 0 unless (@csvs); # no time.csv files
|
||||
|
||||
# stuff normally done from reduce.pl (should all be in protoconf?)
|
||||
# Basic sanity check
|
||||
return 0 unless ($testsecs > 0);
|
||||
|
||||
$startTime = 0; # these are timeInSeconds/$timeStep
|
||||
$endTime = 0;
|
||||
|
||||
# keep graphs with somewhat more precision than sample rate;
|
||||
$timeStep = int ($params{FREQUENCY} / 2);
|
||||
if ($timeStep < 1) { $timeStep = 1; }
|
||||
|
||||
# global results initialization
|
||||
$reportingClients = 0;
|
||||
$totalProcs = 0; # number of clients started
|
||||
|
||||
foreach $f (@commClientFields) { # protocol independent fields
|
||||
$cliGen{$f} = ArrayInstance->new();
|
||||
}
|
||||
|
||||
return 0 unless (readClientCSV ("$resultdir/clients.csv")); # client info
|
||||
|
||||
foreach $c (@csvs) { # read time info
|
||||
$c =~ s/.gz$//; # strip .gz extension
|
||||
my $p = $c; # strip down to protocol portion
|
||||
$p =~ s/$resultdir\/time-//;
|
||||
$p =~ s/.csv$//;
|
||||
return 0 unless (readTimeCSV ($c, $p));
|
||||
}
|
||||
|
||||
return 0 unless ($reportingClients > 0);
|
||||
|
||||
foreach $section (@workload) {
|
||||
next unless ($section->{sectionTitle} =~ /CLIENT/i);
|
||||
my $slist = $section->{sectionParams};
|
||||
$slist =~ s/HOSTS=\s*//; # strip off initial bit
|
||||
my @hlist = split /[\s,]/, $slist;
|
||||
my $hcnt = (1 + $#hlist);
|
||||
my $pcount = $section->{PROCESSES};
|
||||
my $tcount = ($section->{THREADS}) ? $section->{THREADS} : 1;
|
||||
|
||||
$totalProcs += $pcount * $tcount * $hcnt;
|
||||
}
|
||||
|
||||
# Find time extent for a key graph
|
||||
($startTime, $endTime) = dataMinMax ("blocks", \@protocols,
|
||||
$startTime, $endTime);
|
||||
|
||||
$realTestSecs = ($endTime - $startTime) * $timeStep;
|
||||
$realTestSecs = 1 unless ($realTestSecs); # in case of small MaxBlocks
|
||||
printf "Reported test duration %d seconds with %d second resolution\n",
|
||||
$realTestSecs, $timeStep;
|
||||
$realTestSecs = $testsecs if ($realTestSecs > $testsecs);
|
||||
|
||||
my @newProtos; # figure real protocol list
|
||||
foreach $p (@protocols) {
|
||||
my $gp = $graphs{$p};
|
||||
my $numValid = 0;
|
||||
# See if there is real data here
|
||||
CHECKVAL: foreach $t (@timers) {
|
||||
foreach $f (@{$timerFields{$t}}) {
|
||||
my $vp = $gp->{$t}->{$f};
|
||||
next unless ($vp); # no data
|
||||
next unless (scalar %$vp); # redundant???
|
||||
|
||||
#print "Checking: $p $t $f => ENTRIES\n";
|
||||
$numValid++;
|
||||
last CHECKVAL;
|
||||
}
|
||||
}
|
||||
($numValid > 0) || next;
|
||||
|
||||
push @newProtos, $p;
|
||||
}
|
||||
# update protocol list to only have what was used
|
||||
@protocols = @newProtos;
|
||||
@protocolsAll = @newProtos;
|
||||
push @protocolsAll, "Total";
|
||||
}
|
||||
|
||||
|
||||
my $doFull = 1; # re-processing is currently broken
|
||||
|
||||
# if (!((-f "$resultdir/clients.csv")
|
||||
# || (-f "$resultdir/clients.csv.gz"))) { # no processing yet
|
||||
# $doFull = 1;
|
||||
# } else { # see if any source is newer than csv
|
||||
# foreach $section (@workload) {
|
||||
# next unless ($section->{sectionTitle} =~ /CLIENT/i);
|
||||
# my $slist = $section->{sectionParams};
|
||||
# $slist =~ s/HOSTS=\s*//; # strip off initial bit
|
||||
# foreach $cli (split /[\s,]/, $slist) {
|
||||
# my $fname = getClientFilename ($cli, $section);
|
||||
# if ((-r $fname) # raw source exists
|
||||
# && ((-M "$resultdir/clients.csv")
|
||||
# > (-M $fname))) { # newer
|
||||
# #print "$fname is newer than $resultdir/clients.csv\n";
|
||||
# $doFull++;
|
||||
# last;
|
||||
# }
|
||||
# }
|
||||
# }
|
||||
# }
|
||||
|
||||
# unless ($doFull) { # do CSV load
|
||||
# # if this is a csv only run, then these may not exist yet
|
||||
# mkdir ("$tmpbase", 0775);
|
||||
# mkdir ("$tmpdir", 0775);
|
||||
# unless (-r "$resultbase/index.html") {
|
||||
# do 'makeindex.pl' || warn "$@\n"; # html index
|
||||
# }
|
||||
|
||||
# $doFull = 1 unless (loadCSV); # if CSV fails, fall back to full processing
|
||||
# }
|
||||
|
||||
if ($doFull) {
|
||||
do 'reduce.pl' || die "$@\n";
|
||||
}
|
||||
|
||||
|
||||
print "Generating results pages:\t", scalar (localtime), "\n";
|
||||
|
||||
do 'report.pl' || die "$@\n";
|
||||
|
||||
# Now display that data to console
|
||||
if ($params{VERBOSE}) {
|
||||
fileShow ($resultstxt);
|
||||
print "\n";
|
||||
}
|
||||
|
||||
pathprint ("\nResults (text):\t$resultstxt\n");
|
||||
pathprint ( "Results (HTML):\t$resultshtml\n");
|
||||
print "Index of runs: \tfile://$cwd/$resultbase/index.html\n";
|
||||
|
||||
print "Process done:\t", scalar (localtime), "\n";
|
||||
@@ -1,158 +0,0 @@
|
||||
# The contents of this file are subject to the Netscape Public
|
||||
# License Version 1.1 (the "License"); you may not use this file
|
||||
# except in compliance with the License. You may obtain a copy of
|
||||
# the License at http://www.mozilla.org/NPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS
|
||||
# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
# implied. See the License for the specific language governing
|
||||
# rights and limitations under the License.
|
||||
#
|
||||
# The Original Code is the Netscape Mailstone utility,
|
||||
# released March 17, 2000.
|
||||
#
|
||||
# The Initial Developer of the Original Code is Netscape
|
||||
# Communications Corporation. Portions created by Netscape are
|
||||
# Copyright (C) 1997-2000 Netscape Communications Corporation. All
|
||||
# Rights Reserved.
|
||||
#
|
||||
# Contributor(s): Dan Christian <robodan@netscape.com>
|
||||
# Marcel DePaolis <marcel@netcape.com>
|
||||
#
|
||||
# Alternatively, the contents of this file may be used under the
|
||||
# terms of the GNU Public License (the "GPL"), in which case the
|
||||
# provisions of the GPL are applicable instead of those above.
|
||||
# If you wish to allow use of your version of this file only
|
||||
# under the terms of the GPL and not to allow others to use your
|
||||
# version of this file under the NPL, indicate your decision by
|
||||
# deleting the provisions above and replace them with the notice
|
||||
# and other provisions required by the GPL. If you do not delete
|
||||
# the provisions above, a recipient may use your version of this
|
||||
# file under either the NPL or the GPL.
|
||||
#####################################################
|
||||
|
||||
# This define the structures that hold summary, client, and graph data,
|
||||
|
||||
# This sets the names used for display. Can be internationalized.
|
||||
# All top level names are here (both timers and scalars).
|
||||
# Any unlisted names will map to themselves.
|
||||
%timerNames
|
||||
= (
|
||||
#internal name, Printed name
|
||||
"total", "total",
|
||||
"conn", "connect",
|
||||
"reconn", "reconnect",
|
||||
"banner", "banner",
|
||||
"login", "login",
|
||||
"cmd", "command",
|
||||
"submit", "submit",
|
||||
"retrieve", "retrieve",
|
||||
"logout", "logout",
|
||||
"idle", "idle",
|
||||
"connections", "connections",
|
||||
"blocks", "blocks",
|
||||
);
|
||||
|
||||
# This sets the names used for display. Can be internationalized.
|
||||
%fieldNames
|
||||
= (
|
||||
#internal name, Printed name
|
||||
"Try", "Try",
|
||||
"Error", "Error",
|
||||
"BytesR", "BytesR",
|
||||
"BytesW", "BytesW",
|
||||
"Time", "Time",
|
||||
"TimeMin", "TMin",
|
||||
"TimeMax", "TMax",
|
||||
"Time2", "TStd",
|
||||
);
|
||||
|
||||
|
||||
# hold time graphs for each protocol
|
||||
%graphs = ();
|
||||
|
||||
# Totals are done during plotting, if needed
|
||||
%finals = (); # create base finals hash
|
||||
|
||||
# These are sections that dont get passed to mailclient (case insensitive)
|
||||
@scriptWorkloadSections
|
||||
= (
|
||||
"Config", # special, references %params
|
||||
"Client", # testbed client(s)
|
||||
"Graph", # graph generation
|
||||
"Setup", # things to run with ./setup
|
||||
"Startup", # things to run before test
|
||||
"Monitor", # other performance monitoring
|
||||
"PreTest", # things to run before test
|
||||
"PostTest", # things to run after test
|
||||
);
|
||||
|
||||
# These are sections that arent protocols. Anything else must be.
|
||||
@nonProtocolSections
|
||||
= (@scriptWorkloadSections, ("Default"));
|
||||
|
||||
# These are the known workload parameters (as they will print)
|
||||
# These are coerced to upper case internally (do NOT internationize)
|
||||
@workloadParameters
|
||||
= (
|
||||
"addressFormat",
|
||||
"arch",
|
||||
"blockID",
|
||||
"blockTime",
|
||||
"chartHeight",
|
||||
"chartPoints",
|
||||
"chartWidth",
|
||||
"clientCount",
|
||||
"command",
|
||||
"comments",
|
||||
"file",
|
||||
"firstAddress",
|
||||
"firstLogin",
|
||||
"frequency",
|
||||
"gnuplot",
|
||||
"group",
|
||||
"idleTime",
|
||||
"leaveMailOnServer",
|
||||
"loginFormat",
|
||||
"loopDelay",
|
||||
"numAddresses",
|
||||
"numLogins",
|
||||
"numLoops",
|
||||
"numRecips",
|
||||
"mailClient",
|
||||
"maxBlocks",
|
||||
"maxClients",
|
||||
"maxErrors",
|
||||
"maxThreads",
|
||||
"maxProcesses",
|
||||
"passwdFormat",
|
||||
"processes",
|
||||
"rampTime",
|
||||
"rcp",
|
||||
"rsh",
|
||||
"sequentialAddresses",
|
||||
"sequentialLogins",
|
||||
"server",
|
||||
"smtpMailFrom",
|
||||
"sysConfig",
|
||||
"threads",
|
||||
"telemetry",
|
||||
"tempDir",
|
||||
"time",
|
||||
"title",
|
||||
"TStamp",
|
||||
"useAuthLogin",
|
||||
"useEHLO",
|
||||
"weight",
|
||||
"wmapBannerCmds",
|
||||
"wmapClientHeader",
|
||||
"wmapInBoxCmds",
|
||||
"wmapLoginCmd",
|
||||
"wmapLoginData",
|
||||
"wmapLogoutCmds",
|
||||
"wmapMsgReadCmds",
|
||||
"wmapMsgWriteCmds",
|
||||
"workload",
|
||||
);
|
||||
|
||||
return 1;
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,605 +0,0 @@
|
||||
# The contents of this file are subject to the Netscape Public
|
||||
# License Version 1.1 (the "License"); you may not use this file
|
||||
# except in compliance with the License. You may obtain a copy of
|
||||
# the License at http://www.mozilla.org/NPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS
|
||||
# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
# implied. See the License for the specific language governing
|
||||
# rights and limitations under the License.
|
||||
#
|
||||
# The Original Code is the Netscape Mailstone utility,
|
||||
# released March 17, 2000.
|
||||
#
|
||||
# The Initial Developer of the Original Code is Netscape
|
||||
# Communications Corporation. Portions created by Netscape are
|
||||
# Copyright (C) 1997-2000 Netscape Communications Corporation. All
|
||||
# Rights Reserved.
|
||||
#
|
||||
# Contributor(s): Dan Christian <robodan@netscape.com>
|
||||
# Marcel DePaolis <marcel@netcape.com>
|
||||
#
|
||||
# Alternatively, the contents of this file may be used under the
|
||||
# terms of the GNU Public License (the "GPL"), in which case the
|
||||
# provisions of the GPL are applicable instead of those above.
|
||||
# If you wish to allow use of your version of this file only
|
||||
# under the terms of the GPL and not to allow others to use your
|
||||
# version of this file under the NPL, indicate your decision by
|
||||
# deleting the provisions above and replace them with the notice
|
||||
# and other provisions required by the GPL. If you do not delete
|
||||
# the provisions above, a recipient may use your version of this
|
||||
# file under either the NPL or the GPL.
|
||||
#####################################################
|
||||
|
||||
# This file deals with the summary data only
|
||||
|
||||
# Should be packages
|
||||
do 'genplot.pl' || die "$@\n";
|
||||
|
||||
sub walkSetupTotals {
|
||||
my $a = shift; my $f = shift; my $p = shift;
|
||||
if ($p =~ /(\w+):(\w+):$/) {
|
||||
my $tm = $2;
|
||||
if (!($finals{Total}->{$tm}->{$f})) {
|
||||
$finals{Total}->{$tm}->{$f} = $a;
|
||||
} elsif ($f =~ /Min$/) {
|
||||
$finals{Total}->{$tm}->{$f} = $a
|
||||
if (($a > 0.0) && ($a < $finals{Total}->{$tm}->{$f}));
|
||||
} elsif ($f =~ /Max$/) {
|
||||
$finals{Total}->{$tm}->{$f} = $a if ($a > $finals{Total}->{$tm}->{$f});
|
||||
} else {
|
||||
$finals{Total}->{$tm}->{$f} += $a;}
|
||||
}
|
||||
elsif ($p =~ /(\w+):$/) {
|
||||
$finals{Total}->{$f} += $a;
|
||||
}
|
||||
}
|
||||
|
||||
sub setupTotals {
|
||||
# Figure out combined timers for "Total" protocol
|
||||
# We might do a smarter merge here (look at context and try to match order)
|
||||
# As long as the first protocol is a superset, it wont matter
|
||||
my @tnames;
|
||||
foreach $proto (@protocols) {
|
||||
foreach $n (@{$protocolFields{$proto}}) {
|
||||
my $t = $n;
|
||||
$t =~ s/([][{}*+?^.\/])/\\$1/g; # quote regex syntax
|
||||
my $found = 0;
|
||||
foreach $tn (@tnames) { # see if it is in the list already
|
||||
next unless ($tn =~ /$t/);
|
||||
$found = 1;
|
||||
last;
|
||||
}
|
||||
#print "proto $proto: Found $n\n" if ($found > 0);
|
||||
next if ($found > 0);
|
||||
#print "proto $proto: Add $n\n";
|
||||
push @tnames, $n; # add to list
|
||||
}
|
||||
}
|
||||
#print "'Total' timers @tnames\n";
|
||||
$protocolFields{"Total"} = \@tnames;
|
||||
|
||||
# Create "Total" hashes
|
||||
$finals{Total} = ArrayInstance->new();
|
||||
foreach $n (@{$protocolFields{"Total"}}) { # all timers
|
||||
my $t = $n; # dont modify original list
|
||||
if ($t =~ /^\[(\w+)\]$/) { # Timer case, strip off brackets
|
||||
$finals{Total}->{$1} = ArrayInstance->new();
|
||||
#print "Creating Total timer field $1\n";
|
||||
} else { # scalar
|
||||
$finals{Total}->{$n} = 0;
|
||||
#print "Creating Total scalar field $n\n";
|
||||
}
|
||||
}
|
||||
|
||||
# Total finals array
|
||||
foreach $proto (@protocols) {
|
||||
foreach $t (@{$protocolFields{$proto}}) {
|
||||
if ($t =~ /^\[(\w+)\]$/) { # Timer case, strip off brackets
|
||||
my $tm = $1;
|
||||
foreach $f (@timerFieldsAll) {
|
||||
my $a = $finals{$proto}->{$tm}->{$f};
|
||||
if (!($finals{Total}->{$tm}->{$f})) { # never touched
|
||||
$finals{Total}->{$tm}->{$f} = $a;
|
||||
} elsif ($f =~ /Min$/) {
|
||||
$finals{Total}->{$tm}->{$f} = $a
|
||||
if (($a > 0.0)
|
||||
&& ($a < $finals{Total}->{$tm}->{$f}));
|
||||
} elsif ($f =~ /Max$/) {
|
||||
$finals{Total}->{$tm}->{$f} = $a
|
||||
if ($a > $finals{Total}->{$tm}->{$f});
|
||||
} else {
|
||||
$finals{Total}->{$tm}->{$f} += $a;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
$finals{Total}->{$t} += $finals{$proto}->{$t};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# Convert Time2 to standard deviation
|
||||
foreach $proto (@protocolsAll) {
|
||||
foreach $n (@{$protocolFields{$proto}}) {
|
||||
my $t = $n; # dont modify original list
|
||||
if ($t =~ /^\[(\w+)\]$/) { $t = $1; } # strip off brackets
|
||||
next unless ($finals{$proto}->{$t}); # proto doesnt have timer
|
||||
next unless ($finals{$proto}->{$t}->{Try});
|
||||
next unless ($finals{$proto}->{$t}->{Time2} > 0);
|
||||
my $ss = $finals{$proto}->{$t}->{Time2};
|
||||
my $tot = $finals{$proto}->{$t}->{Time};
|
||||
my $n = $finals{$proto}->{$t}->{Try};
|
||||
next unless ($n > 0); # skip if this is 0
|
||||
|
||||
my $var = ($ss - (($tot * $tot) / $n)) / $n;
|
||||
print "$proto->$t var < 0: Time2=$ss Time=$tot n=$n\n"
|
||||
if ($var < 0);
|
||||
$finals{$proto}->{$t}->{Time2} = ($var > 0) ? sqrt ($var) : 0.0;
|
||||
}
|
||||
}
|
||||
|
||||
# Divide total times by trys to get averate time
|
||||
foreach $proto (@protocolsAll) {
|
||||
foreach $n (@{$protocolFields{$proto}}) {
|
||||
my $t = $n; # dont modify original list
|
||||
if ($t =~ /^\[(\w+)\]$/) { $t = $1; } # strip off brackets
|
||||
next unless ($finals{$proto}->{$t}); # proto doesnt have timer
|
||||
($finals{$proto}->{$t}->{Try}) || next;
|
||||
$finals{$proto}->{$t}->{Time} /= $finals{$proto}->{$t}->{Try}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# The text version is designed to be machine processable
|
||||
# commify and kformat are not used
|
||||
sub genTextReport {
|
||||
fileBackup ($resultstxt); # if processing as we go, backup old file
|
||||
# Open a text file to hold the results
|
||||
open(RESULTSTXT, ">$resultstxt") ||
|
||||
die "Couldn't open $resultstxt: $!";
|
||||
|
||||
# Store results as text
|
||||
printf RESULTSTXT "---- Mozilla MailStone Results $params{TSTAMP} ----\n";
|
||||
|
||||
printf RESULTSTXT "\t\t%s\n", $params{TITLE};
|
||||
printf RESULTSTXT "\t\t%s\n", $params{COMMENTS};
|
||||
printf RESULTSTXT "\n";
|
||||
printf RESULTSTXT "Test duration: %d %s. Rampup: %d %s. Reported duration %s seconds\n",
|
||||
figureTimeNumber ($params{TIME}),
|
||||
figureTimeUnits ($params{TIME}, "minutes"),
|
||||
figureTimeNumber ($params{RAMPTIME}),
|
||||
figureTimeUnits ($params{RAMPTIME}, "seconds"), $realTestSecs;
|
||||
printf RESULTSTXT "Number of reporting clients: %s of %s\n",
|
||||
$reportingClients, $totalProcs;
|
||||
|
||||
foreach $proto (@protocolsAll) {
|
||||
# do op counters
|
||||
printf RESULTSTXT "\n%-15s ", $proto;
|
||||
foreach $f (@timerFieldsAll) {
|
||||
#($f =~ m/^Time2$/o) && next;
|
||||
printf RESULTSTXT "%13s",
|
||||
($fieldNames{$f}) ? $fieldNames{$f} : $f;
|
||||
}
|
||||
foreach $n (@{$protocolFields{$proto}}) {
|
||||
my $t = $n; # dont modify original list
|
||||
unless ($t =~ /^\[(\w+)\]$/) { # scalar case
|
||||
#next; # skip scalars for now
|
||||
# do scalar counters. Column should line up with "Try"
|
||||
printf RESULTSTXT "\n%-15s ",
|
||||
$proto . ":" . (($timerNames{$t}) ? $timerNames{$t} : $t);
|
||||
printf RESULTSTXT
|
||||
"%13s", $finals{$proto}->{$t};
|
||||
next;
|
||||
} else { # strip off brackets
|
||||
$t = $1;
|
||||
}
|
||||
printf RESULTSTXT "\n%-15s ",
|
||||
$proto . ":" . (($timerNames{$t}) ? $timerNames{$t} : $t);
|
||||
foreach $f (@timerFieldsAll) {
|
||||
#($f =~ m/^Time2$/o) && next;
|
||||
if ($f =~ m/Time/o) {
|
||||
printf RESULTSTXT
|
||||
"%13.3f", $finals{$proto}->{$t}->{$f};
|
||||
} elsif ($f =~ m/Bytes/o) {
|
||||
printf RESULTSTXT
|
||||
"%13d", $finals{$proto}->{$t}->{$f};
|
||||
} else {
|
||||
printf RESULTSTXT
|
||||
"%13s", $finals{$proto}->{$t}->{$f};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# do ops/sec
|
||||
printf RESULTSTXT "\n\n%-15s ", $proto;
|
||||
foreach $f (@timerFieldsAll) {
|
||||
($f =~ m/^Time/o) && next;
|
||||
printf RESULTSTXT "%9s/sec",
|
||||
($fieldNames{$f}) ? $fieldNames{$f} : $f;
|
||||
}
|
||||
foreach $n (@{$protocolFields{$proto}}) {
|
||||
my $t = $n; # dont modify original list
|
||||
unless ($t =~ /^\[(\w+)\]$/) { # scalar case
|
||||
#next; # skip scalars for now
|
||||
# do scalar counter/sec. Column should line up with "Try"
|
||||
printf RESULTSTXT "\n%-15s ",
|
||||
$proto . ":" . (($timerNames{$t}) ? $timerNames{$t} : $t) . "/s";
|
||||
printf RESULTSTXT
|
||||
"%13.3f", $finals{$proto}->{$t} / $realTestSecs;
|
||||
next;
|
||||
} else {
|
||||
$t = $1;
|
||||
}
|
||||
printf RESULTSTXT "\n%-15s ",
|
||||
$proto . ":" . (($timerNames{$t}) ? $timerNames{$t} : $t) . "/s";
|
||||
foreach $f (@timerFieldsAll) {
|
||||
($f =~ m/^Time/o) && next;
|
||||
if ($f =~ m/Bytes/o) {
|
||||
printf RESULTSTXT
|
||||
"%13d",
|
||||
$finals{$proto}->{$t}->{$f} / $realTestSecs;
|
||||
} else {
|
||||
printf RESULTSTXT
|
||||
"%13.3f",
|
||||
$finals{$proto}->{$t}->{$f} / $realTestSecs;
|
||||
}
|
||||
}
|
||||
}
|
||||
printf RESULTSTXT "\n\n";
|
||||
}
|
||||
|
||||
if ($params{SYSCONFIG}) {
|
||||
print RESULTSTXT "\nSytem config details\n";
|
||||
if (($params{SYSCONFIG} =~ m/^\S+$/o)
|
||||
&& (open(SCFILE, "<$params{SYSCONFIG}"))) {
|
||||
while (<SCFILE>) {
|
||||
(m/^<\S+>\s*$/o) && next; # skip HTML only on them
|
||||
s/<\S+>//g; # trim out obvious HTML commands
|
||||
s/<!--.*-->//g; # trim out HTML comments
|
||||
print RESULTSTXT $_;
|
||||
}
|
||||
close(SCFILE);
|
||||
} else {
|
||||
my $l = $params{SYSCONFIG}; # filter similar to above
|
||||
$l =~ s/<\S+>//g; # trim out obvious HTML commands
|
||||
$l =~ s/<!--.*-->//g; # trim out HTML comments
|
||||
$l =~ s/\\\n/\n/g; # turn quoted newline to plain newline
|
||||
print RESULTSTXT $l;
|
||||
}
|
||||
}
|
||||
|
||||
close(RESULTSTXT);
|
||||
}
|
||||
|
||||
# Write the main part of the HTML page
|
||||
sub genHTMLReportStart {
|
||||
fileBackup ($resultshtml); # if processing as we go, backup old file
|
||||
# Open an html file to hold the results
|
||||
open(RESULTSHTML, ">$resultshtml") ||
|
||||
die "Couldn't open $resultshtml: $!";
|
||||
|
||||
print RESULTSHTML <<END;
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
|
||||
<HTML>
|
||||
<A NAME=TitleSection>
|
||||
<TITLE>
|
||||
Mozilla MailStone Results $params{TSTAMP}
|
||||
</TITLE>
|
||||
</A>
|
||||
<HEAD>
|
||||
</HEAD>
|
||||
<BODY TEXT="#000000" BGCOLOR="#FFFFFF" LINK="#0000FF" VLINK="#FF0000" ALINK="#000088">
|
||||
<CENTER>
|
||||
<HR NOSHADE WIDTH="100%">
|
||||
<H1>Mozilla MailStone Results $params{TSTAMP}</H1>
|
||||
<H2>$params{TITLE}</H2>
|
||||
<I>$params{COMMENTS}</I>
|
||||
<HR WIDTH="100%">
|
||||
</CENTER>
|
||||
|
||||
END
|
||||
printf RESULTSHTML "<BR><B>Test duration:</B> %d %s. ",
|
||||
figureTimeNumber ($params{TIME}),
|
||||
figureTimeUnits ($params{TIME}, "minutes");
|
||||
printf RESULTSHTML "<B>Rampup:</B> %d %s. ",
|
||||
figureTimeNumber ($params{RAMPTIME}),
|
||||
figureTimeUnits ($params{RAMPTIME}, "seconds");
|
||||
printf RESULTSHTML "<B>Reported duration:</B> %s seconds\n",
|
||||
commify ($realTestSecs);
|
||||
|
||||
printf RESULTSHTML "<BR><B>Reporting clients:</B> %s of %s\n",
|
||||
commify ($reportingClients), commify ($totalProcs);
|
||||
|
||||
print RESULTSHTML <<END;
|
||||
<BR>
|
||||
Test <A HREF="all.wld">complete workload</a> description.
|
||||
Filtered <A HREF="work.wld">workload</a> description.
|
||||
<BR>
|
||||
Plain <A HREF="results.txt">text version</a> of results.
|
||||
Log of <A HREF="stderr">stderr</a> and debugging output.
|
||||
<BR>
|
||||
|
||||
<A NAME=MonitoringSection></A>
|
||||
END
|
||||
|
||||
{ # list user requested logging
|
||||
my @logfiles = <$resultdir/*-pre.log>;
|
||||
if (@logfiles) {
|
||||
foreach $f (@logfiles) {
|
||||
$f =~ s/$resultdir\///o; # strip directory out
|
||||
$f =~ s/-pre\.log$//o; # strip extension off
|
||||
print RESULTSHTML "Pre test log: <A HREF=\"$f-pre.log\">$f</a><BR>\n";
|
||||
}
|
||||
}
|
||||
@logfiles = <$resultdir/*-run.log>;
|
||||
if (@logfiles) {
|
||||
foreach $f (@logfiles) {
|
||||
$f =~ s/$resultdir\///o; # strip directory out
|
||||
$f =~ s/-run\.log$//o; # strip extension off
|
||||
print RESULTSHTML "Monitoring log: <A HREF=\"$f-run.log\">$f</a><BR>\n";
|
||||
}
|
||||
}
|
||||
@logfiles = <$resultdir/*-post.log>;
|
||||
if (@logfiles) {
|
||||
foreach $f (@logfiles) {
|
||||
$f =~ s/$resultdir\///o; # strip directory out
|
||||
$f =~ s/-post\.log$//o; # strip extension off
|
||||
print RESULTSHTML "Post test log: <A HREF=\"$f-post.log\">$f</a><BR>\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#print RESULTSHTML
|
||||
#"<CENTER><H2>Results per protocol</H2></CENTER>\n";
|
||||
|
||||
foreach $proto (@protocolsAll) {
|
||||
printf RESULTSHTML "<A NAME=%sTable></A>\n", $proto;
|
||||
printf RESULTSHTML
|
||||
"<TABLE BORDER=2 CELLSPACING=2 CELLPADDING=2 COLS=%d WIDTH=\"95%%\">",
|
||||
2+$#{@{$protocolFields{$proto}}};
|
||||
print RESULTSHTML
|
||||
"<CAPTION>$proto Counters</CAPTION>\n";
|
||||
# do op counters
|
||||
print RESULTSHTML
|
||||
"<TR><TH>$proto</TH>\n";
|
||||
foreach $f (@timerFieldsAll) {
|
||||
#($f =~ m/^Time2$/o) && next;
|
||||
printf RESULTSHTML "<TH>%s</TH> ",
|
||||
($fieldNames{$f}) ? $fieldNames{$f} : $f;
|
||||
}
|
||||
print RESULTSHTML
|
||||
"</TR>\n";
|
||||
foreach $n (@{$protocolFields{$proto}}) {
|
||||
my $t = $n; # dont modify original list
|
||||
unless ($t =~ /^\[(\w+)\]$/) { # scalar case
|
||||
next; # skip scalars for now
|
||||
# do scalar counters. Column should line up with "Try"
|
||||
printf RESULTSHTML "<TR ALIGN=RIGHT><TH>%s</TH>\n",
|
||||
($timerNames{$t}) ? $timerNames{$t} : $t;
|
||||
printf RESULTSHTML
|
||||
"<TD>%s</TD> ",
|
||||
commify ($finals{$proto}->{$t});
|
||||
next;
|
||||
} else {
|
||||
$t = $1;
|
||||
}
|
||||
printf RESULTSHTML "<TR ALIGN=RIGHT><TH>%s</TH>\n",
|
||||
($timerNames{$t}) ? $timerNames{$t} : $t;
|
||||
foreach $f (@timerFieldsAll) {
|
||||
#($f =~ m/^Time2$/o) && next;
|
||||
if ($f =~ m/Time/o) {
|
||||
printf RESULTSHTML
|
||||
"<TD>%s</TD> ",
|
||||
tformat ($finals{$proto}->{$t}->{$f});
|
||||
} elsif ($f =~ m/Bytes/o) {
|
||||
printf RESULTSHTML
|
||||
"<TD>%s</TD> ",
|
||||
kformat ($finals{$proto}->{$t}->{$f});
|
||||
} else {
|
||||
printf RESULTSHTML
|
||||
"<TD>%s</TD> ",
|
||||
commify ($finals{$proto}->{$t}->{$f});
|
||||
}
|
||||
}
|
||||
print RESULTSHTML "</TR>\n";
|
||||
}
|
||||
|
||||
# do ops/sec
|
||||
print RESULTSHTML
|
||||
"<TR><TH>$proto</TH>\n";
|
||||
foreach $f (@timerFieldsAll) {
|
||||
($f =~ m/^Time/o) && next;
|
||||
printf RESULTSHTML "<TH>%s/sec</TH> ",
|
||||
($fieldNames{$f}) ? $fieldNames{$f} : $f;
|
||||
}
|
||||
print RESULTSHTML
|
||||
"</TR>\n";
|
||||
foreach $n (@{$protocolFields{$proto}}) {
|
||||
my $t = $n; # dont modify original list
|
||||
unless ($t =~ /^\[(\w+)\]$/) { # scalar case
|
||||
next; # skip scalars for now
|
||||
# do scalar counters. Column should line up with "Try"
|
||||
printf RESULTSHTML "<TR ALIGN=RIGHT><TH>%s</TH>\n",
|
||||
($timerNames{$t}) ? $timerNames{$t} : $t;
|
||||
printf RESULTSHTML
|
||||
"<TD>%.3f</TD> ",
|
||||
$finals{$proto}->{$t} / $realTestSecs;
|
||||
next;
|
||||
} else {
|
||||
$t = $1;
|
||||
}
|
||||
printf RESULTSHTML "<TR ALIGN=RIGHT><TH>%s</TH>\n",
|
||||
($timerNames{$t}) ? $timerNames{$t} : $t;
|
||||
foreach $f (@timerFieldsAll) {
|
||||
($f =~ m/^Time/o) && next;
|
||||
if ($f =~ m/Bytes/o) {
|
||||
printf RESULTSHTML
|
||||
"<TD>%s</TD> ",
|
||||
kformat ($finals{$proto}->{$t}->{$f} / $realTestSecs);
|
||||
} else {
|
||||
printf RESULTSHTML
|
||||
"<TD>%.3f</TD> ",
|
||||
$finals{$proto}->{$t}->{$f} / $realTestSecs;
|
||||
}
|
||||
}
|
||||
print RESULTSHTML "</TR>\n";
|
||||
}
|
||||
printf RESULTSHTML "</TABLE> <BR>\n\n";
|
||||
}
|
||||
|
||||
print RESULTSHTML <<END;
|
||||
|
||||
<BR>
|
||||
|
||||
<CENTER>
|
||||
<A NAME=GraphSection></A>
|
||||
END
|
||||
}
|
||||
|
||||
%genplotGraphs = ();
|
||||
|
||||
# Call genplot; and, if a graph is generated, insert the HTML reference to it
|
||||
sub genHTMLReportGraph {
|
||||
my $name = shift;
|
||||
my $title = shift;
|
||||
my $label = shift;
|
||||
my $protos = shift || die "genHTMLReportGraph: '$name' missing protocols";
|
||||
my $field = shift;
|
||||
my $vars = shift || die "genHTMLReportGraph: '$name' missing vars";
|
||||
|
||||
if ($genplotGraphs{$name}) {
|
||||
print "Graph $name has already been generated.\n";
|
||||
return;
|
||||
}
|
||||
|
||||
$genplotGraphs{$name} = $title;
|
||||
|
||||
# Delineate and tag each graph
|
||||
print RESULTSHTML "<A NAME=$name><HR SIZE=4 WIDTH=\"90%\"></A>\n";
|
||||
if (genPlot ($name, $title, $label, $protos, $field, $vars) > 0) {
|
||||
print RESULTSHTML <<END;
|
||||
<P><H3>$title</H3>
|
||||
<IMG SRC=$name.$params{IMAGETYPE} ALT="$label"></P>
|
||||
END
|
||||
} else {
|
||||
print RESULTSHTML "<BR>Graph \"$name\" contained no data (@{$vars}).<BR>\n";
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
# Write the final parts of the HTML page
|
||||
sub genHTMLReportEnd {
|
||||
print RESULTSHTML <<END;
|
||||
<!-- INSERT IMAGES HERE - DO NOT DELETE THIS LINE -->
|
||||
</CENTER>
|
||||
<A NAME=EndSection></A>
|
||||
END
|
||||
|
||||
if ($params{SYSCONFIG}) {
|
||||
print RESULTSHTML "<HR WIDTH=\"100%\">";
|
||||
print RESULTSHTML "<CENTER><H2>Details</H2></CENTER>\n";
|
||||
if (($params{SYSCONFIG} =~ m/^\S+$/o)
|
||||
&& (open(SCFILE, "<$params{SYSCONFIG}"))) { # see if its a file
|
||||
while (<SCFILE>) {
|
||||
print RESULTSHTML $_;
|
||||
}
|
||||
close(SCFILE);
|
||||
} else { # output text directly
|
||||
my $l = $params{SYSCONFIG};
|
||||
$l =~ s/\\\n/\n/g; # turn quoted newline to plain newline
|
||||
print RESULTSHTML $l;
|
||||
}
|
||||
}
|
||||
|
||||
print RESULTSHTML <<END;
|
||||
|
||||
<HR NOSHADE WIDTH="100%">
|
||||
|
||||
</BODY>
|
||||
</HTML>
|
||||
END
|
||||
close(RESULTSHTML);
|
||||
}
|
||||
|
||||
|
||||
# Actually generate the standard stuff
|
||||
setupTotals();
|
||||
genTextReport();
|
||||
|
||||
|
||||
genHTMLReportStart();
|
||||
|
||||
my $graphCount = 0;
|
||||
foreach $section (@workload) {
|
||||
next unless ($section->{sectionTitle} =~ /GRAPH/i);
|
||||
my $name = $section->{sectionParams};
|
||||
$name =~ s/name=\s*//; # strip off initial bit
|
||||
my @varlist = split (/[\s,]+/, $section->{VARIABLES});
|
||||
|
||||
$graphCount++;
|
||||
genHTMLReportGraph ($name, $section->{TITLE}, $section->{LABEL},
|
||||
($section->{FIELD} =~ /Time/o)
|
||||
? \@protocols : \@protocolsAll,
|
||||
$section->{FIELD}, \@varlist);
|
||||
}
|
||||
|
||||
if ($graphCount <= 0) { # use built ins
|
||||
|
||||
# generate the graphs we want
|
||||
# NOTE: the first argument (name), must be unique; sets file name
|
||||
genHTMLReportGraph ("connects",
|
||||
"Number of connections attempted", "Connections/sec",
|
||||
\@protocolsAll, "Try", ["conn" ]);
|
||||
genHTMLReportGraph ("connections",
|
||||
"Total connections", "Connections",
|
||||
\@protocolsAll, "", ["connections" ]);
|
||||
genHTMLReportGraph ("errors",
|
||||
"Number of connection errors", "Errors/sec",
|
||||
\@protocolsAll, "Error", ["conn", "banner", "login", "logout" ]);
|
||||
genHTMLReportGraph ("retrieves",
|
||||
"Number of messages read", "Messages/sec",
|
||||
\@protocolsAll, "Try", ["retrieve" ]);
|
||||
genHTMLReportGraph ("submits",
|
||||
"Number of messages written", "Messages/sec",
|
||||
\@protocolsAll, "Try", ["submit" ]);
|
||||
genHTMLReportGraph ("commands",
|
||||
"Protocol commands", "Commands/sec",
|
||||
\@protocolsAll, "Try", ["cmd" ]);
|
||||
genHTMLReportGraph ("readBytes",
|
||||
"Bytes read", "Bytes/sec",
|
||||
\@protocolsAll, "BytesR", ["login", "banner", "cmd", "retrieve", "submit", "logout" ]);
|
||||
genHTMLReportGraph ("writeBytes",
|
||||
"Bytes written", "Bytes/sec",
|
||||
\@protocolsAll, "BytesW", ["login", "banner", "cmd", "retrieve", "submit", "logout" ]);
|
||||
genHTMLReportGraph ("msgTime",
|
||||
"Message transfer time", "Seconds per message",
|
||||
\@protocols, "Time", ["cmd", "submit", "retrieve" ]);
|
||||
genHTMLReportGraph ("setupTime",
|
||||
"Connection setup time", "Seconds per connection",
|
||||
\@protocols, "Time", ["conn", "banner", "login" ]);
|
||||
genHTMLReportGraph ("blocks",
|
||||
"Number of mailstone blocks executed", "Blocks/sec",
|
||||
\@protocolsAll, "", ["blocks" ]);
|
||||
}
|
||||
|
||||
if ($params{ADDGRAPHS}) { # pick up additional graphs
|
||||
my @graphs = ();
|
||||
readWorkloadFile ($params{ADDGRAPHS}, \@graphs);
|
||||
foreach $section (@graphs) {
|
||||
next unless ($section->{sectionTitle} =~ /GRAPH/i);
|
||||
my $name = $section->{sectionParams};
|
||||
$name =~ s/name=\s*//; # strip off initial bit
|
||||
my @varlist = split (/[\s,]+/, $section->{VARIABLES});
|
||||
|
||||
$graphCount++;
|
||||
genHTMLReportGraph ($name, $section->{TITLE}, $section->{LABEL},
|
||||
($section->{FIELD} =~ /Time/o)
|
||||
? \@protocols : \@protocolsAll,
|
||||
$section->{FIELD}, \@varlist);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
genHTMLReportEnd();
|
||||
|
||||
return 1;
|
||||
@@ -1,205 +0,0 @@
|
||||
#!/bin/ksh
|
||||
|
||||
# global configuration parameters.
|
||||
# Fill in defaults for anything that is not already set
|
||||
|
||||
# Look for testname$test_form, first
|
||||
export test_form=${test_form:-""}
|
||||
|
||||
# string appended to every description
|
||||
export desc_conf=${desc_conf:-""}
|
||||
|
||||
# extra arguments common to all tests
|
||||
export extra_args=${extra_args:-""}
|
||||
|
||||
# error limit to abort sequence
|
||||
export error_limit=${error_limit:-100}
|
||||
|
||||
# set this to only show what it will do
|
||||
export only_show_it=${only_show_it:-0}
|
||||
|
||||
# time to allow the server to calm down after each run
|
||||
export sleep_time=${sleep_time:-5}
|
||||
|
||||
# This is where we store the important runs
|
||||
export save_dir=${save_dir:-"results.save"}
|
||||
|
||||
# Basic sanity test
|
||||
if [[ ! -x /usr/bin/perl || ! -f .license ]] ; then # see if setup was ever run
|
||||
echo "Critical files are missing. Run setup."
|
||||
exit 2;
|
||||
fi
|
||||
|
||||
find_timestamp () { # find the timestamp string from latest run
|
||||
#OLD timestamp=`ls -d results/[0-9]*.[0-9][0-9][0-9][0-9]?(a-z) | tail -1`
|
||||
|
||||
# list all directories with the timestamp pattern
|
||||
timestamp=`echo results/[0-9]*.[0-9][0-9][0-9][0-9]?([a-z])`
|
||||
# strip all but the last one
|
||||
timestamp=${timestamp##* }
|
||||
|
||||
# strip the top directory name out
|
||||
timestamp=${timestamp#results/}
|
||||
|
||||
# return it
|
||||
echo $timestamp
|
||||
return 0
|
||||
}
|
||||
|
||||
|
||||
# copy last mailstone run from the current directory to good results directory
|
||||
save_run () {
|
||||
|
||||
[[ -d $save_dir ]] || \
|
||||
mkdir $save_dir
|
||||
|
||||
[[ $only_show_it -gt 0 ]] && return 0 # dont do anything important
|
||||
|
||||
if [[ -n "$last_timestamp" && -d "results/$last_timestamp/" ]] ; then
|
||||
cp -pR results/$last_timestamp $save_dir/
|
||||
# index probably has lots of extra junk, but its better than nothing
|
||||
cp -pf results/index.html $save_dir/
|
||||
fi
|
||||
}
|
||||
|
||||
# Display and run a command. Skip if in only_show mode.
|
||||
run () {
|
||||
if [[ $only_show_it -gt 0 ]] ; then
|
||||
echo "Would run:" "$@"
|
||||
return 0
|
||||
fi
|
||||
echo "Running: " "$@"
|
||||
"$@"
|
||||
}
|
||||
|
||||
# Sleep. Skip if in only_show mode.
|
||||
run_sleep () {
|
||||
if [[ $only_show_it -gt 0 ]] ; then
|
||||
echo "Would sleep:" "$@"
|
||||
return 0
|
||||
fi
|
||||
echo "Sleeping: " "$@"
|
||||
sleep "$@"
|
||||
}
|
||||
# for readability, just use sleep
|
||||
alias sleep=run_sleep
|
||||
|
||||
|
||||
# This runs the actual mstone run and check for errors
|
||||
# compress tmp files
|
||||
# Usage: run_test testname description [args...]
|
||||
run_test () {
|
||||
testname="$1"; shift;
|
||||
desc="$1"; shift;
|
||||
|
||||
# see if a special version of this test exists
|
||||
if [[ -f conf/$testname$test_form.wld ]] ; then
|
||||
testname=$testname$test_form
|
||||
fi
|
||||
|
||||
#oldtimestamp=`find_timestamp`
|
||||
|
||||
if [[ $only_show_it -gt 0 ]] ; then
|
||||
echo "Would run:" mstone $testname -b "$desc $desc_conf" $extra_args "$@"
|
||||
if [[ ! -f conf/$testname.wld ]] ; then
|
||||
echo "Configuration Error: No such test $testname"
|
||||
fi
|
||||
return 0
|
||||
fi
|
||||
|
||||
echo "\n##########################################################"
|
||||
if [[ ! -f conf/$testname.wld ]] ; then
|
||||
echo "CONFIGURATION ERROR: No such test $testname"
|
||||
exit 2
|
||||
fi
|
||||
|
||||
echo "\nRunning:" mstone $testname -b "$desc $desc_conf" $extra_args "$@"
|
||||
# We actually bypass the mstone script
|
||||
/usr/bin/perl -Ibin -- bin/mailmaster.pl -w conf/$testname.wld -b "$desc $desc_conf" $extra_args "$@"
|
||||
stat=$?
|
||||
|
||||
# BUG if another test is running at the same time, this is wrong
|
||||
timestamp="`find_timestamp`"
|
||||
|
||||
# test failed to even run
|
||||
if [[ $stat -ne 0 ]]
|
||||
then
|
||||
echo "ABORT! Test failed to start"
|
||||
[[ -n "$mail_list" ]] && \
|
||||
mail_series "DotCom Failed run: `date`" "$mail_list"
|
||||
exit 2
|
||||
fi
|
||||
|
||||
# compress tmp files. get the csv files, too.
|
||||
gzip tmp/$timestamp/* results/$timestamp/*.csv
|
||||
|
||||
# stick the timestamp someplace global for a save_run
|
||||
export last_timestamp=$timestamp
|
||||
export all_timestamps="$all_timestamps $timestamp"
|
||||
|
||||
# save the results
|
||||
save_run
|
||||
|
||||
# see how many errors we hit
|
||||
totline=`grep 'Total:total ' results/$timestamp/results.txt`
|
||||
|
||||
# strip label and first field
|
||||
errors=${totline##+([+-z])+( )+([+-9])+( )}
|
||||
# strip trailing fields
|
||||
errors=${errors%% *}
|
||||
|
||||
echo "" # space things out
|
||||
|
||||
if [[ $errors -gt $error_limit ]] ; then
|
||||
echo "ABORT! Errors ($errors) exceed error limit ($error_limit)"
|
||||
[[ -n "$mail_list" ]] && \
|
||||
mail_series "DotCom Aborted run: `date`" "$mail_list"
|
||||
exit 1
|
||||
fi
|
||||
echo "Run completed OK ($errors errors). Timestamp $timestamp"
|
||||
|
||||
sleep $sleep_time
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
# Usage: mail_series subject "address,address,..."
|
||||
mail_series () {
|
||||
subject=$1; shift
|
||||
file=/tmp/series$$.tar
|
||||
|
||||
if [[ $only_show_it -gt 0 ]] ; then
|
||||
echo "Would mail results about $subject" to "$@"
|
||||
return 0
|
||||
fi
|
||||
echo "Mailing results about $subject" to "$@"
|
||||
|
||||
tar cf $file $save_dir/index.html
|
||||
for f in $all_timestamps ; do
|
||||
tar rf $file $save_dir/$f
|
||||
done
|
||||
gzip $file
|
||||
echo "$all_timestamps" | uuenview -b -30000 -s "$subject" -m "$@" $file.gz
|
||||
rm -f $file.gz
|
||||
}
|
||||
|
||||
# parse command line arguments
|
||||
while [[ -n "$1" ]]
|
||||
do
|
||||
case $1 in
|
||||
# -n mode, do not execute, just show
|
||||
-n) only_show_it=1; shift;;
|
||||
|
||||
# set test form
|
||||
-f) shift; test_form=$1; shift;;
|
||||
|
||||
# set test extra description
|
||||
-d) shift; desc_conf=$1; shift;;
|
||||
|
||||
# Rest are to be passed in exactly
|
||||
--) shift; break;;
|
||||
|
||||
#default, pick up as an extra arg
|
||||
*) extra_args="$extra_args $1"; shift;;
|
||||
esac
|
||||
done
|
||||
@@ -1,464 +0,0 @@
|
||||
#!/usr/bin/env perl
|
||||
# The contents of this file are subject to the Netscape Public
|
||||
# License Version 1.1 (the "License"); you may not use this file
|
||||
# except in compliance with the License. You may obtain a copy of
|
||||
# the License at http://www.mozilla.org/NPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS
|
||||
# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
# implied. See the License for the specific language governing
|
||||
# rights and limitations under the License.
|
||||
#
|
||||
# The Original Code is the Netscape Mailstone utility,
|
||||
# released March 17, 2000.
|
||||
#
|
||||
# The Initial Developer of the Original Code is Netscape
|
||||
# Communications Corporation. Portions created by Netscape are
|
||||
# Copyright (C) 1999-2000 Netscape Communications Corporation. All
|
||||
# Rights Reserved.
|
||||
#
|
||||
# Contributor(s): Dan Christian <robodan@netscape.com>
|
||||
# Marcel DePaolis <marcel@netcape.com>
|
||||
# Jim Salter <jsalter@netscape.com>
|
||||
#
|
||||
# Alternatively, the contents of this file may be used under the
|
||||
# terms of the GNU Public License (the "GPL"), in which case the
|
||||
# provisions of the GPL are applicable instead of those above.
|
||||
# If you wish to allow use of your version of this file only
|
||||
# under the terms of the GPL and not to allow others to use your
|
||||
# version of this file under the NPL, indicate your decision by
|
||||
# deleting the provisions above and replace them with the notice
|
||||
# and other provisions required by the GPL. If you do not delete
|
||||
# the provisions above, a recipient may use your version of this
|
||||
# file under either the NPL or the GPL.
|
||||
#####################################################
|
||||
|
||||
# usage: setup.pl setup|cleanup|checktime|timesync -m machine_file
|
||||
# message files are expected to be in ./data/ and end with ".msg"
|
||||
|
||||
print "Netscape Mailstone.\nCopyright (c) 1997-2000 Netscape Communications Corp.\n";
|
||||
|
||||
$mode = shift; # mode must be first
|
||||
|
||||
# this parses the command line for -m machinefile
|
||||
# also sets many defaults
|
||||
do 'args.pl'|| die $@;
|
||||
sub warn_system;
|
||||
sub die_system;
|
||||
|
||||
parseArgs(); # parse command line
|
||||
|
||||
setConfigDefaults(); # setup RSH and RCP
|
||||
|
||||
$cpcmd = "cp"; # copy files... dir
|
||||
$rmcmd = "rm -f"; # remove files...
|
||||
|
||||
die "Must specify workload file" unless (@workload);
|
||||
|
||||
# Add or change client machines
|
||||
sub configClients {
|
||||
print "\n You can enter multiple machines like this: host1,host2\n";
|
||||
my @d = <bin/*/bin>;
|
||||
if (@d) {
|
||||
my @d2;
|
||||
foreach (@d2 = @d) { s/^bin\/// }
|
||||
foreach (@d = @d2) { s/\/bin$// }
|
||||
print " These OS versions are available:\n@d\n";
|
||||
}
|
||||
|
||||
foreach $section (@workload) {
|
||||
next unless ($section->{sectionTitle} =~ /CLIENT/i);
|
||||
my $slist = $section->{sectionParams};
|
||||
$slist =~ s/HOSTS=\s*//; # strip off initial bit
|
||||
my $arch = "default OS";
|
||||
$arch = $section->{ARCH} if ($section->{ARCH});
|
||||
print "\nWhat is the name of the client(s) for $arch [$slist]: ";
|
||||
my $ans = <STDIN>; chomp $ans;
|
||||
if ($ans) {
|
||||
$ans =~ s/\s//g; # strip any whitespace
|
||||
fileReplaceText ($params{WORKLOAD}, "<CLIENT", $slist, $ans);
|
||||
}
|
||||
}
|
||||
while (1) {
|
||||
print "\nWhat additional client(s) [none]: ";
|
||||
my $ans = <STDIN>; chomp $ans;
|
||||
last unless ($ans); # done
|
||||
last if ($ans =~ /^none$/i);
|
||||
$ans =~ s/\s//g; # strip any whitespace
|
||||
my $block = "\n<CLIENT HOSTS=$ans>\n";
|
||||
|
||||
print "What OS type [default]: ";
|
||||
my $ans = <STDIN>; chomp $ans;
|
||||
$block .= " Arch\t$ans\n" if ($ans && !($ans =~ /^default$/i));
|
||||
|
||||
$block .= "</CLIENT>\n";
|
||||
fileInsertAfter ($params{WORKLOAD}, "^</CLIENT>", $block);
|
||||
}
|
||||
}
|
||||
|
||||
# Create a user ldif file
|
||||
sub configUserLdif {
|
||||
my $name = "conf/$defaultSection->{SERVER}.ldif";
|
||||
print "\nWhat file to you want to create [$name]? ";
|
||||
$ans = <STDIN>; chomp $ans;
|
||||
$name = $ans if ($ans);
|
||||
|
||||
my $mode = "users";
|
||||
print "\nDo you want to create a broadcast account [y]? ";
|
||||
$ans = <STDIN>;
|
||||
$mode .= " broadcast" unless ($ans =~ /^n/i);
|
||||
|
||||
my $basedn = $defaultSection->{SERVER}; # pick a default
|
||||
$basedn =~ s/^.*?\.//; # strip off before first dot
|
||||
$basedn = "o=$basedn";
|
||||
|
||||
print "\nWhat is LDAP base DN [$basedn]? ";
|
||||
$ans = <STDIN>; chomp $ans;
|
||||
$basedn = $ans if ($ans);
|
||||
|
||||
my $args = $params{MAKEUSERSARGS};
|
||||
|
||||
print "\n Common additional makeusers arguments:\n";
|
||||
print "\t-s storeName -x storeCount \tMultiple store partitions\n";
|
||||
print "\t[-3|-4] \tConfigure for NSMS 3.x or 4.x\n";
|
||||
print "Any extra arguments to makeusers [$args]? ";
|
||||
$ans = <STDIN>; chomp $ans;
|
||||
$args = $ans if ($ans);
|
||||
|
||||
my $perlbin = "/usr/bin/perl";
|
||||
|
||||
$params{DEBUG} &&
|
||||
print "$perlbin -Ibin -- bin/makeusers.pl $mode -w $params{WORKLOAD} -b '$basedn' -o $name $args\n";
|
||||
|
||||
print "\nGenerating $name (this can take a while)\n";
|
||||
warn_system "$perlbin -Ibin -- bin/makeusers.pl $mode -w $params{WORKLOAD} -b '$basedn' -o $name $args";
|
||||
print "LDIF generation complete. See $name\n";
|
||||
print "\tSee the manual or INSTALL to create users using the LDIF file.\n";
|
||||
}
|
||||
|
||||
# This uses a match pattern plus text to text replacements.
|
||||
# Could make all changes and then write out new workload
|
||||
# You would have to be carefull about sections with multi-line support.
|
||||
sub configWorkload {
|
||||
my $ans;
|
||||
|
||||
print "\nWhat is the name of the mail host [$defaultSection->{SERVER}]: ";
|
||||
$ans = <STDIN>; chomp $ans;
|
||||
if ($ans) {
|
||||
fileReplaceText ($params{WORKLOAD},
|
||||
"(SERVER|SMTPMAILFROM|ADDRESSFORMAT)",
|
||||
$defaultSection->{SERVER}, $ans);
|
||||
$defaultSection->{SERVER} = $ans; # needed for ldif generation
|
||||
}
|
||||
print "\nWhat is the user name pattern [$defaultSection->{LOGINFORMAT}]: ";
|
||||
$ans = <STDIN>; chomp $ans;
|
||||
if ($ans) {
|
||||
fileReplaceText ($params{WORKLOAD},
|
||||
"(LOGINFORMAT|ADDRESSFORMAT)",
|
||||
$defaultSection->{LOGINFORMAT}, $ans);
|
||||
$ans =~ s/%ld/0/; # create smtpMailFrom user
|
||||
my $olduser = $defaultSection->{SMTPMAILFROM};
|
||||
$olduser =~ s/@.*$//; # strip off after @
|
||||
fileReplaceText ($params{WORKLOAD},
|
||||
"SMTPMAILFROM",
|
||||
$olduser, $ans);
|
||||
}
|
||||
|
||||
print "\nWhat is the password pattern [$defaultSection->{PASSWDFORMAT}]: ";
|
||||
$ans = <STDIN>; chomp $ans;
|
||||
fileReplaceText ($params{WORKLOAD}, "PASSWDFORMAT",
|
||||
$defaultSection->{PASSWDFORMAT}, $ans);
|
||||
|
||||
$defaultSection->{NUMLOGINS} = 100 unless ($defaultSection->{NUMLOGINS});
|
||||
print "\nHow many users [$defaultSection->{NUMLOGINS}]: ";
|
||||
$ans = <STDIN>; chomp $ans;
|
||||
fileReplaceText ($params{WORKLOAD}, "(NUMADDRESSES|NUMLOGINS)",
|
||||
$defaultSection->{NUMLOGINS}, $ans);
|
||||
|
||||
$defaultSection->{FIRSTLOGIN} = 0 unless ($defaultSection->{FIRSTLOGIN});
|
||||
print "\nWhat is the first user number [$defaultSection->{FIRSTLOGIN}]: ";
|
||||
$ans = <STDIN>; chomp $ans;
|
||||
fileReplaceText ($params{WORKLOAD}, "(FIRSTADDRESS|FIRSTLOGIN)",
|
||||
$defaultSection->{FIRSTLOGIN}, $ans);
|
||||
|
||||
unless ($params{NT}) {
|
||||
configClients ();
|
||||
}
|
||||
|
||||
print "\nDo you want to view the edited $params{WORKLOAD} [y]? ";
|
||||
$ans = <STDIN>;
|
||||
unless ($ans =~ /^n/i) {
|
||||
print "Here is the edited $params{WORKLOAD}:\n\n";
|
||||
fileShow ($params{WORKLOAD});
|
||||
print "\n";
|
||||
}
|
||||
|
||||
print "\nDo you want to generate a user LDIF file [y]? ";
|
||||
$ans = <STDIN>;
|
||||
unless ($ans =~ /^n/i) {
|
||||
configUserLdif ();
|
||||
}
|
||||
}
|
||||
|
||||
# See if license file has been displayed
|
||||
if (($mode ne "cleanup") && (! -f ".license" )) {
|
||||
fileShow ("LICENSE");
|
||||
# SEAN: blow off annoying agreement message.
|
||||
# print "\nDo you agree to the terms of the license? (yes/no) ";
|
||||
# my $ans = <STDIN>;
|
||||
# print "\n";
|
||||
# unless ($ans =~ /^yes$/i) {
|
||||
# print "License not agreed to.\n";
|
||||
# exit 0;
|
||||
# }
|
||||
my ($sec, $min, $hour, $mday, $mon, $year) = localtime;
|
||||
open (LIC, ">.license");
|
||||
printf LIC "%04d$mon$mday$hour$min\n", $year+1900;
|
||||
close (LIC);
|
||||
}
|
||||
|
||||
if ($mode eq "config") { # re-run config
|
||||
configWorkload ();
|
||||
|
||||
print "\nMake any additional changes to $params{WORKLOAD} and then re-run 'setup'\n";
|
||||
exit 0;
|
||||
} elsif ($mode ne "cleanup") { # check if configured
|
||||
my $unconf = 0; # see if default values are in use
|
||||
foreach $section (@workload) {
|
||||
($section->{SERVER})
|
||||
&& ($section->{SERVER} =~ /example\.com$/)
|
||||
&& $unconf++;
|
||||
($section->{SMTPMAILFROM})
|
||||
&& ($section->{SMTPMAILFROM} =~ /example\.com$/)
|
||||
&& $unconf++;
|
||||
($section->{ADDRESSFORMAT})
|
||||
&& ($section->{ADDRESSFORMAT} =~ /example\.com$/)
|
||||
&& $unconf++;
|
||||
last if ($unconf > 0);
|
||||
}
|
||||
if ($unconf > 0) {
|
||||
print "Server has not been configured (example.com is an invalid address).\n";
|
||||
print "Do you want to setup a simple configuration now [y]?";
|
||||
my $ans = <STDIN>;
|
||||
if ($ans =~ /^n/i) {
|
||||
print "Re-run setup when you have edited the configuration.\n";
|
||||
exit 0;
|
||||
}
|
||||
configWorkload ();
|
||||
|
||||
print "\nMake any additional changes to $params{WORKLOAD} and then re-run 'setup'\n";
|
||||
exit 0;
|
||||
}
|
||||
}
|
||||
|
||||
if ($mode eq "timesync") {
|
||||
if ($params{NT}) {
|
||||
print "Timesync has no effect on NT\n";
|
||||
exit 0;
|
||||
}
|
||||
my ($sec, $min, $hour, $mday, $mon, $year) = localtime;
|
||||
$mon += 1; # adjust from 0 based to std
|
||||
$systime = sprintf ("%02d%02d%02d%02d%04d.%02d",
|
||||
$mon, $mday, $hour, $min, 1900+$year, $sec);
|
||||
} elsif ($mode eq "checktime") {
|
||||
if ($params{NT}) { # if running on NT, then only single client
|
||||
print "Checktime not needed on NT\n";
|
||||
exit 0;
|
||||
}
|
||||
mkdir ("$resultbase", 0775);
|
||||
mkdir ("$tmpbase", 0775);
|
||||
foreach $section (@workload) {
|
||||
next unless ($section->{sectionTitle} =~ /CLIENT/i);
|
||||
my $slist = $section->{sectionParams};
|
||||
$slist =~ s/HOSTS=\s*//; # strip off initial bit
|
||||
foreach $cli (split /[\s,]/, $slist) {
|
||||
open MAKEIT, ">$tmpbase/$cli.tim";
|
||||
close MAKEIT;
|
||||
}
|
||||
}
|
||||
} elsif (($mode eq "setup") || ($mode eq "cleanup")) {
|
||||
@msgs = <data/*.msg>;
|
||||
foreach (@files = @msgs) { s/data\/// }
|
||||
print "Found these message files:\n@files\n\n";
|
||||
if ($params{NT}) { # handle NT localhost here
|
||||
exit 0 if ($mode =~ /cleanup$/);
|
||||
my $clipath = "bin/WINNT4.0/bin/mailclient.exe";
|
||||
print "Copying $clipath and message files to $cli\n";
|
||||
die_system "copy $clipath $params{TEMPDIR}";
|
||||
foreach $f (@files) {
|
||||
die_system "copy $f $params{TEMPDIR}";
|
||||
}
|
||||
exit 0; # without perl:fork, no more to do
|
||||
}
|
||||
}
|
||||
|
||||
# iterate over every client in the testbed, complete the cmd and rsh
|
||||
foreach $section (@workload) {
|
||||
next unless ($section->{sectionTitle} =~ /CLIENT/i);
|
||||
my $slist = $section->{sectionParams};
|
||||
$slist =~ s/HOSTS=\s*//; # strip off initial bit
|
||||
foreach $cli (split /[\s,]/, $slist) {
|
||||
my $rsh = ($section->{RSH}) ? $section->{RSH} : $params{RSH};
|
||||
my $rcp = ($section->{RCP}) ? $section->{RCP} : $params{RCP};
|
||||
my $tempdir;
|
||||
if ($section->{TEMPDIR}) {
|
||||
$tempdir = $section->{TEMPDIR};
|
||||
} elsif ($params{TEMPDIR}) {
|
||||
$tempdir = $params{TEMPDIR};
|
||||
}
|
||||
|
||||
my $cliarch = $section->{ARCH};
|
||||
|
||||
# presumed architecture for bin/mailclient on localhost:
|
||||
my $local_arch = `bin/nsarch`;
|
||||
chomp $local_arch;
|
||||
|
||||
# Try to determine arch if it hasn't been explicitly set.
|
||||
if (!$cliarch) {
|
||||
if ($cli =~ /localhost/) {
|
||||
$cliarch = `bin/nsarch`;
|
||||
chomp $cliarch;
|
||||
} else {
|
||||
$cliarch = `$rsh $cli sh < bin/nsarch`;
|
||||
chomp $cliarch;
|
||||
}
|
||||
}
|
||||
|
||||
# most time critical first
|
||||
if ($mode eq "timesync") {
|
||||
next if ($cli =~ /^localhost$/i); # dont reset our own time
|
||||
# run all these in parallel to minimize skew
|
||||
next if ($cliarch eq "NT4.0");
|
||||
forkproc ($rsh, $cli, "date $systime");
|
||||
}
|
||||
|
||||
elsif ($mode eq "checktime") {
|
||||
# run all these in parallel to minimize skew
|
||||
forkproc ($rsh, $cli, ($cliarch eq "NT4.0")
|
||||
? "time" : "date",
|
||||
"/dev/null", "$tmpbase/$cli.tim");
|
||||
}
|
||||
|
||||
elsif ($mode eq "setup") {
|
||||
my ($clibin) = split /\s/, (($section->{COMMAND})
|
||||
? $section->{COMMAND}
|
||||
: $params{CLIENTCOMMAND});
|
||||
my $clipath = ''; # do nothing by default
|
||||
|
||||
# Look for architecture-specific binary.
|
||||
if ($cliarch) {
|
||||
|
||||
# fallback to just os-name if we can't find an exact match.
|
||||
my $approx = $cliarch;
|
||||
$approx =~ s/^(\D+).*/$1/;
|
||||
my $approx_bin = <"bin/${approx}*/bin/$clibin">;
|
||||
|
||||
if (-x "bin/$cliarch/bin/$clibin") {
|
||||
# exact match.
|
||||
$clipath = "bin/$cliarch/bin/$clibin";
|
||||
} elsif (-x $approx_bin) {
|
||||
# approximate match
|
||||
$clipath = $approx_bin;
|
||||
} elsif ($local_arch =~ /^$approx/) {
|
||||
# same arch as localhost
|
||||
$clipath = "bin/mailclient";
|
||||
} else {
|
||||
print STDERR
|
||||
"Requested OS $cliarch for $cli not found. ",
|
||||
"Not copying binary.\n";
|
||||
}
|
||||
} else {
|
||||
# arch not found
|
||||
print STDERR "Cannot determine architecture for $cli. ",
|
||||
"Not copying binary.\n";
|
||||
}
|
||||
# See if we have anything to copy:
|
||||
if ("$clipath @files" !~ /\S/) {
|
||||
print STDERR "Nothing to copy to $cli. Skipping.\n";
|
||||
next;
|
||||
}
|
||||
my $rdir = ($tempdir) ? "$tempdir/" : ".";
|
||||
# chmod so that the remote files can be easily cleaned up
|
||||
my $rcmd = "chmod g+w @files $clibin; uname -a";
|
||||
$rcmd = "cd $tempdir; " . $rcmd if ($tempdir);
|
||||
$rdir =~ s!/!\\!g if ($cliarch eq "NT4.0");
|
||||
if ($cli =~ /^localhost$/i) {
|
||||
die "TEMPDIR must be set for 'localhost'\n"
|
||||
unless ($tempdir);
|
||||
die "Invalid local NT copy. Should never get here.\n"
|
||||
if ($cliarch eq "NT4.0"); # should never happen
|
||||
print "Copying $clipath and message files to $rdir\n";
|
||||
die_system ("$cpcmd @msgs $clipath $rdir");
|
||||
die_system ($rcmd);
|
||||
} else {
|
||||
print "$rcp $clipath @msgs $cli:$rdir\n" if ($params{DEBUG});
|
||||
print "Copying $clipath and message files to $cli:$rdir\n";
|
||||
warn_system (split (/\s+/, $rcp), $clipath, @msgs, "$cli:$rdir");
|
||||
next if ($cliarch eq "NT4.0"); # chmod not valid
|
||||
print "rcmd='$rcmd'\n" if ($params{DEBUG});
|
||||
die_system (split (/\s+/, $rsh), $cli, $rcmd);
|
||||
}
|
||||
print "\n";
|
||||
}
|
||||
|
||||
elsif ($mode eq "cleanup") {
|
||||
if ($params{DEBUG}) { # get debug files
|
||||
print "Cleaning up debug files on $cli\n";
|
||||
my $rcmd = ($cliarch eq "NT4.0") ? "DEL" : "$rmcmd";
|
||||
$rmcmd .= " mstone-debug.[0-9]*";
|
||||
$rcmd = "cd $tempdir; " . $rcmd if ($tempdir);
|
||||
$rcmd =~ s/;/&&/g if ($cliarch eq "NT4.0");
|
||||
if ($cli =~ /^localhost$/i) {
|
||||
die "TEMPDIR must be set for 'localhost'\n"
|
||||
unless ($tempdir);
|
||||
warn_system ($rcmd);
|
||||
} else {
|
||||
warn_system (split (/\s+/, $rsh), $cli, $rcmd);
|
||||
}
|
||||
} else {
|
||||
print "Cleaning $cli\n";
|
||||
my $rcmd = ($cliarch eq "NT4.0") ? "DEL" : "$rmcmd";
|
||||
$rcmd .= " $clibin @files";
|
||||
$rcmd = "cd $tempdir; " . $rcmd if ($tempdir);
|
||||
$rcmd =~ s/;/&&/g if ($cliarch eq "NT4.0");
|
||||
if ($cli =~ /^localhost$/i) {
|
||||
die "TEMPDIR must be set for 'localhost'\n"
|
||||
unless ($tempdir);
|
||||
warn_system ($rcmd);
|
||||
} else {
|
||||
warn_system (split (/\s+/, $rsh), $cli, $rcmd);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
else {
|
||||
die "Couldn't recognize mode $mode!\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# wait for children to finish
|
||||
if (($mode eq "timesync") || ($mode eq "checktime")) {
|
||||
$pid = wait();
|
||||
while ($pid != -1) {
|
||||
$pid = wait();
|
||||
}
|
||||
}
|
||||
|
||||
# Print the results of the time checks
|
||||
if ($mode eq "checktime") {
|
||||
print "Time from each client:\n";
|
||||
foreach $section (@workload) {
|
||||
next unless ($section->{sectionTitle} =~ /CLIENT/i);
|
||||
my $slist = $section->{sectionParams};
|
||||
$slist =~ s/HOSTS=\s*//; # strip off initial bit
|
||||
foreach $cli (split /[\s,]/, $slist) {
|
||||
open TIMEFILE, "$tmpbase/$cli.tim"
|
||||
|| warn "Counldn't open $tmpbase/$cli.tim\n";
|
||||
printf "%32s: ", $cli;
|
||||
while (<TIMEFILE>) { print; last;} # single line (2 on NT)
|
||||
close(TIMEFILE);
|
||||
unlink "$tmpbase/$cli.tim";
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,280 +0,0 @@
|
||||
/*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is the Netscape Mailstone utility,
|
||||
* released March 17, 2000.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1999-2000 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s): Sean O'Rourke <sean@sendmail.com>
|
||||
* Thom O'Connor <thom@sendmail.com>
|
||||
* Sendmail, Inc.
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the
|
||||
* terms of the GNU Public License Version 2 or later (the "GPL"), in
|
||||
* which case the provisions of the GPL are applicable instead of
|
||||
* those above. If you wish to allow use of your version of this file
|
||||
* only under the terms of the GPL and not to allow others to use your
|
||||
* version of this file under the NPL, indicate your decision by
|
||||
* deleting the provisions above and replace them with the notice and
|
||||
* other provisions required by the GPL. If you do not delete the
|
||||
* provisions above, a recipient may use your version of this file
|
||||
* under either the NPL or the GPL.
|
||||
*/
|
||||
|
||||
use Thread qw(async);
|
||||
use FileHandle qw(_IOLBF);
|
||||
use Socket;
|
||||
use strict;
|
||||
use Getopt::Long;
|
||||
|
||||
# options
|
||||
my $maxconn = SOMAXCONN;
|
||||
my $t_banner = 0;
|
||||
my $t_from = 0;
|
||||
my $t_rcpt = 0;
|
||||
my $t_dot = 0;
|
||||
my $port = 25;
|
||||
my $cs = '';
|
||||
my $log = '';
|
||||
my $proto = getprotobyname('tcp');
|
||||
|
||||
# statistics
|
||||
my ($cmds, $errs, $bytesw, $bytesr, $msgs);
|
||||
|
||||
GetOptions('maxconn:i' => \$maxconn,
|
||||
'banner-delay:i' => \$t_banner,
|
||||
'from-delay:i' => \$t_from,
|
||||
'rcpt-delay:i' => \$t_rcpt,
|
||||
'dot-delay:i' => \$t_dot,
|
||||
'log:s' => \$log,
|
||||
'checksums:s' => sub { use Digest::MD5; $cs = $_[0]; })
|
||||
|| &usage;
|
||||
|
||||
if (@ARGV == 1) {
|
||||
($port) = @ARGV;
|
||||
}
|
||||
|
||||
if ($log) {
|
||||
if (open(LOG, ">$log")) {
|
||||
print STDERR "Logging messages to $log\n";
|
||||
} else {
|
||||
warn ("Cannot open logfile $log\n");
|
||||
$log = '';
|
||||
}
|
||||
}
|
||||
|
||||
socket(S, PF_INET, SOCK_STREAM, $proto) || die $!;
|
||||
setsockopt(S, SOL_SOCKET, SO_REUSEADDR, pack("l", 1)) || die $!;
|
||||
|
||||
(bind(S, sockaddr_in($port, INADDR_ANY))
|
||||
&& listen(S, $maxconn))
|
||||
|| die $!;
|
||||
|
||||
my $addr;
|
||||
my $fh = new FileHandle;
|
||||
my $cnt = 0;
|
||||
|
||||
$SIG{INT} = sub { close(LOG); print STDERR "done\n"; exit 0; };
|
||||
|
||||
while(my $addr = accept($fh, S)) {
|
||||
if (++$cnt % 100 == 0) {
|
||||
print STDERR "$cnt\r";
|
||||
}
|
||||
my $thr = async { do_smtp($addr, $fh); };
|
||||
$thr->join;
|
||||
$fh = new FileHandle;
|
||||
}
|
||||
|
||||
sub usage
|
||||
{
|
||||
print STDERR <<EOS;
|
||||
Usage: $0 [options] [port]
|
||||
EOS
|
||||
exit -1;
|
||||
}
|
||||
|
||||
sub netline
|
||||
{
|
||||
my $fh = shift;
|
||||
my $line = $fh->getline;
|
||||
$line =~ s/\r\n$// if $line;
|
||||
$line;
|
||||
}
|
||||
|
||||
sub millisleep
|
||||
{
|
||||
my $t = shift;
|
||||
select(undef, undef, undef, $t) if $t > 0;
|
||||
}
|
||||
|
||||
sub netprint($@)
|
||||
{
|
||||
my ($fh, @stuff) = @_;
|
||||
foreach (@_) {
|
||||
s/([^\r])\n/$1\r\n/g;
|
||||
$fh->print($_);
|
||||
}
|
||||
}
|
||||
|
||||
sub do_smtp
|
||||
{
|
||||
my ($addr, $s) = @_;
|
||||
my $buf;
|
||||
my ($port, $iaddr) = sockaddr_in($addr);
|
||||
my $name = gethostbyaddr($iaddr, AF_INET);
|
||||
$s->setvbuf($buf, _IOLBF, 1024);
|
||||
|
||||
millisleep($t_banner);
|
||||
$s->print("220 wazzup, bro?\r\n");
|
||||
my %state = ('conn' => $s,
|
||||
'host' => $name);
|
||||
my %funcs = ('helo' => \&do_helo,
|
||||
'ehlo' => \&do_helo,
|
||||
'word' => \&do_helo,
|
||||
|
||||
'quit' => \&do_quit,
|
||||
'latr' => \&do_quit,
|
||||
|
||||
'mail' => \&do_from,
|
||||
'rcpt' => \&do_rcpt,
|
||||
'data' => \&do_data,
|
||||
'rset' => \&do_ok,
|
||||
'vrfy' => \&do_ok,
|
||||
'noop' => \&do_ok,
|
||||
);
|
||||
while (my $line = netline($s))
|
||||
{
|
||||
my ($cmd, $arg) = ($line =~ /^\s*(\S+)\s*(.*)$/);
|
||||
die "cmd = `$cmd'" unless ($cmd = lc($cmd));
|
||||
# fail 1% of commands
|
||||
if ($funcs{$cmd}) {
|
||||
&{$funcs{$cmd}}(\%state, $cmd, $arg, \%funcs);
|
||||
} else {
|
||||
$s->print("500 5.0.0 no. Just... no.\r\n");
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
sub already_said_that
|
||||
{
|
||||
my ($state, $cmd, $arg) = @_;
|
||||
$state->{conn}->print("503 5.0.0 Dude, you already said that.\r\n");
|
||||
}
|
||||
|
||||
sub do_helo
|
||||
{
|
||||
my ($state, $cmd, $arg) = @_;
|
||||
$state->{helohost} = $arg;
|
||||
die unless $cmd;
|
||||
if ($cmd eq 'helo') {
|
||||
if ($arg eq $state->{host}) {
|
||||
$state->{conn}->print("221 hello Mr. Honest\r\n");
|
||||
} else {
|
||||
$state->{conn}->print("221 We know where you live, $state->{iaddr}\r\n");
|
||||
}
|
||||
} elsif ($cmd eq 'ehlo') {
|
||||
my $esmtp = <<EOS;
|
||||
250-localhost is pleased to make your acquaintance, and offers:
|
||||
250 8bitmime
|
||||
EOS
|
||||
if ($arg) {
|
||||
netprint($state->{conn}, $esmtp);
|
||||
} else {
|
||||
$state->{conn}->print("501 5.0.0 tell me more...\r\n");
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
$state->{conn}->print("221 2.0.0 peace brother\r\n");
|
||||
}
|
||||
}
|
||||
|
||||
sub do_quit
|
||||
{
|
||||
my ($state, $cmd) = @_;
|
||||
$state->{conn}->print( "221 2.0.0 drop in any time\r\n");
|
||||
close ($state->{conn});
|
||||
}
|
||||
|
||||
sub do_from
|
||||
{
|
||||
my ($state, $cmd, $args, $funcs) = @_;
|
||||
millisleep($t_from);
|
||||
$state->{conn}->print( "250 2.1.0 Okay, keep talking\r\n");
|
||||
$funcs->{rcpt} = \&do_rcpt;
|
||||
}
|
||||
|
||||
sub do_rcpt
|
||||
{
|
||||
my ($state, $cmd, $args, $funcs) = @_;
|
||||
my ($rcpt) = ($args =~ /to\:\s*(.+)/i);
|
||||
millisleep($t_rcpt);
|
||||
$state->{conn}->print("250 2.1.5 ${rcpt}'s cool\r\n");
|
||||
$funcs->{data} = \&do_data;
|
||||
}
|
||||
|
||||
sub do_data
|
||||
{
|
||||
my ($state, $cmd, $args, $funcs) = @_;
|
||||
$state->{conn}->print( "354 up to the dot...\r\n");
|
||||
if ($cs) {
|
||||
my $line;
|
||||
my $md5 = Digest::MD5->new;
|
||||
# skip headers
|
||||
header: while ($_ = netline($state->{conn})) {
|
||||
last header if /^$/;
|
||||
last body if /^\.$/;
|
||||
}
|
||||
|
||||
body: while ($_ = $state->{conn}->getline) {
|
||||
if (/^=CS=MD5=(.+)\r/) {
|
||||
my $sum = $1;
|
||||
my $end = netline($state->{conn});
|
||||
|
||||
if ($end ne '.') {
|
||||
print STDERR "Fake checksum?: $sum\n";
|
||||
while (netline($state->{conn}) ne '.') { }
|
||||
} elsif (lc($sum) eq lc($md5->hexdigest)) {
|
||||
# print STDERR "MD5 sum OK.\n";
|
||||
} else {
|
||||
print STDERR "MD5 sum mismatch: $sum, ",
|
||||
$md5->hexdigest, "\n";
|
||||
}
|
||||
last body;
|
||||
} elsif (/^\.\r$/) {
|
||||
print STDERR "no checksum\n" if $cs =~ /^r/;
|
||||
last body;
|
||||
}
|
||||
print LOG $_ if $log;
|
||||
$md5->add($_);
|
||||
}
|
||||
print LOG ".\r\n" if $log;
|
||||
} else {
|
||||
local ($/) = "\r\n.\r\n";
|
||||
$state->{conn}->getline;
|
||||
}
|
||||
millisleep($t_dot);
|
||||
if (rand() % 100 == 0) {
|
||||
$state->{conn}->print("451 ohshit\r\n");
|
||||
} else {
|
||||
$state->{conn}->print("250 2.0.0 I will deliver\r\n");
|
||||
}
|
||||
}
|
||||
|
||||
sub do_ok
|
||||
{
|
||||
my ($state) = @_;
|
||||
$state->{conn}->print("220 uhhuh\r\n");
|
||||
}
|
||||
@@ -1,825 +0,0 @@
|
||||
# util.pl -- utilities which used to live in bin/args.pl
|
||||
|
||||
sub my_system {
|
||||
my ($file, $line);
|
||||
$file = shift;
|
||||
$line = shift;
|
||||
my $ret;
|
||||
if (($ret = system(@_)) != 0) {
|
||||
my $msg = "$file:$line: @_\n\t";
|
||||
my ($excode, $sig, $cored) = ($ret >> 8, $ret & 127, $ret & 128);
|
||||
if ($sig) {
|
||||
$msg .= "died with signal $sig";
|
||||
$msg .= ' (core dumped)' if ($cored);
|
||||
$msg .= "\n";
|
||||
} else {
|
||||
$msg .= "exited abnormally with code $excode\n";
|
||||
}
|
||||
return $msg;
|
||||
}
|
||||
undef;
|
||||
}
|
||||
|
||||
sub warn_system {
|
||||
my ($pack, $file, $line) = caller;
|
||||
my $msg = my_system($file, $line, @_);
|
||||
warn $msg if $msg;
|
||||
}
|
||||
|
||||
sub die_system {
|
||||
my ($pack, $file, $line) = caller;
|
||||
my $msg = my_system($file, $line, @_);
|
||||
die $msg if $msg;
|
||||
}
|
||||
|
||||
# Utility functions
|
||||
# Create a unique hash array. Programming Perl, 2nd edition, p291 (p217?)
|
||||
package ArrayInstance;
|
||||
sub new {
|
||||
my $type = shift;
|
||||
my %params = @_;
|
||||
my $self = {};
|
||||
return bless $self, $type;
|
||||
}
|
||||
|
||||
package main;
|
||||
|
||||
# run a command in the background, return its PID
|
||||
# Uses fork: will not run on NT in perl 5.004
|
||||
# if the server is "localhost", ignore the rcmd part
|
||||
# if stdin, stdout, and/or stderr is set, redirect those for the sub process
|
||||
sub forkproc {
|
||||
my $rcmd = shift;
|
||||
my $server = shift;
|
||||
my $command = shift;
|
||||
my $stdin = shift;
|
||||
my $stdout = shift;
|
||||
my $stderr = shift;
|
||||
|
||||
if (my $pid = fork()) {
|
||||
return $pid; # parent
|
||||
}
|
||||
|
||||
# rest of this is in the child
|
||||
if ($stdin) { # redirect stdin if needed
|
||||
close (STDIN);
|
||||
open STDIN, "<$stdin"
|
||||
|| die "Couldn't open $stdin for input\n";
|
||||
}
|
||||
|
||||
if ($stdout) { # redirect stdout if needed
|
||||
close (STDOUT);
|
||||
open STDOUT, ">>$stdout"
|
||||
|| die "Couldn't open $stdout for output\n";
|
||||
}
|
||||
|
||||
if ($stderr) { # redirect stderr if needed
|
||||
close (STDERR);
|
||||
open STDERR, ">>$stderr"
|
||||
|| die "Couldn't open $stderr for output\n";
|
||||
}
|
||||
|
||||
if ($server =~ /^localhost$/i) {
|
||||
exec $command;
|
||||
die "Coundn't exec $command:$!\n";
|
||||
} else {
|
||||
exec split (/\s+/, $rcmd), $server, $command;
|
||||
die "Coundn't exec $rcmd $server $command:$!\n";
|
||||
}
|
||||
}
|
||||
|
||||
# Relocate file to tmp directory (if it is in the results directory),
|
||||
# and put a ~ on the end of it.
|
||||
# ASSUMES tmp and results are on the same partition (on NT, same drive).
|
||||
# Usage: fileBackup (filename)
|
||||
sub fileBackup {
|
||||
my $filename = shift;
|
||||
my $bfile = $filename;
|
||||
|
||||
(-f $filename) || return 0; # file doent exist
|
||||
$bfile =~ s/$resultbase/$tmpbase/; # move to tmp
|
||||
$bfile .= "~"; # indicate that this is a backup
|
||||
(-f $bfile) && unlink ($bfile);
|
||||
#print "Backing up $filename to $bfile\n"; # DEBUG
|
||||
rename ($filename, $bfile) || unlink ($filename);
|
||||
}
|
||||
|
||||
# Insert text into a file after a tagline
|
||||
# fileInsertAfter (filename, tagstring, newtext)
|
||||
sub fileInsertAfter {
|
||||
my $filename = shift || die "fileInsertAfter: missing filename";
|
||||
my $tagline = shift || die "fileInsertAfter: missing tagline";
|
||||
my $newtext = shift || die "fileInsertAfter: missing text";
|
||||
my $foundit = 0;
|
||||
|
||||
open(OLD, "<$filename") ||
|
||||
open(OLD, "gunzip -c $filename |") ||
|
||||
die "fileInsertAfter: Could not open input $filename: $!";
|
||||
open(NEW, ">$filename+") ||
|
||||
die "fileInsertAfter: Could not open output $filename+: $!";
|
||||
|
||||
while (<OLD>) {
|
||||
print NEW $_; # copy (including tagline)
|
||||
|
||||
next unless (/$tagline/); # matched tagline
|
||||
|
||||
print NEW $newtext; # insert new text
|
||||
$foundit++;
|
||||
last; # only change first occurance
|
||||
}
|
||||
|
||||
if ($foundit) { # copy rest of file
|
||||
while (<OLD>) {
|
||||
print NEW $_;
|
||||
}
|
||||
}
|
||||
|
||||
close (OLD);
|
||||
close (NEW);
|
||||
if ($foundit) {
|
||||
fileBackup ($filename);
|
||||
rename ("$filename+", "$filename");
|
||||
#print "Updated $filename\n"; # DEBUG
|
||||
return $foundit;
|
||||
} else {
|
||||
($params{DEBUG}) && print "No change to $filename\n"; # DEBUG
|
||||
unlink ("$filename+");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
# Do text for text replacements in a file.
|
||||
# Perl wildcards are automatically quoted.
|
||||
# fileReplace (filename, matchPat, oldtext, newtext)
|
||||
sub fileReplaceText {
|
||||
my $filename = shift || die "fileReplaceText: missing filename";
|
||||
my $tagline = shift || die "fileReplaceText: missing tagline ($filename)";
|
||||
my $oldtext = shift;
|
||||
my $newtext = shift;
|
||||
my $foundit = 0;
|
||||
|
||||
return if ($newtext eq ""); # nothing to do
|
||||
return if ($oldtext eq ""); # nothing can be done
|
||||
|
||||
open(OLD, "<$filename") ||
|
||||
open(OLD, "gunzip -c $filename |") ||
|
||||
die "fileReplaceText: Could not open input $filename: $!";
|
||||
open(NEW, ">$filename+") ||
|
||||
die "fileReplaceText: Could not open output $filename+: $!";
|
||||
|
||||
$oldtext =~ s/([][{}*+?^.\/])/\\$1/g; # quote regex syntax
|
||||
|
||||
while (<OLD>) {
|
||||
if (/$tagline/i) { # matched tagline
|
||||
$foundit++;
|
||||
s/$oldtext/$newtext/; # do the replace
|
||||
}
|
||||
print NEW $_;
|
||||
}
|
||||
|
||||
close (OLD);
|
||||
close (NEW);
|
||||
if ($foundit) {
|
||||
fileBackup ($filename);
|
||||
rename ("$filename+", "$filename");
|
||||
#print "Updated $filename\n"; # DEBUG
|
||||
return $foundit;
|
||||
} else {
|
||||
($params{DEBUG}) && print "No change to $filename\n"; # DEBUG
|
||||
unlink ("$filename+");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
# copy a file to a new name. Handles possible compression. OS independent.
|
||||
# fileCopy (filename, newname)
|
||||
sub fileCopy {
|
||||
my $filename = shift || die "fileReplaceText: missing filename";
|
||||
my $newname = shift || die "fileReplaceText: missing newname ($filename)";
|
||||
|
||||
open(OLD, "<$filename") ||
|
||||
open(OLD, "gunzip -c $filename |") ||
|
||||
die "fileReplaceText: Could not open input $filename: $!";
|
||||
open(NEW, ">$newname") ||
|
||||
die "fileReplaceText: Could not open output $newname: $!";
|
||||
|
||||
while (<OLD>) { # copy it
|
||||
print NEW $_;
|
||||
}
|
||||
|
||||
close (OLD);
|
||||
close (NEW);
|
||||
return 0;
|
||||
}
|
||||
|
||||
# display a file to STDOUT. Handles possible compression
|
||||
sub fileShow {
|
||||
my $filename = shift || die "fileShow: missing filename";
|
||||
open(SHOWIT, "<$filename") ||
|
||||
open(SHOWIT, "gunzip -c $filename.gz |") ||
|
||||
die "fileShow: Couldn't open $filename: $!";
|
||||
while (<SHOWIT>) { print; }
|
||||
close(SHOWIT);
|
||||
}
|
||||
|
||||
# sub function to figure time extents
|
||||
# (start, end) = dataMinMax counterName \@protocols oldstarttime oldendtime
|
||||
# Use 0 for uninitialized start or end
|
||||
sub dataMinMax {
|
||||
my $name = shift;
|
||||
my $protos = shift;
|
||||
my $start = shift;
|
||||
my $end = shift;
|
||||
|
||||
# make global
|
||||
# create the plot script and data files
|
||||
# Figure out the encompassing time extent
|
||||
foreach $p (@$protos) { # create the plot data files
|
||||
my @times = sort numeric keys %{ $graphs{$p}->{$name}};
|
||||
if ($#times <= 0) {
|
||||
next;
|
||||
}
|
||||
if (($start == 0) || ($times[0] < $start)) {
|
||||
$start = $times[0];
|
||||
}
|
||||
if (($end == 0) || ($times[0] > $end)) {
|
||||
$end = $times[$#times];
|
||||
}
|
||||
}
|
||||
#printf ("Data $name start=$start end=$end (%d points)...\n",
|
||||
# $end - $start);
|
||||
return ($start, $end);
|
||||
}
|
||||
|
||||
# simple function to formatted a number into n, n K, n M, or n G
|
||||
sub kformat {
|
||||
my $n = shift;
|
||||
my $r = "";
|
||||
if ($n > (1024*1024*1024)) {
|
||||
$r = sprintf "%.2fG", $n / (1024*1024*1024);
|
||||
} elsif ($n > (1024*1024)) {
|
||||
$r = sprintf "%.2fM", $n / (1024*1024);
|
||||
} elsif ($n > 1024) {
|
||||
$r = sprintf "%.2fK", $n / 1024;
|
||||
} else {
|
||||
$r = sprintf "%d ", $n;
|
||||
}
|
||||
return $r;
|
||||
}
|
||||
|
||||
# simple function to formatted a time into Ns, Nms, or Nus
|
||||
# the goal is to make a table of timss uncluttered and easy to read
|
||||
# I dont convert to minutes or hours because the non-1000x multipliers
|
||||
# are hard to back solve in your head for comparisons
|
||||
sub tformat {
|
||||
my $n = shift;
|
||||
my $r = "";
|
||||
if ($n == 0.0) {
|
||||
$r = "0.0"; # make exactly 0 explicit
|
||||
} elsif ($n < 0.001) {
|
||||
$r = sprintf "%.2fus", $n * 1000 * 1000;
|
||||
} elsif ($n < 1.0) {
|
||||
$r = sprintf "%.2fms", $n * 1000;
|
||||
} elsif ($n >= 1000.0) {
|
||||
$r = sprintf "%.0fs", $n;
|
||||
} elsif ($n >= 100.0) {
|
||||
$r = sprintf "%.1fs", $n;
|
||||
} else {
|
||||
$r = sprintf "%.3fs", $n;
|
||||
}
|
||||
return $r;
|
||||
}
|
||||
|
||||
#Usage: commify (1234567) returns 1,234,567
|
||||
sub commify { # perl cookbook p64-65
|
||||
my $text = reverse $_[0];
|
||||
$text =~ s/(\d\d\d)(?=\d)(?!\d*\.)/$1,/g;
|
||||
return scalar reverse $text;
|
||||
}
|
||||
|
||||
# subroutine to enable numeric sorts. Programming Perl p218
|
||||
# Use: sort numeric ...
|
||||
sub numeric { $a <=> $b; }
|
||||
|
||||
# on NT, turn slash to backslash, then print. Else print.
|
||||
sub pathprint {
|
||||
my $str = shift;
|
||||
$str =~ s!/!\\!g if ($params{NT}); # turn slash to back slash
|
||||
print $str;
|
||||
}
|
||||
|
||||
# figureTimeNumber number
|
||||
# Given an number like: 60m, 1h, 100s, 4d, 200
|
||||
# Return 60, 1, 100, 4, 200
|
||||
sub figureTimeNumber {
|
||||
my $arg = shift;
|
||||
|
||||
($arg =~ /([0-9]+)(s|sec|second|seconds|m|min|minute|minutes|h|hr|hour|hours|d|day|days)$/i)
|
||||
&& return $1;
|
||||
return $arg; # return default
|
||||
}
|
||||
|
||||
# figureTimeUnits number, default
|
||||
# Given an number like: 60m, 1h, 100s, 4d
|
||||
# Return a string of minutes, hours, seconds, days
|
||||
# Else return the second argument
|
||||
sub figureTimeUnits {
|
||||
my $arg = shift;
|
||||
|
||||
($arg =~ /(s|sec|second|seconds)$/i) && return "seconds";
|
||||
($arg =~ /(m|min|minute|minutes)$/i) && return "minutes";
|
||||
($arg =~ /(h|hr|hour|hours)$/i) && return "hours";
|
||||
($arg =~ /(d|day|days)$/i) && return "days";
|
||||
|
||||
return shift; # return default
|
||||
}
|
||||
|
||||
# figureTimeSeconds number, defaultUnits
|
||||
# Given an number like: 60m, 2h, 100s, 4d
|
||||
# Return 60*60, 2*60*60, 100, 4*24*60*60
|
||||
sub figureTimeSeconds {
|
||||
my $arg = shift;
|
||||
|
||||
($arg =~ /([0-9]+)(s|sec|second|seconds)$/i) && return $1;
|
||||
($arg =~ /([0-9]+)(m|min|minute|minutes)$/i) && return (60*$1);
|
||||
($arg =~ /([0-9]+)(h|hr|hour|hours)$/i) && return (60*60*$1);
|
||||
($arg =~ /([0-9]+)(d|day|days)$/i) && return (24*60*60*$1);
|
||||
|
||||
if ($_) {
|
||||
my $def = shift;
|
||||
return $arg * figureTimeSeconds ("1$def"); # return scaled by default
|
||||
} else {
|
||||
return $arg; # return it
|
||||
}
|
||||
}
|
||||
|
||||
# BACK COMPATIBILITY (everything now in the workload file)
|
||||
# read the testbed conf file, convert to workload sections
|
||||
# machine, how many processes, how many threads/proc, arch
|
||||
# only the first 2 fields are required. Lines starting with # are ignored.
|
||||
# You can include other files using <include conf/filename.tbd>
|
||||
# exampe:
|
||||
# client1 5 10 SunOS5.5.1
|
||||
sub readTestbedFile {
|
||||
my $filename = shift;
|
||||
foreach $section (@workload) {
|
||||
next unless ($section->{sectionTitle} =~ /CLIENT/i);
|
||||
print "Testbed $filename skipped, clients read in workload\n";
|
||||
return 1; # clients already read in workload
|
||||
}
|
||||
|
||||
my $level = 0;
|
||||
if ($_) {
|
||||
$level = 1 + shift;
|
||||
die "Too many nested includes ($level) in $filename!"
|
||||
unless ($level < 100);
|
||||
}
|
||||
my $handle = "$filename$level";
|
||||
open($handle, "<$filename") ||
|
||||
open($handle, "gunzip -c $filename.gz |") ||
|
||||
die "Couldn't open testbed $filename: $!";
|
||||
|
||||
while(<$handle>) {
|
||||
chomp;
|
||||
|
||||
s/#.*//; # strip any comments from line
|
||||
|
||||
m/^\s*$/o && next; # continue if blank line
|
||||
|
||||
# handle include statement
|
||||
if (m/^<(include|INCLUDE)\s+([^\s]+)\s*>/o) {
|
||||
#print "Including $2 from $filename\n";
|
||||
readTestbedFile ($2, $level) || die;
|
||||
next;
|
||||
}
|
||||
|
||||
# get the server name and number of processes
|
||||
my @line = split(/\s+/);
|
||||
# create CLIENT entry in workload
|
||||
my $sparm = ArrayInstance->new();
|
||||
if ($line[1]) {
|
||||
$sparm->{"sectionTitle"} = "CLIENT";
|
||||
$sparm->{"sectionParams"} = "HOSTS=$line[0]";
|
||||
$sparm->{"PROCESSES"} = $line[1];
|
||||
$sparm->{"THREADS"} = $line[2] if ($line[2]);
|
||||
$sparm->{"ARCH"} = $line[3] if ($line[3]);
|
||||
} else {
|
||||
$sparm->{"sectionTitle"} = "MONITOR";
|
||||
$sparm->{"sectionParams"} = "HOSTS=$line[0]";
|
||||
$sparm->{"COMMAND"} = $line[2];
|
||||
}
|
||||
($params{DEBUG})
|
||||
&& print "<$sparm->{sectionTitle} $sparm->{sectionParams}>\n";
|
||||
push @workload, $sparm;
|
||||
}
|
||||
close ($handle);
|
||||
}
|
||||
|
||||
# BACK COMPATIBILITY (everything now in the saved workload file)
|
||||
# This is now only needed to process mailstone4.1 runs
|
||||
sub readConfigFile {
|
||||
my $filename = shift;
|
||||
open(CONFIG, "<$filename") ||
|
||||
open(CONFIG, "gunzip -c $filename.gz |") ||
|
||||
die "Couldn't open config file $filename: $!";
|
||||
|
||||
while(<CONFIG>) {
|
||||
chomp;
|
||||
|
||||
s/#.*//; # strip any comments from line
|
||||
|
||||
m/^\s*$/o && next; # continue if blank line
|
||||
|
||||
# get the property and value
|
||||
my @line = split(/=/);
|
||||
$params{$line[0]} = $line[1];
|
||||
}
|
||||
close CONFIG;
|
||||
}
|
||||
|
||||
# read the workload file and store it as a list of hashes
|
||||
# Each hash always has the fields: sectionTitle and sectionParams
|
||||
# usage: readWorkloadFile filename, \@list
|
||||
sub readWorkloadFile {
|
||||
my $filename = shift || die "readWorkloadFile: Missing file name";
|
||||
my $plist = shift || die "readWorkloadFile: Missing return list";
|
||||
my $level = 0; # file inclusion level
|
||||
my @handles;
|
||||
|
||||
my $fh = "$filename$level";
|
||||
|
||||
($params{DEBUG}) && print "Reading workload from $filename.\n";
|
||||
open($fh, "<$filename") ||
|
||||
open($fh, "gunzip -c $filename.gz |") ||
|
||||
die "readWorkloadFile Couldn't open testbed $filename: $!";
|
||||
$includedFiles{$filename} = 1; # mark file as included
|
||||
|
||||
my $sparm=0;
|
||||
my $conline = "";
|
||||
|
||||
while($fh) {
|
||||
while(<$fh>) {
|
||||
s/#.*//; # strip any comments from line (quoting?)
|
||||
s/\s*$//; # strip trailing white space
|
||||
if ($conline) { # utilize line continue
|
||||
$_ = $conline . "\\\n" . $_;
|
||||
$conline = "";
|
||||
}
|
||||
if (m/\\$/o) { # check for quoted line continue
|
||||
s/\\$//; #
|
||||
$conline = $_;
|
||||
next;
|
||||
}
|
||||
s/^\s*//; # strip initial white space
|
||||
m/^$/o && next; # continue if blank line
|
||||
|
||||
# handle include and includeOnce statements
|
||||
if ((m/^<(include)\s+(\S+)\s*>/i)
|
||||
|| (m/^<(includeonce)\s+(\S+)\s*>/i)) {
|
||||
my $incfile = $2;
|
||||
if (($1 =~ m/^includeonce/i) && ($includedFiles{$incfile})) {
|
||||
($params{DEBUG})
|
||||
&& print "readWorkloadFile:includeOnce $incfile already read.\n";
|
||||
next;
|
||||
}
|
||||
($params{DEBUG})
|
||||
&& print "readWorkloadFile include $incfile from $filename.\n";
|
||||
$includedFiles{$incfile} = 1; # mark file
|
||||
push @handles, $fh; # push current handle on to stack
|
||||
if ($level++ > 99) { # check recursion and make handles unique
|
||||
die "readWorkloadFile: include level too deep: $filename $level\n";
|
||||
}
|
||||
$fh = "$incfile$level";
|
||||
open($fh, "<$incfile") ||
|
||||
open($fh, "gunzip -c $incfile.gz |") ||
|
||||
die "readWorkloadFile Couldn't open testbed file $incfile: $!";
|
||||
$filename = $incfile; # for error messages
|
||||
next;
|
||||
}
|
||||
|
||||
if (m!^</(\w+)>$!o) { # end of section
|
||||
my $end = $1;
|
||||
unless ($sparm->{"sectionTitle"} =~ /$end/i) {
|
||||
die "readWorkloadFile Mismatched section $filename: $. '$sparm->{sectionTitle}' '$end'\n";
|
||||
return 0;
|
||||
}
|
||||
($params{DEBUG}) && print "</$sparm->{sectionTitle}>\n";
|
||||
push @$plist, $sparm;
|
||||
$sparm = 0;
|
||||
next;
|
||||
}
|
||||
|
||||
if (m!^<(\w+)\s*(.*)>$!o) { # start of section
|
||||
my $sec = $1;
|
||||
my $more = $2;
|
||||
|
||||
if ($sparm) {
|
||||
die "readWorkloadFile Missing section end $filename: $. '$sparm->{sectionTitle}'\n";
|
||||
}
|
||||
if ($sec =~ /CONFIG/i) { # special case, map to existing global
|
||||
$sparm = \%params;
|
||||
} elsif ($sec =~ /DEFAULT/i) { # special case, only one DEFAULT
|
||||
if ($defaultSection) { # use existing defaultSection
|
||||
$sparm = $defaultSection;
|
||||
} else { # create a new one
|
||||
$sparm = ArrayInstance->new();
|
||||
$sparm->{"sectionTitle"} = uc $sec; # ignore case
|
||||
$sparm->{"lineList"} = ();
|
||||
$defaultSection = $sparm;
|
||||
}
|
||||
} else {
|
||||
$sparm = ArrayInstance->new();
|
||||
$sparm->{"sectionTitle"} = uc $sec; # ignore case
|
||||
$sparm->{"lineList"} = ();
|
||||
}
|
||||
$sparm->{"sectionParams"} = $more; # take newest more info
|
||||
($params{DEBUG})
|
||||
&& print "<$sparm->{sectionTitle} $sparm->{sectionParams}>\n";
|
||||
next;
|
||||
}
|
||||
|
||||
# must be in a section, get parameters
|
||||
unless ($sparm) {
|
||||
die "readWorkloadFile Entry encountered outside a section $filename: $. $_\n";
|
||||
return 0;
|
||||
}
|
||||
my ($nm, $val) = split (/[\s=]+/, $_, 2);
|
||||
$nm = uc $nm; # ignore case
|
||||
($params{DEBUG}) && print " $nm = $val\n";
|
||||
if ($nm =~ /ACCOUNTFORMAT/) { # BACK COMPATIBILITY
|
||||
print "WARNING: 'accountFormat' is obsolete. Use 'addressFormat' and 'loginFormat'\n";
|
||||
$sparm->{"addressFormat"} = $val;
|
||||
push @{$sparm->{"lineList"}}, "addressFormat $val";
|
||||
$val =~ s/@.+$//; # strip at and everything after
|
||||
$sparm->{"loginFormat"} = $val;
|
||||
push @{$sparm->{"lineList"}}, "loginFormat $val";
|
||||
next;
|
||||
} elsif ($nm =~ /NUMACCOUNTS/) { # BACK COMPATIBILITY
|
||||
print "WARNING: 'numAccounts' is obsolete. Use 'numAddresses' and 'numLogins'\n";
|
||||
$sparm->{"numAddresses"} = $val;
|
||||
push @{$sparm->{"lineList"}}, "numAddresses $val";
|
||||
$sparm->{"numLogins"} = $val;
|
||||
push @{$sparm->{"lineList"}}, "numLogins $val";
|
||||
next;
|
||||
} elsif ($nm =~ /BEGINACCOUNTS/) { # BACK COMPATIBILITY
|
||||
print "WARNING: 'beginAccounts' is obsolete. Use 'firstAddress' and 'firstLogin'\n";
|
||||
$sparm->{"firstAddress"} = $val;
|
||||
push @{$sparm->{"lineList"}}, "firstAddress $val";
|
||||
$sparm->{"firstLogin"} = $val;
|
||||
push @{$sparm->{"lineList"}}, "firstLogin $val";
|
||||
next;
|
||||
}
|
||||
push @{$sparm->{"lineList"}}, $_; # save lines in original order
|
||||
$sparm->{$nm} = $val;
|
||||
next;
|
||||
}
|
||||
close ($fh);
|
||||
$fh = pop @handles || last; # empty include stack
|
||||
$filename = $fh;
|
||||
$sparm = 0; # can only include whole sections
|
||||
}
|
||||
return 1; # success
|
||||
}
|
||||
|
||||
# Write out a workload list to a file
|
||||
# Optionally, pass in a list of sectionTitle's it should ignore
|
||||
# usage: writeWorkloadFile filename \@list [\@skipList]
|
||||
sub writeWorkloadFile {
|
||||
my $filename = shift || die "writeWorkloadFile: Missing file name";
|
||||
my $plist = shift || die "writeWorkloadFile: Missing return list";
|
||||
my $skip = shift;
|
||||
my @skipH;
|
||||
my $configSeen = 0;
|
||||
my $defaultSeen = 0;
|
||||
my @paramH;
|
||||
|
||||
if ($skip) {
|
||||
foreach $s (@$skip) { # turn list into a hash
|
||||
$skipH{(uc $s)} = $s; # fix case for index
|
||||
}
|
||||
}
|
||||
foreach $s (@workloadParameters) { # turn list into a hash
|
||||
$paramH{(uc $s)} = $s; # fix case for index
|
||||
}
|
||||
|
||||
($params{DEBUG}) && print "Writing workload to $filename.\n";
|
||||
unless (open(WORKOUT, ">$filename")) {
|
||||
die "Couldn't open testbed $filename: $!";
|
||||
}
|
||||
|
||||
foreach $sparm (@$plist) { # each hash reference in the list
|
||||
if (($skip)
|
||||
&& ($skipH{$sparm->{"sectionTitle"}})) {
|
||||
#($params{DEBUG}) &&
|
||||
#print "Skipping section $sparm->{sectionTitle}\n";
|
||||
next;
|
||||
}
|
||||
|
||||
# all CONFIG,DEFAULT sections point to the same hash, output once only
|
||||
if ($sparm->{"sectionTitle"} =~ /^CONFIG$/) {
|
||||
next if $configSeen;
|
||||
$configSeen++;
|
||||
}
|
||||
if ($sparm->{"sectionTitle"} =~ /^DEFAULT$/) {
|
||||
next if $defaultSeen;
|
||||
$defaultSeen++;
|
||||
}
|
||||
if ($sparm->{sectionParams}) { # write section with extra args
|
||||
print WORKOUT "<$sparm->{sectionTitle} $sparm->{sectionParams}>\n";
|
||||
} else {
|
||||
print WORKOUT "<$sparm->{sectionTitle}>\n";
|
||||
}
|
||||
if ($sparm->{"sectionTitle"} =~ /^(CONFIG|CLIENT)$/) {
|
||||
# for Config or Client, output the hash to get computed config
|
||||
foreach $k (sort keys %$sparm) { # output each parameter
|
||||
# skip sectionTitle and sectionParams
|
||||
($k =~ /^(sectionTitle|sectionParams|lineList)$/) && next;
|
||||
printf WORKOUT " %s\t%s\n",
|
||||
($paramH{$k}) ? $paramH{$k} : $k,
|
||||
$sparm->{$k};
|
||||
}
|
||||
} else { # write out the line list
|
||||
foreach $l (@{$sparm->{"lineList"}}) {
|
||||
print WORKOUT " $l\n";
|
||||
}
|
||||
}
|
||||
print WORKOUT "</$sparm->{sectionTitle}>\n\n";
|
||||
}
|
||||
close WORKOUT;
|
||||
}
|
||||
|
||||
# Usage: getClientFilename hostname section
|
||||
sub getClientFilename {
|
||||
my $cli = shift || die "Missing client name";
|
||||
my $section = shift || die "Missing section hash";
|
||||
return "$tmpdir/$cli-$section->{GROUP}.out"
|
||||
if ($params{USEGROUPS} && $section->{GROUP});
|
||||
return "$tmpdir/$cli.out"
|
||||
}
|
||||
|
||||
sub setConfigDefaults { # set CONFIG defaults
|
||||
# These are set after writing out the test copy to avoid clutter
|
||||
|
||||
# Path to gnuplot executable
|
||||
$params{GNUPLOT}="gnuplot/gnuplot"
|
||||
unless ($params{GNUPLOT});
|
||||
|
||||
# This is the directory the client lives in
|
||||
$params{TEMPDIR} = "/var/tmp"
|
||||
unless($params{TEMPDIR});
|
||||
|
||||
# Set default remote shell
|
||||
#$params{RSH} = "rsh"
|
||||
$params{RSH} = "ssh"
|
||||
unless($params{RSH});
|
||||
|
||||
# Set default remote copy
|
||||
#$params{RCP} = "rcp"
|
||||
$params{RCP} = "scp"
|
||||
unless($params{RCP});
|
||||
|
||||
# Size of generated gifs
|
||||
$params{CHARTHEIGHT} = 480
|
||||
unless($params{CHARTHEIGHT});
|
||||
$params{CHARTWIDTH} = 640
|
||||
unless($params{CHARTWIDTH});
|
||||
$params{CHARTPOINTS} = int (($params{CHARTWIDTH}-60)*0.8)
|
||||
unless($params{CHARTPOINTS});
|
||||
|
||||
|
||||
# The name of the remote executable
|
||||
$params{CLIENTCOMMAND} = "mailclient"
|
||||
unless ($params{CLIENTCOMMAND});
|
||||
|
||||
# Set default monitoring command
|
||||
$params{MONITORCOMMAND} = "vmstat %f"
|
||||
unless($params{MONITORCOMMAND});
|
||||
|
||||
# Set default switches to makeusers
|
||||
$params{MAKEUSERSARGS} = "-4"
|
||||
unless ($params{MAKEUSERSARGS});
|
||||
|
||||
# Figure out @protocols, this sets the report order
|
||||
@protocols = ();
|
||||
{
|
||||
my %skipH;
|
||||
foreach $s (@nonProtocolSections) { # turn list into a hash
|
||||
#print "$s ";
|
||||
$skipH{(uc $s)} = $s; # fix case for index
|
||||
}
|
||||
print "\n";
|
||||
foreach $sparm (@workload) { # each hash reference in the list
|
||||
next if ($skipH{$sparm->{"sectionTitle"}});
|
||||
|
||||
($params{DEBUG}) &&
|
||||
print "Found protocol ". $sparm->{"sectionTitle"} . "\n";
|
||||
|
||||
push @protocols, $sparm->{"sectionTitle"};
|
||||
# add to skip list so only added once
|
||||
$skipH{(uc $sparm->{"sectionTitle"})} = $sparm->{"sectionTitle"};
|
||||
}
|
||||
}
|
||||
@protocolsAll = @protocols;
|
||||
push @protocolsAll, "Total";
|
||||
|
||||
# figure out the graphs ???
|
||||
}
|
||||
|
||||
sub parseArgs { # get args
|
||||
while (@ARGV) {
|
||||
my $arg = shift(@ARGV);
|
||||
|
||||
if ($arg =~ /^-a$/i) { # was undocumented feature in 4.1
|
||||
$params{ADDGRAPHS} = shift(@ARGV); # extra graphs
|
||||
next;
|
||||
}
|
||||
if ($arg =~ /^-b$/i) {
|
||||
$params{TITLE} = shift(@ARGV); # banner
|
||||
next;
|
||||
}
|
||||
|
||||
# BACK COMPATIBILITY (everything now in the saved workload file)
|
||||
if ($arg =~ /^-c$/i) { # config file, read when encountered
|
||||
my $configFile = shift(@ARGV);
|
||||
readConfigFile ($configFile);
|
||||
next;
|
||||
}
|
||||
|
||||
if ($arg =~ /^-d$/i) {
|
||||
$params{DEBUG}++; # Debug
|
||||
next;
|
||||
}
|
||||
|
||||
if ($arg =~ /^-h$/i) { # Help
|
||||
print "Usage: -w workfile [-t time] [-r ramptime] [-l load] [-v] [-d]\n";
|
||||
print "\t[-b banner] [-n notes] [-s sysconfigfile] [-a add_graphs_file]\n";
|
||||
print "\t[-c configfile] [-m machinefile] [-z] [PARAM=value]...\n";
|
||||
|
||||
die "Usage";
|
||||
}
|
||||
|
||||
if ($arg =~ /^-l$/i) { # "load", FIX: naming conventions
|
||||
$params{CLIENTCOUNT} = shift(@ARGV); # desired client count
|
||||
next;
|
||||
}
|
||||
|
||||
# BACK COMPATIBILITY (everything now in the saved workload file)
|
||||
if ($arg =~ /^-m$/i) {
|
||||
$params{TESTBED} = shift(@ARGV); # testbed machines file
|
||||
next;
|
||||
}
|
||||
|
||||
if ($arg =~ /^-n$/i) {
|
||||
$params{COMMENTS} = shift(@ARGV); # notes
|
||||
next;
|
||||
}
|
||||
|
||||
if ($arg =~ /^-r$/i) {
|
||||
$params{RAMPTIME} = shift(@ARGV); # ramptime
|
||||
next;
|
||||
}
|
||||
if ($arg =~ /^-s$/i) {
|
||||
$params{SYSCONFIG} = shift(@ARGV); # system config html file
|
||||
next;
|
||||
}
|
||||
if ($arg =~ /^-t$/i) {
|
||||
$params{TIME} = shift(@ARGV); # test time
|
||||
next;
|
||||
}
|
||||
|
||||
if ($arg =~ /^-v$/i) {
|
||||
$params{VERBOSE} = 1; # verbose mode
|
||||
next;
|
||||
}
|
||||
|
||||
if ($arg =~ /^-w$/i) { # workload file (may occur multiple times)
|
||||
my $f = shift(@ARGV);
|
||||
readWorkloadFile ($f, \@workload) || die "Error reading workload: $@\n";
|
||||
$params{WORKLOAD} = $f;
|
||||
next;
|
||||
}
|
||||
|
||||
if ($arg =~ /^-z$/i) {
|
||||
$params{NT} = 1; # NT mode
|
||||
next;
|
||||
}
|
||||
|
||||
# any other CONFIG parameter: FIELD=value
|
||||
if ($arg =~ /^(\w+)=(\S.*)$/) {
|
||||
my $field = uc $1;
|
||||
$params{$field} = $2;
|
||||
next;
|
||||
}
|
||||
die "Unknown argument '$arg'";
|
||||
}
|
||||
|
||||
if ($params{NT}) { # should use Cwd module
|
||||
$cwd = `cd`; # NT get current directory
|
||||
$cwd = `pwd` unless ($cwd); # in case we are really on UNIX
|
||||
} else {
|
||||
$cwd = `pwd`; # in case we are really on UNIX
|
||||
}
|
||||
chomp $cwd; # strip NL
|
||||
}
|
||||
|
||||
return 1;
|
||||
@@ -1,271 +0,0 @@
|
||||
I. Format
|
||||
II. Workload Configuration Sections
|
||||
III. Report Generation Sections
|
||||
|
||||
---------
|
||||
I. Format
|
||||
---------
|
||||
|
||||
The config-file format is very free-form -- for example, this text is
|
||||
skipped as a "comment" because it doesn't look like anything else. A
|
||||
section always starts with a line ending in a colon. Everything up to
|
||||
the next section, end-of-file, or `__END__' is part of the current
|
||||
section.
|
||||
|
||||
Name/value pairs within a section are pairs starting with whitespace,
|
||||
and separated by a colon followed by whitespace. So you can write
|
||||
something like this
|
||||
|
||||
# hello there: mister foo
|
||||
|
||||
and it will be ignored. Had the '#' before the "hello" not been
|
||||
there, the attribute name would have been `hello there' and its value
|
||||
would have been `mister foo'. Leading and trailing whitespace is
|
||||
skipped, but internal whitespace is perfectly OK. Note that the
|
||||
"comment" character doesn't have to be a '#', but can be anything you
|
||||
want (except whitespace).
|
||||
|
||||
Leading whitespace also denotes continued values. So
|
||||
|
||||
foo: blah blah
|
||||
and some more words which are part of foo's value.
|
||||
|
||||
creates a variable named 'foo' with this value (including the \n) --
|
||||
"blah blah
|
||||
and some more words which are part of foo's value."
|
||||
|
||||
Finally, anything after '__END__' on a line by itself gets inserted
|
||||
literally into each .wld file. This is the place to put <monitor>
|
||||
sections.
|
||||
|
||||
--------------------------
|
||||
II. Workload Configuration
|
||||
--------------------------
|
||||
|
||||
Parameters with no default are required.
|
||||
|
||||
Messages
|
||||
--------
|
||||
|
||||
Message attributes are defined in the `message' section.
|
||||
|
||||
Parameter Default Description
|
||||
--------- ------- -----------
|
||||
size size distribution (including headers).
|
||||
recipients number of recipients
|
||||
headers ~unif(10, 30) number of headers
|
||||
line length 60 line length
|
||||
mime 0 number of MIME parts
|
||||
|
||||
Users
|
||||
-----
|
||||
|
||||
User behavior parameters are described in the `user' section.
|
||||
|
||||
Parameter Default Description
|
||||
--------- ------- -----------
|
||||
messages per day
|
||||
protocol mail read
|
||||
activity `DURATION each TIME' or `START - STOP'
|
||||
check interval how often user checks mail when active
|
||||
read messages 0 number of old msgs each user has
|
||||
read time 0 how long user takes to `read' a message
|
||||
keep 0 proportion of messages kept on server
|
||||
connection type <unlimited> `latency = X ; bandwidth = X'
|
||||
drop rate 0 proportion of connections dropped before logout
|
||||
|
||||
Delivery
|
||||
--------
|
||||
|
||||
Delivery parameters are described in the `delivery' section.
|
||||
|
||||
Parameter Default Description
|
||||
--------- ------- -----------
|
||||
messages per connection 1 messages sent per SMTP session
|
||||
percent remote 0 % mail going to remote host (sink)
|
||||
connection type <unlimited>
|
||||
fluctuation <uniform> `START - END = X % ; ...'
|
||||
|
||||
Test
|
||||
----
|
||||
|
||||
The `test' section configures the number of users, the time of day to
|
||||
be simulated, etc.
|
||||
|
||||
Parameter Default Description
|
||||
--------- ------- -----------
|
||||
start time of day to start sim
|
||||
end end time of day.
|
||||
length duration. Either length or end
|
||||
must be specified.
|
||||
users total user base
|
||||
percent active percentage of total user base active
|
||||
during test period
|
||||
messages per second messages per second to delivery for
|
||||
SMTP-only simulation. Either
|
||||
`messages per second' or `users'
|
||||
and `percent active' must be
|
||||
specified.
|
||||
comments <nothing> notes on test.
|
||||
preparer Anonymous Name to use on reports.
|
||||
date <ctime(3)>
|
||||
configuration <nothing> Configuration name for report.
|
||||
|
||||
Environment Configuration
|
||||
-------------------------
|
||||
|
||||
Several sections describe the test environment:
|
||||
|
||||
Sink
|
||||
----
|
||||
|
||||
The `sink' section describes the remote mail sink.
|
||||
|
||||
Parameter Default Description
|
||||
--------- ------- -----------
|
||||
addressFormat smuser%ld@ Like addressFormat, but used to
|
||||
generate remote addresses.
|
||||
`hostname' will be appended if it
|
||||
ends in `@'.
|
||||
hostname host on which SMTP sink lives. Used
|
||||
for remote delivery.
|
||||
|
||||
Server
|
||||
------
|
||||
|
||||
The `server' section describes the mail server to be sized:
|
||||
|
||||
Parameter Default Description
|
||||
--------- ------- -----------
|
||||
smtp port 25
|
||||
pop port 110
|
||||
imap port 143
|
||||
web port 1066
|
||||
|
||||
hostname Mail server
|
||||
|
||||
addressFormat smuser%ld@ Passed to
|
||||
sprintf(recipient, addressFormat,
|
||||
userNum, domainNum). If
|
||||
addressFormat ends in `@', `server'
|
||||
is automatically appended.
|
||||
loginFormat smuser%ld@ Same as addressFormat, but used to
|
||||
generate usernames.
|
||||
passwdFormat twang passed to sprintf(passwd, passwdFormat,
|
||||
userNum, domainNum).
|
||||
firstAddress 0 first userNum for addresses
|
||||
firstLogin 0 first userNum for logins
|
||||
smtpMailFrom $USER@$HOST sending address on test mail.
|
||||
|
||||
name Printable server name for reports.
|
||||
hardware Brief hardware description.
|
||||
software Brief software description.
|
||||
|
||||
Clients
|
||||
-------
|
||||
|
||||
The `clients' section describes test client configuration.
|
||||
|
||||
Parameter Default Description
|
||||
--------- ------- -----------
|
||||
smtp localhost client machines for SMTP
|
||||
imap localhost for IMAP
|
||||
pop localhost for POP3
|
||||
web localhost for WEBMAIL
|
||||
|
||||
rsh rsh rsh program to start remote clients
|
||||
rcp rcp rcp program to distribute files
|
||||
command mailclient program to run to start clients
|
||||
|
||||
cert file file containing SSL certificate
|
||||
key file file containing SSL key
|
||||
|
||||
Ugly Mstone details
|
||||
-------------------
|
||||
|
||||
The `mstone' section controls low-level details of how the workload
|
||||
description is translated into mstone terms. The parameters make some
|
||||
assumptions about the size of both the test clients and the server, so
|
||||
they may have to be tweaked. For small- to mid-size configurations,
|
||||
the defaults should work.
|
||||
|
||||
Parameter Default Description
|
||||
--------- ------- -----------
|
||||
preload rate 5 msgs/sec to deliver during preload.
|
||||
preload per connection 100 messages per SMTP session
|
||||
preload delivery time 750 msec expected message delivery time.
|
||||
used to control throttling.
|
||||
preload throttle 500 msec faster/slower than expected at
|
||||
which to throttle
|
||||
throttleFactor 1.1 factor by which to increase/decrease
|
||||
delivery rate when throttling
|
||||
|
||||
read rate 40 msgs/sec to read when aging old
|
||||
messages.
|
||||
read clients 5 test clients to use for aging
|
||||
read protocol (user:protocol) protocol to age messages (e.g. imap)
|
||||
|
||||
rampTime 0 test rampup time
|
||||
smtp connection time 10s
|
||||
pop user spacing 10s MULTIPOP: time between users
|
||||
pop connections per client 10 MULTIPOP: connections per client
|
||||
no event queues false use 1 thread per client
|
||||
max threads per proc 250
|
||||
clientCount 10000 artificial global clientCount
|
||||
|
||||
----------------------
|
||||
III. Report Generation
|
||||
----------------------
|
||||
|
||||
There are several additional configuration sections to provide
|
||||
additional information for sizing reports. The code is in
|
||||
`lib/{sizing,hardware}_defaults.pm'.
|
||||
|
||||
QoS Constraints
|
||||
---------------
|
||||
|
||||
Quality of Service constraints are specified in the `qos' section.
|
||||
See reports/qos.in for an example. The qos section can have any
|
||||
number of members. The name of each member is a description which
|
||||
will appear in the sizing report. The value is a block of perl code
|
||||
which should return a pair of values when evaluated in a context where
|
||||
`$run' is a reference to a hash containing data on the test run to be
|
||||
evaluated. The first value is a value corresponding to this
|
||||
constraint which will be printed in the report. The second is true if
|
||||
the run passed this constraint.
|
||||
|
||||
Hardware
|
||||
--------
|
||||
|
||||
The `machine' section describes the hardware under test. Unlike
|
||||
previous, simple sections, it containts nested values (as hash refs).
|
||||
|
||||
Parameter Description
|
||||
--------- -----------
|
||||
|
||||
processors
|
||||
speed
|
||||
cache
|
||||
|
||||
network
|
||||
|
||||
storage
|
||||
controllers
|
||||
disks
|
||||
type
|
||||
speed
|
||||
model
|
||||
timing
|
||||
OS
|
||||
parameters
|
||||
disks
|
||||
logging
|
||||
|
||||
Software
|
||||
--------
|
||||
|
||||
The `software' section describes the software under test. If multiple
|
||||
types of software are in use, multiple software sections should be
|
||||
specified. The only default parameter for software is the `name'.
|
||||
Other parameters should describe configuration information, version,
|
||||
etc.
|
||||
@@ -1,53 +0,0 @@
|
||||
test:
|
||||
start: 8 AM
|
||||
length: 1h
|
||||
users: ** Number of users here ***
|
||||
|
||||
percent active: 100
|
||||
|
||||
comments: auto-generated Corporate workload.
|
||||
|
||||
-- mail server configuration --
|
||||
|
||||
server:
|
||||
hostname: ** SERVER **
|
||||
|
||||
# defaults given below --
|
||||
# addressFormat: smuser%ld@
|
||||
# loginFormat: smuser%ld@
|
||||
# passwdFormat: twang
|
||||
|
||||
-- test client configuration --
|
||||
|
||||
clients:
|
||||
smtp: ** SMTP clients here **
|
||||
imap: ** IMAP clients here **
|
||||
|
||||
# defaults are `rsh' and `rcp'
|
||||
# rsh: ssh
|
||||
# rcp: scp
|
||||
|
||||
-- Don't edit between here and the `__END__' marker --
|
||||
|
||||
mstone:
|
||||
rampTime: 30s
|
||||
|
||||
message:
|
||||
size: ~lognormal(4k,4.5)
|
||||
recipients: ~lognormal(1,2) : [1, ]
|
||||
mime: ~binomial(0.3)
|
||||
|
||||
delivery:
|
||||
fluctuation: 8 AM - 4 PM = 90%
|
||||
|
||||
user:
|
||||
messages per day: 50
|
||||
read messages: 50
|
||||
protocol: IMAP
|
||||
check interval: ~unif(5m, 8m)
|
||||
connection type: latency = 0; bandwidth = 56k
|
||||
keep: 100%
|
||||
activity: 8 AM - 4 PM; arrival rate = ~normal(20m, 10m)
|
||||
|
||||
__END__
|
||||
# your monitor sections go here...
|
||||
@@ -1,2 +0,0 @@
|
||||
<client HOSTS=localhost>
|
||||
</client>
|
||||
@@ -1,38 +0,0 @@
|
||||
# common setup info for tests
|
||||
# See sample.wld for detailed usage
|
||||
|
||||
# Information on how the test is distributed and reported
|
||||
# Test independent configuration
|
||||
<CONFIG>
|
||||
comments Netscape MSG4.15
|
||||
sysConfig conf/sample.html # File for additonal system config
|
||||
|
||||
# Debug with short runs and a few clients, then increase test time
|
||||
# These get overridden in the test specific files (or the command line)
|
||||
clientCount 5 # nominal clientCount (usually overriden)
|
||||
rampTime 10s
|
||||
time 30s
|
||||
|
||||
# each test should set a title in their CONFIG section
|
||||
# This is a reminder when using old test workloads
|
||||
title Need to set test title
|
||||
</CONFIG>
|
||||
|
||||
# Specify client machines
|
||||
<CLIENT HOSTS=localhost>
|
||||
</CLIENT>
|
||||
|
||||
# Information on the test itself
|
||||
|
||||
# Use the <Default> tag to set command defaults
|
||||
<DEFAULT>
|
||||
server mailhost.example.com
|
||||
smtpMailFrom mailtestuser0@mailhost.example.com
|
||||
loginFormat mailtestuser%ld
|
||||
addressFormat mailtestuser%ld@mailhost.example.com
|
||||
passwdFormat myPassword
|
||||
numLogins 100
|
||||
firstLogin 0
|
||||
numAddresses 100
|
||||
firstAddress 0
|
||||
</DEFAULT>
|
||||
@@ -1,10 +0,0 @@
|
||||
# MailStone workload configuration file. See sample.wld for detailed usage
|
||||
# Typical HTTP GETs
|
||||
|
||||
<includeOnce conf/general.wld>
|
||||
|
||||
<HTTP>
|
||||
weight 100
|
||||
numLoops 1
|
||||
httpcommand GET /
|
||||
</HTTP>
|
||||
@@ -1,74 +0,0 @@
|
||||
#!/bin/ksh
|
||||
# fire off the series of Mailstone IMAP tests
|
||||
|
||||
# To test series setup, do: go_imap -n
|
||||
|
||||
|
||||
# Look for testname$test_form, first. Override with: go_series -f <string>.
|
||||
export test_form="_mail02"
|
||||
|
||||
export test_host="mail02"
|
||||
|
||||
# string appended to every description. Override with: go_series -d <string>.
|
||||
export desc_conf="12 CPUs"
|
||||
|
||||
# Extra arguments common to all tests. Any other args go here.
|
||||
# Note that arguments with embedded spaces wont work here.
|
||||
# Instead use: go_series -- <args...>
|
||||
export extra_args=""
|
||||
|
||||
# error limit to abort sequence
|
||||
export error_limit=500
|
||||
|
||||
# time to allow the server to calm down after each run (seconds)
|
||||
export sleep_time=120
|
||||
|
||||
# who to mail results to
|
||||
#export mail_list="me@example.com,you@example.com"
|
||||
export mail_list=""
|
||||
|
||||
# Get all the helper functions
|
||||
. test_utils.ksh
|
||||
|
||||
### This is where the series of tests is defined
|
||||
|
||||
# clean and re-start server
|
||||
if [[ $only_show_it -gt 0 ]] ; then
|
||||
echo "Would run:" "$@"
|
||||
return 0
|
||||
else
|
||||
# BUG: rsh never returns.
|
||||
# individual commands in clean work fine, but fail as a whole
|
||||
rsh -n $test_host /bin/ksh /iplanet/bin/clean$test_form &
|
||||
sleep 300 && kill -9 $!
|
||||
wait
|
||||
fi
|
||||
|
||||
# check our setup
|
||||
run timesync
|
||||
|
||||
###echo "DEBUG exit" && exit 0
|
||||
|
||||
run_test popdel 'Create mailboxes (random order)' -t 60m maxblocks=100000 "$@"
|
||||
run_test allpop 'Create mailboxes (exhaustive)' "$@"
|
||||
|
||||
run_test imaplogin 'IMAP login rate' "$@"
|
||||
|
||||
run_test smtp10k-5-5k 'Deliver 5, 5k messages to 10k users' "$@"
|
||||
sleep 200 # let queue drain (2000/(10 msg/sec))
|
||||
run_test imapread10k 'IMAP Message downloads 5k from 10k users' "$@"
|
||||
|
||||
run_test smtp10k-5-5k 'Deliver 5, 5k messages to 10k users' "$@"
|
||||
sleep 200 # let queue drain (2000/(10 msg/sec))
|
||||
run_test imapread 'IMAP Message downloads 5k' "$@"
|
||||
|
||||
run_test imapsmtp-throttle 'Combined IMAP-SMTP load (1 of 3)' "$@"
|
||||
run_test imapsmtp-throttle 'Combined IMAP-SMTP load (2 of 3)' "$@"
|
||||
run_test imapsmtp-throttle 'Combined IMAP-SMTP load (3 of 3)' "$@"
|
||||
|
||||
# Some messages will be left from previous test
|
||||
run_test imapmaxusers 'IMAP 30K simultaneous users' "$@"
|
||||
|
||||
# e-mail the whole batch
|
||||
[[ -n "$mail_list" ]] && \
|
||||
mail_series "DotCom IMAP: `date`" "$mail_list"
|
||||
@@ -1,19 +0,0 @@
|
||||
# MailStone workload configuration file. See sample.wld for detailed usage
|
||||
# Typical IMAP checks/reads
|
||||
|
||||
<includeOnce conf/general.wld>
|
||||
|
||||
<CONFIG> # test specific config
|
||||
title IMAP reads
|
||||
clientCount 100 # since IMAP has long sleeps, use lots of clients
|
||||
</CONFIG>
|
||||
|
||||
<IMAP4>
|
||||
weight 100
|
||||
#leaveMailOnServer 1
|
||||
|
||||
idleTime 2s # time between login and first download check
|
||||
loopDelay 5m # time between download checks
|
||||
numLoops 10 # how many check to do before closing the connection
|
||||
blockTime 2s # time between logout and next login (or other block)
|
||||
</IMAP4>
|
||||
@@ -1,51 +0,0 @@
|
||||
-- test size --
|
||||
|
||||
test:
|
||||
length: 90m
|
||||
users: ** Number of users here ***
|
||||
percent active: 10
|
||||
|
||||
comments: Auto-generated ISP workload.
|
||||
|
||||
-- mail server configuration --
|
||||
|
||||
server:
|
||||
hostname: ** SERVER **
|
||||
|
||||
# defaults --
|
||||
# addressFormat: smuser%ld@
|
||||
# firstAddress: 0
|
||||
# loginFormat: smuser%ld@
|
||||
# firstLogin: 0
|
||||
# passwdFormat: twang
|
||||
#
|
||||
|
||||
-- test client configuration --
|
||||
|
||||
clients:
|
||||
smtp: ** SMTP clients here **
|
||||
pop: ** POP clients go here **
|
||||
|
||||
# defaults are `rsh' and `rcp'
|
||||
# rsh: rsh
|
||||
# rcp: rcp
|
||||
|
||||
-- Do not edit between here and the `__END__' marker
|
||||
|
||||
message:
|
||||
size: ~lognormal(3k,4.5)
|
||||
recipients: ~lognormal(1,1.5) : [1, ]
|
||||
mime: 30 %
|
||||
|
||||
user:
|
||||
messages per day: 5
|
||||
read messages: 0
|
||||
protocol: POP
|
||||
check interval: ~unif(5m, 8m)
|
||||
connection type: latency = 0; bandwidth = 56k
|
||||
keep: 5%
|
||||
activity: 30 m each 24 h
|
||||
drop rate: 0.5%
|
||||
|
||||
__END__
|
||||
# other things (e.g. <monitor> sections) can go here...
|
||||
@@ -1,36 +0,0 @@
|
||||
<default>
|
||||
addressFormat smuser%ld@** DOMAIN **
|
||||
loginFormat smuser%ld@** DOMAIN **
|
||||
passwdFormat twang
|
||||
server ** SERVER **
|
||||
</default>
|
||||
|
||||
<smtp HOSTS=smtp>
|
||||
blockTime 0
|
||||
file auto
|
||||
firstAddress 0
|
||||
headers ~unif(10, 30)
|
||||
mime ~binomial(0.3)
|
||||
numAddresses 1000
|
||||
numLoops 1
|
||||
numRecips ~lognormal(1,2) : [1, ]
|
||||
size ~lognormal(4k,4.5)
|
||||
smtpMailFrom sender0@** DOMAIN **
|
||||
useEHLO 2
|
||||
portNum 2003
|
||||
</smtp>
|
||||
|
||||
<client HOSTS=localhost>
|
||||
clients 50
|
||||
group smtp
|
||||
</client>
|
||||
<config>
|
||||
comments lmtp delivery
|
||||
rampTime 0
|
||||
time 5m
|
||||
title lmtp delivery - IMAP
|
||||
useGroups 1
|
||||
</config>
|
||||
|
||||
# other things (e.g. <monitor> sections) can go here...
|
||||
|
||||
@@ -1,36 +0,0 @@
|
||||
<default>
|
||||
addressFormat smuser%ld@** DOMAIN **
|
||||
loginFormat smuser%ld@** DOMAIN **
|
||||
passwdFormat twang
|
||||
server ** SERVER **
|
||||
</default>
|
||||
|
||||
<smtp HOSTS=smtp>
|
||||
blockTime 0
|
||||
file auto
|
||||
firstAddress 0
|
||||
headers ~unif(10, 30)
|
||||
mime 30 %
|
||||
numAddresses 1000
|
||||
numLoops 1
|
||||
numRecips ~lognormal(1,1.5) : [1, ]
|
||||
size ~lognormal(3k,4.5)
|
||||
smtpMailFrom sender0@** DOMAIN **
|
||||
useEHLO 2
|
||||
portNum 2003
|
||||
</smtp>
|
||||
|
||||
<client HOSTS=localhost>
|
||||
clients 50
|
||||
group smtp
|
||||
</client>
|
||||
<config>
|
||||
comments lmtp delivery
|
||||
rampTime 0
|
||||
time 5m
|
||||
title lmtp delivery - POP
|
||||
useGroups 1
|
||||
</config>
|
||||
|
||||
# other things (e.g. <monitor> sections) can go here...
|
||||
|
||||
@@ -1,84 +0,0 @@
|
||||
#!/bin/ksh
|
||||
# fire off the series of Mailstone tests
|
||||
|
||||
# To test series, do: go_series -n
|
||||
|
||||
|
||||
# Look for testname$test_form, first. Override with: go_series -f <string>.
|
||||
export test_form="_mail02"
|
||||
|
||||
export test_host="mail02"
|
||||
|
||||
# string appended to every description. Override with: go_series -d <string>.
|
||||
export desc_conf="12 CPUs"
|
||||
|
||||
# Extra arguments common to all tests. Any other args go here.
|
||||
# Note that arguments with embedded spaces wont work here.
|
||||
# Instead use: go_series -- <args...>
|
||||
export extra_args=""
|
||||
|
||||
# error limit to abort sequence
|
||||
export error_limit=500
|
||||
|
||||
# time to allow the server to calm down after each run (seconds)
|
||||
export sleep_time=120
|
||||
|
||||
# who to mail results to
|
||||
#export mail_list="me@example.com,you@example.com"
|
||||
export mail_list=""
|
||||
|
||||
# Get all the helper functions
|
||||
. test_utils.ksh
|
||||
|
||||
### This is where the series of tests is defined
|
||||
|
||||
# clean and re-start server
|
||||
if [[ $only_show_it -gt 0 ]] ; then
|
||||
echo "Would run:" "$@"
|
||||
return 0
|
||||
else
|
||||
# BUG: this never returns. rsh never returns
|
||||
# individual commands in clean work fine, but fail as a whole
|
||||
rsh -n $test_host /bin/ksh /iplanet/bin/clean$test_form &
|
||||
sleep 300 && kill -9 $!
|
||||
wait
|
||||
fi
|
||||
|
||||
# check our setup
|
||||
run timesync
|
||||
|
||||
###echo "DEBUG exit" && exit 0
|
||||
|
||||
run_test popdel 'Create mailboxes (random order)' -t 60m maxblocks=100000 "$@"
|
||||
run_test allpop 'Create mailboxes (exhaustive)' "$@"
|
||||
|
||||
run_test popdel 'Empty checks: never used (1 of 3)' "$@"
|
||||
run_test popdel 'Empty checks: never used (2 of 3)' "$@"
|
||||
run_test popdel 'Empty checks: never used (3 of 3)' "$@"
|
||||
|
||||
run_test smtp10k-5-5k 'Deliver 5, 5k messages to 10k users' "$@"
|
||||
sleep 200 # let queue drain (2000/(10 msg/sec))
|
||||
|
||||
run_test popsave10k 'Message downloads 5k from 10k users (1 of 3)' "$@"
|
||||
run_test popsave10k 'Message downloads 5k from 10k users (2 of 3)' "$@"
|
||||
run_test popsave10k 'Message downloads 5k from 10k users (3 of 3)' "$@"
|
||||
|
||||
run_test popsave 'Message downloads 5k (1 of 3)' "$@"
|
||||
run_test popsave 'Message downloads 5k (2 of 3)' "$@"
|
||||
run_test popsave 'Message downloads 5k (3 of 3)' "$@"
|
||||
|
||||
run_test popsmtp-throttle 'Combined load (1 of 3)' "$@"
|
||||
run_test popsmtp-throttle 'Combined load (2 of 3)' "$@"
|
||||
run_test popsmtp-throttle 'Combined load (3 of 3)' "$@"
|
||||
|
||||
run_test smtp100k 'SMTP delivery rate' "$@"
|
||||
|
||||
run_test popclean 'Message downloads/delete 5k ' "$@"
|
||||
|
||||
run_test popdel 'Empty checks (1 of 3)' "$@"
|
||||
run_test popdel 'Empty checks (2 of 3)' "$@"
|
||||
run_test popdel 'Empty checks (3 of 3)' "$@"
|
||||
|
||||
# e-mail the whole batch
|
||||
[[ -n "$mail_list" ]] && \
|
||||
mail_series "DotCom POP: `date`" "$mail_list"
|
||||
@@ -1,15 +0,0 @@
|
||||
# MailStone workload configuration file. See sample.wld for detailed usage
|
||||
# Typical POP checks/reads
|
||||
|
||||
<includeOnce conf/general.wld>
|
||||
|
||||
<CONFIG> # test specific config
|
||||
title POP reads
|
||||
clientCount 50
|
||||
</CONFIG>
|
||||
|
||||
<POP3>
|
||||
weight 100
|
||||
numLoops 9999 # will close when messages run out
|
||||
#leaveMailOnServer 1
|
||||
</POP3>
|
||||
@@ -1,44 +0,0 @@
|
||||
# MailStone workload configuration file. See sample.wld for detailed usage
|
||||
# Deliver mail using SMTP
|
||||
# This can measure delivery rates for a specified message type.
|
||||
# This also fills the store for POP or IMAP tests
|
||||
|
||||
<includeOnce conf/general.wld>
|
||||
|
||||
<CONFIG> # test specific config
|
||||
title POP, IMAP, SMTP combined load
|
||||
clientCount 100
|
||||
</CONFIG>
|
||||
|
||||
|
||||
# MailStone workload configuration file. See sample.wld for detailed usage
|
||||
# Typical SMTP delivery with 1K message size and restricted accounts
|
||||
|
||||
<SMTP HOSTS=client1>
|
||||
file en-1k.msg
|
||||
weight 100
|
||||
#numAddresses 200
|
||||
</SMTP>
|
||||
|
||||
|
||||
# MailStone workload configuration file. See sample.wld for detailed usage
|
||||
# Typical POP checks/reads
|
||||
|
||||
|
||||
<POP3 HOSTS=client2>
|
||||
weight 100
|
||||
#leaveMailOnServer 1
|
||||
</POP3>
|
||||
|
||||
|
||||
# MailStone workload configuration file. See sample.wld for detailed usage
|
||||
# Typical IMAP checks/reads
|
||||
|
||||
# IMAP maintains a connection (unlike POP or SMTP)
|
||||
# for combined load tests, run it on separate client machines
|
||||
<IMAP4 HOSTS=client3>
|
||||
weight 100
|
||||
idleTime 5
|
||||
checkMailInterval 10
|
||||
numLoops 1000
|
||||
</IMAP4>
|
||||
@@ -1,21 +0,0 @@
|
||||
# MailStone workload configuration file. See sample.wld for detailed usage
|
||||
# Deliver mail using SMTP
|
||||
# This can measure delivery rates for a specified message type.
|
||||
# This also fills the store for POP or IMAP tests
|
||||
|
||||
<includeOnce conf/general.wld>
|
||||
|
||||
<CONFIG> # test specific config
|
||||
title POP reads with SMTP message deliveries
|
||||
clientCount 50
|
||||
</CONFIG>
|
||||
|
||||
<include conf/smtp1k.wld>
|
||||
<include conf/smtp5k.wld>
|
||||
<include conf/smtp17k.wld>
|
||||
|
||||
<POP3>
|
||||
weight 100
|
||||
#leaveMailOnServer 1
|
||||
</POP3>
|
||||
|
||||
@@ -1,12 +0,0 @@
|
||||
<!-- this file provides system comments and is merged into reports -->
|
||||
<PRE>
|
||||
<B> Mailhost.example.com </B>
|
||||
EXAMPLE SYSTEM CONFIGURATION
|
||||
Netscape Messaging Server 4.15 (7/21/99)
|
||||
E6000
|
||||
26x250MHz UltraSPARC-II
|
||||
6.5GB RAM
|
||||
A3500 w/ 60x9GB 7200 RPM
|
||||
store: 5 x (10x9 RAID-0)
|
||||
queue: 1 x (10x9 RAID-0)
|
||||
</PRE>
|
||||
@@ -1,281 +0,0 @@
|
||||
# MailStone workload configuration file
|
||||
#
|
||||
# Include other workload files like this:
|
||||
# <include conf/morework.wld>
|
||||
#
|
||||
# If you want a workload included ONLY ONCE in the test, use this
|
||||
# <includeOnce conf/morework.wld>
|
||||
#
|
||||
# See Also:
|
||||
# smtp.wld - typical SMTP delivery test
|
||||
# pop.wld - typical POP3 check/download test
|
||||
# imap.wld - typical IMAP4 check/download test
|
||||
|
||||
|
||||
######################################################################
|
||||
# These sections discribe how the test is run:
|
||||
# CONFIG, CLIENT, MONITOR, PRETEST, POSTTEST
|
||||
|
||||
# The <CONFIG> section defines test setup and report parameters
|
||||
# Multiple <CONFIG> sections will be merged into a one.
|
||||
# The equivalent command line switch is shown in parenthesis.
|
||||
<CONFIG>
|
||||
title POP reads # title for report and index (-b)
|
||||
comments Netscape MSG4.1 # additional info at top of report (-n)
|
||||
|
||||
time 3m # test time (-t)
|
||||
rampTime 20s # portion of test to start things (-r)
|
||||
clientCount 12 # number of client connections (-l)
|
||||
|
||||
maxErrors 10000 # set an error abort limit
|
||||
maxBlocks 50000 # stop after this many blocks
|
||||
|
||||
#sysConfig conf/mailhost.txt # Pull in config file (-s)
|
||||
sysConfig \ # Inline config text
|
||||
<PRE>\
|
||||
<B> mailhost.example.com </B>\
|
||||
Netscape Messaging Server 4.11\
|
||||
Linux 2.2.5\
|
||||
4x400Mhz Xeon (1Mb)\
|
||||
2Gb RAM\
|
||||
</PRE>
|
||||
|
||||
useGroups 1 # use group names instead of host names
|
||||
|
||||
telemetry 1 # log telemetry (for debugging)
|
||||
|
||||
# These usually dont need to be set. These are the defaults
|
||||
GnuPlot gnuplot/gnuplot
|
||||
RSH ssh
|
||||
# RSH /usr/bin/remsh # HP-UX uses this path
|
||||
RCP scp
|
||||
# RCP /usr/bin/rcp
|
||||
tempDir /var/tmp # client machine directory
|
||||
chartWidth 640
|
||||
chartHeight 480
|
||||
clientCommand mailclient # CLIENT command to run
|
||||
monitorCommand vmstat %f # MONITOR command to run
|
||||
makeUsersArgs -4 # args to makeusers
|
||||
imageType png # gnuplot image type: png, gif, ...
|
||||
</CONFIG>
|
||||
|
||||
# Each <Client> section defines one or more client machines
|
||||
# Every machine in the section will run the same number of connections
|
||||
# Note that there cannot be whitespace between the client hostnames
|
||||
<CLIENT HOSTS=client1,client2>
|
||||
arch Linux2.2_x86
|
||||
maxClients 200
|
||||
maxThreads 50
|
||||
|
||||
# the group is only used if "useGroups" is set
|
||||
group A
|
||||
|
||||
command mailclient -m 100 # override the command to run
|
||||
</CLIENT>
|
||||
|
||||
# Set a specific number of processes and threads
|
||||
<CLIENT HOSTS=client3,client4>
|
||||
arch SunOS5.6
|
||||
processes 2
|
||||
threads 10
|
||||
|
||||
# the group is only used if "useGroups" is set
|
||||
group B
|
||||
</CLIENT>
|
||||
|
||||
# Here is how to configure a WinNT client from a Unix mail master
|
||||
# The NT rshd must interoperate with Unix rsh; allow redirection of
|
||||
# stdin, stdout, and stderr; and must support binary file copies.
|
||||
# Denicomp's wrshdnt has been used sucessfully. www.denicomp.com
|
||||
<CLIENT HOSTS=winnt01>
|
||||
Arch WINNT4.0
|
||||
command mailclient.exe
|
||||
tempDir c:\temp
|
||||
</CLIENT>
|
||||
|
||||
# The PreTest sections will run before the test starts
|
||||
<PRETEST HOSTS=mailhost.example.com>
|
||||
# RSH rsh -l mailuser
|
||||
command cd /usr/netscape/msg-mailhost; ./getconf
|
||||
</PRETEST>
|
||||
|
||||
# Each <Monitor> section defines remote monitoring commands
|
||||
# for one or more machines.
|
||||
# Commands containing '%c' run to completion.
|
||||
# Otherwise the command will be shutdown down
|
||||
<MONITOR HOSTS=mailhost.example.com>
|
||||
command vmstat,%f,%c
|
||||
</MONITOR>
|
||||
|
||||
# The PostTest sections will run after the test completes
|
||||
<POSTTEST HOSTS=mailhost.example.com>
|
||||
command df
|
||||
</POSTTEST>
|
||||
|
||||
|
||||
######################################################################
|
||||
# available protcols: SMTP, POP3, IMAP4
|
||||
# (command names are not case sensitive)
|
||||
#
|
||||
# Time formats use suffixes of 's', 'm', 'h', 'd'
|
||||
# for seconds, minutes, hours, days
|
||||
# In account formats, "%ld" is replaced by user number
|
||||
|
||||
# These parameters apply to the protocol sections
|
||||
# Command parameter applicable command Example
|
||||
#-------------------------------------------------------------------
|
||||
# server <ALL> mail.example.com
|
||||
# portNum <ALL> 25
|
||||
# (if no value is given, the default port for that service is used)
|
||||
#
|
||||
# weight <ALL> 20
|
||||
#
|
||||
# loginFormat <ALL> test%ld
|
||||
# %ld=address %ld=domain
|
||||
# firstLogin <ALL> 0
|
||||
# numLogins <ALL> 2000
|
||||
# sequentialLogins <ALL> 1
|
||||
# passwdFormat <ALL> netscape
|
||||
#
|
||||
# addressFormat <ALL> test%ld@mail.example%ld.com
|
||||
# %ld=address %ld=domain
|
||||
# firstAddress <ALL> 0
|
||||
# numAddresses <ALL> 2000
|
||||
# sequentialAddresses <ALL> 1
|
||||
#
|
||||
# numDomains <ALL> 3
|
||||
# firstDomain <ALL> 0
|
||||
# sequentialDomains <ALL> 1
|
||||
#
|
||||
# idleTime <ALL> 5m
|
||||
# numLoops <ALL> 200
|
||||
# loopDelay <ALL> 1m
|
||||
# blockTime <ALL> 5m
|
||||
#
|
||||
# numRecips SMTP 3
|
||||
# smtpMailFrom SMTP mailstone@mail.example.com
|
||||
# file SMTP en-3k.msg
|
||||
# useEHLO SMTP 1 (default is HELO)
|
||||
# useAUTHLOGIN SMTP 1 (no AUTHLOGIN by default)
|
||||
#
|
||||
# leaveMailOnServer POP3,IMAP4 1
|
||||
# leaveMailUnSeen IMAP4 1
|
||||
|
||||
# The <Default> section sets command block defaults
|
||||
# Multiple <Default> sections will be merged into one
|
||||
<DEFAULT>
|
||||
server mailhost.example.com
|
||||
smtpMailFrom mailhost0@mailhost.example.com
|
||||
addressFormat mailhost%ld@mailhost.example.com
|
||||
loginFormat mailhost%ld
|
||||
passwdFormat netscape
|
||||
numLogins 1000
|
||||
numAddresses 1000
|
||||
</DEFAULT>
|
||||
|
||||
# Note: empty host list means all hosts
|
||||
<SMTP>
|
||||
file en-1k.msg
|
||||
weight 10
|
||||
numAddresses 200
|
||||
</SMTP>
|
||||
|
||||
<include conf/smtp17.wld>
|
||||
|
||||
# Note: the host name must be the same as specified in the CLIENT section
|
||||
<POP3 HOSTS=client1,client2>
|
||||
weight 10
|
||||
#leaveMailOnServer 1
|
||||
</POP3>
|
||||
|
||||
<IMAP4 HOSTS=client3>
|
||||
idleTime 300
|
||||
#weight 15
|
||||
</IMAP4>
|
||||
|
||||
|
||||
######################################################################
|
||||
# These sections are used to generate the right graphs for the test
|
||||
# This is the built in defaults
|
||||
<GRAPH name=connects>
|
||||
title Number of connections attempted
|
||||
label Connections/sec
|
||||
variables conn
|
||||
field Try
|
||||
</GRAPH>
|
||||
|
||||
<GRAPH name=connections>
|
||||
title Total connections
|
||||
label Connections
|
||||
variables connections
|
||||
</GRAPH>
|
||||
|
||||
<GRAPH name=connErrors>
|
||||
title Number of connection errors
|
||||
label Errors/sec
|
||||
variables conn, banner, login, logout
|
||||
field Error
|
||||
</GRAPH>
|
||||
|
||||
<GRAPH name=msgErrors>
|
||||
title Number of command/message errors
|
||||
label Errors/sec
|
||||
variables cmd, submit, retrieve
|
||||
field Error
|
||||
</GRAPH>
|
||||
|
||||
<GRAPH name=retrieves>
|
||||
Title Number of messages read
|
||||
label Messages/sec
|
||||
variables retrieve
|
||||
field Try
|
||||
</GRAPH>
|
||||
|
||||
<GRAPH name=submits>
|
||||
title Number of messages written
|
||||
label Messages/sec
|
||||
variables submit
|
||||
field Try
|
||||
</GRAPH>
|
||||
|
||||
<GRAPH name=commands>
|
||||
title Number of commands sent
|
||||
label Commands/sec
|
||||
variables cmd
|
||||
field Try
|
||||
</GRAPH>
|
||||
|
||||
<GRAPH name=readBytes>
|
||||
title Bytes read
|
||||
label Bytes/sec
|
||||
variables login, banner, cmd, retrieve, submit, logout
|
||||
field BytesR
|
||||
</GRAPH>
|
||||
|
||||
<GRAPH name=writeBytes>
|
||||
title Bytes written
|
||||
label Bytes/sec
|
||||
variables login, banner, cmd, retrieve, submit, logout
|
||||
field BytesW
|
||||
</GRAPH>
|
||||
|
||||
<GRAPH name=msgTime>
|
||||
title Message transfer time
|
||||
label Seconds per message
|
||||
variables cmd, submit, retrieve
|
||||
field Time
|
||||
</GRAPH>
|
||||
|
||||
<GRAPH name=setupTime>
|
||||
Title Connection setup time
|
||||
label Seconds per connection
|
||||
variables conn, banner, login
|
||||
field Time
|
||||
</GRAPH>
|
||||
|
||||
<GRAPH name=blocks>
|
||||
title Number of mailstone blocks executed
|
||||
label Blocks/sec
|
||||
variables blocks
|
||||
# this is a scalar. No "field" needed/allowed
|
||||
</GRAPH>
|
||||
@@ -1,16 +0,0 @@
|
||||
# MailStone workload configuration file. See sample.wld for detailed usage
|
||||
# Deliver mail using SMTP
|
||||
# This can measure delivery rates for a specified message type.
|
||||
# This also fills the store for POP or IMAP tests
|
||||
|
||||
<includeOnce conf/general.wld>
|
||||
|
||||
<CONFIG> # test specific config
|
||||
title SMTP message deliveries
|
||||
clientCount 20
|
||||
</CONFIG>
|
||||
|
||||
# if we include more than one, we get a distribution of all sizes
|
||||
<include conf/smtp1k.wld>
|
||||
<include conf/smtp5k.wld>
|
||||
<include conf/smtp17k.wld>
|
||||
@@ -1,33 +0,0 @@
|
||||
-- test size --
|
||||
|
||||
test:
|
||||
length: 90m
|
||||
users: 100
|
||||
messages per second: ** Delivery Rate **
|
||||
|
||||
comments: Auto-generated SMTP-only workload
|
||||
|
||||
-- server configuration --
|
||||
|
||||
server:
|
||||
hostname: ** SERVER **
|
||||
# addressFormat: smuser%ld@
|
||||
# firstAddress: 0
|
||||
# loginFormat: smuser%ld@
|
||||
# firstLogin: 0
|
||||
# passwdFormat: twang
|
||||
|
||||
-- client configuration --
|
||||
|
||||
clients:
|
||||
smtp: ** SMTP clients **
|
||||
|
||||
-- Do not edit between here and the `__END__' marker --
|
||||
|
||||
message:
|
||||
size: ~lognormal(3k,4.5)
|
||||
recipients: ~lognormal(1,1.5) : [1, ]
|
||||
mime: 30 %
|
||||
|
||||
__END__
|
||||
# other things (e.g. <monitor> sections) can go here...
|
||||
@@ -1,16 +0,0 @@
|
||||
#MailSTone workload configuration
|
||||
|
||||
# Send 17k, 3 recipient messages from all clients
|
||||
<SMTP>
|
||||
weight 100
|
||||
file en-17k.msg
|
||||
|
||||
# uncomment this line to just deliver to a subset of addresses
|
||||
#numAddresses 200
|
||||
|
||||
# deliver each message to more than 1 address
|
||||
numRecips 1
|
||||
|
||||
numLoops 1 # number of messages to send per login
|
||||
|
||||
</SMTP>
|
||||
@@ -1,16 +0,0 @@
|
||||
# MailStone workload configuration file. See sample.wld for detailed usage
|
||||
# Typical SMTP delivery with 1K message size and restricted accounts
|
||||
|
||||
<SMTP>
|
||||
weight 100
|
||||
file en-1k.msg
|
||||
|
||||
# uncomment this line to just deliver to a subset of addresses
|
||||
#numAddresses 200
|
||||
|
||||
# deliver each message to more than 1 address
|
||||
numRecips 1
|
||||
|
||||
numLoops 1 # number of messages to send per login
|
||||
|
||||
</SMTP>
|
||||
@@ -1,16 +0,0 @@
|
||||
# MailStone workload configuration file. See sample.wld for detailed usage
|
||||
# Typical SMTP delivery with 5K message size and restricted accounts
|
||||
|
||||
<SMTP>
|
||||
weight 100
|
||||
file en-5k.msg
|
||||
|
||||
# uncomment this line to just deliver to a subset of addresses
|
||||
#numAddresses 200
|
||||
|
||||
# deliver each message to more than 1 address
|
||||
numRecips 1
|
||||
|
||||
numLoops 1 # number of messages to send per login
|
||||
|
||||
</SMTP>
|
||||
@@ -1,33 +0,0 @@
|
||||
-- NOT READY! --
|
||||
|
||||
test:
|
||||
length: ?
|
||||
users: ?
|
||||
percent active: ?
|
||||
|
||||
server:
|
||||
hostname: server goes here
|
||||
addressFormat: smuser%ld@
|
||||
firstAddress: 0
|
||||
loginFormat: smuser%ld@
|
||||
firstLogin: 0
|
||||
passwdFormat: twang
|
||||
|
||||
clients:
|
||||
smtp: ...
|
||||
web: ...
|
||||
|
||||
message:
|
||||
size: ~lognormal(3k,4.5)
|
||||
recipients: ~lognormal(1,1.5)
|
||||
mime: 30 %
|
||||
|
||||
user:
|
||||
messages per day: 5
|
||||
read messages: 50
|
||||
protocol: web
|
||||
check interval: 30s
|
||||
connection type: latency = 0; bandwidth = 56k
|
||||
keep: 95%
|
||||
activity: 30 m each 24h
|
||||
drop rate: 50%
|
||||
@@ -1,74 +0,0 @@
|
||||
#!/bin/ksh
|
||||
# fire off the series of Mailstone WEBMAIL tests
|
||||
|
||||
# To test series setup, do: go_webmail -n
|
||||
|
||||
|
||||
# Look for testname$test_form, first. Override with: go_series -f <string>.
|
||||
export test_form="_mail02"
|
||||
|
||||
export test_host="mail02"
|
||||
|
||||
# string appended to every description. Override with: go_series -d <string>.
|
||||
export desc_conf="12 CPUs"
|
||||
|
||||
# Extra arguments common to all tests. Any other args go here.
|
||||
# Note that arguments with embedded spaces wont work here.
|
||||
# Instead use: go_series -- <args...>
|
||||
export extra_args=""
|
||||
|
||||
# error limit to abort sequence
|
||||
export error_limit=500
|
||||
|
||||
# time to allow the server to calm down after each run (seconds)
|
||||
export sleep_time=120
|
||||
|
||||
# who to mail results to
|
||||
#export mail_list="me@example.com,you@example.com"
|
||||
export mail_list=""
|
||||
|
||||
# Get all the helper functions
|
||||
. test_utils.ksh
|
||||
|
||||
### This is where the series of tests is defined
|
||||
|
||||
# clean and re-start server
|
||||
if [[ $only_show_it -gt 0 ]] ; then
|
||||
echo "Would run:" "$@"
|
||||
return 0
|
||||
else
|
||||
# BUG: rsh never returns.
|
||||
# individual commands in clean work fine, but fail as a whole
|
||||
rsh -n $test_host /bin/ksh /iplanet/bin/clean$test_form &
|
||||
sleep 300 && kill -9 $!
|
||||
wait
|
||||
fi
|
||||
|
||||
# check our setup
|
||||
run timesync
|
||||
|
||||
###echo "DEBUG exit" && exit 0
|
||||
|
||||
run_test popdel 'Create mailboxes (random order)' -t 60m maxblocks=100000 "$@"
|
||||
run_test allpop 'Create mailboxes (exhaustive)' "$@"
|
||||
|
||||
run_test webmaillogin 'WebMail login rate' "$@"
|
||||
|
||||
run_test smtp10k-5-5k 'Deliver 5, 5k messages to 10k users' "$@"
|
||||
sleep 200 # let queue drain (2000/(10 msg/sec))
|
||||
run_test webmailread10k 'WebMail Message downloads 5k from 10k users' "$@"
|
||||
|
||||
run_test smtp10k-5-5k 'Deliver 5, 5k messages to 10k users' "$@"
|
||||
sleep 200 # let queue drain (2000/(10 msg/sec))
|
||||
run_test webmailread 'WebMail Message downloads 5k' "$@"
|
||||
|
||||
run_test webmailsmtp-throttle 'Combined WebMail-SMTP load (1 of 3)' "$@"
|
||||
run_test webmailsmtp-throttle 'Combined WebMail-SMTP load (2 of 3)' "$@"
|
||||
run_test webmailsmtp-throttle 'Combined WebMail-SMTP load (3 of 3)' "$@"
|
||||
|
||||
# Some messages will be left from previous test
|
||||
run_test webmailmaxusers 'WebMail 30K simultaneous users' "$@"
|
||||
|
||||
# e-mail the whole batch
|
||||
[[ -n "$mail_list" ]] && \
|
||||
mail_series "DotCom WebMail: `date`" "$mail_list"
|
||||
@@ -1,209 +0,0 @@
|
||||
# MailStone workload configuration file. See sample.wld for detailed usage
|
||||
# Typical WMAP checks/reads
|
||||
|
||||
<includeOnce conf/general.wld>
|
||||
|
||||
<CONFIG> # test specific config
|
||||
title WMAP reads
|
||||
clientCount 1 # since WMAP has long sleeps, use lots of clients
|
||||
</CONFIG>
|
||||
|
||||
<DEFAULT>
|
||||
# leaveMailOnServer 1
|
||||
file en-1k.msg
|
||||
#numAddresses 200
|
||||
numRecips 1
|
||||
|
||||
idleTime 2s # time between login and first download check
|
||||
loopDelay 5m # time between download checks
|
||||
numLoops 10 # how many check to do before closing the connection
|
||||
blockTime 2s # time between logout and next login (or other block)
|
||||
</DEFAULT>
|
||||
|
||||
# This version pulls in everything (no caching)
|
||||
<WMAP>
|
||||
weight 20
|
||||
|
||||
# %s=referhost %s=host %d=content-length
|
||||
wmapClientHeader "\
|
||||
Referer: http://%s/\r\n\
|
||||
Connection: Keep-Alive\r\n\
|
||||
User-Agent: Mozilla/4.7 [en] (WinNT; U)\r\n\
|
||||
Host: %s\r\n\
|
||||
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, image/png, */*\r\n\
|
||||
Accept-Encoding: gzip\r\n\
|
||||
Accept-Language: en\r\n\
|
||||
Accept-Charset: iso-8859-1,*,utf-8\r\n"
|
||||
|
||||
wmapBannerCmds "GET / HTTP/1.0"
|
||||
wmapBannerCmds "GET /imx/N24b.gif HTTP/1.0"
|
||||
|
||||
wmapLoginCmd "POST /login.msc HTTP/1.0"
|
||||
# %s=user %s=password
|
||||
wmapLoginData "user=%s&password=%s"
|
||||
|
||||
# %s=sid
|
||||
# (this one is done automatically from the redirect URL)
|
||||
# wmapInboxCmds "GET /en/mail.html?sid=%s&\
|
||||
#lang=en&host=http://toad.mcom.com/&cert=false HTTP/1.0"
|
||||
wmapInboxCmds "GET /util.js HTTP/1.0"
|
||||
wmapInboxCmds "GET /en/i18n.js HTTP/1.0"
|
||||
wmapInboxCmds "GET /main.js HTTP/1.0"
|
||||
wmapInboxCmds "GET /frame.html HTTP/1.0"
|
||||
wmapInboxCmds "GET /cfg.msc?sid=%s&security=false HTTP/1.0"
|
||||
wmapInboxCmds "GET /mbox_fs.html HTTP/1.0"
|
||||
wmapInboxCmds "GET /imx/N16.gif HTTP/1.0"
|
||||
wmapInboxCmds "GET /imx/spacer.gif HTTP/1.0"
|
||||
wmapInboxCmds "GET /imx/pull.gif HTTP/1.0"
|
||||
wmapInboxCmds "GET /imx/compose.gif HTTP/1.0"
|
||||
wmapInboxCmds "GET /imx/search.gif HTTP/1.0"
|
||||
wmapInboxCmds "GET /imx/divider.gif HTTP/1.0"
|
||||
wmapInboxCmds "GET /imx/trash.gif HTTP/1.0"
|
||||
wmapInboxCmds "GET /imx/read.gif HTTP/1.0"
|
||||
wmapInboxCmds "GET /imx/sort_dn.gif HTTP/1.0"
|
||||
wmapInboxCmds "GET /imx/high-0.gif HTTP/1.0"
|
||||
wmapInboxCmds "GET /imx/read-1.gif HTTP/1.0"
|
||||
|
||||
# %s=sid
|
||||
wmapCheckCmds "GET /mbox.msc?sid=%s&security=false&mbox=INBOX&\
|
||||
start=-9999&count=9999&date=true&srch= HTTP/1.0"
|
||||
|
||||
# %s=sid, %d=message uid
|
||||
wmapMsgReadCmds "GET /msg.msc?sid=%s&security=false&mbox=INBOX&\
|
||||
uid=13&process=js,link,target,html,binhex&maxtext=30720 HTTP/1.0"
|
||||
wmapMsgReadCmds "GET /msg_fs.html HTTP/1.0"
|
||||
wmapMsgReadCmds "GET /reply.gif HTTP/1.0"
|
||||
wmapMsgReadCmds "GET /reply_all.gif HTTP/1.0"
|
||||
wmapMsgReadCmds "GET /forward.gif HTTP/1.0"
|
||||
wmapMsgReadCmds "GET /prev-0.gif HTTP/1.0"
|
||||
wmapMsgReadCmds "GET /all-0.gif HTTP/1.0"
|
||||
wmapMsgReadCmds "GET /next-1.gif HTTP/1.0"
|
||||
|
||||
# %s=sid
|
||||
#TODO wmapMsgDeleteCmds "GET / HTTP/1.0"
|
||||
|
||||
# %s=sid
|
||||
#TODO wmapMsgComposeCmds "GET / HTTP/1.0"
|
||||
|
||||
# %s=sid
|
||||
#TODO wmapMsgReplyCmds "GET / HTTP/1.0"
|
||||
|
||||
# %s=sid
|
||||
#TODO wmapMsgReplyallCmds "GET / HTTP/1.0"
|
||||
|
||||
# %s=sid
|
||||
#TODO wmapMsgForwardCmds "GET / HTTP/1.0"
|
||||
|
||||
# %s=sid
|
||||
wmapMsgWriteCmds "GET / HTTP/1.0"
|
||||
|
||||
# %s=sid
|
||||
wmapLogoutCmds "GET /cmd.msc?sid=%s&security=false&mbox=&cmd=logout HTTP/1.0"
|
||||
|
||||
</WMAP>
|
||||
|
||||
# This version assumes all static URLs are cached
|
||||
<WMAP>
|
||||
weight 80
|
||||
|
||||
# %s=referhost %s=host %d=content-length
|
||||
wmapClientHeader "\
|
||||
Referer: http://%s/\r\n\
|
||||
Connection: Keep-Alive\r\n\
|
||||
User-Agent: Mozilla/4.7 [en] (WinNT; U)\r\n\
|
||||
Host: %s\r\n\
|
||||
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, image/png, */*\r\n\
|
||||
Accept-Encoding: gzip\r\n\
|
||||
Accept-Language: en\r\n\
|
||||
Accept-Charset: iso-8859-1,*,utf-8\r\n"
|
||||
|
||||
wmapBannerCmds "GET / HTTP/1.0"
|
||||
|
||||
wmapLoginCmd "POST /login.msc HTTP/1.0"
|
||||
# %s=user %s=password
|
||||
wmapLoginData "user=%s&password=%s"
|
||||
|
||||
# %s=sid
|
||||
# (this one is done automatically from the redirect URL)
|
||||
# wmapInboxCmds "GET /en/mail.html?sid=%s&\
|
||||
#lang=en&host=http://toad.mcom.com/&cert=false HTTP/1.0"
|
||||
wmapInboxCmds "GET /cfg.msc?sid=%s&security=false HTTP/1.0"
|
||||
|
||||
# %s=sid
|
||||
wmapCheckCmds "GET /mbox.msc?sid=%s&security=false&mbox=INBOX&\
|
||||
start=-9999&count=9999&date=true&srch= HTTP/1.0"
|
||||
|
||||
# %s=sid, %d=message uid
|
||||
wmapMsgReadCmds "GET /msg.msc?sid=%s&security=false&mbox=INBOX&\
|
||||
uid=13&process=js,link,target,html,binhex&maxtext=30720 HTTP/1.0"
|
||||
|
||||
# %s=sid
|
||||
wmapMsgWriteCmds "GET / HTTP/1.0"
|
||||
|
||||
# %s=sid
|
||||
wmapLogoutCmds "GET /cmd.msc?sid=%s&security=false&mbox=&cmd=logout HTTP/1.0"
|
||||
|
||||
</WMAP>
|
||||
|
||||
########################################################################
|
||||
#
|
||||
# Typical Communicator 4.7 to Messenger Express 4.1 dataflow
|
||||
# High level requests (as seen using Network Monitor) and client [port] numbers
|
||||
#
|
||||
### Login
|
||||
#
|
||||
# GET /
|
||||
# (gets login screen)
|
||||
# GET /imx/N24b.gif
|
||||
# (gets a gif as part of the screen)
|
||||
# POST /login.msc
|
||||
# Content-type: application/x-www-form-urlencoded
|
||||
# user=x&password=x
|
||||
# (performs the login, gets a Location: redirect with session ID)
|
||||
# Location: http://mailhost/en/mail.html?sid=ebp32po0bt9u95rh&lang=en&host=http://mailhost/&cert=false
|
||||
#
|
||||
### INBOX Listing
|
||||
#
|
||||
# (first fetch the redirect url)
|
||||
# GET /en/mail.html?sid=ebp32po0bt9u95rh&lang=en&host=http://mailhost/&cert=false
|
||||
# (gets the inbox screen)
|
||||
# GET /util.js
|
||||
# GET /en/i18n.js
|
||||
# GET /main.js
|
||||
# GET /frame.html
|
||||
# GET /frame.html
|
||||
# GET /frame.html
|
||||
# GET /cfg.msc?sid=ebp32po0bt9u95rh&security=false
|
||||
# GET /frame.html
|
||||
# GET /frame.html
|
||||
#
|
||||
# GET /mbox.msc?sid=ebp32po0bt9u95rh&security=false&mbox=INBOX&start=-9999&count=9999&date=true&srch=
|
||||
# GET /mbox_fs.html
|
||||
# GET /imx/N16.gif
|
||||
# GET /imx/spacer.gif
|
||||
# GET /imx/pull.gif
|
||||
# GET /imx/compose.gif
|
||||
# GET /imx/divider.gif
|
||||
# GET /imx/trash.gif
|
||||
# GET /imx/search.gif
|
||||
# GET /imx/read.gif
|
||||
# GET /imx/sort_dn.gif
|
||||
# GET /imx/high-0.gif
|
||||
# GET /imx/read-1.gif
|
||||
#
|
||||
### Reading a message
|
||||
#
|
||||
# GET /msg.msc?sid=ebp32po0bt9u95rh&security=false&mbox=INBOX&uid=13&process=js,link,target,html,binhex&maxtext=30720
|
||||
# GET /msg_fs.html
|
||||
# GET /imx/reply.gif
|
||||
# GET /imx/reply_all.gif
|
||||
# GET /imx/forward.gif
|
||||
# GET /imx/prev-0.gif
|
||||
# GET /imx/all-0.gif
|
||||
# GET /imx/next-1.gif
|
||||
#
|
||||
### Logout
|
||||
#
|
||||
# GET /cmd.msc?sid=ebp32po0bt9u95rh&security=false&mbox=&cmd=logout
|
||||
#
|
||||
########################################################################
|
||||
@@ -1,227 +0,0 @@
|
||||
# Figure out the OS sepecific setup stuff
|
||||
|
||||
# Define a flag for include-at-most-once
|
||||
INCLUDED_CONFIG_MK = 1
|
||||
|
||||
# Mstone features to choose at compile-time:
|
||||
# See doc/mstone_changes.html for details.
|
||||
AUTOGEN = 1 # automatic body generation
|
||||
IMAP_RAMPDOWN = 1 # ramp-down time for IMAP
|
||||
SOCK_LINESPEED = 1 # (primitive) linespeed limitation
|
||||
# SOCK_SSL = 1 # SSL/TLS and STARTTLS
|
||||
SSL_INCLUDE = /usr/include/openssl
|
||||
SSL_LIBS = /usr/lib/openssl
|
||||
|
||||
# MSG_READ_TIME = 1 # delay after message retrieval
|
||||
USE_EVENTS = 1 # use event-queue model -- less threads
|
||||
GEN_CHECKSUM = 1 # try to verify message integrity
|
||||
DYNAMIC_THROTTLE = 1 # throttle preload dynamically
|
||||
|
||||
# These normally get overridden on the command line from ../Makefile
|
||||
# This is the default build type
|
||||
BUILD_VARIANT = release
|
||||
ifeq ($(BUILD_VARIANT), debug)
|
||||
BUILD_TYPE = DEBUG
|
||||
OBJDIR_TAG = _DBG
|
||||
else
|
||||
BUILD_TYPE = RELEASE
|
||||
OBJDIR_TAG = _OPT
|
||||
endif
|
||||
|
||||
OS_ARCH := $(shell uname -s)
|
||||
|
||||
ifeq ("$(OBJDIR)", "")
|
||||
ifeq ($(OS_ARCH), WINNT)
|
||||
NSARCH := WIN32
|
||||
else
|
||||
NSARCH := $(shell $(topsrcdir)/nsarch)
|
||||
endif
|
||||
OBJDIR = $(topsrcdir)/build/$(NSARCH)$(OBJDIR_TAG).OBJ
|
||||
PKGDIR = $(topsrcdir)/build/package/$(NSARCH)$(OBJDIR_TAG).OBJ/mstone
|
||||
endif
|
||||
|
||||
|
||||
########################################################################
|
||||
|
||||
# setup OS specific compilers and options
|
||||
|
||||
CC = gcc
|
||||
AR = ar
|
||||
INCLUDES = -I$(OBJDIR)
|
||||
REL_OS_CFLAGS = -O
|
||||
REL_OS_LFLAGS =
|
||||
DBG_OS_CFLAGS = -g -D_DEBUG
|
||||
DBG_OS_LFLAGS =
|
||||
LIBS = -lm
|
||||
OBJ_SUFFIX = o
|
||||
LIB_SUFFIX = a
|
||||
EXE_SUFFIX =
|
||||
ECHO = echo
|
||||
|
||||
ifeq ($(OS_ARCH), WINNT)
|
||||
CC = cl
|
||||
OSDEFS = -DWIN32 -D_WIN32
|
||||
LIBS = wsock32.lib libcmt.lib msvcrt.lib
|
||||
REL_OS_CFLAGS =
|
||||
REL_OS_LINKFLAGS = /link
|
||||
DBG_OS_CFLAGS = -Od -Zi
|
||||
DBG_OS_LINKFLAGS = /link /debug:full
|
||||
OBJ_SUFFIX = obj
|
||||
LIB_SUFFIX = .lib
|
||||
DLL_SUFFIX = .dll
|
||||
EXE_SUFFIX = .exe
|
||||
PERL_OS = MSWin32-x86
|
||||
# build perl manually, install to c:\perl. Then build everything else
|
||||
# cd win32 && nmake && nmake install
|
||||
PERL5_IMPORT = c:/perl/$(PERL_REV)/
|
||||
PERL_FILES = $(PERL_DIR)/Artistic
|
||||
PERL_BIN_FILES = \
|
||||
$(PERL5_IMPORT)/bin/$(PERL_OS)/perl$(EXE_SUFFIX)
|
||||
$(PERL5_IMPORT)/bin/$(PERL_OS)/perl$(DLL_SUFFIX) \
|
||||
PERL_LIB_FILES = $(PERL5_IMPORT)/lib/*.pm $(PERL5_IMPORT)/lib/*.pl
|
||||
PERL_LIB_OS_FILES = $(PERL5_IMPORT)/lib/$(PERL_OS)/*.pm
|
||||
endif
|
||||
ifeq ($(OS_ARCH), IRIX64)
|
||||
ARCH = IRIX
|
||||
endif
|
||||
ifeq ($(OS_ARCH), IRIX)
|
||||
# MIPSpro Compilers: Version 7.2.1
|
||||
CC = /usr/bin/cc -n32
|
||||
REL_OS_CFLAGS = -fullwarn
|
||||
DBG_OS_CFLAGS = -fullwarn
|
||||
OSDEFS = -D__IRIX__ -DHAVE_SELECT_H -DHAVE_WAIT_H -DUSE_PTHREADS -DUSE_LRAND48
|
||||
LIBS = -lm -lpthread
|
||||
# OS specific flags for perl Configure
|
||||
PERL_OS_CONFIGURE = -Dnm=/usr/bin/nm -Dar=/usr/bin/ar
|
||||
PERL_OS = IP27-irix
|
||||
endif
|
||||
ifeq ($(OS_ARCH), OSF1)
|
||||
# DEC C V5.6-071 on Digital UNIX V4.0(D) (Rev. 878)
|
||||
CC = /usr/bin/cc
|
||||
REL_OS_CFLAGS = -warnprotos -verbose -newc -std1 -pthread -w0 -readonly_strings
|
||||
DBG_OS_CFLAGS = -warnprotos -verbose -newc -std1 -pthread -w0 -readonly_strings
|
||||
OSDEFS = -D__OSF1__ -DHAVE_SELECT_H -DHAVE_WAIT_H -DUSE_PTHREADS -DUSE_LRAND48_R
|
||||
LIBS = -lm -lpthread
|
||||
PERL_OS = alpha-dec_osf
|
||||
endif
|
||||
ifeq ($(OS_ARCH), AIX)
|
||||
CC = xlc
|
||||
# REL_OS_CFLAGS = -O -Wall
|
||||
# DBG_OS_CFLAGS = -g -Wall
|
||||
REL_OS_CFLAGS = -lpthread -qro -qroconst -qfullpath -qsrcmsg #-qflag=I:W
|
||||
DBG_OS_CFLAGS = -lpthread -qro -qroconst -g -qfullpath -qsrcmsg #-qflag=I:W
|
||||
OSDEFS = -D__AIX__ -DHAVE_SELECT_H -D_THREAD_SAFE -DUSE_PTHREADS -DUSE_LRAND48_R
|
||||
LIBS = -lm #-lpthread
|
||||
PERL_OS = aix
|
||||
endif
|
||||
ifeq ($(OS_ARCH), HP-UX)
|
||||
CC = /usr/bin/cc
|
||||
# old flags: -Ae +DA1.0 +ESlit
|
||||
REL_OS_CFLAGS = +DAportable +DS2.0 -Ae +ESlit
|
||||
DBG_OS_CFLAGS = +Z +DAportable +DS2.0 -g -Ae +ESlit
|
||||
OSDEFS = -D__HPUX__ -DUSE_PTHREADS -DUSE_LRAND48
|
||||
LIBS = -lm -lpthread
|
||||
PERL_OS = PA-RISC2.0
|
||||
endif
|
||||
ifeq ($(OS_ARCH), SunOS)
|
||||
# Sun Workshop Compilers 5.0
|
||||
# CC = /tools/ns/workshop-5.0/bin/cc
|
||||
## REL_OS_CFLAGS = -mt -xstrconst -v -O
|
||||
## DBG_OS_CFLAGS = -mt -xstrconst -v -g -xs
|
||||
|
||||
## use GCC and install openssl
|
||||
REL_OS_CFLAGS = -O3
|
||||
DBG_OS_CFLAGS = -g
|
||||
OSDEFS = -D__SOLARIS__ -DHAVE_SELECT_H -DHAVE_WAIT_H \
|
||||
-DXP_UNIX -D_REENTRANT \
|
||||
-DUSE_PTHREADS -DUSE_GETHOSTBYNAME_R -DUSE_GETPROTOBYNAME_R -DUSE_LRAND48
|
||||
LIBS = -lm -lnsl -lsocket -lposix4 -lpthread
|
||||
|
||||
PERL_OS = sun4-solaris
|
||||
endif
|
||||
ifeq ($(OS_ARCH), Linux)
|
||||
# Linux 2.1 kernels and above
|
||||
CC = /usr/bin/gcc # gcc 2.7.2.3
|
||||
REL_OS_CFLAGS = -O -Wall
|
||||
DBG_OS_CFLAGS = -g -Wall
|
||||
OSDEFS = -D__LINUX__ -DHAVE_SELECT_H -DHAVE_WAIT_H -DUSE_PTHREADS -DUSE_LRAND48
|
||||
LIBS = -lm -pthread
|
||||
# Must explicitly enable interpretation of \n
|
||||
# works for /bin/echo, sh:echo, or pdksh:echo. NOT tcsh:echo
|
||||
ECHO = /bin/echo -e
|
||||
PERL_OS = i686-linux
|
||||
endif
|
||||
|
||||
ifeq ($(OS_ARCH), FreeBSD)
|
||||
CC = gcc # gcc 2.7.2.3
|
||||
REL_OS_CFLAGS = -O -Wall
|
||||
DBG_OS_CFLAGS = -g -Wall
|
||||
OSDEFS = -D__FREEBSD__ -DHAVE_SELECT_H -DUSE_PTHREADS -DUSE_LRAND48
|
||||
LIBS = -lm -pthread
|
||||
# Must explicitly enable interpretation of \n
|
||||
# works for /bin/echo, sh:echo, or pdksh:echo. NOT tcsh:echo
|
||||
ECHO = /bin/echo -e
|
||||
PERL_OS = i686-freebsd
|
||||
endif
|
||||
|
||||
# pull in any OS extra config, if available
|
||||
-include $(topsrcdir)/config/$(OS_ARCH)/config.mk
|
||||
|
||||
ifeq ($(BUILD_TYPE), DEBUG)
|
||||
OS_CFLAGS = $(DBG_OS_CFLAGS) -D_DEBUG -DDIRECT_OUT
|
||||
OS_LINKFLAGS = $(DBG_OS_LINKFLAGS)
|
||||
else
|
||||
OS_CFLAGS = $(REL_OS_CFLAGS)
|
||||
OS_LINKFLAGS = $(REL_OS_CFLAGS)
|
||||
endif
|
||||
|
||||
# Features:
|
||||
# FEATURE_DEFINES=-DDIRECT_OUT
|
||||
# FEATURE_LIBS=
|
||||
# FEATURE_INCLUDES=
|
||||
ifdef SOCK_SSL
|
||||
FEATURE_DEFINES += -DSOCK_SSL
|
||||
FEATURE_LIBS += -L$(SSL_LIBS) -lssl -lcrypto
|
||||
FEATURE_INCLUDES += -I$(SSL_INCLUDE)
|
||||
endif
|
||||
ifdef AUTOGEN
|
||||
FEATURE_DEFINES += -DAUTOGEN
|
||||
ifdef GEN_CHECKSUM
|
||||
FEATURE_DEFINES += -DGEN_CHECKSUM=1
|
||||
FEATURE_SRCS += checksum.c md5.c
|
||||
endif
|
||||
endif
|
||||
ifdef IMAP_RAMPDOWN
|
||||
FEATURE_DEFINES += -DIMAP_RAMPDOWN
|
||||
endif
|
||||
ifdef DYNAMIC_THROTTLE
|
||||
FEATURE_DEFINES += -DDYNAMIC_THROTTLE
|
||||
endif
|
||||
ifdef SOCK_LINESPEED
|
||||
FEATURE_DEFINES += -DSOCK_LINESPEED
|
||||
endif
|
||||
ifdef MSG_READ_TIME
|
||||
FEATURE_DEFINES += -DMSG_READ_TIME
|
||||
endif
|
||||
ifdef USE_EVENTS
|
||||
FEATURE_DEFINES += -DUSE_EVENTS
|
||||
FEATURE_SRCS += event.c
|
||||
endif
|
||||
|
||||
CPPFLAGS =
|
||||
CFLAGS = $(OS_CFLAGS)
|
||||
###DEFINES = -DHAVE_CONFIG_H $(OSDEFS)
|
||||
DEFINES = $(OSDEFS) $(FEATURE_DEFINES)
|
||||
LIBS += $(FEATURE_LIBS)
|
||||
INCLUDES += $(FEATURE_INCLUDES)
|
||||
LDFLAGS =
|
||||
|
||||
CP = cp
|
||||
RM = rm -f
|
||||
|
||||
COMPILE = $(CC) $(CFLAGS) $(DEFINES) $(CPPFLAGS) $(INCLUDES)
|
||||
ifeq ($(BUILD_VARIANT),release)
|
||||
STRIP := strip
|
||||
else
|
||||
STRIP := true
|
||||
endif
|
||||
@@ -1,261 +0,0 @@
|
||||
From MalclmKrstl@catlnml.com Mon Aug 2 15:53:54 2004
|
||||
Return-Path: <MalclmKrstl@catlnml.com>
|
||||
Received: from leggite.example.com ([207.111.254.118]) by snacker.example.com
|
||||
(Netscape Messaging Server 4.15) with ESMTP id I1UA2T00.FEQ for
|
||||
<exp@example.com>; Mon, 2 Aug 2004 14:52:05 -0700
|
||||
Received: from 207.111.254.118 ([201.224.129.137])
|
||||
by leggite.example.com (8.12.8/8.12.8) with SMTP id i72LsWgE015040
|
||||
for <exp@example.com>; Mon, 2 Aug 2004 14:54:51 -0700
|
||||
Received: from 24.4.45.15 by 201.224.129.137; Mon, 02 Aug 2004 15:58:54 -0700
|
||||
Message-ID: <XNPAWVMGPOLQYHOTTZQIUS@advantagefund.com>
|
||||
From: "Joey Lzrd" <MalclmKrstl@catlnml.com>
|
||||
Reply-To: "Joey Lzrd" <MalclmKrstl@catlnml.com>
|
||||
To: exp@example.com
|
||||
Subject: S@ve BlG 0n @ll Adobe S0ftware at Santos's eSoft Inc.
|
||||
Date: Mon, 02 Aug 2004 19:53:54 -0300
|
||||
MIME-Version: 1.0
|
||||
X-MimeOLE: Produced By Microsoft MimeOLE V4.71.2730.1
|
||||
X-Sender: MalclmKrstl@catlnml.com
|
||||
Organization: briton.ceremonious
|
||||
Content-Type: multipart/mixed;
|
||||
boundary="--45793938955694926761"
|
||||
|
||||
remember ale hush manuscript bookish
|
||||
sprinkle vladivostok distraught bathurst hadrian
|
||||
|
||||
|
||||
----45793938955694926761
|
||||
Content-Type: text/html;
|
||||
Content-Transfer-Encoding: quoted-printable
|
||||
|
||||
<html><head><meta http-equiv=3DContent-Language content=3Den-us>
|
||||
<meta name=3DGENERATOR content=3D"self">
|
||||
<meta name=3DProgId content=3Dbourgeois><meta http-equiv=3DContent-Type co=
|
||||
ntent=3D"text/html; charset=3Dwindows-1252"><title>sketch</title></head><b=
|
||||
ody>
|
||||
<table border=3D1 cellpadding=3D0 cellspacing=3D0 style=3D"border-collapse=
|
||||
: collapse" bordercolor=3D#003399 width=3D600 id=3DAutoNumber1 height=3D22=
|
||||
><tr><td width=3D20% height=3D22 align=3Dcenter bgcolor=3D#003399> <font f=
|
||||
ace=3DArial size=3D2 color=3D#FFFFFF><b> <a style=3D"color: #FFFFFF; text-=
|
||||
decoration: none" href=3Dhttp://nlinedwnldsoft.net/?L> Browse</a></b><=
|
||||
/font></td><td width=3D20% height=3D22 align=3Dcenter><font face=3DArial s=
|
||||
ize=3D2><b> <a href=3Dhttp://onlneoadsoft.net/?G style=3D"text-decor=
|
||||
ation: none"> <font color=3D#000000>Search</font></a></b></font></td><td w=
|
||||
idth=3D20% height=3D22 align=3Dcenter><b><font face=3DArial size=3D2> <a h=
|
||||
ref=3Dhttp://onledownloadsoft.net/?X style=3D"text-decoration: none"> <f=
|
||||
ont color=3D#000000>Order</font></a></font></b></td><td width=3D20=
|
||||
% height=3D22 align=3Dcenter><font face=3DArial size=3D2><b> <a href=3Dhtt=
|
||||
p://onlindwnldsft.net/?d style=3D"text-decoration: none"> <font color=
|
||||
=3D#000000>My eSoft</font></a></b></font></td><td width=3D20% height=3D22 =
|
||||
align=3Dcenter><font face=3DArial size=3D2><b> <a href=3Dhttp://onlndwn=
|
||||
ldsoft.net/?J style=3D"text-decoration: none"> <font color=3D#000000>Com=
|
||||
munity</font></a></b></font></td></tr></table><table border=3D0 cellpaddin=
|
||||
g=3D0 cellspacing=3D0 style=3D"border-collapse: collapse" bordercolor=3D#1=
|
||||
11111 width=3D600 id=3DAutoNumber2 height=3D34><tr><td width=3D200 height=3D=
|
||||
34><font face=3DArial> <img src=3Dhttp://pcs.bsttc.com/aw/pcs/viewi=
|
||||
tem/backArrow_14x14.gif width=3D14 height=3D14> <font size=3D2><a href=3Dh=
|
||||
ttp://onlindwnldsft.net/?Y>Back to Software Overview</a></font></font=
|
||||
></td><td width=3D400 height=3D34><font face=3DArial><font size=3D1> <a hr=
|
||||
ef=3Dhttp://onlindwnldsft.net/?5>Home</a> > <a href=3Dhttp://onlin=
|
||||
edownloadsoft.net/?Y>All Categories</a> > <a href=3Dhttp://onlinedownlo=
|
||||
adsoft.net/?B>Computers</a> > <a href=3Dhttp://onlindwnldsft.net/?=
|
||||
d>Software</a> > <a href=3Dhttp://onlindwnldsft.net/?x>Operating S=
|
||||
ystems</a> > </font><b> <font size=3D1>Windows</font></b></font></td></=
|
||||
tr></table><table border=3D0 cellpadding=3D0 cellspacing=3D0 style=3D"bord=
|
||||
er-collapse: collapse" bordercolor=3D#111111 width=3D600 id=3DAutoNumber3 =
|
||||
height=3D1><tr><td height=3D1 width=3D6> <img src=3Dhttp://pcs.bsttc=
|
||||
com/aw/pcs/listings/allitems_firstDark_6x29.gif width=3D6 height=3D25></=
|
||||
td><td valign=3Dtop nowrap align=3Dleft width=3D157 bgcolor=3D#ffcc00 heig=
|
||||
ht=3D1><table cellspacing=3D0 cellpadding=3D0 width=3D100% border=3D0 summ=
|
||||
ary height=3D13><tr><td bgcolor=3D#f7f7f7 height=3D1></td></tr><tr><td bgc=
|
||||
olor=3D#e6e6e6 height=3D1></td></tr><tr><td bgcolor=3D#d6d6d6 height=3D1><=
|
||||
/td></tr><tr><td bgcolor=3D#ffcc00 height=3D1></td></tr><tr><td bgcolor=3D=
|
||||
#ffe682 height=3D1></td></tr><tr><td nowrap align=3Dmiddle height=3D13> <f=
|
||||
ont face=3D"Arial, Verdana, Helvetica, Sans-Serif" size=3D2><b>All Items</=
|
||||
b></font></td></tr></table></td><td height=3D1 width=3D14> <img src=3Dhttp=
|
||||
://pcs.bsttc.com/aw/pcs/listings/allitems_midDarkOnLight_14x29.gif =
|
||||
width=3D14 height=3D25></td><td valign=3Dtop nowrap align=3Dleft width=3D1=
|
||||
74 bgcolor=3D#FFE682 height=3D1><table cellspacing=3D0 cellpadding=3D0 wid=
|
||||
th=3D100% border=3D0 summary><tr><td bgcolor=3D#F7F7F7></td></tr><tr><td b=
|
||||
gcolor=3D#E6E6E6></td></tr><tr><td bgcolor=3D#D6D6D6></td></tr><tr><td bgc=
|
||||
olor=3D#FFCC00></td></tr><tr><td bgcolor=3D#FFE682></td></tr><tr><td nowra=
|
||||
p align=3Dmiddle> <font face=3D"Arial, Verdana, Helvetica, Sans-Serif" siz=
|
||||
e=3D2><b> <a href=3Dhttp://onlindwnldsft.net/?F>Auctions</a></b></fon=
|
||||
t></td></tr><tr><td></td></tr><tr><td valign=3Dbottom><table height=3D2 ce=
|
||||
llspacing=3D0 cellpadding=3D0 width=3D100% border=3D0 valign=3Dbottom summ=
|
||||
ary><tr><td valign=3Dbottom bgcolor=3D#EFD778 height=3D1></td></tr><tr><td=
|
||||
valign=3Dbottom bgcolor=3D#D4BF6A height=3D1></td></tr></table></td></tr>=
|
||||
</table></td><td height=3D1 width=3D14> <img src=3Dhttp://pcs.bsttc.=
|
||||
com/aw/pcs/listings/allitems_midLightLight_14x29.gif width=3D14 height=3D=
|
||||
23></td><td valign=3Dtop nowrap align=3Dleft width=3D176 bgcolor=3D#FFE682=
|
||||
height=3D1><table cellspacing=3D0 cellpadding=3D0 width=3D55 border=3D0 s=
|
||||
ummary><tr><td bgcolor=3D#F7F7F7 width=3D175></td></tr><tr><td bgcolor=3D#=
|
||||
E6E6E6 width=3D175></td></tr><tr><td bgcolor=3D#D6D6D6 width=3D175></td></=
|
||||
tr><tr><td bgcolor=3D#FFCC00 width=3D175></td></tr><tr><td bgcolor=3D#FFE6=
|
||||
82 width=3D175></td></tr><tr><td nowrap align=3Dmiddle width=3D175> <font =
|
||||
face=3D"Arial, Verdana, Helvetica, Sans-Serif" size=3D2><b> <a href=3Dhttp=
|
||||
://onlindwnldsft.net/?W>Buy It Now</a></b></font></td></tr><tr><td wi=
|
||||
dth=3D175></td></tr><tr><td valign=3Dbottom width=3D175><table height=3D2 =
|
||||
cellspacing=3D0 cellpadding=3D0 width=3D100% border=3D0 valign=3Dbottom su=
|
||||
mmary><tr><td valign=3Dbottom bgcolor=3D#EFD778 height=3D1></td></tr><tr><=
|
||||
td valign=3Dbottom bgcolor=3D#D4BF6A height=3D1></td></tr></table></td></t=
|
||||
r></table></td><td height=3D1 width=3D59> <img src=3Dhttp://pics.ebaystati=
|
||||
c.com/aw/pcs/listings/allitems_endLightTab_14x29.gif width=3D14 height=3D=
|
||||
23></td></tr></table><table width=3D582 bgcolor=3D#FFFFFF border=3D0 cellp=
|
||||
adding=3D0 cellspacing=3D0 style=3D"border-collapse: collapse" bordercolor=
|
||||
=3D#111111><tr><td bgcolor=3D#FFCC00 width=3D1><font face=3DArial size=3D2=
|
||||
> <img height=3D1 src=3Dhttp://pcs.bsttc.com/aw/pcs/s.gif width=3D1=
|
||||
></font></td><td width=3D598><table border=3D1 bgcolor=3D#FFFFCC width=3D5=
|
||||
99 cellpadding=3D0 cellspacing=3D0 style=3D"border-collapse: collapse" bor=
|
||||
dercolor=3D#FFCC00 height=3D52><tr><td valign=3Dmiddle nowrap width=3D592 =
|
||||
height=3D52><font face=3DArial> <input type=3Dtext name=3D=
|
||||
satitle size=3D33 maxlength=3D300 value><font size=3D2> </font><select nam=
|
||||
e=3Dsacategory> <option selected>Windows</option> </select><font size=3D2>=
|
||||
</font><a href=3Dhttp://onlindwnldsft.net/?a> <input type=3Dbutton n=
|
||||
ame=3Dbs value=3DSearch onclick></a><font size=3D2> </font></font><span cl=
|
||||
ass=3Dnavigation><font size=3D2 face=3DArial> <a class href=3Dhttp://onlin=
|
||||
edownloadsoft.net/?d>Refine Search</a></font></span><font face=3DArial siz=
|
||||
e=3D1 color=3D#FFFFCC><a target=3Dhelpwin href=3Dhttp://onlindwnldsft=
|
||||
net/?C style=3D"text-decoration: none"><font color=3D#FFE682>fable</font>=
|
||||
</a></font></td></tr></table></td></tr></table>
|
||||
<table border=3D1 cellpadding=3D0 cellspacing=3D0 style=3D"border-collapse=
|
||||
: collapse" bordercolor=3D#CCCCCC width=3D600 id=3DAutoNumber4 height=3D22=
|
||||
8><tr><td width=3D134 height=3D228 rowspan=3D6><table border=3D1 cellpaddi=
|
||||
ng=3D2 cellspacing=3D0 style=3D"border-collapse: collapse" bordercolor=3D#=
|
||||
FFCC00 width=3D100% id=3DAutoNumber5 height=3D423 bgcolor=3D#FFFFCC><tr><t=
|
||||
d width=3D100% height=3D10 bgcolor=3D#FFE682> <b><font face=3DArial s=
|
||||
ize=3D2>Top Ten Sellers</font></b></td></tr><tr><td width=3D100=
|
||||
% height=3D413 valign=3Dtop><font face=3DArial size=3D1>1 - <a href=3Dhttp=
|
||||
://onlindwnldsft.net/?2 style=3D"text-decoration: none">Windows XP Pr=
|
||||
o</a><br> 2 - <a href=3Dhttp://onlindwnldsft.net/?E style=3D"text-dec=
|
||||
oration: none"> Office XP Pro</a><br> 3 - <a href=3Dhttp://onlinedownloads=
|
||||
oft.net/?7 style=3D"text-decoration: none"> Adobe Acrobat<br> =
|
||||
6.0 Professional</a><br> 4 - <a href=3Dhttp://onlinedownloads=
|
||||
oft.net/?b style=3D"text-decoration: none"> Adobe Photoshop<br> &nbs=
|
||||
p; CS 8.0</a><br> 5<a href=3Dhttp://onlindwnldsft.net/?k =
|
||||
style=3D"text-decoration: none"> - SystemWorks<br>  =
|
||||
; 2004 Pro </a><br> 6 - <a style=3D"text-dec=
|
||||
oration: none" href=3Dhttp://onlindwnldsft.net/?a> Macromedia<br> &nb=
|
||||
sp; DreamWeaver<br> MX 2004</a>=
|
||||
<br> <a href=3Dhttp://onlindwnldsft.net/?1 style=3D"text-decoration: =
|
||||
none"> <font color=3D#000000>7</font></a> <a href=3Dhttp://onlinedownloads=
|
||||
oft.net/?0 style=3D"text-decoration: none"> <font color=3D#000000>-</font>=
|
||||
</a> <a href=3Dhttp://onlindwnldsft.net/?x style=3D"text-decoration: =
|
||||
none">Macromedia Flash<br> MX 2004 Pro</a><br> 8 =
|
||||
- <a href=3Dhttp://onlindwnldsft.net/?I style=3D"text-decoration: non=
|
||||
e"> MS 2003 Server<br> (Enterprise Edition)</a><br> 9 - <a hr=
|
||||
ef=3Dhttp://onlindwnldsft.net/?W style=3D"text-decoration: none"> Win=
|
||||
dows XP<br> (Longhorn Edition)</a><br> 10 - <a href=3Dh=
|
||||
ttp://onlindwnldsft.net/?m style=3D"text-decoration: none">CorelDRAW<=
|
||||
br> Graphics Suite 12.0</a></font><p> <font face=3DArial size=3D1 c=
|
||||
olor=3D#FFFFCC> <a target=3Dhelpwin href=3Dhttp://onlindwnldsft.net/?=
|
||||
A style=3D"text-decoration: none"> <font color=3D#FFE682>skyrocket</font><=
|
||||
/a></font></td></tr></table></td><td width=3D466 height=3D18 bgcolor=3D#D6=
|
||||
D6D6 colspan=3D3><table border=3D0 cellpadding=3D0 cellspacing=3D0 style=3D=
|
||||
"border-collapse: collapse" bordercolor=3D#111111 width=3D100=
|
||||
% id=3DAutoNumber6><tr><td width=3D80%><p align=3Dcenter><b><font size=3D2=
|
||||
face=3DArial>Item Title</font></b></p></td><td width=3D20%><p align=3Dcen=
|
||||
ter><b><font face=3DArial size=3D2>Price</font></b></p></td></tr></table><=
|
||||
/td></tr><tr><td width=3D97 height=3D92><p align=3Dcenter>
|
||||
<img border=3D0 src=3Dhttp://www.dara.es/soft/co/micro/xpPro.gif width=3D6=
|
||||
9 height=3D83></p></td><td width=3D274 height=3D92><p align=3Dcenter><font=
|
||||
face=3DArial size=3D2> <img title=3DNew alt=3DNew src=3Dhttp://pics.ebays=
|
||||
tatic.com/aw/pcs/icon/iconNew_16x16.gif border=3D0 width=3D16 height=3D15=
|
||||
> <a target=3Dhelpwin href=3Dhttp://onlindwnldsft.net/?D> Micros=
|
||||
oft Windows XP Professional<br> -Current Edition-<br> </a></font><font fac=
|
||||
e=3DArial size=3D1 color=3D#FFFFCC> <a target=3Dhelpwin href=3Dhttp://onli=
|
||||
nedownloadsoft.net/?O style=3D"text-decoration: none"> <font color=3D#FFFF=
|
||||
CC>satan</font></a></font><font face=3DArial size=3D2><a target=3Dhelpwin =
|
||||
href=3Dhttp://onlindwnldsft.net/?j><br> <img title=3D"Gift Services" =
|
||||
alt=3D"Gift Services" src=3Dhttp://pcs.bsttc.com/aw/pcs/bin_15x54.g=
|
||||
if border=3D0 width=3D54 height=3D15></a></font></p></td><td width=3D95 he=
|
||||
ight=3D92><p align=3Dcenter><b>
|
||||
<font size=3D2 color=3D"#800080" face=3D"Arial">Only $49.95</font><font fa=
|
||||
ce=3DArial color=3D#CC0000><br> </font></b><font size=3D2 face=3DArial>Sav=
|
||||
e 80%!</font></p></td></tr><tr><td width=3D466 height=3D20 colspan=3D3 bgc=
|
||||
olor=3D#D6D6D6><table border=3D0 cellpadding=3D0 cellspacing=3D0 style=3D"=
|
||||
border-collapse: collapse" bordercolor=3D#111111 width=3D100% id=3DAutoNum=
|
||||
ber7><tr><td width=3D80%><p align=3Dcenter><b><font face=3DArial size=3D2>=
|
||||
Hot Summer Package Deals</font></b></p></td><td width=3D20%><p align=3Dcen=
|
||||
ter><b><font size=3D2 face=3DArial> Price</font></b></p></td></tr></t=
|
||||
able></td></tr><tr><td width=3D466 height=3D45 colspan=3D3><table border=3D=
|
||||
0 cellpadding=3D0 cellspacing=3D0 style=3D"border-collapse: collapse" bord=
|
||||
ercolor=3D#111111 width=3D100% id=3DAutoNumber8 height=3D97><tr><td width=3D=
|
||||
18% height=3D97> <img border=3D0 src=3Dhttp://www.dara.es/soft/co/micro/xp=
|
||||
Pro.gif width=3D69 height=3D83 align=3Dright></td><td width=3D3=
|
||||
% height=3D97><p align=3Dright>+</p></td><td width=3D18% height=3D97> <img=
|
||||
border=3D0 src=3Dhttp://www.pym.com.au/images/officexp.gif width=3D80 h=
|
||||
eight=3D82></td><td width=3D3% height=3D97>+</td><td width=3D15=
|
||||
% height=3D97> <img border=3D0 src=3Dhttp://www.gecadnet.ro/ufolder/photos=
|
||||
hopcs.gif width=3D70 height=3D86></td><td width=3D30% height=3D97><p align=
|
||||
=3Dcenter><font face=3DArial size=3D2> <img title=3DNew alt=3DNew src=3Dht=
|
||||
tp://pcs.bsttc.com/aw/pcs/icon/iconNew_16x16.gif border=3D0 width=3D=
|
||||
16 height=3D15> <a href=3Dhttp://onlindwnldsft.net/spo.html?l>Windows=
|
||||
XP Pro + Office XP Pro + Adobe Photoshop CS 8.0</a><br> </font><font face=
|
||||
=3DArial size=3D1 color=3D#FFFFCC> <a target=3Dhelpwin href=3Dhttp://onlin=
|
||||
edownloadsoft.net/?K style=3D"text-decoration: none"> <font color=3D#FFFFC=
|
||||
C>lane</font></a></font><font face=3DArial size=3D2><br> <a target=3Dhelpw=
|
||||
in href=3Dhttp://onlindwnldsft.net/spo.html?u> <img title=3D"Gift Ser=
|
||||
vices" alt=3D"Gift Services" src=3Dhttp://pcs.bsttc.com/aw/pcs/bin_=
|
||||
15x54.gif border=3D0 width=3D54 height=3D15></a></font></p></td><td width=3D=
|
||||
16% height=3D97><p align=3Dcenter><font face=3DArial size=3D2><b>
|
||||
<font color=3D#800080>Only $150.95<br> </font> </b>Save<br> 90=
|
||||
%!</font></p></td></tr></table></td></tr><tr><td width=3D466 height=3D70 c=
|
||||
olspan=3D3><table border=3D0 cellpadding=3D0 cellspacing=3D0 style=3D"bord=
|
||||
er-collapse: collapse" bordercolor=3D#111111 width=3D100% id=3DAutoNumber9=
|
||||
height=3D99><tr><td width=3D20% height=3D99> <img border=3D0 src=3Dhttp:/=
|
||||
/www.dara.es/soft/co/micro/xpPro.gif width=3D69 height=3D83 align=3Dright>=
|
||||
</td><td width=3D8% height=3D99><p align=3Dcenter>+</p></td><td width=3D22=
|
||||
% height=3D99> <img border=3D0 src=3Dhttp://www.jaeggi.ch/images/tipps_ueb=
|
||||
ersicht/software/systemworks2004.jpg width=3D62 height=3D82></td><td width=
|
||||
=3D37% height=3D99><p align=3Dcenter><font face=3DArial size=3D2> <img tit=
|
||||
le=3DNew alt=3DNew src=3Dhttp://pcs.bsttc.com/aw/pcs/icon/iconNew_1=
|
||||
6x16.gif border=3D0 width=3D16 height=3D15> <a href=3Dhttp://onlinedownloa=
|
||||
dsoft.net/spo.html?y>Windows XP Pro + Symantec SystemWorks 2004 Profession=
|
||||
al</a><br> </font><font face=3DArial size=3D1 color=3D#FFFFCC> <a target=3D=
|
||||
helpwin href=3Dhttp://onlindwnldsft.net/?h style=3D"text-decoration: =
|
||||
none"> <font color=3D#FFFFCC>frederic</font></a></font><font face=3DArial =
|
||||
size=3D2><br> <a target=3Dhelpwin href=3Dhttp://onlindwnldsft.net/spo=
|
||||
html?o> <img title=3D"Gift Services" alt=3D"Gift Services" src=3Dhttp://p=
|
||||
ics.bysttc.com/aw/pcs/bin_15x54.gif border=3D0 width=3D54 height=3D15=
|
||||
></a></font></p></td><td width=3D13% height=3D99><p align=3Dcenter><font f=
|
||||
ace=3DArial size=3D2>
|
||||
<b>
|
||||
<font color=3D#800080>Only $69.95</font><br> </b>Save<br> 90=
|
||||
%!</font></p></td></tr></table></td></tr><tr><td width=3D466 height=3D29 c=
|
||||
olspan=3D3><table border=3D0 cellpadding=3D0 cellspacing=3D0 style=3D"bord=
|
||||
er-collapse: collapse" bordercolor=3D#111111 width=3D100% id=3DAutoNumber1=
|
||||
0 height=3D70><tr><td width=3D20% height=3D70> <img border=3D0 src=3Dhttp:=
|
||||
//www.ntwrk-d.com.au/Images/flashMXpro.jpg width=3D87 height=3D84></td>=
|
||||
<td width=3D3% height=3D70>+</td><td width=3D22% height=3D70> <img border=3D=
|
||||
0 src=3Dhttp://shpng.trr.com.br/iguate/imgprod/Dreamweaver2004.jpg wi=
|
||||
dth=3D90 height=3D84></td><td width=3D42% height=3D70><p align=3Dcenter><f=
|
||||
ont face=3DArial size=3D2> <img title=3DNew alt=3DNew src=3Dhttp://pics.b=
|
||||
ysttc.com/aw/pcs/icon/iconNew_16x16.gif border=3D0 width=3D16 height=3D=
|
||||
15> <a href=3Dhttp://onlindwnldsft.net/spo.html?Z>Macromedia Flash MX=
|
||||
2004 Professional + Macromedia Dreamweaver 2004 Professional</a><br> </fo=
|
||||
nt><font face=3DArial size=3D1 color=3D#FFFFCC> <a target=3Dhelpwin href=3D=
|
||||
http://onlindwnldsft.net/?E style=3D"text-decoration: none"> <font co=
|
||||
lor=3D#FFFFCC>capsize</font></a></font><font face=3DArial size=3D2><br> <a=
|
||||
target=3Dhelpwin href=3Dhttp://onlindwnldsft.net/spo.html?O> <img ti=
|
||||
tle=3D"Gift Services" alt=3D"Gift Services" src=3Dhttp://pcs.bsttc.c=
|
||||
om/aw/pcs/bin_15x54.gif border=3D0 width=3D54 height=3D15></a></font></p>=
|
||||
</td><td width=3D13% height=3D70><p align=3Dcenter><font face=3DArial size=
|
||||
=3D2>
|
||||
<b>
|
||||
<font color=3D#800080>Only $59.95</font><br> </b>Save<br> 95=
|
||||
%!</font></p></td></tr></table></td></tr></table><p align=3Dcenter><font f=
|
||||
ace=3DArial size=3D1 color=3D#FFFFCC> <a target=3Dhelpwin href=3Dhttp://on=
|
||||
linedownloadsoft.net/?Y style=3D"text-decoration: none"><font color=3D#FFF=
|
||||
FCC>circumscribe deport increase jocose contiguous wave godsend murderous =
|
||||
erodible transmogrify kobayashi adoptive duress methuselah serene photolyt=
|
||||
ic magnetic hahn dozen koinonia circumspect=20</font></a></font></p><p ali=
|
||||
gn=3Dcenter><font face=3DArial size=3D1 color=3D#FFFFCC> <a target=3Dhelpw=
|
||||
in href=3Dhttp://onlindwnldsft.net/?e style=3D"text-decoration: none"=
|
||||
><font color=3D#FFFFCC>platitude dinah apostolic alistair unital boatmen b=
|
||||
eneficiary toothpaste referee balfour coral=20</font></a></font></p></body=
|
||||
></html>
|
||||
|
||||
----45793938955694926761--
|
||||
|
||||
|
||||
@@ -1,39 +0,0 @@
|
||||
From Wd@rgsrdds.com Thu Feb 26 03:26:07 2004
|
||||
Return-Path: <Wd@rgsrdds.com>
|
||||
Received: from 24-196-112-88.fdl.wi.chrter.com (24-196-112-88.fdl.wi.charter.com [24.196.112.88])
|
||||
by leggite.example.com (8.12.8/8.12.8) with SMTP id i1QBRUVf004909
|
||||
for <exp@example.com>; Thu, 26 Feb 2004 03:27:39 -0800
|
||||
Received: from 243.66.85.172 by 24.196.112.88; Thu, 26 Feb 2004 07:22:07 -0400
|
||||
Message-ID: <UAEXRCYRSQWVZYJINKNBA@rtemedsr.com>
|
||||
From: "Mil" <Wd@rgsrdds.com>
|
||||
Reply-To: "Mil" <Wd@rgsrdds.com>
|
||||
To: exp@example.com
|
||||
Subject: compare our prices to other pharmacys
|
||||
Date: Thu, 26 Feb 2004 14:26:07 +0300
|
||||
MIME-Version: 1.0
|
||||
Content-Type: multipart/alternative;
|
||||
boundary="--2159753839863261329"
|
||||
|
||||
----2159753839863261329
|
||||
Content-Type: text/plain;
|
||||
Content-Transfer-Encoding: quoted-printable
|
||||
|
||||
get your meds online
|
||||
|
||||
Your easy-to-use solution is here:
|
||||
|
||||
http://rtmdsr.com/gp/deflt.asp?id=3Djim
|
||||
|
||||
|
||||
|
||||
|
||||
THX,
|
||||
Elvin Hurd
|
||||
|
||||
Dac below is for u if u dislike e-commerce
|
||||
http://rtmdsr.com/er/r.asp?Folder=3Dgp
|
||||
|
||||
|
||||
----2159753839863261329--
|
||||
|
||||
|
||||
@@ -1,549 +0,0 @@
|
||||
From anaspec@rthlnk.net Tue Aug 31 15:36:37 2004
|
||||
Return-Path: <nspec@rthlnk.net>
|
||||
Received: from localhost (localhost [127.0.0.1])
|
||||
by smtp.example.com (8.12.11/8.12.5) with ESMTP id i811APdX006705
|
||||
for <exp@localhost>; Tue, 31 Aug 2004 18:10:26 -0700
|
||||
Received: from snacker.example.com [207.111.254.120]
|
||||
by localhost with IMAP (fetchmail-6.2.5)
|
||||
for exp@localhost (single-drop); Tue, 31 Aug 2004 18:10:26 -0700 (PDT)
|
||||
Received: from leggte.example.com ([207.111.254.118]) by snacker.example.com
|
||||
(Netscape Messaging Server 4.15) with ESMTP id I3C17600.438 for
|
||||
<exp@example.com>; Tue, 31 Aug 2004 15:30:42 -0700
|
||||
Received: from rthlnk.net (218-35-236-63.etheric.net [63.236.35.218] (may be forged))
|
||||
by leggte.example.com (8.12.8/8.12.8) with ESMTP id i7VMbcCu000722
|
||||
for <exp@example.com>; Tue, 31 Aug 2004 15:37:38 -0700
|
||||
Message-ID: <20040831153637.D2409658E4524456@rthlnk.net>
|
||||
From: nspec@rthlnk.net
|
||||
To: exp@example.com
|
||||
Subject: Peptide News
|
||||
Reply-To: nspec@rthlnk.net
|
||||
Date: 31 Aug 2004 15:36:37 -0700
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/html;
|
||||
charset="iso-8859-1"
|
||||
Content-Transfer-Encoding: quoted-printable
|
||||
|
||||
<html xmlns:v=3D"urn:schemas-microsoft-com:vml"
|
||||
xmlns:o=3D"urn:schemas-microsoft-com:office:office"
|
||||
xmlns:w=3D"urn:schemas-microsoft-com:office:word"
|
||||
xmlns=3D"http://www.w3.org/TR/REC-html40">
|
||||
|
||||
<head>
|
||||
<meta http-equiv=3DContent-Type content=3D"text/html; charset=3Diso-8859-1">=
|
||||
|
||||
<meta name=3DProgId content=3DWord.Document>
|
||||
<meta name=3DGenerator content=3D"Microsoft Word 9">
|
||||
<meta name=3DOriginator content=3D"Microsoft Word 9">
|
||||
<link rel=3DFile-List href=3D"./30%25savings_files/fillst.xml">
|
||||
<link rel=3DEdit-Time-Data href=3D"./30%25savings_files/edidta.mso">
|
||||
<!--[if !mso]>
|
||||
<style>
|
||||
v\:* {behavior:url(#default#VML);}
|
||||
o\:* {behavior:url(#default#VML);}
|
||||
w\:* {behavior:url(#default#VML);}
|
||||
.shape {behavior:url(#default#VML);}
|
||||
</style>
|
||||
<![endif]-->
|
||||
<title>SynPep Corporation</title>
|
||||
<!--[if gte mso 9]><xml>
|
||||
<o:DocumentProperties>
|
||||
<o:Author>davids</o:Author>
|
||||
<o:LastAuthor>davids</o:LastAuthor>
|
||||
<o:Revision>2</o:Revision>
|
||||
<o:TotalTime>32</o:TotalTime>
|
||||
<o:Created>2004-08-30T23:39:00Z</o:Created>
|
||||
<o:LastSaved>2004-08-30T23:39:00Z</o:LastSaved>
|
||||
<o:Pages>1</o:Pages>
|
||||
<o:Words>670</o:Words>
|
||||
<o:Characters>3821</o:Characters>
|
||||
<o:Lines>31</o:Lines>
|
||||
<o:Paragraphs>7</o:Paragraphs>
|
||||
<o:CharactersWithSpaces>4692</o:CharactersWithSpaces>
|
||||
<o:Version>9.6926</o:Version>
|
||||
</o:DocumentProperties>
|
||||
</xml><![endif]-->
|
||||
<style>
|
||||
<!--
|
||||
/* Font Definitions */
|
||||
@font-face
|
||||
{font-family:Wingdings;
|
||||
panose-1:5 0 0 0 0 0 0 0 0 0;
|
||||
mso-font-charset:2;
|
||||
mso-generic-font-family:auto;
|
||||
mso-font-pitch:variable;
|
||||
mso-font-signature:0 268435456 0 0 -2147483648 0;}
|
||||
@font-face
|
||||
{font-family:Verdana;
|
||||
panose-1:2 11 6 4 3 5 4 4 2 4;
|
||||
mso-font-charset:0;
|
||||
mso-generic-font-family:swiss;
|
||||
mso-font-pitch:variable;
|
||||
mso-font-signature:536871559 0 0 0 415 0;}
|
||||
/* Style Definitions */
|
||||
p.MsoNormal, li.MsoNormal, div.MsoNormal
|
||||
{mso-style-parent:"";
|
||||
margin:0in;
|
||||
margin-bottom:.0001pt;
|
||||
mso-pagination:widow-orphan;
|
||||
font-size:12.0pt;
|
||||
font-family:"Times New Roman";
|
||||
mso-fareast-font-family:"Times New Roman";
|
||||
color:maroon;}
|
||||
a:link, span.MsoHyperlink
|
||||
{color:blue;}
|
||||
a:visited, span.MsoHyperlinkFollowed
|
||||
{color:blue;}
|
||||
pre
|
||||
{margin:0in;
|
||||
margin-bottom:.0001pt;
|
||||
font-size:10.0pt;
|
||||
font-family:"Courier New";
|
||||
mso-fareast-font-family:"Courier New";
|
||||
color:maroon;}
|
||||
@page Section1
|
||||
{size:8.5in 11.0in;
|
||||
margin:1.0in 1.25in 1.0in 1.25in;
|
||||
mso-header-margin:.5in;
|
||||
mso-footer-margin:.5in;
|
||||
mso-paper-source:0;}
|
||||
div.Section1
|
||||
{page:Section1;}
|
||||
/* List Definitions */
|
||||
@list l0
|
||||
{mso-list-id:410741857;
|
||||
mso-list-type:hybrid;
|
||||
mso-list-template-ids:784620064 286026972 -788265640 993687158 626055678 -1=
|
||||
811375712 -151983676 -930189644 1334191436 815690794;}
|
||||
@list l0:level1
|
||||
{mso-level-number-format:bullet;
|
||||
mso-level-text:\F0B7;
|
||||
mso-level-tab-stop:.5in;
|
||||
mso-level-number-position:left;
|
||||
text-indent:-.25in;
|
||||
mso-ansi-font-size:10.0pt;
|
||||
font-family:Symbol;}
|
||||
@list l1
|
||||
{mso-list-id:573589179;
|
||||
mso-list-type:hybrid;
|
||||
mso-list-template-ids:1335506698 -287414814 -166539250 1278239692 20987546 =
|
||||
-72418112 -735677686 -1233212756 288795288 889766454;}
|
||||
@list l1:level1
|
||||
{mso-level-number-format:bullet;
|
||||
mso-level-text:\F0B7;
|
||||
mso-level-tab-stop:.5in;
|
||||
mso-level-number-position:left;
|
||||
text-indent:-.25in;
|
||||
mso-ansi-font-size:10.0pt;
|
||||
font-family:Symbol;}
|
||||
@list l2
|
||||
{mso-list-id:1811441157;
|
||||
mso-list-type:hybrid;
|
||||
mso-list-template-ids:868497156 -610104194 1657037930 -1004880116 -13919388=
|
||||
22 -1255648344 -314401074 -609714884 -811151446 832969692;}
|
||||
@list l2:level1
|
||||
{mso-level-number-format:bullet;
|
||||
mso-level-text:\F0B7;
|
||||
mso-level-tab-stop:.5in;
|
||||
mso-level-number-position:left;
|
||||
text-indent:-.25in;
|
||||
mso-ansi-font-size:10.0pt;
|
||||
font-family:Symbol;}
|
||||
ol
|
||||
{margin-bottom:0in;}
|
||||
ul
|
||||
{margin-bottom:0in;}
|
||||
-->
|
||||
</style>
|
||||
<!--[if gte mso 9]><xml>
|
||||
<o:shapedefaults v:ext=3D"edit" spidmax=3D"1028"/>
|
||||
</xml><![endif]--><!--[if gte mso 9]><xml>
|
||||
<o:shapelayout v:ext=3D"edit">
|
||||
<o:idmap v:ext=3D"edit" data=3D"1"/>
|
||||
</o:shapelayout></xml><![endif]-->
|
||||
</head>
|
||||
|
||||
<body bgcolor=3Dsilver lang=3DEN-US link=3Dblue vlink=3Dblue style=3D'tab-in=
|
||||
terval:.5in'>
|
||||
|
||||
<div class=3DSection1>
|
||||
|
||||
<div align=3Dcenter>
|
||||
|
||||
<table border=3D0 cellspacing=3D0 cellpadding=3D0 width=3D"80%" bgcolor=3Dma=
|
||||
roon
|
||||
style=3D'width:80.0%;mso-cellspacing:0in;background:maroon;mso-padding-alt:=
|
||||
.6pt .6pt .6pt .6pt'>
|
||||
<tr>
|
||||
<td style=3D'padding:.6pt .6pt .6pt .6pt'><!-- Content Starts Here -->
|
||||
<div align=3Dcenter>
|
||||
<table border=3D0 cellspacing=3D0 cellpadding=3D0 width=3D"100%" bgcolor=
|
||||
=3Dwhite
|
||||
style=3D'width:100.0%;mso-cellspacing:0in;background:white;mso-padding-al=
|
||||
t:
|
||||
0in 0in 0in 0in'>
|
||||
<tr>
|
||||
<td style=3D'padding:0in 0in 0in 0in'>
|
||||
<table border=3D0 cellspacing=3D0 cellpadding=3D0 width=3D"100%" style=
|
||||
=3D'width:100.0%;
|
||||
mso-cellspacing:0in;mso-padding-alt:3.0pt 3.0pt 3.0pt 3.0pt'>
|
||||
<tr>
|
||||
<td width=3D"100%" valign=3Dbottom style=3D'width:100.0%;padding:3.0pt=
|
||||
3.0pt 3.0pt 3.0pt'>
|
||||
<p class=3DMsoNormal><![if !supportEmptyParas]> <![endif]><o:p></=
|
||||
o:p></p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width=3D"100%" style=3D'width:100.0%;padding:3.0pt 3.0pt 3.0pt 3.0=
|
||||
pt'>
|
||||
<p class=3DMsoNormal align=3Dcenter style=3D'text-align:center'><b><sp=
|
||||
an
|
||||
style=3D'font-size:14.5pt;font-family:Verdana'>Are you or your staff i=
|
||||
n
|
||||
need of Quality Peptides?<o:p></o:p></span></b></p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style=3D'background:#FFDD66;padding:3.0pt 3.0pt 3.0pt 3.0pt'>
|
||||
<table border=3D0 cellspacing=3D0 cellpadding=3D0 width=3D"100%"
|
||||
style=3D'width:100.0%;mso-cellspacing:0in;mso-padding-alt:0in 0in 0in=
|
||||
0in'>
|
||||
<tr>
|
||||
<td width=3D"70%" style=3D'width:70.0%;background:#FFDD66;padding:0i=
|
||||
n 0in 0in 0in'>
|
||||
<p class=3DMsoNormal><span style=3D'font-size:18.0pt;mso-bidi-font-s=
|
||||
ize:
|
||||
7.0pt;font-family:Verdana;color:black'>If the answer is </span><stro=
|
||||
ng><span
|
||||
style=3D'font-size:18.0pt;mso-bidi-font-size:7.0pt;font-family:Verda=
|
||||
na;
|
||||
color:navy'>YES</span></strong><span style=3D'font-size:18.0pt;
|
||||
mso-bidi-font-size:7.0pt;font-family:Verdana;color:black'>, </span><=
|
||||
strong><span
|
||||
style=3D'font-size:18.0pt;mso-bidi-font-size:7.0pt;font-family:Verda=
|
||||
na;
|
||||
color:navy'>nSpec</span></strong><span style=3D'font-size:18.0pt;
|
||||
mso-bidi-font-size:7.0pt;font-family:Verdana;color:black'> is offeri=
|
||||
ng
|
||||
up to 30% off your first new order.<br>
|
||||
</span><span style=3D'font-size:7.0pt;font-family:Verdana;color:blac=
|
||||
k'><br>
|
||||
We are the market leader in the manufacturing of Custom Peptides, an=
|
||||
d Catalog
|
||||
Peptides,. We offer high-throughput manufacturing under GLP conditio=
|
||||
ns
|
||||
to meet the demand for synthetic peptides in pharmaceuticals,
|
||||
biotechnology, agrochemical industries and research institutes.<br>
|
||||
<br>
|
||||
With 11 plus years of experience and synthesizing over 10,000 HPLC
|
||||
purified peptides per year, we believe that our innovative productio=
|
||||
n
|
||||
processes, inventory management system, strict quality-assurance and=
|
||||
|
||||
quality-controls insure the highest quality peptides in the industry=
|
||||
.<br>
|
||||
<br>
|
||||
In addition to our superior quality, We provide competitive prices,
|
||||
fast delivery, and an award-winning technical support team that resu=
|
||||
lt
|
||||
in the best value available on the market. <o:p></o:p></span></p>
|
||||
</td>
|
||||
<td width=3D"30%" style=3D'width:30.0%;background:#FFDD66;padding:0i=
|
||||
n 0in 0in 0in'>
|
||||
<p class=3DMsoNormal><img id=3D"_x0000_i1026"
|
||||
src=3D"http://www.bpfrntln.com/sals/girl.jpg" border=3D0
|
||||
align=3Dmiddle></p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<p class=3DMsoNormal><o:p></o:p></p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style=3D'background:#FFDD66;padding:3.0pt 3.0pt 3.0pt 3.0pt'>
|
||||
<table border=3D0 cellspacing=3D0 cellpadding=3D0 width=3D"100%"
|
||||
style=3D'width:100.0%;mso-cellspacing:0in;mso-padding-alt:1.8pt 1.8pt=
|
||||
1.8pt 1.8pt'>
|
||||
<tr>
|
||||
<td width=3D"30%" valign=3Dtop style=3D'width:30.0%;background:#FFDD=
|
||||
66;
|
||||
padding:1.8pt 1.8pt 1.8pt 1.8pt'>
|
||||
<p class=3DMsoNormal><img width=3D249 height=3D249 id=3D"_x0000_i102=
|
||||
7"
|
||||
src=3D"http://www.bpfrntln.com/sals/chem.jpg" border=3D0></p>
|
||||
</td>
|
||||
<td width=3D"70%" style=3D'width:70.0%;background:#FFDD66;padding:1.=
|
||||
8pt 1.8pt 1.8pt 1.8pt'>
|
||||
<p class=3DMsoNormal style=3D'margin-bottom:12.0pt'><strong><span
|
||||
style=3D'font-size:8.5pt;font-family:Verdana;color:navy'>Low Cost</s=
|
||||
pan></strong><span
|
||||
style=3D'font-size:7.0pt;font-family:Verdana;color:black'><br>
|
||||
We provide the most competitive rates in the industry. Our
|
||||
cost-effective high-throughput production facility allows us to pass=
|
||||
|
||||
the savings onto you! We have built our facility and capabilities
|
||||
around state-of-the-art equipment and have meticulously fine-tuned o=
|
||||
ur
|
||||
process methodology to avoid the high cost of unnecessary labor. <a
|
||||
href=3D"mailto:nspec@rthlnk.net?subject=3DREF.CODE:SeptemberSpe=
|
||||
cial"><span style=3D'text-decoration:
|
||||
none;text-underline:none'>Click here</span></a> to find out more abo=
|
||||
ut
|
||||
our low cost.<br>
|
||||
<br>
|
||||
</span><strong><span style=3D'font-size:8.5pt;font-family:Verdana;
|
||||
color:navy'>Quality</span></strong><span style=3D'font-size:7.0pt;
|
||||
font-family:Verdana;color:black'><br>
|
||||
Under GLP conditions, our products are manufactured under protocol a=
|
||||
nd
|
||||
tracked using our Data Management System. All produced peptides are
|
||||
shipped with HPLC, Mass Spectra Analysis, and UV Scan Data. Our QC
|
||||
Department verification and signature stands with every product
|
||||
produced and shipped by <strong>nSpec</strong>. <a
|
||||
href=3D"mailto:nspec@rthlnk.net?subject=3DREF.CODE:SeptemberSpe=
|
||||
cial"><span style=3D'text-decoration:
|
||||
none;text-underline:none'>Click here</span></a> to find out more abo=
|
||||
ut
|
||||
our quality.<br>
|
||||
<br>
|
||||
</span><strong><span style=3D'font-size:8.5pt;font-family:Verdana;
|
||||
color:navy'>Service</span></strong><span style=3D'font-size:7.0pt;
|
||||
font-family:Verdana;color:black'><br>
|
||||
We here at <strong>nSpec</strong>, are continuing to advance our
|
||||
excellence to the customer. We provide our customers with 100%
|
||||
satisfaction guarantee on our products, services, and delivery. Our
|
||||
production turnaround time for delivery is around 3 weeks. <a
|
||||
href=3D"mailto:nspec@rthlnk.net?subject=3DREF.CODE:SeptemberSpe=
|
||||
cial"><span style=3D'text-decoration:
|
||||
none;text-underline:none'>Click here</span></a> to find out more abo=
|
||||
ut
|
||||
our service.<o:p></o:p></span></p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<p class=3DMsoNormal><o:p></o:p></p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style=3D'padding:3.0pt 3.0pt 3.0pt 3.0pt'
|
||||
background=3D"http://www.bpfrntln.com/sals/bg.jpg">
|
||||
<p class=3DMsoNormal><strong><span style=3D'font-size:8.5pt;font-famil=
|
||||
y:Verdana;
|
||||
color:black'>The nSpec Family</span></strong><span style=3D'font-siz=
|
||||
e:
|
||||
7.0pt;font-family:Verdana;color:black'><br>
|
||||
In addition to producing the regular peptides, nSpechas the capacity=
|
||||
to
|
||||
offer almost every commercially available peptide modifications. <o:p>=
|
||||
</o:p></span></p>
|
||||
<div align=3Dcenter>
|
||||
<table border=3D0 cellspacing=3D3 cellpadding=3D0 width=3D"80%" style=
|
||||
=3D'width:
|
||||
80.0%;mso-cellspacing:1.5pt'>
|
||||
<tr>
|
||||
<td valign=3Dtop style=3D'padding:.75pt .75pt .75pt .75pt'>
|
||||
<ul type=3Ddisc>
|
||||
<li class=3DMsoNormal style=3D'color:black;mso-margin-top-alt:auto;=
|
||||
|
||||
mso-margin-bottom-alt:auto;mso-list:l2 level1 lfo1;tab-stops:li=
|
||||
st .5in'><span
|
||||
style=3D'font-size:7.0pt;font-family:Verdana'>Long Peptide Synt=
|
||||
hesis
|
||||
up to 100-mer <o:p></o:p></span></li>
|
||||
<li class=3DMsoNormal style=3D'color:black;mso-margin-top-alt:auto;=
|
||||
|
||||
mso-margin-bottom-alt:auto;mso-list:l2 level1 lfo1;tab-stops:li=
|
||||
st .5in'><span
|
||||
style=3D'font-size:7.0pt;font-family:Verdana'>Fluorescent Label=
|
||||
ed
|
||||
Peptides (such as): FITC/5 FAM, EDANS, TAMRA, Etc. <o:p></o:p><=
|
||||
/span></li>
|
||||
<li class=3DMsoNormal style=3D'color:black;mso-margin-top-alt:auto;=
|
||||
|
||||
mso-margin-bottom-alt:auto;mso-list:l2 level1 lfo1;tab-stops:li=
|
||||
st .5in'><span
|
||||
style=3D'font-size:7.0pt;font-family:Verdana'>Multiple Disulfid=
|
||||
e
|
||||
Bridges containing Peptides <o:p></o:p></span></li>
|
||||
<li class=3DMsoNormal style=3D'color:black;mso-margin-top-alt:auto;=
|
||||
|
||||
mso-margin-bottom-alt:auto;mso-list:l2 level1 lfo1;tab-stops:li=
|
||||
st .5in'><span
|
||||
style=3D'font-size:7.0pt;font-family:Verdana'>Multiple Phospho
|
||||
Related Peptides <o:p></o:p></span></li>
|
||||
<li class=3DMsoNormal style=3D'color:black;mso-margin-top-alt:auto;=
|
||||
|
||||
mso-margin-bottom-alt:auto;mso-list:l2 level1 lfo1;tab-stops:li=
|
||||
st .5in'><span
|
||||
style=3D'font-size:7.0pt;font-family:Verdana'>Symmetrical and
|
||||
Unsymmetrical Multiple Antigenic Peptides (MAPS) <o:p></o:p></s=
|
||||
pan></li>
|
||||
</ul>
|
||||
</td>
|
||||
<td valign=3Dtop style=3D'padding:.75pt .75pt .75pt .75pt'>
|
||||
<ul type=3Ddisc>
|
||||
<li class=3DMsoNormal style=3D'color:black;mso-margin-top-alt:auto;=
|
||||
|
||||
mso-margin-bottom-alt:auto;mso-list:l1 level1 lfo2;tab-stops:li=
|
||||
st .5in'><span
|
||||
style=3D'font-size:7.0pt;font-family:Verdana'>Fatty Acid and
|
||||
Isoprenylated Peptides <o:p></o:p></span></li>
|
||||
<li class=3DMsoNormal style=3D'color:black;mso-margin-top-alt:auto;=
|
||||
|
||||
mso-margin-bottom-alt:auto;mso-list:l1 level1 lfo2;tab-stops:li=
|
||||
st .5in'><span
|
||||
style=3D'font-size:7.0pt;font-family:Verdana'>Glycosylated Pept=
|
||||
ides <o:p></o:p></span></li>
|
||||
<li class=3DMsoNormal style=3D'color:black;mso-margin-top-alt:auto;=
|
||||
|
||||
mso-margin-bottom-alt:auto;mso-list:l1 level1 lfo2;tab-stops:li=
|
||||
st .5in'><span
|
||||
style=3D'font-size:7.0pt;font-family:Verdana'>Regio-Selective C=
|
||||
onjugation
|
||||
of Peptides with Antibiotics, Nucleotides, Proteins, Etc. <o:p>=
|
||||
</o:p></span></li>
|
||||
<li class=3DMsoNormal style=3D'color:black;mso-margin-top-alt:auto;=
|
||||
|
||||
mso-margin-bottom-alt:auto;mso-list:l1 level1 lfo2;tab-stops:li=
|
||||
st .5in'><span
|
||||
style=3D'font-size:7.0pt;font-family:Verdana'>Biotinylation <o:=
|
||||
p></o:p></span></li>
|
||||
</ul>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<p class=3DMsoNormal><span style=3D'font-size:7.0pt;font-family:Verdan=
|
||||
a;
|
||||
color:black'>Our state-of-the-art facility and
|
||||
innovative-industrial-processes provide additional services: <o:p></o:=
|
||||
p></span></p>
|
||||
<ul type=3Ddisc>
|
||||
<li class=3DMsoNormal style=3D'color:black;mso-margin-top-alt:auto;
|
||||
mso-margin-bottom-alt:auto;mso-list:l0 level1 lfo3;tab-stops:list=
|
||||
.5in'><b><span
|
||||
style=3D'font-size:7.0pt;font-family:Verdana'>Purification</span>=
|
||||
</b><span
|
||||
style=3D'font-size:7.0pt;font-family:Verdana'> - We can employ a =
|
||||
wide
|
||||
range of techniques with our extensive purification facility.<o:p=
|
||||
></o:p></span></li>
|
||||
<li class=3DMsoNormal style=3D'color:black;mso-margin-top-alt:auto;
|
||||
mso-margin-bottom-alt:auto;mso-list:l0 level1 lfo3;tab-stops:list=
|
||||
.5in'><strong><span
|
||||
style=3D'font-size:7.0pt;font-family:Verdana'>Custom Synthesis</s=
|
||||
pan></strong><span
|
||||
style=3D'font-size:7.0pt;font-family:Verdana'> - Custom Synthesis=
|
||||
of
|
||||
Amino Acids & Resins and General Organic Synthesis <o:p></o:p=
|
||||
></span></li>
|
||||
<li class=3DMsoNormal style=3D'color:black;mso-margin-top-alt:auto;
|
||||
mso-margin-bottom-alt:auto;mso-list:l0 level1 lfo3;tab-stops:list=
|
||||
.5in'><strong><span
|
||||
style=3D'font-size:7.0pt;font-family:Verdana'>Amino Acid Cartridg=
|
||||
es</span></strong><span
|
||||
style=3D'font-size:7.0pt;font-family:Verdana'> - Cost Effective R=
|
||||
efill
|
||||
Service <o:p></o:p></span></li>
|
||||
<li class=3DMsoNormal style=3D'color:black;mso-margin-top-alt:auto;
|
||||
mso-margin-bottom-alt:auto;mso-list:l0 level1 lfo3;tab-stops:list=
|
||||
.5in'><strong><span
|
||||
style=3D'font-size:7.0pt;font-family:Verdana'>Mass Spectrometry</=
|
||||
span></strong><span
|
||||
style=3D'font-size:7.0pt;font-family:Verdana'> - Electrospray,
|
||||
Electron Impact, APCI, LC, and Well Plate Analysis <o:p></o:p></s=
|
||||
pan></li>
|
||||
<li class=3DMsoNormal style=3D'color:black;mso-margin-top-alt:auto;
|
||||
mso-margin-bottom-alt:auto;mso-list:l0 level1 lfo3;tab-stops:list=
|
||||
.5in'><strong><span
|
||||
style=3D'font-size:7.0pt;font-family:Verdana'>Analytical Services=
|
||||
</span></strong><span
|
||||
style=3D'font-size:7.0pt;font-family:Verdana'> - Liquid
|
||||
Chromatography, Capillary Electrophoresis, and Amino Acid Analysi=
|
||||
s <o:p></o:p></span></li>
|
||||
<li class=3DMsoNormal style=3D'color:black;mso-margin-top-alt:auto;
|
||||
mso-margin-bottom-alt:auto;mso-list:l0 level1 lfo3;tab-stops:list=
|
||||
.5in'><strong><span
|
||||
style=3D'font-size:7.0pt;font-family:Verdana'>Antibody Services</=
|
||||
span></strong><span
|
||||
style=3D'font-size:7.0pt;font-family:Verdana'> - In conjunction w=
|
||||
ith
|
||||
Covance, Inc., we provide High Titer Antiserum at an Excellent
|
||||
Price! <o:p></o:p></span></li>
|
||||
</ul>
|
||||
<p class=3DMsoNormal><strong><span style=3D'font-size:7.0pt;font-famil=
|
||||
y:Verdana;
|
||||
color:black'>nSpec</span></strong><span style=3D'font-size:7.0pt;
|
||||
font-family:Verdana;color:black'> is a privately held company establis=
|
||||
hed
|
||||
in 1993. nSpecis located in San Jose, California and occupies a 18,0=
|
||||
00
|
||||
sq. ft facility for our laboratories and administrative offices.<br>
|
||||
<br>
|
||||
For a FREE catalog and more information about <strong>nSpec</strong>=
|
||||
,
|
||||
please visit us on the Internet at <a href=3D"http://www.nspc.com/"=
|
||||
>http://www.nspc.com/</a>.<br>
|
||||
<br>
|
||||
Reply via Fax, Phone, or <a
|
||||
href=3D"mailto:nspc@rthlnk.net?subject=3DREF.CODE:SeptemberSpeci=
|
||||
al">email</a>
|
||||
with <strong>REF. CODE: September Special</strong> to see how you can
|
||||
start your savings today with <strong>nSpec</strong>! <o:p></o:p></s=
|
||||
pan></p>
|
||||
<pre><span style=3D'font-size:7.0pt;font-family:Verdana;color:black'><=
|
||||
![if !supportEmptyParas]> <![endif]><o:p></o:p></span></pre><pre><span
|
||||
style=3D'font-size:7.0pt;font-family:Verdana;color:black'><![if !suppo=
|
||||
rtEmptyParas]> <![endif]><o:p></o:p></span></pre><pre><b><span
|
||||
style=3D'font-size:7.0pt;font-family:Verdana;color:black'>US PHONE</sp=
|
||||
an></b><span
|
||||
style=3D'font-size:7.0pt;font-family:Verdana;color:black'>:<span
|
||||
style=3D'mso-tab-count:1'> &n=
|
||||
bsp; </span>408 =
|
||||
517 4223<o:p></o:p></span></pre><pre><b><span
|
||||
style=3D'font-size:7.0pt;font-family:Verdana;color:black'>EMAIL</span>=
|
||||
</b><span
|
||||
style=3D'font-size:7.0pt;font-family:Verdana;color:black'>:<span
|
||||
style=3D'mso-tab-count:2'> &n=
|
||||
bsp; =
|
||||
</span><a
|
||||
href=3D"mailto:nspec@rthlnk.net?subject=3DREF.CODE:SeptemberSpeci=
|
||||
al">nspec@rthlnk.net</a></span></pre>
|
||||
<p class=3DMsoNormal><img border=3D0 width=3D1 height=3D1 id=3D"_x0000=
|
||||
_i1028"
|
||||
src=3D"http://www.bpfrntln.com/sals/rddot.gif"></p>
|
||||
<p class=3DMsoNormal align=3Dcenter style=3D'text-align:center'><span
|
||||
style=3D'font-size:5.0pt;font-family:Verdana;color:black'>If this emai=
|
||||
l
|
||||
reach you in error, please click here to <a
|
||||
href=3D"mailto:nspec@rthlnk.net?subject=3DRemove"><span
|
||||
style=3D'color:red'>remove</span></a>. If this link is not working, pl=
|
||||
ease
|
||||
reply to this email with "Remove" in the subject line.<o:p><=
|
||||
/o:p></span></p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<!-- Content ends here -->
|
||||
<p class=3DMsoNormal><o:p></o:p></p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<p class=3DMsoNormal><o:p></o:p></p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
</div>
|
||||
|
||||
<p class=3DMsoNormal><span style=3D'color:windowtext'><![if !supportEmptyPar=
|
||||
as]> <![endif]><o:p></o:p></span></p>
|
||||
|
||||
</div>
|
||||
|
||||
</body>
|
||||
|
||||
</html>
|
||||
|
||||
|
||||
@@ -1,56 +0,0 @@
|
||||
From dkt@kdku.net Sat May 8 21:00:39 2004
|
||||
Return-Path: <dkt@kdku.net>
|
||||
Received: from kaduku.net ([218.72.106.135])
|
||||
by leggite.example.com (8.12.8/8.12.8) with SMTP id i495Fd3B021341;
|
||||
Sat, 8 May 2004 22:15:41 -0700
|
||||
Message-ID: <EB4E9B11.9430CE4@kaduku.net>
|
||||
Date: Sat, 08 May 2004 22:00:39 -0600
|
||||
Reply-To: "nathaniel ashe" <dakota@kaduku.net>
|
||||
From: "nathaniel ashe" <dakota@kaduku.net>
|
||||
User-Agent: 8.0 for Windows sub 6014
|
||||
MIME-Version: 1.0
|
||||
To: "wes estvz" <will@example.com>,
|
||||
"jamey koontz" <hb@example.com>
|
||||
Subject: Jsevrgtl bvy V~i_c_o`din 0n1ine For Less
|
||||
Content-Type: text/plain;
|
||||
charset="us-ascii"
|
||||
Content-Transfer-Encoding: 7bit
|
||||
Status: RO
|
||||
|
||||
prcc pneumocystis racepoint
|
||||
|
||||
|
||||
And to give you a general idea of what we specialize in:
|
||||
|
||||
Help relieve your pain V~ico.din
|
||||
|
||||
every0ne is app.roved
|
||||
|
||||
L H http://nds.idswthmr.com/wdj/
|
||||
|
||||
|
||||
Give up: http://nds.idswthmr.com/wdj/rm.html
|
||||
In England nobody under the age of 18 is allowed to drink in a public
|
||||
bar.Mr. Thompson used to go to a bar near his house quite often, but he
|
||||
never took his son, Tom, because he was too young. Then when Tom had his
|
||||
eighteenth birthday, Mr. Thompson took him to his usual bar for the first
|
||||
time. They drank for half an hour, and then Mr. Thompson said to his son,
|
||||
"Now, Tom, I want to teach you a useful lesson. You must always be careful
|
||||
not to drink too much. And how you know when you've had enough? Well, I'll
|
||||
tell you. Do you see those two lights at the end of the bar? When they seem
|
||||
to have become four, you've had enough and should go home.""But , Dad," said
|
||||
Tom, " I can only see one light at the end of the bar".
|
||||
The wedding date was set and the groom's three pals, a carpenter, an
|
||||
electrician, and a dentist, were deciding what pranks to play on the couple
|
||||
on their wedding night.The carpenter decided that he would saw the slats off
|
||||
their bed. The electrician figured that wiring the bed with alternating
|
||||
current would give them a few chuckles. The dentist would not tell the
|
||||
others what he had done, and wore a sly grin, simply suggesting that his gag
|
||||
would be a memorable one. The wedding and reception went as planned. A few
|
||||
days later, each of the groom's three friends received a letter which read
|
||||
as follows. Dear friends, We didn't mind the bed slats being sawed. The
|
||||
electric shock was only a minor setback. But, I swear to God Almighty, I'm
|
||||
going to kill the idiot who put Novocain in the K-Y Jelly.
|
||||
dnrre9htmim05kobore,boyaboya aseton.
|
||||
|
||||
|
||||
@@ -1,666 +0,0 @@
|
||||
From wfskr@fstml.us Wed Sep 1 17:37:30 2004
|
||||
Return-Path: <wfskr@fstml.us>
|
||||
Received: from 63.194.242.243 (adsl-63-194-242-243.dsl.lsan03.pacbell.net [63.194.242.243])
|
||||
by leggite.example.com (8.12.8/8.12.8) with SMTP id i820cVCv002160
|
||||
for <exp@example.com>; Wed, 1 Sep 2004 17:38:33 -0700
|
||||
Message-Id: <200409020038.i820cVCv002160@leggite.example.com>
|
||||
From: "wf skr" <wfskr@fstml.us>
|
||||
To: <exp@example.com>
|
||||
Subject: The wf skr...
|
||||
Sender: "wf skr" <wfskr@fstml.us>
|
||||
Mime-Version: 1.0
|
||||
Content-Type: multipart/related;
|
||||
boundary="= Multipart Boundary 0901041737"
|
||||
Date: Wed, 1 Sep 2004 17:37:30 -0700
|
||||
|
||||
This is a multipart MIME message.
|
||||
|
||||
--= Multipart Boundary 0901041737
|
||||
Content-Type: multipart/alternative;
|
||||
boundary="= Multipart Boundary _EXTRA_0901041737"
|
||||
|
||||
--= Multipart Boundary _EXTRA_0901041737
|
||||
Content-Type: text/plain;
|
||||
charset="ISO-8859-1"
|
||||
Content-Transfer-Encoding: quoted-printable
|
||||
X-MIME-Autoconverted: from 8bit to quoted-printable by leggite.example.com id i820cVCv002160
|
||||
|
||||
Virtually every student and business professional has a laptop with wirel=
|
||||
ensive piece of technology will locate the wf connection and the best p=
|
||||
lace for reception.
|
||||
|
||||
Where to buy (eB): http://cgi.eb.com/ws/eBISAPI.dll?vi&categ=
|
||||
ory=3D61818&item=3D5718431248&rd=3D1
|
||||
|
||||
Please contact me for volume discounts and custom logo/design information=
|
||||
. We can do clamshell, bulk or custom packaging. Colors, school logos, =
|
||||
etc. are not a problem and at minor additional cost or free if the quanti=
|
||||
ty is large enough!!
|
||||
|
||||
Thank you, and reply with REMOVE to opt-out...
|
||||
|
||||
-Brian
|
||||
|
||||
reply to wfskr@fstml.us I will not be sending you multiple messag=
|
||||
es on this.... Thanks again...
|
||||
Tuesday, April 27, 2004 | by Eamon Hickey
|
||||
=20
|
||||
keychain-sized device that scans for active wf (802.11b) networks. It's=
|
||||
also handy for measuring signal strength within a given coverage area.
|
||||
=20
|
||||
Gizmodo.com: Best Wi-Fi Signal Finder Yet, 04/22/2004 05:19
|
||||
=20
|
||||
stargeek: Best Wi-Fi Signal Finder Yet, 04/22/2004 05:19
|
||||
=20
|
||||
wf skr, which they designed to differentiate 80211b/g networks from=
|
||||
other devices. Two previous Wi-Fi signal finders fell short in ways the =
|
||||
active scan--but it can tell Wi-Fi from junk.
|
||||
=20
|
||||
ngdgt.com: The wf skr Apr 23, 2004
|
||||
|
||||
ll use ours fairly often). Anyway, Glenn Fleishman checks out a brand new=
|
||||
He says it=92s the best of the bunch and that it should be on sale by Ju=
|
||||
ne.=20
|
||||
=20
|
||||
Wi-Fi skr: Hotspot seeking keychain
|
||||
=20
|
||||
earth, finding wireless access points with the equivalent of a tiny divin=
|
||||
g hotspots and junk interference, something this latest version is appare=
|
||||
ntly much better at.
|
||||
|
||||
--= Multipart Boundary _EXTRA_0901041737
|
||||
Content-Type: text/html;
|
||||
charset="ISO-8859-1"
|
||||
Content-Transfer-Encoding: quoted-printable
|
||||
X-MIME-Autoconverted: from 8bit to quoted-printable by leggite.example.com id i820cVCv002160
|
||||
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
|
||||
<HTML><HEAD>
|
||||
<META http-equiv=3DContent-Type content=3D"text/html; charset=3Dwindows-1=
|
||||
252">
|
||||
<META content=3D"MSHTML 6.00.2800.1458" name=3DGENERATOR>
|
||||
<STYLE>BODY {
|
||||
FONT-FAMILY: arial
|
||||
}
|
||||
</STYLE>
|
||||
</HEAD>
|
||||
<BODY>
|
||||
<DIV>
|
||||
<DIV>
|
||||
<DIV><SPAN class=3d3-4><SPAN class=3d7-0><F=
|
||||
ONT=20
|
||||
face=3DArial size=3D2>Virtually every student<SPAN class=3D458063818-1905=
|
||||
2004>=20
|
||||
and <SPAN class=3D450083818-19052004>b</SPAN></SPAN><SPAN=20
|
||||
class=3D101323200-04052004>usiness <SPAN=20
|
||||
class=3D450083818-19052004>p</SPAN>rofessional</SPAN> has a laptop=20
|
||||
with wireless LAN capability, and wants to log anywhere and=20
|
||||
everywhere. This inexpensive piece of technology will locate the Wi=
|
||||
Fi=20
|
||||
connection and the best place for reception.</FONT></SPAN></SPAN></DIV>
|
||||
<DIV><SPAN class=3d3-4><SPAN class=3d7-0><F=
|
||||
ONT=20
|
||||
face=3DArial size=3D2></FONT></SPAN></SPAN> </DIV>
|
||||
<DIV><SPAN class=3d3-4><SPAN=20
|
||||
class=3d7-0><STRONG><U><FONT face=3DArial size=3D2>What it=
|
||||
=20
|
||||
is:</FONT></U></STRONG></SPAN></SPAN></DIV>
|
||||
<DIV><FONT size=3D2><FONT face=3DArial><SPAN class=3d3-4><=
|
||||
SPAN=20
|
||||
class=3d7-0><SPAN class=3d3-4><SPAN=20
|
||||
class=3d7-0>T</SPAN>he wf skr</SPAN></SPAN> find=
|
||||
<SPAN=20
|
||||
class=3d7-0>s</SPAN> wireless hot spot<SPAN=20
|
||||
class=3d7-0>s</SPAN> (<SPAN class=3d3-4>w</=
|
||||
SPAN><SPAN=20
|
||||
class=3d3-4>ithout having to boot-up your computer)=20
|
||||
and </SPAN>finds the strongest wireless (802.11 b/g)=20
|
||||
signal. W</SPAN>hether you're in an airport, <SPAN=20
|
||||
class=3d7-0>coffee shop, classroom</SPAN> or at home,=
|
||||
the wf=20
|
||||
skr will zero-in on the best access point. <SPAN=20
|
||||
class=3d3-4> </SPAN><BR></FONT></FONT></DIV>
|
||||
<DIV><FONT size=3D2><FONT face=3DArial><SPAN=20
|
||||
class=3d7-0></SPAN><STRONG><U></U></STRONG></FONT></FONT>&=
|
||||
nbsp;</DIV>
|
||||
<DIV><FONT size=3D2><FONT face=3DArial><STRONG><U>H<SPAN class=3D72630411=
|
||||
5-06052004>ow=20
|
||||
it works:</SPAN></U></STRONG><BR>Simply point the wf skr in any=20
|
||||
direction<SPAN class=3d3-4>, p</SPAN>ush the button and ho=
|
||||
ld it=20
|
||||
down.<SPAN class=3d3-4> </SPAN> The red lights sweep =
|
||||
back and=20
|
||||
forth<SPAN class=3d3-4>, i</SPAN>f there is a wireless acc=
|
||||
ess point=20
|
||||
within 300 feet, the wf skr will find it<SPAN class=3D331482323-0305=
|
||||
2004>.=20
|
||||
</SPAN> When the red lights stop sweeping and remain lit, you've loc=
|
||||
ated an=20
|
||||
(802.11 b/g) access point<SPAN class=3d3-4>, t</SPAN>he mo=
|
||||
re red=20
|
||||
lights that stay lit, the stronger the signal. <BR><BR></FONT></FONT=
|
||||
><SPAN=20
|
||||
class=3d3-4><SPAN class=3d3-4><SPAN=20
|
||||
class=3d7-0><FONT size=3D2><FONT face=3DArial><STRONG><SPA=
|
||||
N><U>Where to=20
|
||||
buy<SPAN class=3D717052920-06082004> (eB)</SPAN>:</U><SPAN=20
|
||||
class=3D717052920-06082004> <U><A=20
|
||||
href=3D"http://cgi.eb.com/ws/eBISAPI.dll?vi&ctg=3D6181=
|
||||
8&item=3D5718431248&rd=3D1">http://cgi.eb.com/ws/eBISAPI.dll?=
|
||||
vi&ctg=3D61818&item=3D5718431248&rd=3D1</A></U></S=
|
||||
PAN></SPAN></STRONG><BR></FONT></FONT></SPAN></SPAN></SPAN></DIV>
|
||||
<DIV><SPAN class=3d3-4><FONT size=3D2><FONT face=3DArial><=
|
||||
SPAN=20
|
||||
class=3d3-4><SPAN=20
|
||||
class=3d7-0>Please c</SPAN></SPAN>ontact me for volum=
|
||||
e=20
|
||||
discount<SPAN class=3d7-0>s</SPAN> and custom=20
|
||||
logo/design <SPAN class=3d7-0>information</SPAN>.<SPA=
|
||||
N=20
|
||||
class=3d7-0> We can do clamshell, bulk or custom=20
|
||||
packaging. Colors, school logos, etc. are not a problem and at=
|
||||
minor=20
|
||||
additional cost<SPAN class=3D717052920-06082004> or free if the quantity =
|
||||
is large=20
|
||||
enough!!</SPAN></SPAN></FONT></FONT></SPAN></DIV>
|
||||
<DIV><SPAN class=3d3-4><SPAN class=3d7-0><F=
|
||||
ONT=20
|
||||
face=3DArial size=3D2></FONT></SPAN></SPAN> </DIV>
|
||||
<DIV>
|
||||
<DIV><SPAN class=3d3-4><FONT face=3DArial=20
|
||||
size=3D2></FONT></SPAN></DIV><SPAN class=3d3-4></SPAN></DI=
|
||||
V>
|
||||
<DIV><SPAN class=3d3-4><FONT face=3DArial size=3D2>Thank y=
|
||||
ou, and reply=20
|
||||
with REMOVE to opt-out...</FONT></SPAN></DIV>
|
||||
<DIV><SPAN style=3D"FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: Arial"><A=20
|
||||
href=3D"http://www.dnncrprtd.com/"><FONT face=3DArial size=3D2></FO=
|
||||
NT></A><FONT=20
|
||||
color=3D#000000></FONT></SPAN> </DIV>
|
||||
<DIV><SPAN style=3D"FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: Arial"></S=
|
||||
PAN><SPAN=20
|
||||
style=3D"FONT-FAMILY: Arial"><SPAN style=3D"FONT-FAMILY: Arial"><SPAN=20
|
||||
style=3D"FONT-FAMILY: Arial"><SPAN class=3D717052920-06082004><FONT=20
|
||||
size=3D2>-Brian</FONT></SPAN></SPAN></SPAN></SPAN></DIV>
|
||||
<DIV><SPAN style=3D"FONT-FAMILY: Arial"><SPAN style=3D"FONT-FAMILY: Arial=
|
||||
"><SPAN=20
|
||||
style=3D"FONT-FAMILY: Arial"><SPAN class=3D717052920-06082004><FONT face=3D=
|
||||
Arial=20
|
||||
size=3D2></FONT></SPAN></SPAN></SPAN></SPAN> </DIV>
|
||||
<DIV><SPAN style=3D"FONT-FAMILY: Arial"><SPAN style=3D"FONT-FAMILY: Arial=
|
||||
"><SPAN=20
|
||||
style=3D"FONT-FAMILY: Arial"><SPAN class=3D717052920-06082004><FONT size=3D=
|
||||
2>reply to=20
|
||||
</FONT><A href=3D"mailto:wfskr@fstml.us"><FONT=20
|
||||
size=3D2>wfskr@fstml.us</FONT></A><FONT size=3D2> <SPAN=20
|
||||
class=3D072343215-26082004>I will not be sending you multiple messages on=
|
||||
this....=20
|
||||
Thanks again...</SPAN></FONT></SPAN></SPAN></SPAN></SPAN></DIV>
|
||||
<DIV class=3DSection1>
|
||||
<P align=3Dcenter><FONT size=3D3><SPAN style=3D"FONT-FAMILY: Arial"><FONT=
|
||||
size=3D3><SPAN=20
|
||||
style=3D"FONT-FAMILY: Arial"><FONT size=3D3><SPAN=20
|
||||
style=3D"FONT-FAMILY: Arial"></SPAN></FONT></SPAN></FONT></SPAN></FONT></=
|
||||
P>
|
||||
<P align=3Dcenter><FONT size=3D3><SPAN style=3D"FONT-FAMILY: Arial"><FONT=
|
||||
size=3D3><SPAN=20
|
||||
style=3D"FONT-FAMILY: Arial"><FONT size=3D3><SPAN style=3D"FONT-FAMILY: A=
|
||||
rial"><SPAN=20
|
||||
style=3D"FONT-FAMILY: Arial"><SPAN=20
|
||||
style=3D"FONT-FAMILY: Arial"><STRONG><U></U></STRONG></SPAN></SPAN></SPAN=
|
||||
></FONT></SPAN></FONT></SPAN></FONT></P>
|
||||
<P align=3Dleft><FONT size=3D3><SPAN style=3D"FONT-FAMILY: Arial"><FONT s=
|
||||
ize=3D3><SPAN=20
|
||||
style=3D"FONT-FAMILY: Arial"><FONT size=3D3><SPAN=20
|
||||
style=3D"FONT-FAMILY: Arial"><SPAN><FONT size=3D4><IMG alt=3D"" hspace=3D=
|
||||
0=20
|
||||
src=3D"cid:2183279"=20
|
||||
align=3Dbaseline border=3D0>Wi-Fi Networking News: Crsls wf=20
|
||||
seeker <?xml:namespace prefix =3D o ns =3D=20
|
||||
"urn:schemas-microsoft-com:office:office" /><o:p></o:p></FONT></SPAN></P>
|
||||
<H1 class=3dmn style=3D"MARGIN: 0in 0in 0pt"><SPAN class=3Dbodytex=
|
||||
tbold1><SPAN=20
|
||||
style=3D"FONT-SIZE: 9pt; COLOR: black; LETTER-SPACING: 0pt">Tuesday, =
|
||||
;April 27, 2004</SPAN></SPAN><SPAN=20
|
||||
style=3D"FONT-SIZE: 9pt; COLOR: black"> | by Eamon Hickey</SPAN=
|
||||
></H1>
|
||||
<H1 class=3dmn style=3D"MARGIN: 0in 0in 0pt"><SPAN style=3D"COLOR:=
|
||||
black"><FONT=20
|
||||
size=3D2> <o:p></o:p></FONT></SPAN></H1></DIV>
|
||||
<DIV class=3DSection1 style=3D"MARGIN: 0in 0in 0pt"><SPAN=20
|
||||
style=3D"FONT-SIZE: 9pt; COLOR: black"><FONT size=3D2>Wi-Fi Networking Ne=
|
||||
ws has=20
|
||||
this<SPAN class=3d3-4> </SPAN><SPAN class=3D331482323-0305=
|
||||
2004>brief=20
|
||||
report on Crsls Wi Fi skr, </SPAN>a keychain-sized device tha=
|
||||
t scans=20
|
||||
for active wf (802.11b) networks. It's also handy for measuring signal=20
|
||||
strength within a given coverage area.<o:p></o:p></FONT></SPAN></DIV>
|
||||
<H1 class=3DSection1 style=3D"MARGIN: 0in 0in 0pt">
|
||||
<P class=3dmn style=3D"MARGIN: 0in 0in 0pt"><FONT=20
|
||||
size=3D2> <o:p></o:p></FONT></P>
|
||||
<H1 style=3D"MARGIN: 0in 0in 0pt"><FONT size=3D4><SPAN>Gizmd.com<SPAN=20
|
||||
class=3D130050304-05052004>:</SPAN></SPAN> Best Wi-Fi Signal Finder=20
|
||||
Yet</FONT><FONT size=3D3>, </FONT><SPAN style=3D"FONT-SIZE: 8.5pt">04/22/=
|
||||
2004=20
|
||||
05:19</SPAN><SPAN=20
|
||||
style=3D"FONT-SIZE: 14pt; COLOR: #666699; FONT-FAMILY: Verdana; mso-bidi-=
|
||||
font-size: 10.0pt"><o:p></o:p></SPAN></H1>
|
||||
<P style=3D"MARGIN: 0in 0in 0pt; LINE-HEIGHT: 12pt"><SPAN=20
|
||||
style=3D"FONT-SIZE: 9pt; COLOR: blue; FONT-FAMILY: Arial"></SPAN></P>
|
||||
<P class=3dmn style=3D"MARGIN: 0in 0in 0pt"><SPAN=20
|
||||
style=3D"COLOR: black; FONT-FAMILY: 'Times New Roman'"><FONT=20
|
||||
size=3D2> <o:p></o:p></FONT></SPAN></P></H1>
|
||||
<H1 class=3DMsoBodyText style=3D"MARGIN: 0in 0in 0pt"><FONT size=3D2>Glen=
|
||||
n Fleishman=20
|
||||
got a hold of the Crsls wf skr, a keychain-sized sniffer to dete=
|
||||
ct=20
|
||||
802.11b/g networks and says it's the best yet:</FONT></H1>
|
||||
<H1 class=3DSection1 style=3D"MARGIN: 0in 0in 0pt">
|
||||
<P class=3DMsoBodyText style=3D"MARGIN: 0in 0in 0pt"><FONT size=3D2>Push =
|
||||
the button on=20
|
||||
signal strength in zero to four LEDs. Keep the button held down and it=92=
|
||||
s a Wi-Fi=20
|
||||
dowser, allowing you to move around and see immediate response to differe=
|
||||
nt=20
|
||||
signal strengths.</FONT></P>
|
||||
<P class=3dmn style=3D"MARGIN: 0in 0in 0pt"><SPAN style=3D"COLOR: =
|
||||
black"><FONT=20
|
||||
size=3D2><FONT face=3DArial> <o:p></o:p></FONT></FONT></SPAN></P>
|
||||
<P class=3dmn style=3D"MARGIN: 0in 0in 0pt"><FONT color=3D#000080>=
|
||||
<SPAN=20
|
||||
style=3D"FONT-SIZE: 14pt; COLOR: #333399; FONT-FAMILY: Verdana; mso-bidi-=
|
||||
font-size: 10.0pt"><FONT=20
|
||||
size=3D4>stargeek<SPAN class=3D130050304-05052004>:</SPAN><SPAN=20
|
||||
class=3D130050304-05052004> </SPAN></FONT></SPAN><SPAN=20
|
||||
style=3D"FONT-FAMILY: Georgia"><FONT size=3D2>Best Wi-Fi Signal Finder Ye=
|
||||
t,=20
|
||||
</FONT></SPAN><SPAN style=3D"FONT-SIZE: 8.5pt; FONT-FAMILY: Georgia">04/2=
|
||||
2/2004=20
|
||||
05:19</SPAN></FONT></P></H1>
|
||||
<DIV class=3dmn style=3D"MARGIN: 0in 0in 0pt"><FONT color=3D#00008=
|
||||
0><SPAN=20
|
||||
style=3D"FONT-SIZE: 8.5pt; FONT-FAMILY: Georgia"></SPAN><SPAN=20
|
||||
style=3D"FONT-FAMILY: Georgia"><o:p></o:p></SPAN></FONT><FONT=20
|
||||
size=3D2> </FONT></DIV>
|
||||
<DIV class=3dmn style=3D"MARGIN: 0in 0in 0pt"><FONT color=3D#00008=
|
||||
0><FONT=20
|
||||
size=3D2><SPAN style=3D"FONT-FAMILY: Georgia; LETTER-SPACING: 0.2pt">Chry=
|
||||
salis=20
|
||||
previous Wi-Fi signal finders fell short in ways the skr does not. The=
|
||||
=20
|
||||
displaying the results instant of a constant active scan--but it can tell=
|
||||
Wi-Fi=20
|
||||
from junk.</SPAN><SPAN=20
|
||||
style=3D"COLOR: black"><o:p></o:p></SPAN></FONT></FONT></DIV>
|
||||
<H1 class=3DSection1 style=3D"MARGIN: 0in 0in 0pt">
|
||||
<P class=3dmn style=3D"MARGIN: 0in 0in 0pt"><SPAN style=3D"COLOR: =
|
||||
black"><FONT=20
|
||||
size=3D2> </FONT></SPAN><SPAN style=3D"COLOR: black"><FONT=20
|
||||
size=3D2> <o:p></o:p></FONT></SPAN></P>
|
||||
<P class=3dmn style=3D"MARGIN: 0in 0in 0pt"><SPAN><FONT=20
|
||||
size=3D4>ngdgt.com<SPAN class=3d3-4>: The wf=20
|
||||
skr</SPAN></FONT> </SPAN><FONT size=3D2>Apr 23, 2004</FONT></P>
|
||||
<P class=3dmn style=3D"MARGIN: 0in 0in 0pt"><FONT=20
|
||||
size=3D2></FONT> </P></H1>
|
||||
<DIV class=3dmn style=3D"MARGIN: 0in 0in 0pt"><FONT size=3D2>There=
|
||||
were a=20
|
||||
couple of credit card-sized wf detectors that came out last y=
|
||||
ear,=20
|
||||
signals occupying the 2.4GHz part of the spectrum. He says it=92s the bes=
|
||||
t of the=20
|
||||
bunch and that it should be on sale by June. </FONT></DIV>
|
||||
<H1 class=3DSection1 style=3D"MARGIN: 0in 0in 0pt">
|
||||
<P class=3dmn style=3D"MARGIN: 0in 0in 0pt"><FONT=20
|
||||
size=3D2> <o:p></o:p></FONT></P>
|
||||
<P class=3dmn style=3D"MARGIN: 0in 0in 0pt"><SPAN=20
|
||||
style=3D"FONT-SIZE: 14pt; COLOR: #333399; FONT-FAMILY: Verdana; mso-bidi-=
|
||||
font-size: 9.5pt"><A=20
|
||||
href=3D"http://www.brdbndrprts.com/shnws/42831"></A><A=20
|
||||
href=3D"http://www.brdbndrprts.com/shnws/42831"><SPAN=20
|
||||
style=3D"COLOR: #333399; TEXT-DECORATION: none; mso-bidi-font-size: 10.0p=
|
||||
t; text-underline: none"><FONT=20
|
||||
color=3D#000000 size=3D4>Wi-Fi skr</FONT></SPAN></A><FONT color=3D#000=
|
||||
000><FONT=20
|
||||
size=3D4><SPAN class=3d3-4></SPAN>: </FONT></FONT><A=20
|
||||
href=3D"http://www.brdbndrprts.com/shnws/42831"><SPAN=20
|
||||
style=3D"COLOR: #333399; TEXT-DECORATION: none; text-underline: none"><FO=
|
||||
NT=20
|
||||
color=3D#000000 size=3D4>Hotspot seeking=20
|
||||
keychain</FONT></SPAN></A><o:p></o:p></SPAN></P>
|
||||
<P class=3dmn style=3D"MARGIN: 0in 0in 0pt"><SPAN=20
|
||||
style=3D"FONT-SIZE: 9.5pt; COLOR: black; FONT-FAMILY: Verdana"><FONT=20
|
||||
size=3D2> <o:p></o:p></FONT></SPAN></P></H1>
|
||||
<DIV class=3dmn style=3D"MARGIN: 0in 0in 0pt"><SPAN class=3Dnews1>=
|
||||
<SPAN=20
|
||||
style=3D"FONT-SIZE: 9.5pt; COLOR: black; FONT-FAMILY: Verdana"><A=20
|
||||
href=3D"http://wifntnws.com/archives/003248.html"><SPAN=20
|
||||
style=3D"COLOR: black"><FONT size=3D2>Wi-Fi Networking News</FONT></SPAN>=
|
||||
</A><FONT=20
|
||||
size=3D2> takes a look at the new "</FONT><A=20
|
||||
href=3D"http://wifntnws.com/archives/003248.html"><SPAN=20
|
||||
style=3D"COLOR: black"><FONT size=3D2>Wi-Fi skr</FONT></SPAN></A><FONT=
|
||||
size=3D2>"=20
|
||||
and junk interference, something this latest version is apparently much b=
|
||||
etter=20
|
||||
at.</FONT></SPAN></SPAN></DIV></SPAN></FONT></SPAN></FONT></SPAN></FONT><=
|
||||
/DIV></DIV></BODY></HTML>
|
||||
|
||||
--= Multipart Boundary _EXTRA_0901041737--
|
||||
|
||||
--= Multipart Boundary 0901041737
|
||||
Content-Type: application/octet-stream;
|
||||
name="retail.jpg"
|
||||
Content-ID: <2183279>
|
||||
Content-Disposition: attachment;
|
||||
filename="retail.jpg"
|
||||
Content-Transfer-Encoding: base64
|
||||
|
||||
/9j/6wJgRVBTAHic7ZjJigIxEIbn/Z/EiwfxoHjQgyfB5aKg4oKouIH7goow
|
||||
UPAdDJPpZKxMO0N/l5+mO92V6qSWfHwkJCT8d87ns+hmsxGtVqui5XJZNJVK
|
||||
ic7n8y/HX69X0VarJZrJZJ7G9fv9EGYHYzqdimI/mk6nRYvFomilUhFtNpui
|
||||
+Xxe1Jw/yv16vf40LpvNiv4VP2Hvcrn0GsfzzJvr2+327Tju4793YzabiRYK
|
||||
BdHJZBKLHcPhMJbvDgYDUeZvrnvWC/tFi6h1Y0J8Ox6Pqnas12tR1/nzn06n
|
||||
k6odJp1OR/R+v3uN6/V6Kt/fbreixE3iHvvD9/9pcblcvJ4nv0Gj0VCxI5fL
|
||||
icblh8ViIcq+0IL4/iqs39CMRiNRbT/YiCs//BWIi6vVKsj749pv2lBva8M+
|
||||
IK+Hej/5kvxIXW0qcdK3PqaPCYV2PUrfQJ3gWx9QV+CvKLTitA3sob/05fF4
|
||||
iOJnrXqJ/d9ut799jv7Et37ytaNUKv1oPH7xjWfUM/QttVpNlDxI/WfLU4fD
|
||||
4el6PB57fd8X376Bde26XogTtrrdjEfcJ451u90vvw9a9bQN7HCNj5zr2NYN
|
||||
72OezJv97Lre8D/7iPeZ5wb7/d7pfa/iGq/N8wlgv9DPaNdxvucp2rj2pZyP
|
||||
sU52u50ofvmtOjoufOM1ceS3/ELfHRf0+VHgj9B+0erXtWB/kXdthM4b1Ffk
|
||||
g3eDvGM7T7fZHeXXKDjPe/d4Rh4mX3FeEhW/8aurn+gD+Q/v7pdXwa9mvWdT
|
||||
4jv/4b+cL7jCOqB+QUOfbyckJCTExSfQUQHQ/+AAEEpGSUYAAQIBAGAAYAAA
|
||||
//4AJkNyZWF0ZWQgYnkgSW1hZ2VHZWFyLCBBY2N1U29mdCBDb3JwLv/AABEI
|
||||
ASwBkAMBIgACEQEDEQH/2wCEAAcFBQYFBAcGBgYICAcJCxMMCwoKCxgREg4T
|
||||
HBkeHRwZGxsfIy0mHyErIhsbJzYoKy8wMzMzHiY4PDcxOy0yMzEBCAgICwoL
|
||||
FwwMFzEgGyAgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEx
|
||||
MTExMTExMTExMTExMf/EAaIAAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkK
|
||||
CxAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0Kx
|
||||
wRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZ
|
||||
WmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKz
|
||||
tLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6
|
||||
AQADAQEBAQEBAQEBAAAAAAAAAQIDBAUGBwgJCgsRAAIBAgQEAwQHBQQEAAEC
|
||||
dwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEX
|
||||
GBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5
|
||||
eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJ
|
||||
ytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5+v/aAAwDAQACEQMRAD8A+kaK
|
||||
KKACiiigAooooAKKKKACiiigCK6/485v9w/yrnBXR3X/AB5zf7h/lXOVnMaD
|
||||
8KWkpagYopeKaKdTELxRSUtABS0lLQAUtJRQAtFJRRYBaPak7UdqLALxRSUd
|
||||
qACiikpALSUUnSiwBSUZpKACm0uaQ0WASkpaSkMQ11lcma6ytKYmFFFFaCCi
|
||||
iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAIrr/jzm/3D/Kub
|
||||
rpLr/jzm/wBw/wAq5us5jQUtJUsETTzLGvU96SQDBS9q249Pt40+ZA2OpNRy
|
||||
Q24QlYBgd6pQEZNFaPkRTKoWH7w4ZAf59KQaUrEg+YMd9w5p8gGfS1e/slcZ
|
||||
xLx23jmmnScchZD7eZ0o5AKdFWzpDdAGPuZTxTDo8xGAij3Mzc/pRyAQUVP/
|
||||
AGPOR9yMEdB5zHP6Un9jXGMhYgf7vmtj88UcgXIe1HSpv7FuByPJ56gu3FL/
|
||||
AGHMDjdFj1y2aOQLkGaSrA0OUnBkjA7EbqX+w5T1kjH0Lf40cgXK1HarP9hy
|
||||
7s+an5t/jTToc4PyyRkZ7swxRyBcr0lT/wBh3X3fMjxjht7Z/Kk/sS7wTmIE
|
||||
dAJW5/SjkAgpKlOmXMa72VBjjaJXx+eKng06aIhzbhww6CTO388UuQLlKkq9
|
||||
DFGXnUYDqOQ6/d9OKz53kjbDhAT0wODRyBcWkpiSb1zjFPrNqwxDXW1yVdbV
|
||||
0wYUUUVoIKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAiuv
|
||||
+POb/cP8q5uukuv+POb/AHD/ACrm6znuNBV7SB/pZ/3TVA9K0dHH+kufRKI7
|
||||
gaVxJtAUfkKigTzmLEq0GMAddx75pty7CRioY47YqWdSkEcEGELHaMDoO9ao
|
||||
kc9zbwkI0irjoKadQtAB+/U5OOOaWKyt4lwIlJ7lhkmphGigAIoA9BRoBAb6
|
||||
3HHmH/vk0h1G2A++3/fB/wAKsbV/uj8qNq+go0GVTqlqDje2f9w0h1W1UgEv
|
||||
/wB8GppJQnQYqubog9cUWAf/AGnbkZAkI9kNH9pQAgbZef8ApmazJPEunxKz
|
||||
NcsVU4LxozLn6gEVXfxtoUfDaiAfQq3+FAGyNWt2TcEuCB/0xb/Cj+1IdpYQ
|
||||
3OB/0wb/AArnLjxlpclvNNHq8SRRA/u0cebIfQA8gfhXO2njuKK6Lm9vGVj9
|
||||
xyGVfz5/Wk2kI9FGqwn/AJZXI+sDD+lSLfxuuRFPj3jIrnF8f6EgVLi9MUpA
|
||||
yhjc4/EDFO/4Tzw6ScarHx14bj9KYHQHUIwB+6n54/1RpRfIWAEM/wD37NVL
|
||||
LV7W/t1mtLqKaNhkNG4Iq0LjnG6gY77YAceTN/3xS/axj/Uzf981JHIHFPpA
|
||||
VJNQjRfmt7gj0ERNRLf2pP8AqbiMHuY2UVo0nanoBUktoLy1xFKwydyyK2SD
|
||||
WDPH5hmjkXDRkjPv/wDXH862Zs2eqwOjBYrjKOv+11BH60moQM9xvUgDaM0C
|
||||
ObgY5Ix1qyOlReUI55FHQGpV6VjNDQlddXImuup0xsKKKK0EFFFFABRRRQAU
|
||||
UUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUARXX/AB5zf7h/lXNV0t1/x5zf
|
||||
7jfyrmqznuNAa09FH7yU+wrL71q6L/y2/D+tEQLMob7TlMDkZ5qWYgXduvqW
|
||||
/lUMwH2jO4/fXiluJQmpWqkgZz/KtUSSXMhjdMNjrQLtAPmIrH1vUbaJwJJ1
|
||||
QgEjnk1xeoeJQVPlXQZR2AppaAehza3aQttMgB9Cay7vxbaxcBhn2NeX3evS
|
||||
OMqzM2P73WsefXGOV38n3/pRZAemX/jmKH7vI9+K56/8bSTpIkcgG8bMHPQ9
|
||||
a88m1VlYneP+AjFZdxqjY+WRs9aAOk1GW8vr5jcEtsOxRyQoHYe1ReRMo+RG
|
||||
qhaeN7y0Zf8AR7aRAgXDJ6Drmr0fxQu1BH9l6ecDrsbP86jlAv6bptxdyASo
|
||||
wWtxvCmI98bPn0rlU+KupbsLY6cgH/TNv/iqX/hbWthfltbAfSNv/iqXKM07
|
||||
zSrq3ztDHHtWNLNdwtgpIMfWnN8WNcY/8e1gR7wn/wCKprfE7UpIyr6dprZ/
|
||||
i8o8f+PUcoHXeCvEGyC4tLyNtpZTFKo+dHPHBrdtfHyBzDLIC6naTngkV5PN
|
||||
451KeNkihtbbd1aCPDD6Ek4/CqdtqcqoPnyPfmrWwrH0Ba+NrX+PKmtyw8S2
|
||||
d2PlnX8a+fLHWpNoBIx6HofyrZtbyZ+Vl8v2BosB7/HeRSAFSCPWpldWHFeS
|
||||
aL4gubRsPMGQ8ZY13mk6yt5GoLLux0FFhlnXiqfYZT1S4BWrN+sZkUsVzt7j
|
||||
ms/xFMv2G24588D6cGruqCMPE7A5wQMH6UCM1442huHRNpGO+e4qqtWZJT++
|
||||
QgAFRj3FVV61lMaFNddXImuuogNhRRRWggooooAKKKKACiiigAooooAKKKKA
|
||||
CiiigAooooAKKKKACiiigCK6/wCPOb/cb+VczXTXX/HlN/1zb+Vcx2rOY0Fa
|
||||
2ifdn+o/rWRWvof3JvqKIiH3UqpOp2jd5i8Z9xWXqN+rapbyKeF64/Grmpys
|
||||
nRekg5x2rm55AViOex/rWyJZxvjy9m+327CZR8r9T15FcVNqDLnc4zn+E1t/
|
||||
EmbyruxYKCdrdfwrhpboMuWUhqFsM1JL7cAMkLjjmqktzu6ufzptoqyvFLIR
|
||||
5WcYIPzeo61o3Ediuwx2ygd8MT/OqUbptB5GFJM23apOPrVUyE+9duttZLaI
|
||||
psrRmZc7nXnn8azYNNsZZmMlshVQMknaCScDAyO/cnFP2ctPMLo5RpB0IqPc
|
||||
A3cD1rqrvSCLeWXToINqbmMbqCcDhsFhnI7g4x15FZsIjTTY3+xxS7VJdiCT
|
||||
1PvWkcPzaJkOdtzIRv3mMblBp24EnHA7c9Knl1GBGZFsIVbpkKeP1pdQN35C
|
||||
maCKNM8bNmf05qXRSV7jUr9CqXx6cd6A47HFQjJU4IxUeXXkZxWBZdD89TU6
|
||||
OVHUcVUtAk1xHHNL5aM2C4XO0fSu+b4W6hKJF069guniuGglVh5e0jbyM9R8
|
||||
4ppAcpFckY2gAita11B2wueB2yRVvSfAeo397cRebAq21wLeUo285PcDpjkc
|
||||
kitSL4a658rGayIxniQkqME88eimnYQWN6q7QxY+x/8A112OgaqLeRGVlxnH
|
||||
DVhH4f6tbmLZdWg4VXLORhycEDrke/6VFeaRe6MYDKVdW+86IxCtuYYJOOfl
|
||||
NMD1fVLpbnRbeQDP79efwNdDqRxFEQoY5wPUcV5VoOqvcW5tHkyA6uF/Tj86
|
||||
9Uv2P2aHacEkfyqWBz9ywF22DjK5x6UgpL1sXmNv8PJoHSspjQ8111ch2rr6
|
||||
KY2FFFFaCCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAIrv
|
||||
/jym/wCubfyrmK6e7/48pv8Arm38q5es57jQnatfRGCwzE8fMKyDTo7qSAAJ
|
||||
naWyQO9EBMs6y7iAFXGN+evXrXOSOMIcdj/WtnWpI/ssRJbJfgAdPlNYEr5C
|
||||
jFaks83+J74ubDB52OP1FcCzgnmu0+KUh+3aeOmEc/qK4oCOOLzJF3ZxW1Cj
|
||||
Kpe2yBtI2dO1G0FrHbXSKpQOA5ztZWGCDjkeoIzg9QR01mjguYVKqjI2NxyA
|
||||
Om0nI45HUDPtiuU+02skaq0O0AdagtZZ+Vh3kg8FTirhGMXZy0aKlBtLlV2d
|
||||
fc29vLfCUbD6EtUEloBbSqH/AHTHJwc8DB59Og/KsCSTVYx5rSz7Qc8SE4/W
|
||||
q7vd6lmKMSyt3y2cVSrxs5SltsEsPVUlDkd2acl6sNrKyz+ZKzS/dORlxhiT
|
||||
06dhms1J3itInU5AU8HoeTTn069srFjJbsVySWUg44p8enXM+h/alCCONDnJ
|
||||
54Jp0sbh4QUnJbNfPohzy/FObjyPv8u5BLrLSxMhhgGRjiJBj6cVHfscD60a
|
||||
foeo6lE0lrb+ZGvBYsAB+dadt4a1nXkLWtniMHHmO4AP09fwrmeY0Iwn7WaW
|
||||
nkL6pVbi4xZz6thTzjigOe546Vr6n4R1rR2iW7tCqysER1YFST0GR0/Grkvw
|
||||
88TW93BbPpjtLPnYEdW6YySQcDqOtcP17DWT9otdtV0LdOa0aMrRVsn1+xj1
|
||||
Bitk06CdgcYTIzz9K7+ax8KyCS5h8Tyw+Yskgt0mJCsCCoJI3cgeh5AriTp9
|
||||
34Z8X29vqNks01vNG8ltw+8cHbxkHI/nXWya/pi63YXOm+Ep4JrG6Mk4WPBI
|
||||
wTtIA49eemOOK6ac4zjzRd0yGrF99O8Gec5i8V3ex5GJzJ0wPlJOM+nOD1x2
|
||||
qKybw6uuTp/wkN5aWhtk8qZGLbmZcOp+XPUn8AfWpZL7T4WiRfAM8ZAjZmiR
|
||||
ZNy43FfukdCCT97jBqxqmoQmC4sE8AukjRukUiRh/LLDcCCq8kBvXjA96uwi
|
||||
vJZeFF06a6tNevJJY4TIULYywICryo5O7tnG01zdrqchi8oOxQncVDHGf8k1
|
||||
kz2l3ZGMXNvLAZFDp5iFdy+oz1FPt5xG38J+tIZ6L4Mu1k1qOHaOcD6c17JP
|
||||
qHmyLbnG0Pw3fp/+uvCPAN35niy0jOAWzwB7GvXo5WXUiM5j3kOufrj9aGLq
|
||||
WL0sbxQoG3bxmlXpUN8f9JQg4G3pnpUq9KymUh/auwrjweK7CiAMKKKK0EFF
|
||||
FFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAQ3f/HlP/1zb+Vc
|
||||
vmuou/8Ajxn/AOubfyrlqznuNB2qN2IAx68U/tVebqADRETJtYlP2a3AjUkv
|
||||
ySP9k1hSEnb06Vs6x532O3AYhA3r1G01hvuCDJzWhLPMPikA17Yf7j/zFcTD
|
||||
P5ahXUkCu1+KKFr6x29o2/mK4iO5jKgSRZx3FdmEny3alb9RS9C2Ire4iBVc
|
||||
EcEgYIqWJI4tNZRIY8/eYD3qobtY4tsCYz3NR2941upjlUPG1TiJRltv5HpY
|
||||
StThL3uxoWFxaWquDdtIrdip4q1bxwx6M7LMYkc5MijJHNZ8NzYIdy2rMfTP
|
||||
FSWmpfZDLbzxB4jk7TxtryK9GUlePc9jD46jTahUa2aVr6X7vf7i3p99p9gr
|
||||
q+oNKr/wsh4rQ02OGbw5NHv2QMXG49lz/hVOws4r+XfYaFNLg4Mj/LGp92Jw
|
||||
K6ODw/PFpM1ndzWdsZA3HmZxn8MfrXHVwtSavBO91vY6qePo07RnKLSjK1r9
|
||||
baXfco6mksPh62i07aLN2VZHXrtJH862PEsOmQafaW19qM9jbDIUQxkhsAdc
|
||||
DtTdFt9L0vTnsbvVBPEeNuxeAeo+8a1oH0OawFnqd0t5CvCF4QDjtk7uvuMV
|
||||
w1MsxUZJqN1GTd01d3669UcNTHUKkW07XitNdLdPQy4vEnhweFTo66pNdyDA
|
||||
iaWF87t2VGcdjitX4n+JtW8OW2nHSrnyDOzh22Kx4xjqDjrSXFjpCadLb6Ba
|
||||
6aJJxgs8uHxntgN/MVg/EeXWNehtFbQZoBalmLRyCbg46henTvXNSyeTxdOT
|
||||
pvku2+ble67LzPLrVk4tX18jhotV1bWfGFrfPItzqTzxhC8YIZgQFyoGCOB2
|
||||
r0T7N4+0rXL/AFIzafBcXUYabjcrJEqjcBg9mA9eTx1ryoHZeOULhgwKsowR
|
||||
/hUx1jU2JJv7rAOcmVs5xj+VfXwhGEVGKskcG56sbf4i2k8e7UtPV4FWIjeD
|
||||
gPtXLYHGNi8nHt1qPTbj4h6tcXkEWoWYfT5/JdJU2gttPYrgjGT839a8rXUL
|
||||
47Qb2fAxgeaeMdKDqN8lpLbLdTeRK4kkQMcMwyMn35NUFj07VfAfibW4bVr6
|
||||
/smmt0MS5XYNg27cELkn58YIGK5fxP4Z/wCEXuLaF7xbh5kLErGVA54wT14r
|
||||
kftU5JJlkz1J3GnCeRsFizY45PSi4Hd/DyVR43sAOnz/APoDV7KCE1ncG+YS
|
||||
tx69a8K+HU23x5YAjnLjj/cavcXKjWnHIPnNt+uTSewupdvyDOhc/Nt5qaP7
|
||||
oxVW+G2VASD8vBFWIsbBj0rOZSJhXY1xorsqKYMKKKK0EFFFFABRRRQAUUUU
|
||||
AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAQ3f/HjP/wBc2/lXK11V5/x4z/8A
|
||||
XNv5VylZzGg7VXmIDj6VY7VVuMbqIiYurRoYLbMgzvyBj/ZNZEigADPatbVG
|
||||
iCW4wxbd36D5TWU+DJWhLPLPikxW/slH/PM/zrhFQkHOK774mqG1az4yoiPf
|
||||
3rhN4LEKOKa2GQtgLxURYmvSofh5pOoaVpaQaq8OrXtutwIpCGUrhy2FAyMB
|
||||
eOec4pH+E7JYfvL+OOQO7mc7ivlCJZBlMZDYPr+HenYDzmCXY55A4ru/CGk2
|
||||
EttPrepBXiQsI4nOQSo689eSAB069cYrN8VeA/8AhFtOgnfUBNO91JbsoTai
|
||||
7QCDuPqCOP8ACqlitybGNftMJhg6ASeuT/jV0VGVRQb3CakocyR1l1qWoXOF
|
||||
MpgjI+WOLjavpnrVUQ+pLE9yetdD4Z0i21/TmurrUIraOAhXXGZH/wB0Vu/Z
|
||||
vDOnKRFYyXjBM77iU8n02rjFfSxVCi+WELteX6s8tupPWUtDhxCiIWIGAM8i
|
||||
mxbJoydoBHY1vXHiaQ/Jb6Rp8KdAPskbf+h0638UlFbz9D0yQ+v2VAf/AB2u
|
||||
jmqW+H8TK0e5zUsC5xgCmpdXdowMNzImP4c8flXWSaz4XvP3eoaQbNjwJ7Vy
|
||||
uPwbg1n6z4bji006npl+l5YhgG3DZImTgZXuMkcis3GjUfLVhZ+a/VFXnFXh
|
||||
Izp7PT/FWnXRdUg1uBd6yjjzh7nvzjOegORgAg+cFNiASqeCeM13NxaCGO7K
|
||||
sRJFCpyP9p1Qj8mritWPlahcRMRuSVgT7g187jaUaVVxhsejQm5wTkUecnFG
|
||||
T70xQSetTKVGBjNchuIqkngCnhSOODSlgVGBj2FCYz1waAOj+HpKeP8ASsDr
|
||||
KR/46a94nYjWpBj/AJbnn8a8F8Ckp480j3uVH58V7vcE/wBsyHt5p/nUvYXU
|
||||
v3xBaIqpC4IGanhP7tfpUF6xJjLLg4IxipYWBjXjtUTKROK7OuLFdpRTBhRR
|
||||
RWggooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigCG8/48Z/+
|
||||
ubfyrk66y8/48J/+ubfyrk6znuNAelVZz89WTVSc/vDilETDVZQVgURrwTyP
|
||||
pWVIRn04rV1VpykOQdnP8qx5mwDxWhLPJvitPs1ayUf88j/OuFjuOeOK7T4q
|
||||
Ef2xZggf6k/zrgx7ULYZqrf3HmROJ5A8QAjbecoB2HpSy6jeuHY3k53Elv3h
|
||||
5JGDn8KzBJjGalWQMKYxZ726uFZJrmV0LbyrOSC2MZ+tXNNkZdsYJCtyR64q
|
||||
iVBOas2BxdovoP611YP+NFea/MyrfA/Q7nwreGG8mj5IYAYrqdQMn2UZljQf
|
||||
3VOD9K47wwXXUJmQDhRnP1rT1G6k87DYUei/419XWpOckoyseRTmox1VzRiX
|
||||
ThCxkf8AeEcDBqSzNiyMJnAOMAEVzyTCRsHJ/wCBH+lK52Dcpb/vo1yyy2lJ
|
||||
NOT1ZssVJWslodHZWNtdyFM457c8VJo2nQ2/iy3syQ0E0gUx4wp5A6VzttdO
|
||||
HBWU5B79fzFdJpEs7+LdIlfBQ3EYz/wICk8POlzPnvHl28xe0jO2lnc5iY7r
|
||||
bU2PU26E/wDf+OuD8QEjxLqa+l1KP/HjXoMrQxRaoJo2YCAcK2P+W8ftXHeI
|
||||
5tOPijUsWcxb7XJuYTjBO9skfL9PyPrx4WZSarPS/wDwyO/CK8bXH+FvCU/i
|
||||
WG/kguUj+xxiQxhGeRwT/CqjJA7+laUPww8WStAF0sjzk3qWlQADj73Pyn5h
|
||||
wfWrPw0sNXv9auBok1vZSRQ+Y1zPAspQ9PlJB2k5P4Dvit7Q7zxlqmoajbz6
|
||||
qIZtNgAlDWKSPKhIABG3LcYPNcSd0dLVnY5TxD4F1Dw3plnf3JBinQbwwCmO
|
||||
QlspjPONvX3Fc6ABxivTdY0LxrrOmrZJdJeaf5UcypIkMOCVZwFA5zjd0wex
|
||||
GK5bxB4Ju/DnhmDUr+VFuJLnyGtlIYoNgcEkHg4PSmIreDm2+NtH4/5e4/8A
|
||||
0IV7vcAjVXYHjzOlfPvhKfHjTSCP+fuL/wBCFe/znOosQcHfUvYXU0r4uPL3
|
||||
nJwe9S25zCnHGBVe8GFiw4brzU1sT5CZ9KzmUi0DxXa1xI6V21OmDCiiitBB
|
||||
RRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAEN5/x4T/9c2/l
|
||||
XJV1t7/x4XH/AFzb+VciKzmNC9qpTn96QKuE1QnP75h70oiYupKQYiXU8HgH
|
||||
6VlTd61NRMe+EKW3YPXp2rLmyWYVbJPIPisf+JxZf9cT/OuCzxgV3vxYGNas
|
||||
h/0xP864HpQthjgfloDEd677RPAmj6n4O0+9uNVe11K/laG3RiCjOHVQNuM9
|
||||
GyTnjFOm+EuoQPNE2oW5nSAzpAqnfIAzKQoOM/cz9COKqwzghI2Kuaad10P9
|
||||
0/zrpPG/gaHw3YW+o2V35lrK0cTRPnejtErnnABHJ/SsDSLYmJrjIwhCY+uT
|
||||
/SurBfx4+q/Mxr/w36HT6A2Lqc89B061Y1i5eJkEURZmYIqk4yar6A22edgO
|
||||
cCjVnP2i3LEZMw4/CvsZfGeKvhK//EyDHD2kZ9Pmb+lDPqSj/XWbj0O8f0qX
|
||||
zeTSq/qCa05BXEs7qYzGKaEIwXcCrbgwrr9KfbrGksCxP2iM4J6fMK5O2wdR
|
||||
QKmf3RP6iur05wb/AE9+AFmjzxjowrmrr3X6GlMyPEP+j3evR4+6pXH0uI64
|
||||
jX8f8JJqRIHN1L/6Ea7bxgANV8RY9X/9KY64PxJIB4m1MZ6XUn/oRr5fHu9T
|
||||
7vyR6uGXulvQ/Feq+G3lfS7oQmXbvBjVwSpyDhgeQehqGTxVqjzalIbn59SB
|
||||
F0di/vMtu9OOfTFYfmjbt6VGzH0rhOg6yP4heJII4o49UZUiVVQCNOAqlR2/
|
||||
usR+NVda8X63rthDaajqD3EEbBlRlX7wG0EkDJOOOa5sORTw3HUj2poDc8LO
|
||||
R4t0gg9LuP8A9CFfQs5H9ptk4O4Zr5z8OyBPE2mNj7tzGf8Ax4V9FXGP7SYn
|
||||
++KmQupqXYAjiCsSMnqKmtMi3T6VBeMHjjwoUAkcVLaf8e6c1nIpFxTXb1wy
|
||||
13NOmDCiiitBBRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA
|
||||
EF7/AMeFx/1zb+VcjXXXv/IPuP8Arm38q5AVnMEKelUZhulJzyDV09KoyY81
|
||||
ue9KIMTUXRpYVWMKcNzn6Vmy/eNamptOZIBICEw2OPpWVL95qtiPIviyD/bV
|
||||
l/1xP86XwZ8O4vFHhm/1CaeWOZCUtFRlAdgMtnPYZXPTgk9sUfFUj+3LMf8A
|
||||
TA/zNcpaatqGnwNHZ39zbxtyyQysoY+4Boi9BpHZeEvBsHiPS7OefV5rfZqn
|
||||
2REWX5QCm4mPg/NkD24rZsPh9rT3kb6h4iu5bWeI+ckU7htrI7oNx4bocj3r
|
||||
y+2vb2GJBb3M0aK/mBUcgBumeO+O9K2q6kqRIL66CR5Ma+a2Fzwcc8VWgM7H
|
||||
xf4UuPDXhC2ur3UJ7u8a8EbK5JhAMIYYB6kA4yPp2rndMaSfTXlwiosioVRQ
|
||||
MnDYP6frWZd315cWccNxdTypGRtR5CQvHGB9KfpUsiv5QYhDyV7Ejp/M104K
|
||||
KeIi/NfmZ15NUmvI6rRJNkkoGByDUmsqJJbd17SjI/CodDIE0h9xzWnqNr9o
|
||||
t8RvskVtwOM9q+yk7TPEirxMgHnpzU8ZBIBNRLY3m4k3MBwO8R/xqT7HeqoI
|
||||
ubcg8f6o/wCNbOSISHLIiaqgCn/UnnPvXRWM4Q2zFflEinBPXkVgWFlI12ZZ
|
||||
5Fd8bRtXAArUysBUHsQcVzVUmrGkdNRfHimLXfEakfxSEf8AgRGa8z8SuT4q
|
||||
1Qg8fapP/QjXp3xMkUeJNbK8Bx/7UjNeW+ITnxNqRz1uZP8A0I18ljHefyX5
|
||||
I9ehsZ+c0ozjFIBg0/FchuAA9KCM9KVR6U/bjGRSHYs6S5TWbNv7syH9RX0n
|
||||
M2b9iB/EK+bbVwlzBgDiRT+tfR5YGZiB3HNJi6mxebjDEXGDnjjHFPs8eQuD
|
||||
61HdZWGPcwY57HOKdZkeQPqf51MxouCu7rgx0rvKKYMKKKK0EFFFFABRRRQA
|
||||
UUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAQXv/IPuP+ubfyrjxXYX3/IO
|
||||
uP8Ark38q44Gs5ghSeKoSEea3+9V09KoO375hj+KkgYaigWeE+ajHa3Cn/dr
|
||||
Nl6tWhqBiFxDs37tjdcY6rWdIRlqsR5H8Vv+Q3Z/9cP/AGY1wRcgc9K7z4q/
|
||||
8hqz/wCuJ/nXAP0pIuOxPDcmNBipBdbiQVBqipwo/lSgkGqGWxIHd81Pph/0
|
||||
v2waz1fBIzV/S/8AX5x2rswC/wBoj6o58T/DfodRpEvltKfcVsedGyt1OR1H
|
||||
auesWwZB712Oh6RqFnfwS3lg/wBkmwjF8DhuBn05I619diZqnHmZ49CHO+Uw
|
||||
d7FXI6Y61JHI/wC7jxjnNdf9jtLW1d1sgJNOQwyszqwaRgoUkfUmtTVfsWmv
|
||||
bRzJH9onneNXFpG5YjaBknGMZ6gVw08w59OQ6auEVPaVzzm1uMXJ3cDnvUrX
|
||||
I3sgOQDwaseJbT7P4tv4lOESUgHAHb0AArLZgZRtHOMfWvRVpx5u6ON3TsXf
|
||||
iTceZrd5IMYdQePqleea3h/EF847zuf1rsvHTk3QJ6lFP/oNcTqB36nct6yH
|
||||
+dfH45WqNen5I9nD6xIZVVXwOmBSdqV23NnPYU30riOglQc4BzUj/dXgcVCh
|
||||
xTmdcYFAyaEgSxn0Yfzr6PVskntkV82Rtgr9RX0fC52ZxxgH9Kl7Evc3LnYL
|
||||
ZAhLfNzke1SWZHkDjuainZGt02JtAPPOc8U+0P7r8TUyGi4CMV31efrXoFOm
|
||||
DCiiitBBRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAEF9/y
|
||||
Drj/AK5N/KuNHSuyvv8AkHXP/XJv5VxYrOYCk8VnOf37f71aB6Vmyf69uf4q
|
||||
SAW/eNriERxBSEbJyT3Ws6Q/e4rT1FpzPD5iFV2Nj5cf3azJM5arYjyP4rkD
|
||||
WbL/AK4n+dcAzfLXoHxWQtrNmR/zxP8AM150+4DFJFrYcn3BS55qJX2qKTzO
|
||||
aqwXJB1NaWk/8fH/AAGssHitTSR+9J/2P6iu3L/94j6nPif4bOi08gM+SRzX
|
||||
oqeJ9CM0U1+Bfzq6bZRa+W4Udd/OG7ce1eb2iusbMY2COflbHBxVjkkEA/lX
|
||||
11ahGra72PFhUcFoeijxPpW9t9xE1x5e2O6EMmVG7OGOd3Pt0qQeKdBbykl8
|
||||
ssDIxkjhYKuWUkBT/eAPPUV52OnINIwHoa5/qFPuzT28ux6LdeJ9H8i8dJbS
|
||||
WQxP9mDW7Myk4wp3LjHH0rzue4aa8eZwNzks20ADJPYDpTQh7Bqjm/dLuYHL
|
||||
cCt6OHhSTUepE5ue5V8Wz+d5L9flA/lXKS/PO7dyxroNecPHCoPRa50/fP1z
|
||||
XyuYq1eXr+iPXwr9xDcCk9qcVxzSY9BXn2OkTNJnilpCeMUAPQ8gD1r6PtiT
|
||||
AjZ6qD+lfOETsj5VipPHB7V9G2hJtIiDyY1PH0qXsJ7nQXMjNaIQioA2OBjP
|
||||
FPssiE59TTbsTi2TzifvcAnpxS2nEZwf4qmQ0XAa9BrzwGvQ6dMGFFFFaCCi
|
||||
iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAK9/wD8g25/65N/
|
||||
KuLB4rtL/wD5Btz/ANcm/lXFdqzmAE8VnSf69v8Aeq+TxWfKR57D3pIBdQRl
|
||||
uIS0qv8AI3Rs/wB2s9+rc1dvhEs8OyQsdrfw4xytZ7nlvrViPKfis5XWLID/
|
||||
AJ4n+dcA4V4zxzXd/Fk/8Tmy/wCuJ/nXAbuKSNFsRCImMMKhPBq2pxGB7VFJ
|
||||
HxlRzVJktDA3y1qaRIPM+dtiDqxBx9KyCPlFWbK5ktZN0YUgjDIwyGHoa2o1
|
||||
XSmpx6GdSCnHlZ2a6hG1vEjXW+JB+7TJwgPJGO3NPinimbbG+4+grlJ9RkvS
|
||||
MwxReWMDylxn61WRZ5plhRmy5C4B616LzafY5Vg49zu4Skyjy5N3uOR+lOmZ
|
||||
II2d2OFGTkEVnWMP2CNrRZg7wnaxHY9cU3UrtrXT3mkRZRkDY/RvY170ZRdD
|
||||
23TlucDTU+TzLUOp2sqbkmU46ru5FSi9tHT52XHuc1zt7p9jcaMmsaRugZGC
|
||||
XFvuJ2H1B9DVWzKT27/a5pFAjYgqAfmAO3Oe2a8JZs7/AA/id/1RdyxrlzDN
|
||||
dH7OQURQOBgVkZ5HrROZEEYLfKVDAVGGIxXn4iu60+ZnTSpqEbImJ5xSZAqN
|
||||
mO7igNWBqOYg8YpuR3pM80vGaQDkI3CvomwIOnQnpmFT/wCOivnQcMK+iNPY
|
||||
f2VATwPIU/8AjopMXU6WaMRwKPMRzn+E9KfaY8s4/vVFOIVhUI7Oc85XFPtD
|
||||
8hx61EhourXolecqa9Gp0wYUUUVoIKKKKACiiigAooooAKKKKACiiigAoooo
|
||||
AKKKKACiiigAooooAr3/APyDbn/rk38jXEdq7fUP+QZc/wDXJv5GuHrOYAel
|
||||
UJ8ecfrV09KoTn98aEA2+eNpYQkQQ7Wyck56VnueWrSvzcFoDLnZtOOntWY/
|
||||
3mqhHlHxZ/5Clif+mTfzrz7PFeg/Fj/kKWH/AFyb+dedk4ojsWth4+6MUmeK
|
||||
aGwKYW5pgKU6U5AQRQMECgYB4pkksP3HPvitfwreQ2PiuwuJ4leNZMENjGSC
|
||||
AfwJB/CsZDiL6mu0+GngOXxvrUqOzR2duuZZV4IJB24/EUpbCbsYsF2+n6zd
|
||||
W92rKzykkkdDmk1u7F3AFjJMYPJxXaeObbw63iGDRZbgx6hYxCKa+jTKyHnh
|
||||
gO4GOfXI6AAUz4d8O29mfP8AEiTgjiO3t2LH2OcAfrXZHMav1f2HQx+rwc/a
|
||||
HN6DEq+F9enlbCeWiIp7sW/pj9ay4WBgdParmtX6eXHpllE0NjC24Bj80jf3
|
||||
mrMhf5setcS7m45mE0cYYY2Jt+vJpjRDbkelLGMZFPb7hpgivINrkdqTbxwK
|
||||
dLy+fbtTOQKBi0CmjOaeM4wO9IYDqK+htNIOiwE5x9mXP/fIr58TaFIK5J6H
|
||||
0r6C0vA0G3JXI+zLx/wEUmSzpJ/I8lRFvznndipbXHl/jUM8kbKoSIJz6k1N
|
||||
a8R/jUyGiyK9IrzcYr0inTBhRRRWggooooAKKKKACiiigAooooAKKKKACiii
|
||||
gAooooAKKKKACiiigCvqH/IMuv8Ark38jXC9q7nUf+QXdf8AXFv5GuFzUSAD
|
||||
0qhcH9+1XSaoXP8Arj9BSQmNvFjDQFZdzYPG3HaqTfeb61au5I/9GCxYOSN2
|
||||
f9mqjnDNVMDyb4tNjVbAf9Mm/nXnh5FegfFw/wDE2sP+uJ/nXnobihbFIMn0
|
||||
pMUuaWmMUdKUUoXjpRiglirxHj3Ne7fBqXT9K8HXrzXyw3M7+bgngKBgZ/HP
|
||||
5ivGLawa70yaWHDSQnLJ3x6/59/Smx6pfWoZY7qVMpsbDHlcYx9MUOzJauX3
|
||||
mk1DVbrUZvv3ErSc+5zU4GAcVVsMi0QH649K0VjBQNkD1oKMzVbR5lSSNMkc
|
||||
HFZ01nNaeQ0q4E0YkT6ZI/pXSBgxCIQaj1y48/SbKGSGJBa7kSRR8zgnOD7A
|
||||
k0COcTuak6jFNXhcCtzw5ZSXzXkUVrBO5iwPNONpz1Bxj88fUUxnPONuPpUZ
|
||||
r0iDTbg2wUeHNNkZcBd8yEtjHPH59f65qWugXdrHJDLodlKMsSJLlMrkjHPX
|
||||
j69O1Kw0cEOtOrv7TToWmu4l0GwRocKxlnOMYJJHHI9/pWUvgvUL5pLuBLaG
|
||||
BzuRDMMLk8L+AP6UrDOXA5r6E0fI8O2hwD/oqcH/AHRXhF5YyWNw8EwAkQDO
|
||||
DkcjNe9aGG/4R6yK/e+zR4x/uihiZ0E0pk2gxov+6uKmtxiP8ahnMx8vzSxG
|
||||
Plz6VPAP3QqJAiYCvSa83Ar0inTBhRRRWggooooAKKKKACiiigAooooAKKKK
|
||||
ACiiigAooooAKKKKACiiigCtqP8AyC7r/ri/8jXB54rvNR/5BV3/ANcX/ka4
|
||||
AGokA4niqN1/rPwq2TxVK5+/+FJALdtOIYA64jPT5cdqosOScVaulASAiVW/
|
||||
2Rn0psVlc3EMrQoWC4zg9Pw79KqxJ4z8XB/xN7ADOPJP8688A5r33xh4Oi8S
|
||||
6aF81YruLJibqM+h9q8qm+H3iGGQobEtjujAihO25SOZCjPJI+lKBiuh/wCE
|
||||
G8QDk6dJ+lA8Ea//ANA6X8qLjuYSnAprEiuhHgvXgOdNm/Km/wDCFa9/0Dpf
|
||||
youDMS1vJ7O5WeByrD071pWq2mqTnzWELnoBgAmrY8Fa7j/kHSflTv8AhCtc
|
||||
J40+QU7oRL9jlgXJhcqOhXlfzFEcm7gRMXJxtAzmli8L+J7cjybedSPQ1K+h
|
||||
+MZUKsk5U9RupAJLdi0T/SFSP/Y/i/8ArVgX1+97NuIwg4Va1D4L8RO257CR
|
||||
j7kU4eCde/6B7/mKLoDABwMVe0y8s7SSRrywF2rLhVMjJtPrxWj/AMITr3T+
|
||||
z3/MUh8E6/njT3/MUXKTF/tzRBMrL4eAUZOPtT/z/wA9vxRdf0wXMztoiNDI
|
||||
EHlmU5XaD0bGeTgn6Un/AAhOv/8AQPf8xTv+EI1/H/IPf8xRzDuhW8QaRuLR
|
||||
eH4o23qwJmZuAQSMHjnGPxqxH4m0zB3eH4TnkqszBc4wSF5A/pVf/hCdeA50
|
||||
9/zFC+DNf6DT3p3C6K+rXunXcEIstPNrKM+ZiQsp9Ote2aArf2Bp6N8rfZ4x
|
||||
zxj5RXnnhr4dXsl7HcasixwociEHJc++Ogr1BIxbpmTCKMDjtSZLfY0Jl2eW
|
||||
d6tkdj0q1Af3QqpKqAoEfd+GKswnES1EgRYB4r0mvNAeK9Lp0wYUUUVoIKKK
|
||||
KACiikJxQAtFNLhRkkCq4vDKWEERk2nBI4H60AWqKqfarnfs+xvnGeox+ecV
|
||||
JFcF3KPGUcDO00AT0UUUAFFFFABRRRQAUUUUAFFFFAFbUv8AkFXf/XF/5GvP
|
||||
s16DqX/IJu/+uL/yNeeZqJAKTxUW2KSUq23IGfmJFPNRsaSYD3jjaNUaRdi9
|
||||
BuOB+lS297b2lrLCI1bzBgtlsiqTHioHbjinzAOlW2Lkgj/gRP8AQVWkWD/n
|
||||
pCPxb/CmyNxVSU1PMIc6Wv8AFcR/QBv8KryR2x+7cQge+7/CoZKgYUcwE/l2
|
||||
4/5eof8AvljTCLMHm7X8ImP9arstRlaXMBcBsO9y/wCEB/8Aiqd5mnD/AJby
|
||||
f+A//wBlWfto49KOYZoiXTx/y3f8bb/7KgPp+f8Aj4f/AMBv/sqztwHalDj0
|
||||
o5gNPdp+eJ2+n2c//FU4tppHDtn/AK5N/wDFVliQelOEg9KOYDSAsT0mI/4A
|
||||
f/iqeEsu0+Pqp/xrMDinBhRzAaQjtz0uox9Vb/CnrHFji8t/xD//ABNZysKe
|
||||
CKOYRoiKM9bq3P4sP5rUq28R6TQH/toBWauM1OmOKOZDN/TjZ2brK8cMzD+F
|
||||
pV20kyR3M7uFQBmyVEi4rJjIzVqMinzBY0DBE2N3BHpIo/pSRY2DHT3OagQi
|
||||
plOBxSbuOxMDxXp1eXg16hVUwYUUUVoIKKKKACqmpXDWti0qjkVbqG7hE9s0
|
||||
ZHBFAFZ7W1ji33dwWBx8zvtH4Yps7s9gh0to0Qv8zjACjv1/Cq9u3m6cYpBm
|
||||
Wzbv3X/9WfyqNI4JC9w8BlPmeXFCvRmxnJ/D+VAD/t8kVg0S3iz3Och0XIA+
|
||||
vQ1bjlMotLjAzIm1iPX0/nTRGQqpd/YokPSILyB7HI5/CgW/2Oz2MQVSbMXP
|
||||
UH/9ZoA0aKKKACiiigAooooAKKKKACiiigCtqX/IJu/+uL/yNefY4r0HUv8A
|
||||
kE3f/XF/5GvPe1TJANYVC2fSrIAIpNoPapsIoPn0qB8+lahiU9qaYUI6UrDM
|
||||
ZgfSoHQntW4bePH3aabaL+7SsI55oSR0qI27eldIbaL+7QLaLH3aVgOXNo56
|
||||
Cm/YpMdDXV/Zov7tKLaL+7TsByX2GT0o+wS+ldeLaL+7S/Zov7tKwzj/ALBL
|
||||
/dpPsMv92uyFtF/dFH2WL+7RYDjfsUv92k+xyf3a7T7LD/cpPskP9yiwWON+
|
||||
yyf3aBbOP4a7D7HD/cpps4f7tFgOTELgfdNOETD+GunNnD/dpptIc/dpWA5x
|
||||
VYdqeu4djW8bSHP3aT7LEB92iwGOrsD0q1FKeOKu/ZYs/dpRBGOgp2GMjk4q
|
||||
wj8UwRKBwKeFAoAkDV6pXlIAFerVcAYUUUVoIKKKKACkNLSGgDKuAbHU47oc
|
||||
RP8AJJ7D1qe2ihsd9uLtd0rEopIyOOMetXGVWGGAIqA2FqUKiCMA9QFxQBQG
|
||||
lTNEUkSEMfvysSxPvU1uiTzRrFlra3XahP8AEfX/AD71N/Z1uQAwd1H8LuWH
|
||||
5E4q0qhVAUAAdhQB/9k=
|
||||
|
||||
--= Multipart Boundary 0901041737--
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user