Module: Treequel::ContentSyncControl

Includes:
Constants, Control
Defined in:
lib/treequel/controls/contentsync.rb

Overview

A Treequel::Control module that implements the “Content Sync” control (RFC 4533)

NOTICE: This control currently doesn’t do anything, as it depends on Intermediate Responses, which the underlying Ruby-LDAP library doesn’t support (yet).

Usage

As with all Controls, you must first register the control with the Treequel::Directory object you’re intending to search:

dir = Treequel.directory( 'ldap://ldap.acme.com/dc=acme,dc=com' )
dir.register_controls( Treequel::ContentSyncControl )

Once that’s done, any Treequel::Branchset you create will have the #on_sync method:

# Build DHCP records out of all the hosts in the directory, then rebuild
# everything when a host record changes.
hosts = dir.filter( :ou => Hosts ).collection
hosts.filter( :objectClass => :ipHost ).on_sync do ||
    #
end

See deveiate.org/projects/Treequel/ticket/6 Ticket: Add support for the RFC4533 Content Sync operation.

Constant Summary collapse

OID =

The control’s OID

CONTROL_OIDS[:sync]
SYNC_MODE_REFRESH =

Sync mode constants (from RFC4533, section 2.2)

1
SYNC_MODE_REFRESH_AND_PERSIST =
3

Constants included from Constants

Treequel::Constants::CONTROL_NAMES, Treequel::Constants::CONTROL_OIDS, Treequel::Constants::EXTENSION_NAMES, Treequel::Constants::EXTENSION_OIDS, Treequel::Constants::FEATURE_NAMES, Treequel::Constants::FEATURE_OIDS, Treequel::Constants::MINIMAL_OPERATIONAL_ATTRIBUTES, Treequel::Constants::SCOPE, Treequel::Constants::SCOPE_NAME

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Control

#get_client_controls

Instance Attribute Details

#content_sync_callbackObject

The callback to call when results change



67
68
69
# File 'lib/treequel/controls/contentsync.rb', line 67

def content_sync_callback
  @content_sync_callback
end

Instance Method Details

#each(&block) ⇒ Object

Override the Enumerable method to update the cookie value each time a page is fetched.



81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
# File 'lib/treequel/controls/contentsync.rb', line 81

def each( &block )
  super do |branch|
    self.log.debug "Looking for the sync control in controls: %p" % [ branch.controls ]
    branch.controls.each do |control|
      self.log.debug "  got a %s control: %p" % [
        CONTROL_NAMES[control.oid],
        control.decode,
      ]

      case control.oid
      when CONTROL_OIDS[:sync_state]
        self.log.debug "  got a 'state' control"
        block.call( branch )
      when CONTROL_OIDS[:sync_done]
        self.log.debug "  got a 'done' control"
        break
      else
        self.log.info "  got an unexpected control (%p)" % [ control ]
      end
    end
  end
end

#initializeObject

Add the requisite instance variables to including Branchsets.



53
54
55
56
57
58
59
# File 'lib/treequel/controls/contentsync.rb', line 53

def initialize
  self.log.notice "The ContentSync control doesn't work yet -- it requires support for " +
    "IntermediateResponses, which Ruby-LDAP doesn't do yet. " +
    "See http://deveiate.org/projects/Treequel/ticket/6 for updates on the " +
    "status of this."
  @content_sync_callback = nil
end

#on_sync(&callback) ⇒ Object

Clone the Branchset with a persistent change callback.



71
72
73
74
75
76
# File 'lib/treequel/controls/contentsync.rb', line 71

def on_sync( &callback )
  newset = self.clone
  newset.content_sync_callback = callback

  return newset
end