6 use LiCoM::Config (qw(get_config));
7 use LiCoM::Connection (qw($Ldap));
13 LiCoM::Group - High level group management.
25 $obj->{'name'} = $entry->get_value ('cn', asref => 0);
26 $obj->{'description'} = $entry->get_value ('description', asref => 0);
27 $obj->{'members'} = [map { m/cn=([^,]+)/i; $1; } ($entry->get_value ('member', asref => 0))];
28 $obj->{'ldap'} = $entry;
30 return (bless ($obj, $pkg));
33 =head1 STATIC FUNCTIONS
35 =item LiCoM::Group-E<gt>B<load> (I<$cn>)
37 Loads and returns the group named I<$cn> or all groups with a member named
48 my $mesg = $Ldap->search
50 base => get_config ('base_dn'),
51 filter => "(&(objectClass=groupOfNames)(cn=$name))"
54 if ($mesg->is_error ())
56 warn ("Error while querying LDAP server: " . $mesg->error_text ());
60 for ($mesg->entries ())
63 $obj = new ($pkg, $entry);
74 my $dn = _cn_to_dn ($cn);
77 my $mesg = $Ldap->search
79 base => get_config ('base_dn'),
80 filter => "(&(objectClass=groupOfNames)(member=$dn))"
83 if ($mesg->is_error ())
85 warn ("Error while querying LDAP server: " . $mesg->error_text ());
89 for ($mesg->entries ())
92 push (@retval, new ($pkg, $entry));
99 =item LiCoM::Group-E<gt>B<create> (I<$name>, I<$description>, I<@member_cns>)
101 Creates and returns a new group. At least one member has to be given to meet
102 LDAP requirements. I<@members> is an array of CNs.
112 my $dn = _cn_to_dn ($name);
113 my ($ou) = get_config ('base_dn') =~ m/\bou\s*=\s*([^,]+)/i;
115 my $entry = Net::LDAP::Entry->new ();
117 $entry->add (objectClass => [qw(top groupOfNames)]);
118 $entry->add (ou => $ou);
119 $entry->add (cn => $name);
120 $entry->add (member => [map { _cn_to_dn ($_) } (@members)]);
121 $entry->add (description => $desc) if ($desc);
124 $entry->changetype ('add');
125 my $mesg = $entry->update ($Ldap);
127 if ($mesg->is_error ())
129 warn ("Error while creating entry '$dn' on LDAP server: " . $mesg->error_text ());
133 return (new ($pkg, $entry));
136 =item LiCoM::Group-E<gt>B<all> ()
138 Returns all group-objects found in the database.
147 my $mesg = $Ldap->search
149 base => get_config ('base_dn'),
150 filter => "(objectClass=groupOfNames)"
153 if ($mesg->is_error ())
155 warn ("Error while querying LDAP server: " . $mesg->error_text ());
159 for ($mesg->entries ())
162 my $group = new ($pkg, $entry);
164 push (@retval, $group);
174 =item I<$obj>-E<gt>B<delete> ()
183 my $entry = $obj->{'ldap'};
185 $entry->changetype ('delete');
187 $entry->update ($Ldap);
192 =item I<$obj>-E<gt>B<get_members> ()
194 Returns a list of all members.
201 return (@{$obj->{'members'}});
204 =item I<$obj>-E<gt>B<add_members> (I<@cn>)
206 Adds the given I<@cn>s to the group, if they aren't already in the group.
213 my $entry = $obj->{'ldap'};
220 if (!grep { $_ eq $n } (@{$obj->{'members'}}))
222 push (@{$obj->{'members'}}, $n);
226 _update_members ($obj);
229 =item I<$obj>-E<gt>B<del_members> (I<@cn>)
231 Deletes the given I<@cn>s from the group. Automatically deletes the group if no
232 members are left (to meet LDAP-standards, mostly..).
239 my $entry = $obj->{'ldap'};
245 @{$obj->{'members'}} = grep { $d ne $_ } (@{$obj->{'members'}});
248 if (@{$obj->{'members'}})
250 _update_members ($obj);
254 LiCoM::Group::delete ($obj);
258 =item I<$obj>-E<gt>B<name> ([I<$name>])
260 Sets the name if given. Returns the (new) name.
270 my $entry = $obj->{'ldap'};
271 $obj->{'name'} = shift;
273 $entry->changetype ('modify');
274 $entry->replace (cn => $obj->{'name'});
275 $entry->update ($Ldap);
276 $entry->dn (_cn_to_dn ($obj->{'name'}));
277 $entry->update ($Ldap);
280 return ($obj->{'name'});
283 =item I<$obj>-E<gt>B<description> ([I<$description>])
285 Sets the description if given. Returns the (new) description.
295 my $entry = $obj->{'ldap'};
296 $obj->{'description'} = shift;
298 $entry->changetype ('modify');
299 $entry->replace (description => [$obj->{'description'}]);
300 $entry->update ($Ldap);
303 return ($obj->{'description'});
309 my $base_dn = get_config ('base_dn') or die;
311 return ('cn=' . $cn . ',' . $base_dn);
317 my $entry = $obj->{'ldap'};
318 my @tmp = map { _cn_to_dn ($_); } (@{$obj->{'members'}});
320 $entry->changetype ('modify');
321 $entry->replace (member => \@tmp);
322 $entry->update ($Ldap);
329 Florian octo Forster E<lt>octo at verplant.orgE<gt>