On Thu, May 04, 2006 at 10:31:14AM +0100 or thereabouts, Kostas Georgiou wrote:
> On Thu, May 04, 2006 at 09:37:05AM +0100, Steve Traylen wrote:
>
> > On Sat, Apr 29, 2006 at 06:37:47PM +0100 or thereabouts, Kostas Georgiou wrote:
> > >
> > > Correct me If I am wrong but shouldn't everything else read the data from
> > > the ldap server? The ldap server gets the ldif from lcg-info-generic but
> > > the attributes are stored as OIDs internally so the search will still give
> > > you the same results as the old script right?
> >
> > Of course you are correct again.
> >
> > After testing on a couple of other nodes not in production or where the
> > information is non critical it now deployed on our CE
> > lcgce01.gridpp.rl.ac.uk.
> >
> > Kostas, this clearly makes a difference in a good direction and should
> > be submitted up the tree for certification and deployment. I'm happy
> > to do that giving you credit of course if you want me to.
>
> I'll be happy if you can submit it upstream, I suspect that it will
> reach the right people a lot sooner if you do it instead of me.
>
> Here is a version that uses Net::LDAP::LDIF which makes the code a lot
> easier to read and it should be able to handle LDIF files a lot better
> than hand written regular expressions. The downside is that it requires
> yet another perl module but perl-Net-LDAP is already required by other
> packages so it's not that bad.
Comparing the outputs through a gris of the origional and your regex
one then the significant difference is the original showed
dn: GlueCEUniqueID=lcgce01.gridpp.rl.ac.uk:2119/jobmanager-lcgpbs-S,mds-vo-nam
e=local,o=grid
objectClass: GlueCETop
objectClass: GlueCE
objectClass: GlueSchemaVersion
objectClass: GlueCEAccessControlBase
objectClass: GlueCEInfo
objectClass: GlueCEPolicy
objectClass: GlueCEState
objectClass: GlueInformationService
objectClass: GlueKey
GlueCEHostingCluster: lcgce01.gridpp.rl.ac.uk
GlueCEName: S
GlueCEUniqueID: lcgce01.gridpp.rl.ac.uk:2119/jobmanager-lcgpbs-S
GlueCEInfoGatekeeperPort: 2119
GlueCEInfoHostName: lcgce01.gridpp.rl.ac.uk
GlueCEInfoLRMSType: torque
GlueCEInfoLRMSVersion: 2.0.0p7
and your one shows
dn: glueceuniqueid=lcgce01.gridpp.rl.ac.uk:2119/jobmanager-lcgpbs-s,mds-vo-nam
e=local,o=grid
GlueSchemaVersionMajor: 1
GlueCEPolicyAssignedJobSlots: 0
GlueCEInfoApplicationDir: /stage/sl3-lcg-exp
objectClass: GlueCETop
objectClass: GlueCE
objectClass: GlueSchemaVersion
objectClass: GlueCEAccessControlBase
objectClass: GlueCEInfo
objectClass: GlueCEPolicy
in particular this instance is lower case , are these both the same
instance in LDIF terms.
Now looking at the your perl('LDAP') version it shows it as
before with camel case instances.
# lcgce01.gridpp.rl.ac.uk:2119/jobmanager-lcgpbs-S, local, grid
dn: GlueCEUniqueID=lcgce01.gridpp.rl.ac.uk:2119/jobmanager-lcgpbs-S,mds-vo-nam
e=local,o=grid
objectClass: GlueCETop
objectClass: GlueCE
objectClass: GlueSchemaVersion
objectClass: GlueCEAccessControlBase
objectClass: GlueCEInfo
objectClass: GlueCEPolicy
objectClass: GlueCEState
objectClass: GlueInformationService
objectClass: GlueKey
GlueCEHostingCluster: lcgce01.gridpp.rl.ac.uk
GlueCEName: S
GlueCEUniqueID: lcgce01.gridpp.rl.ac.uk:2119/jobmanager-lcgpbs-S
GlueCEInfoGatekeeperPort: 2119
GlueCEInfoHostName: lcgce01.gridpp.rl.ac.uk
GlueCEInfoLRMSType: torque
GlueCEInfoLRMSVersion: 2.0.0p7
GlueCEInfoTotalCPUs: 856
GlueCEInfoJobManager: lcgpbs
so my suspician is that the 1st and 2nd outputs are not equivalent though
it does not matter since perl-Ldap one is probably less error prone
to the previous white space problems and such like.
Steve
>
> Cheers,
> Kostas
> #!/usr/bin/perl -w
> use strict;
> use POSIX;
> use File::stat;
> use FileHandle;
> use Net::LDAP::LDIF;
>
> # Read an ldif file and populate a hash with Net::LDAP::Entry objects.
> sub read_ldif_file($%) {
> my $file = shift;
> my $href = shift;
> my $ldif = Net::LDAP::LDIF->new( $file, "r", onerror => 'die');
> while( not $ldif->eof ( ) ) {
> my $entry = $ldif->read_entry ( );
> if ( ! defined( $href->{lc($entry->dn())} ) ) {
> $href->{lc($entry->dn())} = $entry;
> } else {
> my $old_entry = $href->{lc($entry->dn())};
> foreach my $attr ( $entry->attributes ) {
> $old_entry->add( $attr => $entry->get_value( $attr, asref => 1 ) );
> }
> }
> }
> $ldif->done();
> }
>
> # Set our process group to a distinct value
> setpgrp();
>
> #Read in the configuration file.
> my %config = (
> static_dir => '',
> plugin_dir => '',
> provider_dir => '',
> cache_ttl => '',
> freshness => '',
> timeout => '',
> response => '',
> temp_dir => '',
> );
>
> if ($ARGV[0]){
> my $fh = new FileHandle $ARGV[0]
> or die "Error: Can't open config file: $ARGV[0]\n";
> foreach (<$fh>){
> if ((! m/^\#/) & (m/=/)){
> m/^(.*)=(.*)$/;
> my $key=$1;
> my $value=$2;
> $key=~s/\s+//g;
> $value=~s/\s+//g;
> $config{$key}=$value;
> }
> }
> }else{
> print "Usage: lcg-info-generic <config file>\n";
> exit 1;
> }
>
> while ( my ($key, $value) = each(%config) ) {
> if ( ! $config{$key} ){
> print "Error: configuration parameter $key not set.\n";
> exit 2;
> }
> }
>
> my @files=glob("$config{static_dir}/*.ldif");
>
> my $dynamic_entries = {};
> my $static_entries = {};
> foreach(@files){
> #Reads the static ldif.
> read_ldif_file($_, $static_entries);
> }
>
> chomp($config{temp_dir});
> mkdir($config{temp_dir});
>
> my @dynamic;
> my @provider;
> my $pid;
> my @pid;
> my $file_time;
> my $current_time=time;
>
> #Remove junk files.
> my @junk;
> push @junk, glob("$config{plugin_dir}/*~");
> push @junk, glob("$config{provider_dir}/*~");
> push @junk, glob("$config{plugin_dir}/\#*");
> push @junk, glob("$config{provider_dir}/\#*");
>
> foreach(@junk){
> remove($_);
> }
>
> @dynamic=glob("$config{plugin_dir}/*");
> @provider=glob("$config{provider_dir}/*");
>
> for(@dynamic, @provider){
> my $chksum = unpack("%64C*", $_);
> my @file= split ( );
> $file[0]=~s/.*\///;
>
> if(! -e "$config{temp_dir}/$file[0].ldif.$chksum"){
> system("touch $config{temp_dir}/$file[0].ldif.$chksum");
> $file_time = $current_time - ($config{freshness}+1);
> }
> else{
> $file_time=stat("$config{temp_dir}/$file[0].ldif.$chksum");
> if($file_time){
> $file_time=$file_time->mtime;
> }else{
> $file_time=0;
> }
> }
>
> if($file_time + $config{freshness} < $current_time ){
>
> # Fork the search.
> unless ($pid=fork){
>
> close STDOUT;
>
> # Set our process group to a distinct value.
> setpgrp();
> my $PGRP=getpgrp();
>
> # Eval will kill the process if it times out.
> eval {
> local $SIG{ALRM} = sub { die "GOT TIRED OF WAITING" };
> alarm ($config{timeout}); #Will call alarm after the timeout.
> system("$_ > $config{temp_dir}/$file[0].ldif.$chksum.$PGRP");
> `mv $config{temp_dir}/$file[0].ldif.$chksum.$PGRP $config{temp_dir}/$file[0].ldif.$chksum`;
> alarm(0); # Cancel the pending alarm if responds.
> };
>
> # This sections is executed if the process times out.
> if ($@ =~ /GOT TIRED OF WAITING/) {
> `rm -f $config{temp_dir}/$file[0].ldif.$chksum.$PGRP`;
> kill (-SIGKILL(), $PGRP);
> exit 1;
> }
> exit 0;
> }
> push @pid, $pid;
> }
> }
>
> # Eval will kill the process if it times out.
> eval {
> local $SIG{ALRM} = sub { die "GOT TIRED OF WAITING" };
> alarm ($config{response}); #Will call alarm after the timeout.
> foreach(@pid){
> waitpid($_,0);
> }
> alarm(0); # Cancel the pending alarm if responds.
> };
>
> for(@provider){
> my $chksum = unpack("%64C*", $_);
> my @file= split ( );
> $file[0]=~s/.*\///;
> $file_time=stat("$config{temp_dir}/$file[0].ldif.$chksum");
> if($file_time){
> $file_time=$file_time->mtime;
> }else{
> $file_time=$current_time;
> }
> if($file_time + $config{cache_ttl} > $current_time ){
> #Reads the output from the provider script.
> read_ldif_file("$config{temp_dir}/$file[0].ldif.$chksum", $static_entries);
> }
> }
>
> for(@dynamic){
> my $chksum = unpack("%64C*", $_);
> my @file= split ( );
> $file[0]=~s/.*\///;
> $file_time=stat("$config{temp_dir}/$file[0].ldif.$chksum");
> if($file_time){
> $file_time=$file_time->mtime;
> }else{
> $file_time=$current_time;
> }
> if($file_time + $config{cache_ttl} > $current_time ){
> #Reads the output from the dynamic script.
> read_ldif_file("$config{temp_dir}/$file[0].ldif.$chksum", $dynamic_entries);
> }
> }
>
> # Merge dynamic values to the static ones
> # Dynamic entries without corresponding static entries are ignored
> foreach my $dn ( keys %$static_entries ) {
> if ( defined( $dynamic_entries->{$dn} ) ) {
> my $dynamic_entry = $dynamic_entries->{$dn};
> my $static_entry = $static_entries->{$dn};
> foreach my $attr ( $dynamic_entry->attributes() ) {
> if( $static_entry->exists($attr) ) {
> $static_entry->replace( $attr => $dynamic_entry->get_value( $attr, asref => 1 ) );
> }
> }
> }
> }
>
> # Write the ldif in STDOUT
> print "\n";
> my $ldif = new Net::LDAP::LDIF("-", "w",
> lowercase => 0,
> encode => 'none',
> wrap => 0);
> foreach my $entry ( values %$static_entries ) {
> $ldif->write( $entry );
> }
> $ldif->done();
> print "\n";
>
> exit;
--
Steve Traylen
[log in to unmask]
http://www.gridpp.ac.uk/
|