diff options
| author | Manuel Traut <manut@mecka.net> | 2011-04-29 09:09:27 +0200 |
|---|---|---|
| committer | Manuel Traut <manut@mecka.net> | 2011-04-29 09:09:27 +0200 |
| commit | 5238ad5a0c4a9e1c8cd036f5de4055e39bd71297 (patch) | |
| tree | 4407c087b9fb5432b1dc11e70b52dacfa0b99feb /beagle/debian-rfs/usr/share/perl5/Debconf/DbDriver/LDAP.pm | |
| parent | 60ead65c41afba7e6aa4bbcf507a1d52f7a8fe9f (diff) | |
added debootstrap stuff
Signed-off-by: Manuel Traut <manut@mecka.net>
Diffstat (limited to 'beagle/debian-rfs/usr/share/perl5/Debconf/DbDriver/LDAP.pm')
| -rw-r--r-- | beagle/debian-rfs/usr/share/perl5/Debconf/DbDriver/LDAP.pm | 263 |
1 files changed, 263 insertions, 0 deletions
diff --git a/beagle/debian-rfs/usr/share/perl5/Debconf/DbDriver/LDAP.pm b/beagle/debian-rfs/usr/share/perl5/Debconf/DbDriver/LDAP.pm new file mode 100644 index 0000000..f2664f6 --- /dev/null +++ b/beagle/debian-rfs/usr/share/perl5/Debconf/DbDriver/LDAP.pm @@ -0,0 +1,263 @@ +#!/usr/bin/perl -w +# This file was preprocessed, do not edit! + + +package Debconf::DbDriver::LDAP; +use strict; +use Debconf::Log qw(:all); +use Net::LDAP; +use base 'Debconf::DbDriver::Cache'; + + +use fields qw(server port basedn binddn bindpasswd exists keybykey ds accept_attribute reject_attribute); + + +sub binddb { + my $this=shift; + + $this->error("No server specified") unless exists $this->{server}; + $this->error("No Base DN specified") unless exists $this->{basedn}; + + $this->{binddn} = "" unless exists $this->{binddn}; + $this->{port} = 389 unless exists $this->{port}; + + debug "db $this->{name}" => "talking to $this->{server}, data under $this->{basedn}"; + + $this->{ds} = Net::LDAP->new($this->{server}, port => $this->{port}, version => 3); + if (! $this->{ds}) { + $this->error("Unable to connect to LDAP server"); + return; # if not fatal, give up anyway + } + + my $rv = ""; + if (!($this->{binddn} && $this->{bindpasswd})) { + debug "db $this->{name}" => "binding anonymously; hope that's OK"; + $rv = $this->{ds}->bind; + } else { + debug "db $this->{name}" => "binding as $this->{binddn}"; + $rv = $this->{ds}->bind($this->{binddn}, password => $this->{bindpasswd}); + } + if ($rv->code) { + $this->error("Bind Failed: ".$rv->error); + } + + return $this->{ds}; +} + + +sub init { + my $this = shift; + + $this->SUPER::init(@_); + + $this->binddb; + return unless $this->{ds}; + + $this->{exists} = {}; + + if ($this->{keybykey}) { + debug "db $this->{name}" => "will get database data key by key"; + } + else { + debug "db $this->{name}" => "getting database data"; + my $data = $this->{ds}->search(base => $this->{basedn}, sizelimit => 0, timelimit => 0, filter => "(objectclass=debconfDbEntry)"); + if ($data->code) { + $this->error("Search failed: ".$data->error); + } + + my $records = $data->as_struct(); + debug "db $this->{name}" => "Read ".$data->count()." entries"; + + $this->parse_records($records); + + $this->{ds}->unbind; + } +} + + +sub shutdown +{ + my $this = shift; + + return if $this->{readonly}; + + if (grep $this->{dirty}->{$_}, keys %{$this->{cache}}) { + debug "db $this->{name}" => "saving changes"; + } else { + debug "db $this->{name}" => "no database changes, not saving"; + return 1; + } + + unless ($this->{keybykey}) { + $this->binddb; + return unless $this->{ds}; + } + + foreach my $item (keys %{$this->{cache}}) { + next unless defined $this->{cache}->{$item}; # skip deleted + next unless $this->{dirty}->{$item}; # skip unchanged + (my $entry_cn = $item) =~ s/([,+="<>#;])/\\$1/g; + my $entry_dn = "cn=$entry_cn,$this->{basedn}"; + debug "db $this->{name}" => "writing out to $entry_dn"; + + my %data = %{$this->{cache}->{$item}}; + my %modify_data; + my $add_data = [ 'objectclass' => 'top', + 'objectclass' => 'debconfdbentry', + 'cn' => $item + ]; + + my @fields = keys %{$data{fields}}; + foreach my $field (@fields) { + my $ldapname = $field; + if ( $ldapname =~ s/_(\w)/uc($1)/ge ) { + $data{fields}->{$ldapname} = $data{fields}->{$field}; + delete $data{fields}->{$field}; + } + } + + foreach my $field (keys %{$data{fields}}) { + next if ($data{fields}->{$field} eq '' && + !($field eq 'value')); + if ((exists $this->{accept_attribute} && + $field !~ /$this->{accept_attribute}/) or + (exists $this->{reject_attribute} && + $field =~ /$this->{reject_attribute}/)) { + debug "db $item" => "reject $field"; + next; + } + + $modify_data{$field}=$data{fields}->{$field}; + push(@{$add_data}, $field); + push(@{$add_data}, $data{fields}->{$field}); + } + + my @owners = keys %{$data{owners}}; + debug "db $this->{name}" => "owners is ".join(" ", @owners); + $modify_data{owners} = \@owners; + push(@{$add_data}, 'owners'); + push(@{$add_data}, \@owners); + + my @flags = grep { $data{flags}->{$_} eq 'true' } keys %{$data{flags}}; + if (@flags) { + $modify_data{flags} = \@flags; + push(@{$add_data}, 'flags'); + push(@{$add_data}, \@flags); + } + + $modify_data{variables} = []; + foreach my $var (keys %{$data{variables}}) { + my $variable = "$var=$data{variables}->{$var}"; + push (@{$modify_data{variables}}, $variable); + push(@{$add_data}, 'variables'); + push(@{$add_data}, $variable); + } + + my $rv=""; + if ($this->{exists}->{$item}) { + $rv = $this->{ds}->modify($entry_dn, replace => \%modify_data); + } else { + $rv = $this->{ds}->add($entry_dn, attrs => $add_data); + } + if ($rv->code) { + $this->error("Modify failed: ".$rv->error); + } + } + + $this->{ds}->unbind(); + + $this->SUPER::shutdown(@_); +} + + +sub load { + my $this = shift; + return unless $this->{keybykey}; + my $entry_cn = shift; + + my $records = $this->get_key($entry_cn); + return unless $records; + + debug "db $this->{name}" => "Read entry for $entry_cn"; + + $this->parse_records($records); +} + + +sub remove { + return 1; +} + + +sub save { + return 1; +} + + +sub get_key { + my $this = shift; + return unless $this->{keybykey}; + my $entry_cn = shift; + + my $data = $this->{ds}->search( + base => 'cn=' . $entry_cn . ',' . $this->{basedn}, + sizelimit => 0, + timelimit => 0, + filter => "(objectclass=debconfDbEntry)"); + + if ($data->code) { + $this->error("Search failed: ".$data->error); + } + + return unless $data->entries; + $data->as_struct(); +} + +sub parse_records { + my $this = shift; + my $records = shift; + + foreach my $dn (keys %{$records}) { + my $entry = $records->{$dn}; + debug "db $this->{name}" => "Reading data from $dn"; + my %ret = (owners => {}, + fields => {}, + variables => {}, + flags => {}, + ); + my $name = ""; + + foreach my $attr (keys %{$entry}) { + if ($attr eq 'objectclass') { + next; + } + my $values = $entry->{$attr}; + + $attr =~ s/([a-z])([A-Z])/$1.'_'.lc($2)/ge; + + debug "db $this->{name}" => "Setting data for $attr"; + foreach my $val (@{$values}) { + debug "db $this->{name}" => "$attr = $val"; + if ($attr eq 'owners') { + $ret{owners}->{$val}=1; + } elsif ($attr eq 'flags') { + $ret{flags}->{$val}='true'; + } elsif ($attr eq 'cn') { + $name = $val; + } elsif ($attr eq 'variables') { + my ($var, $value)=split(/\s*=\s*/, $val, 2); + $ret{variables}->{$var}=$value; + } else { + $val=~s/\\n/\n/g; + $ret{fields}->{$attr}=$val; + } + } + } + + $this->{cache}->{$name} = \%ret; + $this->{exists}->{$name} = 1; + } +} + + +1 |
