1 |
package Torus::Core; |
2 |
|
3 |
use base qw( |
4 |
DesignPattern::Object |
5 |
DesignPattern::Object::Logger |
6 |
); |
7 |
|
8 |
use strict; |
9 |
use warnings; |
10 |
|
11 |
use loadConfig; |
12 |
#use Torus::Driver::ldap; |
13 |
use Data::Transfer::Sync; |
14 |
|
15 |
my $logger = Log::Dispatch::Config->instance; |
16 |
|
17 |
|
18 |
my $DEBUGLEVEL = $config->get("debug_level"); |
19 |
my $TRACELEVEL = $config->get("trace_level"); |
20 |
my $bool_started; |
21 |
|
22 |
|
23 |
sub addItem { |
24 |
|
25 |
my $torusObjectType = shift; |
26 |
my $mapiEntry = shift; |
27 |
my $basedn = shift; |
28 |
my $ldapEntry; |
29 |
|
30 |
if (!$bool_started) { |
31 |
Torus::Driver::ldap::connectStore(); |
32 |
} |
33 |
|
34 |
$bool_started = 1; |
35 |
|
36 |
if ($DEBUGLEVEL > 3) { |
37 |
print STDOUT "=" x 3, " ", __PACKAGE__, " ", "=" x 30, "\n"; |
38 |
print STDOUT "recieved torus-object (type=$torusObjectType)", "\n"; |
39 |
print STDOUT "trying to write to (basedn='$basedn')", "\n"; |
40 |
} |
41 |
|
42 |
if ($torusObjectType eq 'MapiContact') { |
43 |
$basedn = Torus::Driver::ldap::createOuSafe($basedn); |
44 |
my $entry = Torus::Driver::ldap::prepareEntry($basedn, $mapiEntry); |
45 |
if (my $result = Torus::Driver::ldap::addEntry($entry)) { |
46 |
#my $error = 0; |
47 |
#$error = 1 if $result->code >= 0; |
48 |
#Torus::Driver::ldap::traceEntry($mapiEntry, $entry, { error => $error, prefix => $result->error }) if $TRACELEVEL >= 2; |
49 |
#undef $result; |
50 |
Torus::Driver::ldap::processResult($entry->{identifier}, $result); |
51 |
} |
52 |
} |
53 |
|
54 |
} |
55 |
|
56 |
sub startSync { |
57 |
|
58 |
my $self = shift; |
59 |
my $opts = shift; |
60 |
|
61 |
my $ldapLocator = Data::Storage::Locator->new( |
62 |
ldap => { |
63 |
type => "NetLDAP", |
64 |
# dsn => "ldap:host=192.168.1.56;binddn='cn=root, dc=labnet, dc=de';pass=Geheim", |
65 |
dsn => "ldap:host=192.168.10.150;binddn='cn=root, o=netfrag.org, c=de';pass=secret", |
66 |
#schema => 'BizWorks::BackendDbSchema', |
67 |
#classnames => [qw( SystemEvent LangText )], |
68 |
#classnames => [qw( SystemEvent Person Address LangText )], |
69 |
#test_availability => 1, |
70 |
#test_integrity => 1, |
71 |
#test_emptyness => 1, |
72 |
# TODO: re-enable this! (multiple-target-logging!) |
73 |
#logger => 1, |
74 |
want_transactions => 0, |
75 |
syncable => 1, |
76 |
}, |
77 |
); |
78 |
my $ldapStorage = Data::Storage->new($ldapLocator); |
79 |
$ldapStorage->connect(); |
80 |
|
81 |
my $mapiStorage; |
82 |
|
83 |
|
84 |
# create a new synchronization object |
85 |
my $sync = Data::Transfer::Sync->new(); |
86 |
|
87 |
|
88 |
# resolve mapping metadata for syncing requested resource |
89 |
# if now mapping is given explicitely, try to use mapping named like "target" |
90 |
$opts->{mapping} ||= $opts->{target}; |
91 |
# was: ($nodemapping and $propmapping were package-globals) |
92 |
# is: (both mappings are retrieved from mapping-module/package/object |
93 |
# resolve mapping module |
94 |
my $modulename = $self->{config}->{mappings}->{$opts->{mapping}}; |
95 |
$opts->{mapping_module} = $modulename; |
96 |
|
97 |
#print Dumper($opts); |
98 |
|
99 |
# mungle & check the options |
100 |
# TODO: refactor this and the innards..... |
101 |
|
102 |
#$opts = $sync->prepareSyncOptions($opts); |
103 |
if (!$sync->prepareOptions($opts)) { |
104 |
$logger->critical( __PACKAGE__ . "->startSync: 'Data::Transfer::Sync::prepareSyncOptions' failed."); |
105 |
} |
106 |
|
107 |
#print Dumper($opts); |
108 |
|
109 |
if (!$sync->checkOptions($opts)) { |
110 |
$logger->critical( __PACKAGE__ . "->startSync: 'Data::Transfer::Sync::checkOptions' failed."); |
111 |
return; |
112 |
} |
113 |
|
114 |
# branch to execution path for special targets |
115 |
# detect for option 'handler' which could be a CODEref |
116 |
if ($opts->{handler} && ref $opts->{handler} eq 'CODE') { |
117 |
$logger->info( __PACKAGE__ . "->startSync: Running (special handler code - no generic sync!) on '$opts->{target}' with MODE $opts->{mode}, NODE $opts->{target_node}"); |
118 |
$opts->{handler}->($self, $opts); |
119 |
return; |
120 |
} |
121 |
|
122 |
# determine write-protection(s) from options |
123 |
my @write_protects; |
124 |
push @write_protects, 'L' if $opts->{source_write_protect}; |
125 |
push @write_protects, 'R' if $opts->{target_write_protect}; |
126 |
|
127 |
# configure synchronization-object |
128 |
$sync->configure( |
129 |
storages => { |
130 |
#L => $self->{bizWorks}->{$opts->{source}}, |
131 |
L => $mapiStorage, |
132 |
#R => $self->{bizWorks}->{$opts->{target}}, |
133 |
R => $ldapStorage, |
134 |
}, |
135 |
id_authorities => [qw( L ) ], |
136 |
checksum_authorities => [qw( L ) ], |
137 |
write_protected => \@write_protects, |
138 |
verbose => 1, |
139 |
); |
140 |
|
141 |
# patch options |
142 |
$opts->{source} = "L:$opts->{source_node}" if $opts->{source_node}; |
143 |
$opts->{target} = "R:$opts->{target_node}" if $opts->{target_node}; |
144 |
|
145 |
#print Dumper($opts); |
146 |
|
147 |
$sync->syncNodes($opts); |
148 |
|
149 |
} |
150 |
|
151 |
1; |