Legacy Servers (Tivoli, Novell)
Relevant source files
The following files were used as context for generating this wiki page:
The Legacy Servers module provides specialized implementations for non-standard LDAP environments, specifically IBM Tivoli and Novell eDirectory. These implementations extend the base RFC-compliant processing to handle proprietary schema definitions, Access Control List (ACL) formats, and operational attributes unique to these platforms. The system uses a priority-based detection mechanism to automatically identify the server type of an LDIF entry or schema definition and apply the appropriate normalization or migration logic.
This functionality is part of the Infrastructure Layer of the project, specifically within the servers/ package, which facilitates the transformation of legacy-formatted LDIF data into modern, RFC-compliant domain models used throughout the FLEXT-LDIF ecosystem.
Sources: src/flext_ldif/servers/novell.py:1-12, src/README.md:10-25, tests/constants.py:38-50
Architecture and Inheritance
The legacy server implementations follow a strict inheritance hierarchy. Both Novell and Tivoli implementations derive from FlextLdifServersRfc, which in turn relies on the base entry processing capabilities defined in the servers/_base module.
The architecture leverages nested classes (Constants, Schema, Acl, Entry) to encapsulate specific server behaviors within a unified server class.
Sources: src/flext_ldif/servers/novell.py:12-15, src/flext_ldif/servers/_base/entry.py:23-45
Novell eDirectory Implementation
The Novell eDirectory implementation (FlextLdifServersNovell) focuses on handling specific OID patterns, proprietary ACL formats using the # separator, and unique operational attributes like GUID.
Detection Mechanisms
Detection is performed through a combination of OID pattern matching, attribute prefix checking, and DN marker inspection.
| Detection Type | Pattern / Value |
|---|---|
| OID Pattern | 2.16.840.1.113719. |
| Attribute Prefixes | nspm, login, dirxml- |
| DN Markers | ou=services, ou=apps, ou=system |
| ObjectClasses | ndsperson, ndsserver, ndstree |
Sources: src/flext_ldif/servers/novell.py:28-60, src/flext_ldif/servers/novell.py:270-285
ACL Processing
Novell ACLs utilize a proprietary format where segments are separated by the # character. The Acl nested class provides the logic to parse these segments into canonical permissions.
The rights mapping translates characters like 'B' (Browse) to 'Search', 'W' (Write) to 'Write', and 'S' to 'Supervisor' permissions.
Sources: src/flext_ldif/servers/novell.py:125-145, src/flext_ldif/servers/novell.py:202-230
Entry Normalization
During entry processing, the server adds metadata to track the original source type and ensures proprietary attributes are preserved in the metadata field of the entry model.
def _process_novell_entry(
self,
entry: m.Ldif.Entry,
attributes: t.MutableStrSequenceMapping,
) -> p.Result[m.Ldif.Entry]:
"""Normalize eDirectory entry attributes."""
processed_attributes[c.Ldif.ServerMetadataKeys.SERVER_TYPE] = [
self._get_server_type(),
]
# ... additional transformation logic ...
new_attrs = m.Ldif.Attributes.model_validate({"attributes": processed_attributes})
return r[m.Ldif.Entry].ok(entry.model_copy(update={"attributes": new_attrs}))
Sources: src/flext_ldif/servers/novell.py:301-325
Data Metadata and Round-trip Preservation
Legacy server processing heavily utilizes the ServerMetadata and FormatDetails models to ensure that data transformed for modern systems can be reverted to its legacy state with zero data loss (minimal differences tracking).
Metadata Structures
| Model | Purpose |
|---|---|
| ValidationMetadata | Tracks RFC violations and server-specific violations found during parsing. |
| FormatDetails | Preserves original DN line formatting, spacing, and trailing comments. |
| SchemaFormatDetails | Stores quoting styles and field ordering of legacy schema definitions. |
| MinimalDifferences | Captures exact deltas between legacy input and normalized output. |
Sources: src/flext_ldif/_models/domain_metadata.py:40-100, src/flext_ldif/_utilities/metadata.py:380-400
Round-trip Logic
The base entry implementation in FlextLdifServersBaseEntry includes a check for round-trip preservation. If the target server type matches the original server type stored in metadata, the system can bypass normalization and restore the exact original LDIF string.
Sources: src/flext_ldif/servers/_base/entry.py:348-365
Summary of Configuration and Constants
Novell and Tivoli servers utilize standardized constants for priority-based dispatching.
- Priority: Novell is assigned a priority of
20. - Canonical Name:
novell_edirectory. - Normalization Support: Supports denormalization to
rfcand itself. - Operational Attributes: Includes
createTimestamp,modifyTimestamp, andGUID.
Sources: src/flext_ldif/servers/novell.py:19-35, tests/constants.py:48-55
Conclusion
Legacy Server support for Tivoli and Novell provides the necessary bridge between proprietary LDAP implementations and modern RFC-compliant workflows. By leveraging specialized detection, ACL parsing, and detailed metadata tracking, the system maintains high fidelity during data migrations while allowing the rest of the application to operate on standardized models. This architecture ensures that FLEXT-LDIF remains compatible with enterprise environments that rely on these legacy directory services.