From 7760bfc8411a6e6d86b01f26b705a3be88cb201c Mon Sep 17 00:00:00 2001 From: =?utf8?q?Zden=C4=9Bk=20=C5=A0ustr?= Date: Tue, 25 Oct 2011 13:32:17 +0000 Subject: [PATCH] Merge branch_3_0 to HEAD. --- org.glite.jobid.api-c/configure | 41 +- org.glite.jobid.api-c/project/ChangeLog | 6 + org.glite.jobid.api-c/project/version.properties | 4 +- org.glite.jobid.api-c/src/cjobid.c | 12 +- org.glite.jobid.api-cpp/configure | 39 +- org.glite.jobid.api-cpp/project/ChangeLog | 6 + org.glite.jobid.api-cpp/project/version.properties | 4 +- org.glite.jobid.api-java/configure | 41 +- org.glite.jobid.api-java/project/ChangeLog | 6 + .../project/version.properties | 2 +- org.glite.jobid/project/version.properties | 4 +- org.glite.lb.client-java/Makefile | 2 +- org.glite.lb.client-java/configure | 39 +- org.glite.lb.client-java/project/ChangeLog | 7 + .../project/version.properties | 2 +- org.glite.lb.client/Makefile | 43 +- org.glite.lb.client/configure | 310 +++++++---- org.glite.lb.client/examples/user_jobs.c | 54 +- org.glite.lb.client/interface/stat_fields.h | 1 + org.glite.lb.client/project/ChangeLog | 17 + org.glite.lb.client/project/version.properties | 2 +- org.glite.lb.client/src/connection.c | 5 +- org.glite.lb.common/configure | 39 +- org.glite.lb.common/interface/context-int.h | 6 +- org.glite.lb.common/interface/context.h | 1 + org.glite.lb.common/project/ChangeLog | 9 + org.glite.lb.common/project/version.properties | 2 +- org.glite.lb.common/src/context.c | 66 +++ org.glite.lb.common/src/events_parse.c.T | 2 +- org.glite.lb.common/src/mini_http.c | 21 +- org.glite.lb.doc/Makefile | 7 +- org.glite.lb.doc/configure | 318 ++++++++---- org.glite.lb.doc/project/ChangeLog | 18 + org.glite.lb.doc/project/version.properties | 2 +- org.glite.lb.doc/src/LBAG-Installation.tex | 61 ++- org.glite.lb.doc/src/LBAG-Running.tex | 4 + org.glite.lb.doc/src/LBTP-Introduction.tex | 2 +- org.glite.lb.doc/src/LBTP-Nagios.tex | 124 +++++ org.glite.lb.doc/src/LBTP-Tests.tex | 100 ++-- org.glite.lb.doc/src/LBTP.tex | 5 +- org.glite.lb.doc/src/LBUG-Introduction.tex | 10 +- org.glite.lb.doc/src/LBUG-Tools.tex | 22 +- org.glite.lb.doc/src/emi.cls | 1 + org.glite.lb.doc/src/faq.tex | 59 +++ .../src/images/LB-components-LB-WMS.pdf | Bin 79142 -> 84385 bytes .../src/images/LB-components-query.pdf | Bin 47744 -> 56629 bytes org.glite.lb.doc/src/images/LB-components.pdf | Bin 86695 -> 93972 bytes org.glite.lb.doc/src/notify.tex | 6 +- org.glite.lb.glite-LB/project/ChangeLog | 6 + .../src/activemq_cpp_plugin.cpp | 1 + org.glite.lb.logger/configure | 318 ++++++++---- org.glite.lb.logger/project/ChangeLog | 3 + org.glite.lb.logger/project/version.properties | 2 +- org.glite.lb.logger/src/interlogd.c | 4 +- org.glite.lb.logger/src/logd.c | 6 +- org.glite.lb.logger/src/recover.c | 11 +- org.glite.lb.nagios/Makefile | 2 + org.glite.lb.nagios/configure | 28 +- org.glite.lb.nagios/project/ChangeLog | 3 +- org.glite.lb.nagios/project/package.description | 2 +- org.glite.lb.nagios/project/version.properties | 2 +- org.glite.lb.server/configure | 318 ++++++++---- org.glite.lb.server/project/ChangeLog | 28 + org.glite.lb.server/project/version.properties | 2 +- org.glite.lb.server/src/bkserverd.c | 65 ++- org.glite.lb.server/src/dump.c | 6 +- org.glite.lb.server/src/get_events.c.T | 16 +- org.glite.lb.server/src/lb_authz.c | 4 +- org.glite.lb.server/src/lb_http.c | 3 + org.glite.lb.server/src/lb_proto.c | 26 +- org.glite.lb.server/src/lb_text.c | 55 ++ org.glite.lb.server/src/lb_text.h | 1 + org.glite.lb.server/src/notification.c | 79 ++- org.glite.lb.server/src/query.c | 16 +- org.glite.lb.server/src/server_state.c | 47 +- org.glite.lb.server/src/srv_purge.c | 11 +- org.glite.lb.server/src/stats.c | 10 +- org.glite.lb.server/src/ws_typeref.c.T | 10 + org.glite.lb.state-machine/Makefile | 27 +- org.glite.lb.state-machine/project/.post | 1 + org.glite.lb.utils/configure | 39 +- org.glite.lb.utils/project/ChangeLog | 10 + org.glite.lb.utils/project/version.properties | 2 +- org.glite.lb.utils/src/dump.c | 36 +- org.glite.lb.utils/src/purge.c | 12 +- .../config/functions/config_glite_lb.in | 2 + .../config/functions/emi/config_info_service_lb | 3 + org.glite.lb.yaim/configure | 318 ++++++++---- org.glite.lb.yaim/project/ChangeLog | 9 + org.glite.lb.yaim/project/version.properties | 4 +- org.glite.lb/configure | 568 +++++++++++++++------ org.glite.lb/etics-tag-with-subsystems.pl | 2 +- org.glite.lb/etics-tag.pl | 52 +- org.glite.lb/project/version.properties | 2 +- org.glite.lbjp-common.gsoap-plugin/configure | 41 +- .../project/ChangeLog | 3 + .../project/version.properties | 2 +- org.glite.lbjp-common.gss/configure | 320 ++++++++---- org.glite.lbjp-common.gss/interface/glite_gss.h | 3 + org.glite.lbjp-common.gss/project/ChangeLog | 8 + .../project/doc/EMI_Logo_std.pdf | Bin 0 -> 34764 bytes org.glite.lbjp-common.gss/project/doc/Makefile | 3 + org.glite.lbjp-common.gss/project/doc/cesnet.pdf | Bin 0 -> 4518 bytes org.glite.lbjp-common.gss/project/doc/emi.cls | 490 ++++++++++++++++++ .../project/doc/lbjp-common-gss_FD.tex | 34 ++ .../project/version.properties | 2 +- org.glite.lbjp-common.gss/src/glite_gss.c | 289 +++++++---- org.glite.lbjp-common.jp-interface/configure | 41 +- .../project/ChangeLog | 6 + .../project/version.properties | 2 +- org.glite.lbjp-common.maildir/configure | 41 +- org.glite.lbjp-common.maildir/project/ChangeLog | 6 + .../project/version.properties | 2 +- org.glite.lbjp-common.server-bones/configure | 41 +- .../project/ChangeLog | 6 + .../project/version.properties | 4 +- org.glite.lbjp-common.server-bones/src/srvbones.c | 9 +- org.glite.lbjp-common.trio/configure | 41 +- org.glite.lbjp-common.trio/project/ChangeLog | 6 + .../project/version.properties | 2 +- org.glite.lbjp-common/project/version.properties | 4 +- 121 files changed, 3806 insertions(+), 1304 deletions(-) create mode 100644 org.glite.lb.doc/src/LBTP-Nagios.tex create mode 100644 org.glite.lb.state-machine/project/.post create mode 100644 org.glite.lbjp-common.gss/project/doc/EMI_Logo_std.pdf create mode 100644 org.glite.lbjp-common.gss/project/doc/Makefile create mode 100644 org.glite.lbjp-common.gss/project/doc/cesnet.pdf create mode 100644 org.glite.lbjp-common.gss/project/doc/emi.cls create mode 100644 org.glite.lbjp-common.gss/project/doc/lbjp-common-gss_FD.tex diff --git a/org.glite.jobid.api-c/configure b/org.glite.jobid.api-c/configure index 27f197c..e2b3330 100755 --- a/org.glite.jobid.api-c/configure +++ b/org.glite.jobid.api-c/configure @@ -248,6 +248,10 @@ $externs{'mysql-server'}{prefix}=$externs{mysql}{prefix} if $externs{'mysql-serv $externs{'mysql-devel'}{prefix}=$externs{mysql}{prefix} if $externs{'mysql-devel'}{prefix} eq ''; $externs{'gsoapxx'}{prefix}=$externs{gsoap}{prefix} if $externs{'gsoapxx'}{prefix} eq ''; +$externs{'mysql-server'}{withprefix}=$externs{mysql}{withprefix} if $externs{'mysql-server'}{withprefix} eq ''; +$externs{'mysql-devel'}{wihtprefix}=$externs{mysql}{withprefix} if $externs{'mysql-devel'}{withprefix} eq ''; +$externs{'gsoapxx'}{withprefix}=$externs{gsoap}{withprefix} if $externs{'gsoapxx'}{withprefix} eq ''; + %project = %{$projects{$project}}; for $_ (keys %{$project{etics_externs}}) { $etics_externs{$_} = $project{etics_externs}{$_}; @@ -423,7 +427,9 @@ sub mode_build { open MAK,">Makefile" or die "Makefile: $!\n"; - print MAK "all: @modules\n\nclean check:\n"; + print MAK "all: @modules\n\n"; + print MAK "stage: ".(join '-stage ', @modules)."-stage\n\n"; + print MAK "clean check install:\n"; for (@modules) { my $full = full($_); @@ -446,11 +452,13 @@ sub mode_build { @ldeps{@{$deps{$_}}} = 1; for my $x (split /,/,$staged) { delete $ldeps{$x}; } my @dnames = $module ? () : keys %ldeps; + my $snames = $#dnames == -1 ? '' : join('-stage ', @dnames).'-stage'; my $full = full($_); my $build = $buildroot{$_}; print MAK "$_: @dnames\n\tcd $full/$build && \${MAKE} && \${MAKE} install\n\n"; + print MAK "$_-stage: $snames\n\tcd $full/$build && \${MAKE} && \${MAKE} stage\n\n"; } close MAK; @@ -523,7 +531,7 @@ BEGIN{ 'lb.doc' => [ qw/tetex-latex:B/ ], 'lb.logger' => [ qw/cppunit:B libtool:B/ ], 'lb.logger-msg' => [ qw/cppunit:B activemq libtool:B/ ], - 'lb.server' => [ qw/globus_essentials:R globus:B expat cares mysql:R mysql-server:R mysql-devel:B cppunit:B gsoap:B classads voms lcas gridsite bison:B libtool:B libxml2/ ], + 'lb.server' => [ qw/globus_essentials:R globus:B expat cares mysql:R mysql-server:R mysql-devel:B cppunit:B gsoap:B classads voms lcas gridsite bison:B libtool:B libxml2 flex:B/ ], 'lb.state-machine' => [ qw/classads libtool:B libxslt:B expat:B/ ], 'lb.utils' => [ qw/cppunit:B libtool:B/ ], 'lb.ws-interface' => [ qw/libxslt:B/ ], @@ -539,7 +547,7 @@ BEGIN{ 'lbjp-common.gss' => [ qw/globus_essentials:R globus:B cares cppunit:B libtool:B/ ], 'lbjp-common.gsoap-plugin' => [ qw/cppunit:B globus_essentials:R globus:B cares:B gsoap gsoapxx libtool:B/ ], 'jobid.api-c' => [ qw/cppunit:B libtool:B openssl:B/ ], - 'jobid.api-cpp' => [ qw/cppunit:B/ ], + 'jobid.api-cpp' => [ qw/cppunit:B libtool:B/ ], 'jobid.api-java' => [ qw/ant:B jdk:B/ ], 'jp.client' => [ qw/gsoap libtar globus_essentials:R globus:B/ ], 'jp.doc' => [], @@ -556,7 +564,7 @@ BEGIN{ 'gridsite.services' => [ qw/curl:R gsoap:R/ ], 'gridsite.service-clients' => [ qw/curl:R gsoap:R gsoapxx:R/ ], 'gridsite.gsexec' => [ qw// ], - 'px.proxyrenewal' => [ qw/globus:B globus_essentials:R myproxy-devel:B myproxy-libs:R voms libtool:R/ ], + 'px.proxyrenewal' => [ qw/globus:B globus_essentials:R myproxy-devel:B myproxy-libs:R voms libtool:B/ ], 'px.myproxy-config' => [ qw/myproxy-admin:R/ ], # in myproxy-config.spec ); @@ -716,10 +724,11 @@ for my $ext (keys %deps_aux) { ); %conflicts = ( - 'lb.glite-LB' => [ qq/emi-lb/ ], - 'px.glite-PX' => [ qq/emi-px/ ], - 'lb.emi-lb' => [ qq/glite-LB/ ], - 'px.emi-px' => [ qq/glite-PX/ ], +); + +%provides = ( + 'lbjp-common.gss' => [ qq/glite-security-gss/ ], + 'lbjp-common.gsoap-plugin' => [ qq/glite-security-gsoap-plugin/ ], ); %cvs_prefix = ( @@ -815,7 +824,6 @@ for my $ext (keys %deps_aux) { gridsite=>'emi.gridsite.shared', yaim_core=>'emi.yaim.yaim-core', yaim_bdii=>'emi.bdii.yaim-bdii', - gip_release=>'emi.bdii.glite-info-provider-release', gip_service=>'emi.bdii.glite-info-provider-service', bdii=>'emi.bdii.core', glite_version=>'emi.misc.glite-version', @@ -845,11 +853,11 @@ for my $ext (keys %deps_aux) { jdk=>'java-devel', }, etics_projects => { - 'emi'=>[qw/voms voms-devel gridsite lcas gip_release gip_service bdii glite_version glue_schema yaim_core yaim_bdii trustmanager trustmanager_axis/], + 'emi'=>[qw/voms voms-devel gridsite lcas gip_service bdii glite_version glue_schema yaim_core yaim_bdii trustmanager trustmanager_axis/], }, need_externs_aux => { 'lb.client-java' => [ qw/ant:B jdk:B axis:B trustmanager trustmanager_axis libtool:B/ ], - 'lb.glite-LB' => [ qw/fetchcrl:R gip_release:R gip_service:R bdii:R glite_version:R glue_schema:R/ ], + 'lb.glite-LB' => [ qw/fetchcrl:R gip_service:R bdii:R glite_version:R glue_schema:R/ ], 'lb.yaim' => [ qw/yaim_core:R yaim_bdii:R perl-LDAP:R/ ], 'px.glite-PX' => [qw/myproxy-server:R myproxy-admin:R fetchcrl:R gip_service:R bdii:R glite_version:R glue_schema:R/], 'px.myproxy-yaim' => [ qw/yaim_core:R yaim_bdii:R/ ], @@ -1129,18 +1137,18 @@ sub mode_etics { if ($project ne 'glite') { $flags = 'RELEASE_VERSION=${age}.${platformFamily} libdir=${libdir} GSOAPDIR=`pkg-config gsoap --variable=prefix` OPENSSL_GLOBUS_FLAGS=`pkg-config globus-openssl --cflags` OPENSSL_GLOBUS_LIBS=`pkg-config globus-openssl --libs` FLAVOR_GLOBUS_EXT= HTTPD_FLAGS="-I/usr/include/httpd -I/usr/include/apache2 -I/usr/include/apr-${aprSuffix} -I/usr/include/pcre"'; - $prefix = "prefix=${prefix}/usr"; + $prefix = 'prefix=${prefix}/usr'; } else { $flags = 'RELEASE_VERSION=${age}.${platformFamily} libdir=${libdir} GSOAPDIR=${gsoap.location} OPENSSL_GLOBUS_FLAGS=-I${globus.location}/include/${globus.dbg.nothr.flavor} OPENSSL_GLOBUS_LIBS=-L${globus.location}/${libdir}/ FLAVOR_GLOBUS_EXT=_${globus.dbg.nothr.flavor} HTTPD_FLAGS="-I${httpd-devel.location}/include/httpd -I${httpd-devel.location}/include/apache2 -I${httpd-devel.location}/include/apr-${aprSuffix} -I${httpd-devel.location}/include/pcre"'; - $prefix = "prefix=${prefix}"; + $prefix = 'prefix=${prefix}'; } $cmd{compile} = "echo 'make $flags' > build.sh\n\tmake $flags build"; $cmd{clean} = "rm -rvf build.sh; $cmd{clean}"; $cmd{install} = "make $prefix $flags install"; - $cmd{packaging} = "mkdir ${moduleDir}/src/tgz + $cmd{packaging} = "mkdir \${moduleDir}/RPMTMP/SOURCES \${moduleDir}/src/tgz make $prefix $flags rpm && \ - cp ${moduleDir}/RPMTMP/SOURCES/gridsite-${version}.src.tar.gz ${moduleDir}/src/tgz"; + cp \${moduleDir}/RPMTMP/SOURCES/gridsite-\${version}.src.tar.gz \${moduleDir}/src/tgz"; } else { $cmd{clean} = 'None'; @@ -1218,6 +1226,9 @@ $package_description$package_summary$defprops}; for (@{$conflicts{"$subsys.$module"}}) { print C "package.conflicts = $_\n"; } + for (@{$provides{"$subsys.$module"}}) { + print C "package.provides = $_\n"; + } for my $pp (keys %{$platform_properties{"$subsys.$module"}}) { next if $pp eq 'default'; diff --git a/org.glite.jobid.api-c/project/ChangeLog b/org.glite.jobid.api-c/project/ChangeLog index f61346c..82eeef4 100644 --- a/org.glite.jobid.api-c/project/ChangeLog +++ b/org.glite.jobid.api-c/project/ChangeLog @@ -30,6 +30,9 @@ - Support for IPv6 literal addresses - Fixed notification ID parsing +1.0.7-1 +- Handling error returned by gethostbyname() (Savannah Bug #67627) + 2.0.0-1 - Version numbering fixed @@ -57,3 +60,6 @@ 2.0.2-5 - Module rebuilt +2.0.3-1 +- Handling error returned by gethostbyname() (Savannah Bug #67627) + diff --git a/org.glite.jobid.api-c/project/version.properties b/org.glite.jobid.api-c/project/version.properties index c007265..2196c4d 100644 --- a/org.glite.jobid.api-c/project/version.properties +++ b/org.glite.jobid.api-c/project/version.properties @@ -1,3 +1,3 @@ # : /cvs/jra1mw/org.glite.jobid.api-c/project/version.properties,v 1.1 2009/01/16 08:48:52 zsustr Exp $ -module.version=2.0.2 -module.age=5 +module.version=2.0.3 +module.age=1 diff --git a/org.glite.jobid.api-c/src/cjobid.c b/org.glite.jobid.api-c/src/cjobid.c index bfd4203..57da65c 100644 --- a/org.glite.jobid.api-c/src/cjobid.c +++ b/org.glite.jobid.api-c/src/cjobid.c @@ -51,6 +51,7 @@ int glite_jobid_recreate(const char* bkserver, int port, const char *unique, gli struct timeval tv; int skip; char* portbeg; + char* rndaddr = NULL; struct hostent* he; @@ -58,16 +59,17 @@ int glite_jobid_recreate(const char* bkserver, int port, const char *unique, gli return EINVAL; if (unique == NULL) { - gethostname(hostname, 100); - he = gethostbyname(hostname); - assert(he->h_length > 0); gettimeofday(&tv, NULL); srandom(tv.tv_usec); + gethostname(hostname, 100); + he = gethostbyname(hostname); + if (!he) asprintf(&rndaddr,"%d.%d.%d.%d",rand()%256,rand()%256,rand()%256,rand()%256); skip = strlen(hostname); skip += sprintf(hostname + skip, "-IP:0x%x-pid:%d-rnd:%d-time:%d:%d", - *((int*)he->h_addr_list[0]), getpid(), (int)random(), - (int)tv.tv_sec, (int)tv.tv_usec); + rndaddr ? rndaddr : *((int*)he->h_addr_list[0]), + getpid(), (int)random(), (int)tv.tv_sec, (int)tv.tv_usec); + free(rndaddr); } *jobId = NULL; diff --git a/org.glite.jobid.api-cpp/configure b/org.glite.jobid.api-cpp/configure index a67786b..e2b3330 100755 --- a/org.glite.jobid.api-cpp/configure +++ b/org.glite.jobid.api-cpp/configure @@ -248,6 +248,10 @@ $externs{'mysql-server'}{prefix}=$externs{mysql}{prefix} if $externs{'mysql-serv $externs{'mysql-devel'}{prefix}=$externs{mysql}{prefix} if $externs{'mysql-devel'}{prefix} eq ''; $externs{'gsoapxx'}{prefix}=$externs{gsoap}{prefix} if $externs{'gsoapxx'}{prefix} eq ''; +$externs{'mysql-server'}{withprefix}=$externs{mysql}{withprefix} if $externs{'mysql-server'}{withprefix} eq ''; +$externs{'mysql-devel'}{wihtprefix}=$externs{mysql}{withprefix} if $externs{'mysql-devel'}{withprefix} eq ''; +$externs{'gsoapxx'}{withprefix}=$externs{gsoap}{withprefix} if $externs{'gsoapxx'}{withprefix} eq ''; + %project = %{$projects{$project}}; for $_ (keys %{$project{etics_externs}}) { $etics_externs{$_} = $project{etics_externs}{$_}; @@ -423,7 +427,9 @@ sub mode_build { open MAK,">Makefile" or die "Makefile: $!\n"; - print MAK "all: @modules\n\nclean check:\n"; + print MAK "all: @modules\n\n"; + print MAK "stage: ".(join '-stage ', @modules)."-stage\n\n"; + print MAK "clean check install:\n"; for (@modules) { my $full = full($_); @@ -446,11 +452,13 @@ sub mode_build { @ldeps{@{$deps{$_}}} = 1; for my $x (split /,/,$staged) { delete $ldeps{$x}; } my @dnames = $module ? () : keys %ldeps; + my $snames = $#dnames == -1 ? '' : join('-stage ', @dnames).'-stage'; my $full = full($_); my $build = $buildroot{$_}; print MAK "$_: @dnames\n\tcd $full/$build && \${MAKE} && \${MAKE} install\n\n"; + print MAK "$_-stage: $snames\n\tcd $full/$build && \${MAKE} && \${MAKE} stage\n\n"; } close MAK; @@ -523,7 +531,7 @@ BEGIN{ 'lb.doc' => [ qw/tetex-latex:B/ ], 'lb.logger' => [ qw/cppunit:B libtool:B/ ], 'lb.logger-msg' => [ qw/cppunit:B activemq libtool:B/ ], - 'lb.server' => [ qw/globus_essentials:R globus:B expat cares mysql:R mysql-server:R mysql-devel:B cppunit:B gsoap:B classads voms lcas gridsite bison:B libtool:B libxml2/ ], + 'lb.server' => [ qw/globus_essentials:R globus:B expat cares mysql:R mysql-server:R mysql-devel:B cppunit:B gsoap:B classads voms lcas gridsite bison:B libtool:B libxml2 flex:B/ ], 'lb.state-machine' => [ qw/classads libtool:B libxslt:B expat:B/ ], 'lb.utils' => [ qw/cppunit:B libtool:B/ ], 'lb.ws-interface' => [ qw/libxslt:B/ ], @@ -556,7 +564,7 @@ BEGIN{ 'gridsite.services' => [ qw/curl:R gsoap:R/ ], 'gridsite.service-clients' => [ qw/curl:R gsoap:R gsoapxx:R/ ], 'gridsite.gsexec' => [ qw// ], - 'px.proxyrenewal' => [ qw/globus:B globus_essentials:R myproxy-devel:B myproxy-libs:R voms libtool:R/ ], + 'px.proxyrenewal' => [ qw/globus:B globus_essentials:R myproxy-devel:B myproxy-libs:R voms libtool:B/ ], 'px.myproxy-config' => [ qw/myproxy-admin:R/ ], # in myproxy-config.spec ); @@ -716,10 +724,11 @@ for my $ext (keys %deps_aux) { ); %conflicts = ( - 'lb.glite-LB' => [ qq/emi-lb/ ], - 'px.glite-PX' => [ qq/emi-px/ ], - 'lb.emi-lb' => [ qq/glite-LB/ ], - 'px.emi-px' => [ qq/glite-PX/ ], +); + +%provides = ( + 'lbjp-common.gss' => [ qq/glite-security-gss/ ], + 'lbjp-common.gsoap-plugin' => [ qq/glite-security-gsoap-plugin/ ], ); %cvs_prefix = ( @@ -815,7 +824,6 @@ for my $ext (keys %deps_aux) { gridsite=>'emi.gridsite.shared', yaim_core=>'emi.yaim.yaim-core', yaim_bdii=>'emi.bdii.yaim-bdii', - gip_release=>'emi.bdii.glite-info-provider-release', gip_service=>'emi.bdii.glite-info-provider-service', bdii=>'emi.bdii.core', glite_version=>'emi.misc.glite-version', @@ -845,11 +853,11 @@ for my $ext (keys %deps_aux) { jdk=>'java-devel', }, etics_projects => { - 'emi'=>[qw/voms voms-devel gridsite lcas gip_release gip_service bdii glite_version glue_schema yaim_core yaim_bdii trustmanager trustmanager_axis/], + 'emi'=>[qw/voms voms-devel gridsite lcas gip_service bdii glite_version glue_schema yaim_core yaim_bdii trustmanager trustmanager_axis/], }, need_externs_aux => { 'lb.client-java' => [ qw/ant:B jdk:B axis:B trustmanager trustmanager_axis libtool:B/ ], - 'lb.glite-LB' => [ qw/fetchcrl:R gip_release:R gip_service:R bdii:R glite_version:R glue_schema:R/ ], + 'lb.glite-LB' => [ qw/fetchcrl:R gip_service:R bdii:R glite_version:R glue_schema:R/ ], 'lb.yaim' => [ qw/yaim_core:R yaim_bdii:R perl-LDAP:R/ ], 'px.glite-PX' => [qw/myproxy-server:R myproxy-admin:R fetchcrl:R gip_service:R bdii:R glite_version:R glue_schema:R/], 'px.myproxy-yaim' => [ qw/yaim_core:R yaim_bdii:R/ ], @@ -1129,18 +1137,18 @@ sub mode_etics { if ($project ne 'glite') { $flags = 'RELEASE_VERSION=${age}.${platformFamily} libdir=${libdir} GSOAPDIR=`pkg-config gsoap --variable=prefix` OPENSSL_GLOBUS_FLAGS=`pkg-config globus-openssl --cflags` OPENSSL_GLOBUS_LIBS=`pkg-config globus-openssl --libs` FLAVOR_GLOBUS_EXT= HTTPD_FLAGS="-I/usr/include/httpd -I/usr/include/apache2 -I/usr/include/apr-${aprSuffix} -I/usr/include/pcre"'; - $prefix = "prefix=${prefix}/usr"; + $prefix = 'prefix=${prefix}/usr'; } else { $flags = 'RELEASE_VERSION=${age}.${platformFamily} libdir=${libdir} GSOAPDIR=${gsoap.location} OPENSSL_GLOBUS_FLAGS=-I${globus.location}/include/${globus.dbg.nothr.flavor} OPENSSL_GLOBUS_LIBS=-L${globus.location}/${libdir}/ FLAVOR_GLOBUS_EXT=_${globus.dbg.nothr.flavor} HTTPD_FLAGS="-I${httpd-devel.location}/include/httpd -I${httpd-devel.location}/include/apache2 -I${httpd-devel.location}/include/apr-${aprSuffix} -I${httpd-devel.location}/include/pcre"'; - $prefix = "prefix=${prefix}"; + $prefix = 'prefix=${prefix}'; } $cmd{compile} = "echo 'make $flags' > build.sh\n\tmake $flags build"; $cmd{clean} = "rm -rvf build.sh; $cmd{clean}"; $cmd{install} = "make $prefix $flags install"; - $cmd{packaging} = "mkdir ${moduleDir}/src/tgz + $cmd{packaging} = "mkdir \${moduleDir}/RPMTMP/SOURCES \${moduleDir}/src/tgz make $prefix $flags rpm && \ - cp ${moduleDir}/RPMTMP/SOURCES/gridsite-${version}.src.tar.gz ${moduleDir}/src/tgz"; + cp \${moduleDir}/RPMTMP/SOURCES/gridsite-\${version}.src.tar.gz \${moduleDir}/src/tgz"; } else { $cmd{clean} = 'None'; @@ -1218,6 +1226,9 @@ $package_description$package_summary$defprops}; for (@{$conflicts{"$subsys.$module"}}) { print C "package.conflicts = $_\n"; } + for (@{$provides{"$subsys.$module"}}) { + print C "package.provides = $_\n"; + } for my $pp (keys %{$platform_properties{"$subsys.$module"}}) { next if $pp eq 'default'; diff --git a/org.glite.jobid.api-cpp/project/ChangeLog b/org.glite.jobid.api-cpp/project/ChangeLog index d052ca3..a1099cf 100644 --- a/org.glite.jobid.api-cpp/project/ChangeLog +++ b/org.glite.jobid.api-cpp/project/ChangeLog @@ -20,6 +20,9 @@ 1.0.1-2 - Module rebuilt +1.0.1-3 +- Module rebuilt + 1.1.0-1 - Fixes for parallel release in EMI & gLite @@ -50,3 +53,6 @@ 1.1.2-6 - Module rebuilt +1.1.3-1 +- experiments with staging in summary Makefile in etics-less build + diff --git a/org.glite.jobid.api-cpp/project/version.properties b/org.glite.jobid.api-cpp/project/version.properties index 0cb77b4..01957f0 100644 --- a/org.glite.jobid.api-cpp/project/version.properties +++ b/org.glite.jobid.api-cpp/project/version.properties @@ -1,3 +1,3 @@ # : /cvs/glite/org.glite.jobid.api-cpp/project/version.properties,v 1.1 2009/01/16 08:48:52 zsustr Exp $ -module.version=1.1.2 -module.age=6 +module.version=1.1.3 +module.age=1 diff --git a/org.glite.jobid.api-java/configure b/org.glite.jobid.api-java/configure index 27f197c..e2b3330 100755 --- a/org.glite.jobid.api-java/configure +++ b/org.glite.jobid.api-java/configure @@ -248,6 +248,10 @@ $externs{'mysql-server'}{prefix}=$externs{mysql}{prefix} if $externs{'mysql-serv $externs{'mysql-devel'}{prefix}=$externs{mysql}{prefix} if $externs{'mysql-devel'}{prefix} eq ''; $externs{'gsoapxx'}{prefix}=$externs{gsoap}{prefix} if $externs{'gsoapxx'}{prefix} eq ''; +$externs{'mysql-server'}{withprefix}=$externs{mysql}{withprefix} if $externs{'mysql-server'}{withprefix} eq ''; +$externs{'mysql-devel'}{wihtprefix}=$externs{mysql}{withprefix} if $externs{'mysql-devel'}{withprefix} eq ''; +$externs{'gsoapxx'}{withprefix}=$externs{gsoap}{withprefix} if $externs{'gsoapxx'}{withprefix} eq ''; + %project = %{$projects{$project}}; for $_ (keys %{$project{etics_externs}}) { $etics_externs{$_} = $project{etics_externs}{$_}; @@ -423,7 +427,9 @@ sub mode_build { open MAK,">Makefile" or die "Makefile: $!\n"; - print MAK "all: @modules\n\nclean check:\n"; + print MAK "all: @modules\n\n"; + print MAK "stage: ".(join '-stage ', @modules)."-stage\n\n"; + print MAK "clean check install:\n"; for (@modules) { my $full = full($_); @@ -446,11 +452,13 @@ sub mode_build { @ldeps{@{$deps{$_}}} = 1; for my $x (split /,/,$staged) { delete $ldeps{$x}; } my @dnames = $module ? () : keys %ldeps; + my $snames = $#dnames == -1 ? '' : join('-stage ', @dnames).'-stage'; my $full = full($_); my $build = $buildroot{$_}; print MAK "$_: @dnames\n\tcd $full/$build && \${MAKE} && \${MAKE} install\n\n"; + print MAK "$_-stage: $snames\n\tcd $full/$build && \${MAKE} && \${MAKE} stage\n\n"; } close MAK; @@ -523,7 +531,7 @@ BEGIN{ 'lb.doc' => [ qw/tetex-latex:B/ ], 'lb.logger' => [ qw/cppunit:B libtool:B/ ], 'lb.logger-msg' => [ qw/cppunit:B activemq libtool:B/ ], - 'lb.server' => [ qw/globus_essentials:R globus:B expat cares mysql:R mysql-server:R mysql-devel:B cppunit:B gsoap:B classads voms lcas gridsite bison:B libtool:B libxml2/ ], + 'lb.server' => [ qw/globus_essentials:R globus:B expat cares mysql:R mysql-server:R mysql-devel:B cppunit:B gsoap:B classads voms lcas gridsite bison:B libtool:B libxml2 flex:B/ ], 'lb.state-machine' => [ qw/classads libtool:B libxslt:B expat:B/ ], 'lb.utils' => [ qw/cppunit:B libtool:B/ ], 'lb.ws-interface' => [ qw/libxslt:B/ ], @@ -539,7 +547,7 @@ BEGIN{ 'lbjp-common.gss' => [ qw/globus_essentials:R globus:B cares cppunit:B libtool:B/ ], 'lbjp-common.gsoap-plugin' => [ qw/cppunit:B globus_essentials:R globus:B cares:B gsoap gsoapxx libtool:B/ ], 'jobid.api-c' => [ qw/cppunit:B libtool:B openssl:B/ ], - 'jobid.api-cpp' => [ qw/cppunit:B/ ], + 'jobid.api-cpp' => [ qw/cppunit:B libtool:B/ ], 'jobid.api-java' => [ qw/ant:B jdk:B/ ], 'jp.client' => [ qw/gsoap libtar globus_essentials:R globus:B/ ], 'jp.doc' => [], @@ -556,7 +564,7 @@ BEGIN{ 'gridsite.services' => [ qw/curl:R gsoap:R/ ], 'gridsite.service-clients' => [ qw/curl:R gsoap:R gsoapxx:R/ ], 'gridsite.gsexec' => [ qw// ], - 'px.proxyrenewal' => [ qw/globus:B globus_essentials:R myproxy-devel:B myproxy-libs:R voms libtool:R/ ], + 'px.proxyrenewal' => [ qw/globus:B globus_essentials:R myproxy-devel:B myproxy-libs:R voms libtool:B/ ], 'px.myproxy-config' => [ qw/myproxy-admin:R/ ], # in myproxy-config.spec ); @@ -716,10 +724,11 @@ for my $ext (keys %deps_aux) { ); %conflicts = ( - 'lb.glite-LB' => [ qq/emi-lb/ ], - 'px.glite-PX' => [ qq/emi-px/ ], - 'lb.emi-lb' => [ qq/glite-LB/ ], - 'px.emi-px' => [ qq/glite-PX/ ], +); + +%provides = ( + 'lbjp-common.gss' => [ qq/glite-security-gss/ ], + 'lbjp-common.gsoap-plugin' => [ qq/glite-security-gsoap-plugin/ ], ); %cvs_prefix = ( @@ -815,7 +824,6 @@ for my $ext (keys %deps_aux) { gridsite=>'emi.gridsite.shared', yaim_core=>'emi.yaim.yaim-core', yaim_bdii=>'emi.bdii.yaim-bdii', - gip_release=>'emi.bdii.glite-info-provider-release', gip_service=>'emi.bdii.glite-info-provider-service', bdii=>'emi.bdii.core', glite_version=>'emi.misc.glite-version', @@ -845,11 +853,11 @@ for my $ext (keys %deps_aux) { jdk=>'java-devel', }, etics_projects => { - 'emi'=>[qw/voms voms-devel gridsite lcas gip_release gip_service bdii glite_version glue_schema yaim_core yaim_bdii trustmanager trustmanager_axis/], + 'emi'=>[qw/voms voms-devel gridsite lcas gip_service bdii glite_version glue_schema yaim_core yaim_bdii trustmanager trustmanager_axis/], }, need_externs_aux => { 'lb.client-java' => [ qw/ant:B jdk:B axis:B trustmanager trustmanager_axis libtool:B/ ], - 'lb.glite-LB' => [ qw/fetchcrl:R gip_release:R gip_service:R bdii:R glite_version:R glue_schema:R/ ], + 'lb.glite-LB' => [ qw/fetchcrl:R gip_service:R bdii:R glite_version:R glue_schema:R/ ], 'lb.yaim' => [ qw/yaim_core:R yaim_bdii:R perl-LDAP:R/ ], 'px.glite-PX' => [qw/myproxy-server:R myproxy-admin:R fetchcrl:R gip_service:R bdii:R glite_version:R glue_schema:R/], 'px.myproxy-yaim' => [ qw/yaim_core:R yaim_bdii:R/ ], @@ -1129,18 +1137,18 @@ sub mode_etics { if ($project ne 'glite') { $flags = 'RELEASE_VERSION=${age}.${platformFamily} libdir=${libdir} GSOAPDIR=`pkg-config gsoap --variable=prefix` OPENSSL_GLOBUS_FLAGS=`pkg-config globus-openssl --cflags` OPENSSL_GLOBUS_LIBS=`pkg-config globus-openssl --libs` FLAVOR_GLOBUS_EXT= HTTPD_FLAGS="-I/usr/include/httpd -I/usr/include/apache2 -I/usr/include/apr-${aprSuffix} -I/usr/include/pcre"'; - $prefix = "prefix=${prefix}/usr"; + $prefix = 'prefix=${prefix}/usr'; } else { $flags = 'RELEASE_VERSION=${age}.${platformFamily} libdir=${libdir} GSOAPDIR=${gsoap.location} OPENSSL_GLOBUS_FLAGS=-I${globus.location}/include/${globus.dbg.nothr.flavor} OPENSSL_GLOBUS_LIBS=-L${globus.location}/${libdir}/ FLAVOR_GLOBUS_EXT=_${globus.dbg.nothr.flavor} HTTPD_FLAGS="-I${httpd-devel.location}/include/httpd -I${httpd-devel.location}/include/apache2 -I${httpd-devel.location}/include/apr-${aprSuffix} -I${httpd-devel.location}/include/pcre"'; - $prefix = "prefix=${prefix}"; + $prefix = 'prefix=${prefix}'; } $cmd{compile} = "echo 'make $flags' > build.sh\n\tmake $flags build"; $cmd{clean} = "rm -rvf build.sh; $cmd{clean}"; $cmd{install} = "make $prefix $flags install"; - $cmd{packaging} = "mkdir ${moduleDir}/src/tgz + $cmd{packaging} = "mkdir \${moduleDir}/RPMTMP/SOURCES \${moduleDir}/src/tgz make $prefix $flags rpm && \ - cp ${moduleDir}/RPMTMP/SOURCES/gridsite-${version}.src.tar.gz ${moduleDir}/src/tgz"; + cp \${moduleDir}/RPMTMP/SOURCES/gridsite-\${version}.src.tar.gz \${moduleDir}/src/tgz"; } else { $cmd{clean} = 'None'; @@ -1218,6 +1226,9 @@ $package_description$package_summary$defprops}; for (@{$conflicts{"$subsys.$module"}}) { print C "package.conflicts = $_\n"; } + for (@{$provides{"$subsys.$module"}}) { + print C "package.provides = $_\n"; + } for my $pp (keys %{$platform_properties{"$subsys.$module"}}) { next if $pp eq 'default'; diff --git a/org.glite.jobid.api-java/project/ChangeLog b/org.glite.jobid.api-java/project/ChangeLog index 8ff359c..72a3fde 100644 --- a/org.glite.jobid.api-java/project/ChangeLog +++ b/org.glite.jobid.api-java/project/ChangeLog @@ -10,6 +10,9 @@ 1.0.3-2 - Module rebuilt +1.0.4-1 +- Makefile using external modules jakarta-commons-* + 1.1.0-1 - Fixes for parallel release in EMI & gLite @@ -37,3 +40,6 @@ 1.1.3-5 - Module rebuilt +1.1.3-6 +- Module rebuilt + diff --git a/org.glite.jobid.api-java/project/version.properties b/org.glite.jobid.api-java/project/version.properties index 8ab0b9a..4ed0652 100644 --- a/org.glite.jobid.api-java/project/version.properties +++ b/org.glite.jobid.api-java/project/version.properties @@ -1,3 +1,3 @@ # : /cvs/glite/org.glite.jobid.api-java/project/version.properties,v 1.5 2009/01/20 17:25:13 akrenek Exp $ module.version=1.1.3 -module.age=5 +module.age=6 diff --git a/org.glite.jobid/project/version.properties b/org.glite.jobid/project/version.properties index 89d344d..f7d88ed 100644 --- a/org.glite.jobid/project/version.properties +++ b/org.glite.jobid/project/version.properties @@ -1,3 +1,3 @@ # : /cvs/jra1mw/org.glite.jobid.api-c/project/version.properties,v 1.1 2009/01/16 08:48:52 zsustr Exp $ -module.version=2.0.3 -module.age=6 +module.version=2.0.4 +module.age=1 diff --git a/org.glite.lb.client-java/Makefile b/org.glite.lb.client-java/Makefile index 65579fe..ebf358d 100644 --- a/org.glite.lb.client-java/Makefile +++ b/org.glite.lb.client-java/Makefile @@ -18,7 +18,7 @@ JAVA:=${jdk_prefix}/bin/java GEN:=${stagedir}${prefix}/sbin/glite-lb-at3 ${top_srcdir}/project/genEventTypes.pl AT3DIR:=${stagedir}${prefix}/share/glite-lb/at3 -axis_classpath:=$(shell ls -1 ${axis_prefix}/lib/*.jar 2>/dev/null | tr '\012' :) +axis_classpath:=$(shell ls -1 ${axis_prefix}/lib/*.jar ${axis_prefix}/share/java/*.jar 2>/dev/null | tr '\012' :) trustmanager_classpath:=$(shell ls -1 ${trustmanager_prefix}/share/java/glite-security-trustmanager.jar ${trustmanager_prefix}/share/java/trustmanager.jar ${trustmanager_prefix}/share/java/trustmanager-axis.jar ${stagedir}${prefix}/share/java/trustmanager.jar ${stagedir}${prefix}/share/java/trustmanager-axis.jar 2>/dev/null | tr '\012' :) all compile: compile-java-axis compile-java-lb compile-java-gen compile-java-lb2 build-jar examples build-c diff --git a/org.glite.lb.client-java/configure b/org.glite.lb.client-java/configure index a67786b..e2b3330 100755 --- a/org.glite.lb.client-java/configure +++ b/org.glite.lb.client-java/configure @@ -248,6 +248,10 @@ $externs{'mysql-server'}{prefix}=$externs{mysql}{prefix} if $externs{'mysql-serv $externs{'mysql-devel'}{prefix}=$externs{mysql}{prefix} if $externs{'mysql-devel'}{prefix} eq ''; $externs{'gsoapxx'}{prefix}=$externs{gsoap}{prefix} if $externs{'gsoapxx'}{prefix} eq ''; +$externs{'mysql-server'}{withprefix}=$externs{mysql}{withprefix} if $externs{'mysql-server'}{withprefix} eq ''; +$externs{'mysql-devel'}{wihtprefix}=$externs{mysql}{withprefix} if $externs{'mysql-devel'}{withprefix} eq ''; +$externs{'gsoapxx'}{withprefix}=$externs{gsoap}{withprefix} if $externs{'gsoapxx'}{withprefix} eq ''; + %project = %{$projects{$project}}; for $_ (keys %{$project{etics_externs}}) { $etics_externs{$_} = $project{etics_externs}{$_}; @@ -423,7 +427,9 @@ sub mode_build { open MAK,">Makefile" or die "Makefile: $!\n"; - print MAK "all: @modules\n\nclean check:\n"; + print MAK "all: @modules\n\n"; + print MAK "stage: ".(join '-stage ', @modules)."-stage\n\n"; + print MAK "clean check install:\n"; for (@modules) { my $full = full($_); @@ -446,11 +452,13 @@ sub mode_build { @ldeps{@{$deps{$_}}} = 1; for my $x (split /,/,$staged) { delete $ldeps{$x}; } my @dnames = $module ? () : keys %ldeps; + my $snames = $#dnames == -1 ? '' : join('-stage ', @dnames).'-stage'; my $full = full($_); my $build = $buildroot{$_}; print MAK "$_: @dnames\n\tcd $full/$build && \${MAKE} && \${MAKE} install\n\n"; + print MAK "$_-stage: $snames\n\tcd $full/$build && \${MAKE} && \${MAKE} stage\n\n"; } close MAK; @@ -523,7 +531,7 @@ BEGIN{ 'lb.doc' => [ qw/tetex-latex:B/ ], 'lb.logger' => [ qw/cppunit:B libtool:B/ ], 'lb.logger-msg' => [ qw/cppunit:B activemq libtool:B/ ], - 'lb.server' => [ qw/globus_essentials:R globus:B expat cares mysql:R mysql-server:R mysql-devel:B cppunit:B gsoap:B classads voms lcas gridsite bison:B libtool:B libxml2/ ], + 'lb.server' => [ qw/globus_essentials:R globus:B expat cares mysql:R mysql-server:R mysql-devel:B cppunit:B gsoap:B classads voms lcas gridsite bison:B libtool:B libxml2 flex:B/ ], 'lb.state-machine' => [ qw/classads libtool:B libxslt:B expat:B/ ], 'lb.utils' => [ qw/cppunit:B libtool:B/ ], 'lb.ws-interface' => [ qw/libxslt:B/ ], @@ -556,7 +564,7 @@ BEGIN{ 'gridsite.services' => [ qw/curl:R gsoap:R/ ], 'gridsite.service-clients' => [ qw/curl:R gsoap:R gsoapxx:R/ ], 'gridsite.gsexec' => [ qw// ], - 'px.proxyrenewal' => [ qw/globus:B globus_essentials:R myproxy-devel:B myproxy-libs:R voms libtool:R/ ], + 'px.proxyrenewal' => [ qw/globus:B globus_essentials:R myproxy-devel:B myproxy-libs:R voms libtool:B/ ], 'px.myproxy-config' => [ qw/myproxy-admin:R/ ], # in myproxy-config.spec ); @@ -716,10 +724,11 @@ for my $ext (keys %deps_aux) { ); %conflicts = ( - 'lb.glite-LB' => [ qq/emi-lb/ ], - 'px.glite-PX' => [ qq/emi-px/ ], - 'lb.emi-lb' => [ qq/glite-LB/ ], - 'px.emi-px' => [ qq/glite-PX/ ], +); + +%provides = ( + 'lbjp-common.gss' => [ qq/glite-security-gss/ ], + 'lbjp-common.gsoap-plugin' => [ qq/glite-security-gsoap-plugin/ ], ); %cvs_prefix = ( @@ -815,7 +824,6 @@ for my $ext (keys %deps_aux) { gridsite=>'emi.gridsite.shared', yaim_core=>'emi.yaim.yaim-core', yaim_bdii=>'emi.bdii.yaim-bdii', - gip_release=>'emi.bdii.glite-info-provider-release', gip_service=>'emi.bdii.glite-info-provider-service', bdii=>'emi.bdii.core', glite_version=>'emi.misc.glite-version', @@ -845,11 +853,11 @@ for my $ext (keys %deps_aux) { jdk=>'java-devel', }, etics_projects => { - 'emi'=>[qw/voms voms-devel gridsite lcas gip_release gip_service bdii glite_version glue_schema yaim_core yaim_bdii trustmanager trustmanager_axis/], + 'emi'=>[qw/voms voms-devel gridsite lcas gip_service bdii glite_version glue_schema yaim_core yaim_bdii trustmanager trustmanager_axis/], }, need_externs_aux => { 'lb.client-java' => [ qw/ant:B jdk:B axis:B trustmanager trustmanager_axis libtool:B/ ], - 'lb.glite-LB' => [ qw/fetchcrl:R gip_release:R gip_service:R bdii:R glite_version:R glue_schema:R/ ], + 'lb.glite-LB' => [ qw/fetchcrl:R gip_service:R bdii:R glite_version:R glue_schema:R/ ], 'lb.yaim' => [ qw/yaim_core:R yaim_bdii:R perl-LDAP:R/ ], 'px.glite-PX' => [qw/myproxy-server:R myproxy-admin:R fetchcrl:R gip_service:R bdii:R glite_version:R glue_schema:R/], 'px.myproxy-yaim' => [ qw/yaim_core:R yaim_bdii:R/ ], @@ -1129,18 +1137,18 @@ sub mode_etics { if ($project ne 'glite') { $flags = 'RELEASE_VERSION=${age}.${platformFamily} libdir=${libdir} GSOAPDIR=`pkg-config gsoap --variable=prefix` OPENSSL_GLOBUS_FLAGS=`pkg-config globus-openssl --cflags` OPENSSL_GLOBUS_LIBS=`pkg-config globus-openssl --libs` FLAVOR_GLOBUS_EXT= HTTPD_FLAGS="-I/usr/include/httpd -I/usr/include/apache2 -I/usr/include/apr-${aprSuffix} -I/usr/include/pcre"'; - $prefix = "prefix=${prefix}/usr"; + $prefix = 'prefix=${prefix}/usr'; } else { $flags = 'RELEASE_VERSION=${age}.${platformFamily} libdir=${libdir} GSOAPDIR=${gsoap.location} OPENSSL_GLOBUS_FLAGS=-I${globus.location}/include/${globus.dbg.nothr.flavor} OPENSSL_GLOBUS_LIBS=-L${globus.location}/${libdir}/ FLAVOR_GLOBUS_EXT=_${globus.dbg.nothr.flavor} HTTPD_FLAGS="-I${httpd-devel.location}/include/httpd -I${httpd-devel.location}/include/apache2 -I${httpd-devel.location}/include/apr-${aprSuffix} -I${httpd-devel.location}/include/pcre"'; - $prefix = "prefix=${prefix}"; + $prefix = 'prefix=${prefix}'; } $cmd{compile} = "echo 'make $flags' > build.sh\n\tmake $flags build"; $cmd{clean} = "rm -rvf build.sh; $cmd{clean}"; $cmd{install} = "make $prefix $flags install"; - $cmd{packaging} = "mkdir ${moduleDir}/src/tgz + $cmd{packaging} = "mkdir \${moduleDir}/RPMTMP/SOURCES \${moduleDir}/src/tgz make $prefix $flags rpm && \ - cp ${moduleDir}/RPMTMP/SOURCES/gridsite-${version}.src.tar.gz ${moduleDir}/src/tgz"; + cp \${moduleDir}/RPMTMP/SOURCES/gridsite-\${version}.src.tar.gz \${moduleDir}/src/tgz"; } else { $cmd{clean} = 'None'; @@ -1218,6 +1226,9 @@ $package_description$package_summary$defprops}; for (@{$conflicts{"$subsys.$module"}}) { print C "package.conflicts = $_\n"; } + for (@{$provides{"$subsys.$module"}}) { + print C "package.provides = $_\n"; + } for my $pp (keys %{$platform_properties{"$subsys.$module"}}) { next if $pp eq 'default'; diff --git a/org.glite.lb.client-java/project/ChangeLog b/org.glite.lb.client-java/project/ChangeLog index 17fbf34..56c1dca 100644 --- a/org.glite.lb.client-java/project/ChangeLog +++ b/org.glite.lb.client-java/project/ChangeLog @@ -32,6 +32,9 @@ 1.0.5-6 - Module rebuilt +1.0.6-1 +- Support gcj java + 1.1.0-1 - Fixes for parallel release in EMI & gLite - CREAM_CORE->CREAM_EXECUTOR @@ -68,3 +71,7 @@ - '--stage=/' behaviour in fixed configure - wsdl files moved +1.1.6-1 +- Distinguish between generated and non-generated java files for FindBugs etics plugin +- Classes for non-generated files are built in build/classes directory now + diff --git a/org.glite.lb.client-java/project/version.properties b/org.glite.lb.client-java/project/version.properties index 55625ef..01b265a 100644 --- a/org.glite.lb.client-java/project/version.properties +++ b/org.glite.lb.client-java/project/version.properties @@ -1,3 +1,3 @@ # $Header$ -module.version=1.1.5 +module.version=1.1.6 module.age=1 diff --git a/org.glite.lb.client/Makefile b/org.glite.lb.client/Makefile index b4d4a3c..726cc36 100644 --- a/org.glite.lb.client/Makefile +++ b/org.glite.lb.client/Makefile @@ -5,7 +5,6 @@ globalprefix=glite lbprefix=lb package=glite-lb-client version=0.0.0 - CC:=gcc CXX:=g++ @@ -21,6 +20,12 @@ version=${module.version} VERSION_AHEAD=-3 +# hacks needed for ETICS: +# - rpath out of installation directory ${PREFIX} +# (the proper value is ${prefix}/${libdir}) +# - installed *.la files should be removed +rpath?=${PREFIX}${prefix}/${libdir} + VPATH=${top_srcdir}/src:${top_srcdir}/interface:${top_srcdir}/test:${top_srcdir}/examples:${top_srcdir}/doc AT3=${stagedir}${prefix}/sbin/glite-lb-at3 GENSAM=${top_srcdir}/examples/gen_sample_job @@ -107,7 +112,7 @@ EXT_LIB:= CPPUNIT_LIBS?=-L${cppunit_prefix}/${libdir} -lcppunit CPPUNIT_CFLAGS?=-I${cppunit_prefix}/include -LDFLAGS:=${LDFLAGS} -L${stagedir}${prefix}/${libdir} ${COVERAGE_FLAGS} +LDFLAGS:=${LDFLAGS} -L${stagedir}${prefix}/${libdir} -L${PREFIX}${prefix}/${libdir} ${COVERAGE_FLAGS} COMPILE:=libtool --mode=compile ${CC} ${CFLAGS} CXXCOMPILE:=libtool --mode=compile ${CXX} ${CXXFLAGS} @@ -206,28 +211,28 @@ default: all ifeq (${thrflavour},) ${LIB}: ${LIBTHROBJS} - ${LINK} ${version_info} -o $@ ${LIBTHRLOBJS} -rpath ${prefix}/${libdir} \ + ${LINK} ${version_info} -o $@ ${LIBTHRLOBJS} -rpath ${rpath} \ ${COMMON_LIB} ${TRIO_LIB} \ -lglite_security_gss ${PLUSLIB}: ${PLUSTHROBJS} ${LIB} - ${LINKXX} ${version_info} -o $@ ${PLUSTHRLOBJS} -rpath ${prefix}/${libdir} ${LIB} ${PLUS_EXTRA_LIB} + ${LINKXX} ${version_info} -o $@ ${PLUSTHRLOBJS} -rpath ${rpath} ${LIB} ${PLUS_EXTRA_LIB} else ${NOTHRLIB}: ${LIBOBJS} - ${LINK} ${version_info} -o $@ ${LIBLOBJS} -rpath ${prefix}/${libdir} \ + ${LINK} ${version_info} -o $@ ${LIBLOBJS} -rpath ${rpath} \ ${COMMON_LIB_NOTHR} ${TRIO_LIB} \ -lglite_security_gss_${nothrflavour} ${THRLIB}: ${LIBTHROBJS} - ${LINK} ${version_info} -o $@ ${LIBTHRLOBJS} -rpath ${prefix}/${libdir} \ + ${LINK} ${version_info} -o $@ ${LIBTHRLOBJS} -rpath ${rpath} \ ${COMMON_LIB_THR} ${TRIO_LIB} \ -lglite_security_gss_${thrflavour} ${NOTHRPLUSLIB}: ${PLUSOBJS} ${NOTHRLIB} - ${LINKXX} ${version_info} -o $@ ${PLUSLOBJS} -rpath ${prefix}/${libdir} ${NOTHRLIB} ${PLUS_EXTRA_LIB} + ${LINKXX} ${version_info} -o $@ ${PLUSLOBJS} -rpath ${rpath} ${NOTHRLIB} ${PLUS_EXTRA_LIB} ${THRPLUSLIB}: ${PLUSTHROBJS} ${THRLIB} - ${LINKXX} ${version_info} -o $@ ${PLUSTHRLOBJS} -rpath ${prefix}/${libdir} ${THRLIB} ${PLUS_EXTRA_LIB} + ${LINKXX} ${version_info} -o $@ ${PLUSTHRLOBJS} -rpath ${rpath} ${THRLIB} ${PLUS_EXTRA_LIB} endif logevent: logevent.o args.o @@ -399,5 +404,25 @@ clean: check_version: ${CHECK_VERSION} ${stagedir}${prefix}/include/glite/lb/common_version.h +post-install: + rm -rfv ${PREFIX}${prefix}/${libdir}/*.la + +post-install-rpath: + for file in `find ${PREFIX}${prefix}/${libdir} -type f` \ + `find ${PREFIX}${prefix}/bin -type f` \ + `find ${PREFIX}${prefix}/sbin -type f` \ + ; do \ + if test -h $$file; then continue; fi; \ + orpath=`chrpath -l $$file 2>/dev/null`; \ + if test $$? = 0 ; then \ + orpath=`echo $$orpath | sed 's:.*RPATH=::'`; \ + rpath=`echo $$orpath | sed "s:${PREFIX}${prefix}:${sysroot}${prefix}:g" | tr ':' '\n' | grep -v '^$$' | tr '\n' ':' | sed 's/:$$//'`; \ + if test "$$orpath" = "$$rpath"; then continue; fi; \ + echo "$$file"; \ + echo " -> $$rpath"; \ + chrpath -r $$rpath $$file; \ + chrpath -d $$file; \ + fi; \ + done -.PHONY: default all compile examples check stage install clean check_version link +.PHONY: default all compile examples check stage install clean check_version link post-install post-install-rpath diff --git a/org.glite.lb.client/configure b/org.glite.lb.client/configure index aace459..2e34da2 100755 --- a/org.glite.lb.client/configure +++ b/org.glite.lb.client/configure @@ -154,14 +154,6 @@ my %externs = ( prefix=>'/opt/activemq-cpp-library', pkg => 'activemq-cpp' }, - apr => { - prefix=>'/opt/apr', - pkg => 'apr-1' - }, - aprutil => { - prefix=>'/opt/apr-util', - pkg => 'apr-util-1' - }, ); my %jar = ( @@ -248,10 +240,18 @@ $externs{'mysql-server'}{prefix}=$externs{mysql}{prefix} if $externs{'mysql-serv $externs{'mysql-devel'}{prefix}=$externs{mysql}{prefix} if $externs{'mysql-devel'}{prefix} eq ''; $externs{'gsoapxx'}{prefix}=$externs{gsoap}{prefix} if $externs{'gsoapxx'}{prefix} eq ''; +$externs{'mysql-server'}{withprefix}=$externs{mysql}{withprefix} if $externs{'mysql-server'}{withprefix} eq ''; +$externs{'mysql-devel'}{wihtprefix}=$externs{mysql}{withprefix} if $externs{'mysql-devel'}{withprefix} eq ''; +$externs{'gsoapxx'}{withprefix}=$externs{gsoap}{withprefix} if $externs{'gsoapxx'}{withprefix} eq ''; + %project = %{$projects{$project}}; -for $_ (keys %{$project{etics_externs}}) { - $etics_externs{$_} = $project{etics_externs}{$_}; +for my $platform (keys %{$project{etics_externs}}) { + for $_ (keys %{$project{etics_externs}{$platform}}) { + $etics_externs{$platform}{$_} = $project{etics_externs}{$platform}{$_}; + } } +reshuffle_platforms(\%etics_externs, $project{supported_platforms}); +reshuffle_platforms(\%{$project{etics_externs_devel}}, $project{supported_platforms}); for $_ (keys %{$project{etics_projects}}) { $etics_projects{$_} = $project{etics_projects}{$_}; } @@ -504,18 +504,18 @@ sub mode_checkout() { BEGIN{ %etics_externs = ( - 'myproxy-devel'=>'myproxy-devel', - 'myproxy-libs'=>'myproxy-libs', - 'myproxy-server'=>'myproxy-server', - 'myproxy-admin'=>'myproxy-admin', - cares=>'c-ares', - voms=>'org.glite.security.voms-api-cpp', - utiljava=>'org.glite.security.util-java', - gpt=>'gpt', - fetchcrl=>'fetch-crl', - activemq=>'activemq-cpp-library', - apr=>'apr-dev', - aprutil=>'aprutil-dev', + default => { + 'myproxy-devel'=>'myproxy-devel', + 'myproxy-libs'=>'myproxy-libs', + 'myproxy-server'=>'myproxy-server', + 'myproxy-admin'=>'myproxy-admin', + cares=>'c-ares', + voms=>'org.glite.security.voms-api-cpp', + utiljava=>'org.glite.security.util-java', + gpt=>'gpt', + fetchcrl=>'fetch-crl', + activemq=>'activemq-cpp-library', + }, ); %etics_projects = ( @@ -560,7 +560,7 @@ BEGIN{ 'gridsite.services' => [ qw/curl:R gsoap:R/ ], 'gridsite.service-clients' => [ qw/curl:R gsoap:R gsoapxx:R/ ], 'gridsite.gsexec' => [ qw// ], - 'px.proxyrenewal' => [ qw/globus:B globus_essentials:R myproxy-devel:B myproxy-libs:R voms libtool:R/ ], + 'px.proxyrenewal' => [ qw/globus:B globus_essentials:R myproxy-devel:B myproxy-libs:R voms libtool:B/ ], 'px.myproxy-config' => [ qw/myproxy-admin:R/ ], # in myproxy-config.spec ); @@ -720,10 +720,11 @@ for my $ext (keys %deps_aux) { ); %conflicts = ( - 'lb.glite-LB' => [ qq/emi-lb/ ], - 'px.glite-PX' => [ qq/emi-px/ ], - 'lb.emi-lb' => [ qq/glite-LB/ ], - 'px.emi-px' => [ qq/glite-PX/ ], +); + +%provides = ( + 'lbjp-common.gss' => [ qq/glite-security-gss/ ], + 'lbjp-common.gsoap-plugin' => [ qq/glite-security-gsoap-plugin/ ], ); %cvs_prefix = ( @@ -753,6 +754,7 @@ for my $ext (keys %deps_aux) { # (${NAME.location}, ETICS conf. dependencies) # etics_projects ....... ETICS project names of externals # etics_externs_devel .. ETICS modules names of devel versions of externals +# etics_locations ...... ETICS locations in ${NAME.location} properties # need_externs_aux ..... project-specific external dependencies # supported_platforms .. platforms supported by the project # modules .............. additional modules in subsystems @@ -764,29 +766,37 @@ for my $ext (keys %deps_aux) { flavours => '--thrflavour=${globus.thr.flavor} --nothrflavour=${globus.nothr.flavor}', local_prefix => '', etics_externs => { - globus_essentials=>'vdt_globus_essentials', - globus=>'globus', - gridsite=>'org.gridsite.shared', - yaim_core=>'org.glite.yaim.core', - gip_release=>'glite-info-provider-release', - gip_service=>'glite-info-provider-service', - bdii=>'bdii', - glite_version=>'glite-version', - glite_info_templates=>'glite-info-templates', - glue_schema=>'glue-schema', - trustmanager=>'org.glite.security.trustmanager', - axis=>'axis', - lcas=>'org.glite.security.lcas', - gsoapxx=>'-', - build_common_cpp=>'org.glite.build.common-cpp', + default => { + globus_essentials=>'vdt_globus_essentials', + globus=>'globus', + gridsite=>'org.gridsite.shared', + yaim_core=>'org.glite.yaim.core', + gip_release=>'glite-info-provider-release', + gip_service=>'glite-info-provider-service', + bdii=>'bdii', + glite_version=>'glite-version', + glite_info_templates=>'glite-info-templates', + glue_schema=>'glue-schema', + trustmanager=>'org.glite.security.trustmanager', + axis=>'axis', + lcas=>'org.glite.security.lcas', + gsoapxx=>'-', + build_common_cpp=>'org.glite.build.common-cpp', + jdk=>'jdk', + }, }, etics_externs_devel => { - gridsite=>'org.gridsite.devel', + default => { + gridsite=>'org.gridsite.devel', + }, }, etics_projects => { vdt=>[qw/globus globus_essentials gpt/], 'org.glite'=>[qw/voms gridsite lcas gip_release gip_service bdii glite_version glite_info_templates glue_schema yaim_core/], }, + etics_locations => { + '*' => '', + }, need_externs_aux => { 'lb.client-java' => [ qw/ant:B jdk:B axis:B trustmanager utiljava libtool:B/ ], 'lb.glite-LB' => [ qw/fetchcrl:R gpt:R gip_release:R gip_service:R bdii:R glite_version:R glite_info_templates:R glue_schema:R/ ], @@ -794,10 +804,18 @@ for my $ext (keys %deps_aux) { 'px.glite-PX' => [qw/myproxy-server:R myproxy-admin:R fetchcrl:R gip_service:R bdii:R glite_version:R gpt:R glue_schema:R/], 'px.myproxy-yaim' => [ qw/yaim_core:R/ ], }, + supported_platforms => { + sl5_x86_64_gcc412 => 1, + sl5_ia32_gcc412 => 1, + deb5_x86_64_gcc432 => 1, + deb5_ia32_gcc432 => 1, + slc4_x86_64_gcc346 => 1, + slc4_ia32_gcc346 => 1, + }, modules => { 'lb' => [ qw/glite-LB/ ], 'px' => [ qw/glite-PX/ ], - } + }, }, emi => { @@ -814,46 +832,55 @@ for my $ext (keys %deps_aux) { flavours => '--thrflavour= --nothrflavour=', local_prefix => '/usr', etics_externs => { - globus_essentials=>'globus-gssapi-gsi', - globus=>'globus-gssapi-gsi-devel', - gridsite=>'emi.gridsite.shared', - yaim_core=>'emi.yaim.yaim-core', - yaim_bdii=>'emi.bdii.yaim-bdii', - gip_release=>'emi.bdii.glite-info-provider-release', - gip_service=>'emi.bdii.glite-info-provider-service', - bdii=>'emi.bdii.core', - glite_version=>'emi.misc.glite-version', - glue_schema=>'emi.bdii.glue-schema', - trustmanager=>'emi.java-security.trustmanager', - trustmanager_axis=>'emi.java-security.trustmanager-axis', - axis=>'axis1.4', - lcas=>'emi.sac.lcas', - gsoapxx=>'-', - build_common_cpp=>'emi.misc.glite.build-common-cpp', - jdk=>'java', + default => { + globus_essentials=>'globus-gssapi-gsi', + globus=>'globus-gssapi-gsi-devel', + gridsite=>'emi.gridsite.shared', + yaim_core=>'emi.yaim.yaim-core', + yaim_bdii=>'emi.bdii.yaim-bdii', + gip_service=>'emi.bdii.glite-info-provider-service', + bdii=>'emi.bdii.core', + glite_version=>'emi.misc.glite-version', + glue_schema=>'emi.bdii.glue-schema', + trustmanager=>'emi.java-security.trustmanager', + trustmanager_axis=>'emi.java-security.trustmanager-axis', + axis=>'axis1.4', + lcas=>'emi.sac.lcas', + gsoapxx=>'-', + build_common_cpp=>'emi.misc.glite.build-common-cpp', + jdk=>'java', + }, + sl5_x86_64_gcc412EPEL => { + 'myproxy-devel' => 'myproxy-devel.x86_64', + }, }, etics_externs_devel => { - cares => 'c-ares-devel', - classads => 'classads-devel', - cppunit => 'cppunit-devel', - expat => 'expat-devel', - gsoap => 'gsoap-devel', - voms => 'org.glite.security.voms-api', - libtar => 'libtar-devel', - log4c => 'log4c-devel', - postgresql => 'postgresql-devel', - curl => 'curl-devel', - libxml2 => 'libxml2-devel', - openssl => 'openssl-devel', - gridsite=>'emi.gridsite.devel', - jdk=>'java-devel', + default => { + cares => 'c-ares-devel', + classads => 'classads-devel', + cppunit => 'cppunit-devel', + expat => 'expat-devel', + gsoap => 'gsoap-devel', + voms => 'org.glite.security.voms-api', + libtar => 'libtar-devel', + log4c => 'log4c-devel', + postgresql => 'postgresql-devel', + curl => 'curl-devel', + libxml2 => 'libxml2-devel', + openssl => 'openssl-devel', + gridsite=>'emi.gridsite.devel', + jdk=>'java-devel', + }, }, etics_projects => { - 'emi'=>[qw/voms voms-devel gridsite lcas gip_release gip_service bdii glite_version glue_schema yaim_core yaim_bdii trustmanager trustmanager_axis/], + 'emi'=>[qw/voms voms-devel gridsite lcas gip_service bdii glite_version glue_schema yaim_core yaim_bdii trustmanager trustmanager_axis/], + }, + etics_locations => { + axis => 'axis', }, need_externs_aux => { 'lb.client-java' => [ qw/ant:B jdk:B axis:B trustmanager trustmanager_axis libtool:B/ ], - 'lb.glite-LB' => [ qw/fetchcrl:R gip_release:R gip_service:R bdii:R glite_version:R glue_schema:R/ ], + 'lb.glite-LB' => [ qw/fetchcrl:R gip_service:R bdii:R glite_version:R glue_schema:R/ ], 'lb.yaim' => [ qw/yaim_core:R yaim_bdii:R perl-LDAP:R/ ], 'px.glite-PX' => [qw/myproxy-server:R myproxy-admin:R fetchcrl:R gip_service:R bdii:R glite_version:R glue_schema:R/], 'px.myproxy-yaim' => [ qw/yaim_core:R yaim_bdii:R/ ], @@ -865,7 +892,7 @@ for my $ext (keys %deps_aux) { modules => { 'lb' => [ qw/emi-lb/ ], 'px' => [ qw/emi-px/ ], - } + }, }, ); @@ -1037,28 +1064,30 @@ sub mode_etics { close V; } + # XXX: --with ignored for platform-dependend packages my @copts = (); my %ge; @ge{@{$etics_projects{$project{etics_name}}}} = (1) x ($#{$etics_projects{$project{etics_name}}}+1); for (@{$need_externs{"$subsys.$module"}}) { if ($need_externs_type{"$subsys.$module"}->{$_}=~/B/ and (defined $externs{$_} or defined $jar{$_})) { - my $eext = $etics_externs{$_} ? $etics_externs{$_} : $_; + my $eext = $etics_externs{default}{$_} ? $etics_externs{default}{$_} : $_; next if ($eext eq '-'); - if ($project ne 'glite') { + if (defined $project{etics_locations}{'*'} or defined $project{etics_locations}{$_}) { + $eext = $project{etics_locations}{$_} if ($project{etics_locations}{$_}); + push @copts,$ge{$_} ? "--with-$_=\${stageDir}" : "--with-$_=\${$eext.location}"; + } else { if ($ge{$_} and not defined $externs{$_}{pkg}) { push @copts, "--with-$_=\${stageDir}"; } - } else { - push @copts,$ge{$_} ? "--with-$_=\${stageDir}" : "--with-$_=\${$eext.location}"; } } } for (@{$need_jars{"$subsys.$module"}}) { - my $eext = $etics_externs{$_} ? $etics_externs{$_} : $_; + my $eext = $etics_externs{default}{$_} ? $etics_externs{default}{$_} : $_; - push @copts,"--with-$_ \${$eext.location}$jar{$_}" if ($project eq 'glite'); + push @copts,"--with-$_ \${$eext.location}$jar{$_}" if (defined $project{etics_locations}{'*'} or defined $project{etics_locations}{$_}); } my $conf; @@ -1133,18 +1162,18 @@ sub mode_etics { if ($project ne 'glite') { $flags = 'RELEASE_VERSION=${age}.${platformFamily} libdir=${libdir} GSOAPDIR=`pkg-config gsoap --variable=prefix` OPENSSL_GLOBUS_FLAGS=`pkg-config globus-openssl --cflags` OPENSSL_GLOBUS_LIBS=`pkg-config globus-openssl --libs` FLAVOR_GLOBUS_EXT= HTTPD_FLAGS="-I/usr/include/httpd -I/usr/include/apache2 -I/usr/include/apr-${aprSuffix} -I/usr/include/pcre"'; - $prefix = "prefix=${prefix}/usr"; + $prefix = 'prefix=${prefix}/usr'; } else { $flags = 'RELEASE_VERSION=${age}.${platformFamily} libdir=${libdir} GSOAPDIR=${gsoap.location} OPENSSL_GLOBUS_FLAGS=-I${globus.location}/include/${globus.dbg.nothr.flavor} OPENSSL_GLOBUS_LIBS=-L${globus.location}/${libdir}/ FLAVOR_GLOBUS_EXT=_${globus.dbg.nothr.flavor} HTTPD_FLAGS="-I${httpd-devel.location}/include/httpd -I${httpd-devel.location}/include/apache2 -I${httpd-devel.location}/include/apr-${aprSuffix} -I${httpd-devel.location}/include/pcre"'; - $prefix = "prefix=${prefix}"; + $prefix = 'prefix=${prefix}'; } $cmd{compile} = "echo 'make $flags' > build.sh\n\tmake $flags build"; $cmd{clean} = "rm -rvf build.sh; $cmd{clean}"; $cmd{install} = "make $prefix $flags install"; - $cmd{packaging} = "mkdir ${moduleDir}/src/tgz + $cmd{packaging} = "mkdir \${moduleDir}/RPMTMP/SOURCES \${moduleDir}/src/tgz make $prefix $flags rpm && \ - cp ${moduleDir}/RPMTMP/SOURCES/gridsite-${version}.src.tar.gz ${moduleDir}/src/tgz"; + cp \${moduleDir}/RPMTMP/SOURCES/gridsite-\${version}.src.tar.gz \${moduleDir}/src/tgz"; } else { $cmd{clean} = 'None'; @@ -1161,6 +1190,10 @@ sub mode_etics { $cmd{compile} = 'make'; $cmd{test} = 'make check'; $cmd{install} = 'make install'; + if ($subsys eq 'lb' and $module eq 'client') { + $cmd{compile} = "make rpath=$project{local_prefix}/\${libdir}"; + $cmd{install} = "make install post-install rpath=$project{local_prefix}/\${libdir}"; + } } my $defprops = ''; @@ -1222,6 +1255,9 @@ $package_description$package_summary$defprops}; for (@{$conflicts{"$subsys.$module"}}) { print C "package.conflicts = $_\n"; } + for (@{$provides{"$subsys.$module"}}) { + print C "package.provides = $_\n"; + } for my $pp (keys %{$platform_properties{"$subsys.$module"}}) { next if $pp eq 'default'; @@ -1237,36 +1273,59 @@ package.SRPMSLocation = \${moduleDir}/RPMTMP/SRPMS\n"; print C "$package_description$package_summary\n"; } - print C qq{ -[Platform-default:DynamicDependency] + for my $platform ('default', keys %{$project{supported_platforms}}) { + my $used = 0; + + for (@{$need_externs{"$subsys.$module"}},@{$need_jars{"$subsys.$module"}}) { + my $eext = $etics_externs{$platform}{$_} ? $etics_externs{$platform}{$_} : $_; + my $edev = $project{etics_externs_devel}{$platform}{$_}; + next if ($eext eq '-'); + # dependencies not listed in etics_externs only for + # default platform + if (not defined $etics_externs{$platform}{$_} and + $platform ne 'default') { +#print "skipping $_ on $platform\n"; + next; + } + + if (not $used) { + print C qq{ +[Platform-$platform:DynamicDependency] }; - for (@{$need_externs{"$subsys.$module"}},@{$need_jars{"$subsys.$module"}}) { - my $eext = $etics_externs{$_} ? $etics_externs{$_} : $_; - my $edev = $project{etics_externs_devel}{$_}; - next if ($eext eq '-'); + $used = 1; + } - my $proj = 'externals'; - for my $p (keys %etics_projects) { - for $m (@{$etics_projects{$p}}) { - $proj = $p if $m eq $_; + my $proj = 'externals'; + for my $p (keys %etics_projects) { + for $m (@{$etics_projects{$p}}) { + $proj = $p if $m eq $_; + } } - } - my $type = $need_externs_type{"$subsys.$module"}->{$_}; + my $type = $need_externs_type{"$subsys.$module"}->{$_}; - if ($edev) { - if ($type eq 'B') { - $eext = $edev; # no runtime - change to devel pkg - } elsif ($type eq 'BR' or $type eq 'RB') { - print C "$proj|$edev = B\n"; # additional devel pkg + if ($edev) { + if ($type eq 'B') { + $eext = $edev; # no runtime - change to devel pkg + } elsif ($type eq 'BR' or $type eq 'RB') { + print C "$proj|$edev = B\n"; # additional devel pkg + } } + print C "$proj|$eext = $type\n"; } - print C "$proj|$eext = $type\n"; - } - for (@{$deps{"$subsys.$module"}}) { - my $type = $deps_type{"$subsys.$module"}->{$_}; - print C "$project{etics_name}|$project{etics_name}.$_ = $type\n"; + if ($platform eq 'default') { + for (@{$deps{"$subsys.$module"}}) { + my $type = $deps_type{"$subsys.$module"}->{$_}; + if (not $used) { + print C qq{ +[Platform-$platform:DynamicDependency] +}; + $used = 1; + } + print C "$project{etics_name}|$project{etics_name}.$_ = $type\n"; + } + } } close C; @@ -1337,6 +1396,37 @@ sub getlibdir { return $libdir; } +sub reshuffle_platforms($$) { + my ($data, $platforms) = @_; + my ($platform, %blacklist, $value); + + return if not $platforms; + + for $platform (keys %$data) { +#print "plat: $platform: $data->{$platform}\n"; + next if $platform eq 'default'; + for $_ (keys %{$data->{$platform}}) { +#print " blacklist: $_ = $data->{$platform}{$_}\n"; + $blacklist{$_} = 1; + } + } + + for $_ (keys %blacklist) { + if (defined $data->{default}{$_}) { + $value = $data->{default}{$_}; + $data->{default}{$_} = '-'; +#print " deleted $_ from default\n"; + for $platform (keys %$platforms) { + next if $platform eq 'default'; + if (not defined $data->{$platform}{$_}) { + $data->{$platform}{$_} = $value; +#print " added $value to $platform\n" + } + } + } + } +} + sub usage { my @ext = keys %externs; my @myjars = keys %jar; diff --git a/org.glite.lb.client/examples/user_jobs.c b/org.glite.lb.client/examples/user_jobs.c index f50e853..8518349 100644 --- a/org.glite.lb.client/examples/user_jobs.c +++ b/org.glite.lb.client/examples/user_jobs.c @@ -20,6 +20,7 @@ limitations under the License. #include #include #include +#include #include "glite/lb/context.h" #include "glite/lb/xml_conversions.h" @@ -31,13 +32,27 @@ limitations under the License. int use_proxy = 0; +static const char *get_opt_string = "hxn"; + +static struct option opts[] = { + {"help", 0, NULL, 'h'}, + {"proxy", 0, NULL, 'x'}, + {"no-states", 0, NULL, 'n'}, + {NULL, 0, NULL, 0} +}; + int (*user_jobs)(edg_wll_Context, edg_wlc_JobId **, edg_wll_JobStat **); void usage(char *me) { - fprintf(stderr,"usage: %s [-h] [-x] [userid]\n", me); + fprintf(stderr,"usage: %s [options] [userid]\n" + "\t-h, --help show this help\n" + "\t-x, --proxy contact proxy\n" + "\t-n, --no-states do not show job states" + "\n", + me); } int main(int argc,char **argv) @@ -46,21 +61,31 @@ int main(int argc,char **argv) char *errt,*errd; edg_wlc_JobId *jobs = NULL; edg_wll_JobStat *states = NULL; - int i,j; + int opt,i,j; char *owner = NULL; + int show_states = 1; user_jobs = edg_wll_UserJobs; - for ( i = 1; i < argc; i++ ) { - if ( !strcmp(argv[i], "-h") || !strcmp(argv[i], "--help") ) { + + while ((opt = getopt_long(argc, argv, get_opt_string, opts, NULL)) != EOF) { + switch (opt) { + case 'h': usage(argv[0]); exit(0); - } else if ( !strcmp(argv[i], "-x") ) { + case 'x': user_jobs = edg_wll_UserJobsProxy; - continue; + break; + case 'n': + show_states = 0; + break; + default: + if (owner || !optarg) { + usage(argv[0]); + exit(1); + } + owner = strdup(optarg); + break; } - - owner = strdup(argv[i]); - break; } if (edg_wll_InitContext(&ctx) != 0) { @@ -70,8 +95,8 @@ int main(int argc,char **argv) if ( user_jobs == edg_wll_UserJobsProxy && owner ) edg_wll_SetParam(ctx, EDG_WLL_PARAM_LBPROXY_USER, owner); - if (user_jobs(ctx,&jobs,&states)) goto err; - for (i=0; states[i].state != EDG_WLL_JOB_UNDEF; i++) { + if (user_jobs(ctx,&jobs,show_states ? &states : NULL)) goto err; + for (i=0; states && states[i].state != EDG_WLL_JOB_UNDEF; i++) { char *id = edg_wlc_JobIdUnparse(states[i].jobId), *st = edg_wll_StatToString(states[i].state); @@ -103,6 +128,13 @@ int main(int argc,char **argv) free(id); free(st); } + if (!show_states) { + for (i = 0; jobs[i]; i++) { + char *id = edg_wlc_JobIdUnparse(jobs[i]); + printf(" %s\n", id); + free(id); + } + } printf("\nFound %d jobs\n",i); diff --git a/org.glite.lb.client/interface/stat_fields.h b/org.glite.lb.client/interface/stat_fields.h index 2b1f5f7..95ac0fc 100644 --- a/org.glite.lb.client/interface/stat_fields.h +++ b/org.glite.lb.client/interface/stat_fields.h @@ -24,6 +24,7 @@ void glite_lb_print_stat_fields(void **,edg_wll_JobStat *); void glite_lb_dump_stat_fields(void); #include +#include static char *TimeToStr(time_t t) { diff --git a/org.glite.lb.client/project/ChangeLog b/org.glite.lb.client/project/ChangeLog index 3546e97..8427200 100644 --- a/org.glite.lb.client/project/ChangeLog +++ b/org.glite.lb.client/project/ChangeLog @@ -126,6 +126,12 @@ 4.1.8-1 - Optimized handling of simultaneous proxy&direct logging (fix for bug #77366) +4.1.9-1 +- Fixed default setting for GLITE_LB_EXPORT_PURGE_ARGS + +4.1.10-1 +- Proper handling of background purge error messages (fix for bug #77974) + 5.0.0-1 - Fixes for parallel release in EMI & gLite - Version numbering fixed @@ -176,3 +182,14 @@ 5.0.6-1 - Using rpath only as $prefix/$libdir (fixes rpmlint rpath check in mock environment) + +5.0.7-1 +- Fixed default setting for GLITE_LB_EXPORT_PURGE_ARGS +- Proper handling of background purge error messages (fix for bug #77974) +- Fix locations in automatic purge (SB #81646). +- Makefile adjustments for eticsless build + +5.0.8-1 +- Finalized ETICS+rpath+libtool mock build problem, workaround inside ETICS configurations now +- Fixing rpath problem in mock builds + diff --git a/org.glite.lb.client/project/version.properties b/org.glite.lb.client/project/version.properties index c7cfe5d..66da56e 100644 --- a/org.glite.lb.client/project/version.properties +++ b/org.glite.lb.client/project/version.properties @@ -1,3 +1,3 @@ # $Header$ -module.version=5.0.6 +module.version=5.0.8 module.age=1 diff --git a/org.glite.lb.client/src/connection.c b/org.glite.lb.client/src/connection.c index e5ab489..2b56382 100644 --- a/org.glite.lb.client/src/connection.c +++ b/org.glite.lb.client/src/connection.c @@ -568,7 +568,10 @@ int http_check_status( break; case HTTP_UNSUPPORTED: edg_wll_SetError(ctx, ENOTSUP, "Protocol versions incompatible"); - break; + break; + case HTTP_ACCEPTED: + edg_wll_SetError(ctx,EDG_WLL_ERROR_ACCEPTED_OK,response+len); + break; case HTTP_INTERNAL: /* fall through */ default: diff --git a/org.glite.lb.common/configure b/org.glite.lb.common/configure index a67786b..e2b3330 100755 --- a/org.glite.lb.common/configure +++ b/org.glite.lb.common/configure @@ -248,6 +248,10 @@ $externs{'mysql-server'}{prefix}=$externs{mysql}{prefix} if $externs{'mysql-serv $externs{'mysql-devel'}{prefix}=$externs{mysql}{prefix} if $externs{'mysql-devel'}{prefix} eq ''; $externs{'gsoapxx'}{prefix}=$externs{gsoap}{prefix} if $externs{'gsoapxx'}{prefix} eq ''; +$externs{'mysql-server'}{withprefix}=$externs{mysql}{withprefix} if $externs{'mysql-server'}{withprefix} eq ''; +$externs{'mysql-devel'}{wihtprefix}=$externs{mysql}{withprefix} if $externs{'mysql-devel'}{withprefix} eq ''; +$externs{'gsoapxx'}{withprefix}=$externs{gsoap}{withprefix} if $externs{'gsoapxx'}{withprefix} eq ''; + %project = %{$projects{$project}}; for $_ (keys %{$project{etics_externs}}) { $etics_externs{$_} = $project{etics_externs}{$_}; @@ -423,7 +427,9 @@ sub mode_build { open MAK,">Makefile" or die "Makefile: $!\n"; - print MAK "all: @modules\n\nclean check:\n"; + print MAK "all: @modules\n\n"; + print MAK "stage: ".(join '-stage ', @modules)."-stage\n\n"; + print MAK "clean check install:\n"; for (@modules) { my $full = full($_); @@ -446,11 +452,13 @@ sub mode_build { @ldeps{@{$deps{$_}}} = 1; for my $x (split /,/,$staged) { delete $ldeps{$x}; } my @dnames = $module ? () : keys %ldeps; + my $snames = $#dnames == -1 ? '' : join('-stage ', @dnames).'-stage'; my $full = full($_); my $build = $buildroot{$_}; print MAK "$_: @dnames\n\tcd $full/$build && \${MAKE} && \${MAKE} install\n\n"; + print MAK "$_-stage: $snames\n\tcd $full/$build && \${MAKE} && \${MAKE} stage\n\n"; } close MAK; @@ -523,7 +531,7 @@ BEGIN{ 'lb.doc' => [ qw/tetex-latex:B/ ], 'lb.logger' => [ qw/cppunit:B libtool:B/ ], 'lb.logger-msg' => [ qw/cppunit:B activemq libtool:B/ ], - 'lb.server' => [ qw/globus_essentials:R globus:B expat cares mysql:R mysql-server:R mysql-devel:B cppunit:B gsoap:B classads voms lcas gridsite bison:B libtool:B libxml2/ ], + 'lb.server' => [ qw/globus_essentials:R globus:B expat cares mysql:R mysql-server:R mysql-devel:B cppunit:B gsoap:B classads voms lcas gridsite bison:B libtool:B libxml2 flex:B/ ], 'lb.state-machine' => [ qw/classads libtool:B libxslt:B expat:B/ ], 'lb.utils' => [ qw/cppunit:B libtool:B/ ], 'lb.ws-interface' => [ qw/libxslt:B/ ], @@ -556,7 +564,7 @@ BEGIN{ 'gridsite.services' => [ qw/curl:R gsoap:R/ ], 'gridsite.service-clients' => [ qw/curl:R gsoap:R gsoapxx:R/ ], 'gridsite.gsexec' => [ qw// ], - 'px.proxyrenewal' => [ qw/globus:B globus_essentials:R myproxy-devel:B myproxy-libs:R voms libtool:R/ ], + 'px.proxyrenewal' => [ qw/globus:B globus_essentials:R myproxy-devel:B myproxy-libs:R voms libtool:B/ ], 'px.myproxy-config' => [ qw/myproxy-admin:R/ ], # in myproxy-config.spec ); @@ -716,10 +724,11 @@ for my $ext (keys %deps_aux) { ); %conflicts = ( - 'lb.glite-LB' => [ qq/emi-lb/ ], - 'px.glite-PX' => [ qq/emi-px/ ], - 'lb.emi-lb' => [ qq/glite-LB/ ], - 'px.emi-px' => [ qq/glite-PX/ ], +); + +%provides = ( + 'lbjp-common.gss' => [ qq/glite-security-gss/ ], + 'lbjp-common.gsoap-plugin' => [ qq/glite-security-gsoap-plugin/ ], ); %cvs_prefix = ( @@ -815,7 +824,6 @@ for my $ext (keys %deps_aux) { gridsite=>'emi.gridsite.shared', yaim_core=>'emi.yaim.yaim-core', yaim_bdii=>'emi.bdii.yaim-bdii', - gip_release=>'emi.bdii.glite-info-provider-release', gip_service=>'emi.bdii.glite-info-provider-service', bdii=>'emi.bdii.core', glite_version=>'emi.misc.glite-version', @@ -845,11 +853,11 @@ for my $ext (keys %deps_aux) { jdk=>'java-devel', }, etics_projects => { - 'emi'=>[qw/voms voms-devel gridsite lcas gip_release gip_service bdii glite_version glue_schema yaim_core yaim_bdii trustmanager trustmanager_axis/], + 'emi'=>[qw/voms voms-devel gridsite lcas gip_service bdii glite_version glue_schema yaim_core yaim_bdii trustmanager trustmanager_axis/], }, need_externs_aux => { 'lb.client-java' => [ qw/ant:B jdk:B axis:B trustmanager trustmanager_axis libtool:B/ ], - 'lb.glite-LB' => [ qw/fetchcrl:R gip_release:R gip_service:R bdii:R glite_version:R glue_schema:R/ ], + 'lb.glite-LB' => [ qw/fetchcrl:R gip_service:R bdii:R glite_version:R glue_schema:R/ ], 'lb.yaim' => [ qw/yaim_core:R yaim_bdii:R perl-LDAP:R/ ], 'px.glite-PX' => [qw/myproxy-server:R myproxy-admin:R fetchcrl:R gip_service:R bdii:R glite_version:R glue_schema:R/], 'px.myproxy-yaim' => [ qw/yaim_core:R yaim_bdii:R/ ], @@ -1129,18 +1137,18 @@ sub mode_etics { if ($project ne 'glite') { $flags = 'RELEASE_VERSION=${age}.${platformFamily} libdir=${libdir} GSOAPDIR=`pkg-config gsoap --variable=prefix` OPENSSL_GLOBUS_FLAGS=`pkg-config globus-openssl --cflags` OPENSSL_GLOBUS_LIBS=`pkg-config globus-openssl --libs` FLAVOR_GLOBUS_EXT= HTTPD_FLAGS="-I/usr/include/httpd -I/usr/include/apache2 -I/usr/include/apr-${aprSuffix} -I/usr/include/pcre"'; - $prefix = "prefix=${prefix}/usr"; + $prefix = 'prefix=${prefix}/usr'; } else { $flags = 'RELEASE_VERSION=${age}.${platformFamily} libdir=${libdir} GSOAPDIR=${gsoap.location} OPENSSL_GLOBUS_FLAGS=-I${globus.location}/include/${globus.dbg.nothr.flavor} OPENSSL_GLOBUS_LIBS=-L${globus.location}/${libdir}/ FLAVOR_GLOBUS_EXT=_${globus.dbg.nothr.flavor} HTTPD_FLAGS="-I${httpd-devel.location}/include/httpd -I${httpd-devel.location}/include/apache2 -I${httpd-devel.location}/include/apr-${aprSuffix} -I${httpd-devel.location}/include/pcre"'; - $prefix = "prefix=${prefix}"; + $prefix = 'prefix=${prefix}'; } $cmd{compile} = "echo 'make $flags' > build.sh\n\tmake $flags build"; $cmd{clean} = "rm -rvf build.sh; $cmd{clean}"; $cmd{install} = "make $prefix $flags install"; - $cmd{packaging} = "mkdir ${moduleDir}/src/tgz + $cmd{packaging} = "mkdir \${moduleDir}/RPMTMP/SOURCES \${moduleDir}/src/tgz make $prefix $flags rpm && \ - cp ${moduleDir}/RPMTMP/SOURCES/gridsite-${version}.src.tar.gz ${moduleDir}/src/tgz"; + cp \${moduleDir}/RPMTMP/SOURCES/gridsite-\${version}.src.tar.gz \${moduleDir}/src/tgz"; } else { $cmd{clean} = 'None'; @@ -1218,6 +1226,9 @@ $package_description$package_summary$defprops}; for (@{$conflicts{"$subsys.$module"}}) { print C "package.conflicts = $_\n"; } + for (@{$provides{"$subsys.$module"}}) { + print C "package.provides = $_\n"; + } for my $pp (keys %{$platform_properties{"$subsys.$module"}}) { next if $pp eq 'default'; diff --git a/org.glite.lb.common/interface/context-int.h b/org.glite.lb.common/interface/context-int.h index e348c14..a558155 100644 --- a/org.glite.lb.common/interface/context-int.h +++ b/org.glite.lb.common/interface/context-int.h @@ -172,7 +172,7 @@ glite_lb_padded_struct(_edg_wll_Context,150, void *notif_index_cols; time_t notifDurationMax; - char **super_users; + char **msg_prefixes; time_t rssTime; _edg_wll_authz_policy authz_policy; @@ -181,6 +181,8 @@ glite_lb_padded_struct(_edg_wll_Context,150, int (*processRequest_cb)(edg_wll_Context ctx); void *processRequestUserData; + + char **msg_brokers; ) /* to be used internally: set, update and and clear the error information in @@ -222,6 +224,8 @@ extern int edg_wll_IncSequenceCode(edg_wll_Context ctx); extern void edg_wll_FreeParams(edg_wll_Context context); +extern int edg_wll_ParseMSGConf(char *msg_conf, char ***brokers, char ***prefixes); + #ifdef __cplusplus } #endif diff --git a/org.glite.lb.common/interface/context.h b/org.glite.lb.common/interface/context.h index ab0b1b2..ad5953d 100644 --- a/org.glite.lb.common/interface/context.h +++ b/org.glite.lb.common/interface/context.h @@ -214,6 +214,7 @@ typedef enum _edg_wll_ErrorCode { EDG_WLL_ERROR_COMPARE_EVENTS, /**< Two compared events differ. */ EDG_WLL_ERROR_DB_TRANS_DEADLOCK, /**< Deadlock detected during DB operation. */ EDG_WLL_ERROR_DB_LOST_CONNECTION, /**< Lost connection to DB */ + EDG_WLL_ERROR_ACCEPTED_OK, /**< Deferred or background operation accepted. */ } edg_wll_ErrorCode; /** diff --git a/org.glite.lb.common/project/ChangeLog b/org.glite.lb.common/project/ChangeLog index 38bb5e7..d03a9de 100644 --- a/org.glite.lb.common/project/ChangeLog +++ b/org.glite.lb.common/project/ChangeLog @@ -108,6 +108,10 @@ 7.1.9-1 - Prevent interlogger files from getting corrupted when disk is full +7.1.10-1 +- Proper handling of background purge error messages (fix for bug #77974) +- Better detection of excessively long lines in HTTP requests. + 8.0.0-1 - Fixes for parallel release in EMI & gLite - Version numbering fixed @@ -150,3 +154,8 @@ - at3 location detection reverted - '--stage=/' behaviour fixed in configure +8.0.6-1 +- Proper handling of background purge error messages (fix for bug #77974) +- Better detection of excessively long lines in HTTP requests. +- Interpretting Messaging broker names and topic prefixes + diff --git a/org.glite.lb.common/project/version.properties b/org.glite.lb.common/project/version.properties index e90e8a5..edc2936 100644 --- a/org.glite.lb.common/project/version.properties +++ b/org.glite.lb.common/project/version.properties @@ -1,3 +1,3 @@ # $Header$ -module.version=8.0.5 +module.version=8.0.6 module.age=1 diff --git a/org.glite.lb.common/src/context.c b/org.glite.lb.common/src/context.c index d905525..44d9c8b 100644 --- a/org.glite.lb.common/src/context.c +++ b/org.glite.lb.common/src/context.c @@ -196,6 +196,20 @@ void edg_wll_FreeContext(edg_wll_Context ctx) if (ctx->jpreg_dir) free(ctx->jpreg_dir); if (ctx->serverIdentity) free(ctx->serverIdentity); + if (ctx->msg_prefixes) { + char **fm; + for (fm = ctx->msg_prefixes; fm && *fm; fm++) + free(*fm); + free(ctx->msg_prefixes); + ctx->msg_prefixes = NULL; + } + if (ctx->msg_brokers) { + char **fm; + for (fm = ctx->msg_brokers; fm && *fm; fm++) + free(*fm); + free(ctx->msg_brokers); + ctx->msg_brokers = NULL; + } edg_wll_FreeParams(ctx); @@ -225,6 +239,8 @@ static const char* const errTexts[] = { "Interlogger has events pending", "Compared events differ", "DB deadlock detected", + "DB connection lost", + "Background operation accepted", }; const char *edg_wll_GetErrorText(int code) { @@ -679,3 +695,53 @@ edg_wll_add_authz_rule(edg_wll_Context ctx, return 0; } + +int +edg_wll_ParseMSGConf(char *msg_conf, char ***brokers, char ***prefixes) { + FILE *conf; + char l[512]; + char *data, *d_to_parse; + int inmsg = 0, ntoks; + char *tok_r = NULL; + char *token; + char **tokens; + + + conf = fopen (msg_conf, "r"); + if (conf == NULL) return -1; //Cannot open file + + while( 1 ) { + fgets(l, 512, conf); + if ( feof(conf) ) break; + + if (l[0] == '[') { // Detect section [msg] + if (!strncasecmp(l, "[msg]", 5)) inmsg = 1; + else inmsg = 0; + } + else if (inmsg) { + if ((!strncasecmp(l, "prefix", 6)) || (!strncasecmp(l, "broker", 6))) { + data=strchr(l, '='); + if (!data) return -2; // No '=' +// data = data[1]; + if (strlen(data) < 1) return -2; // No text after '=' + + tokens = NULL; ntoks = 0; + for (d_to_parse = data+1; ; d_to_parse = NULL) { + token = strtok_r(d_to_parse, " \t\n", &tok_r); + if (token == NULL) break; + + tokens = (char**) realloc (tokens, sizeof(char**) * (ntoks + 2)); + asprintf(&(tokens[ntoks]), "%s", token); + tokens[++ntoks] = NULL; + } + + if (!strncasecmp(l, "prefix", 6)) *prefixes=tokens; + else *brokers=tokens; + } + + } + + } + + return 0; +} diff --git a/org.glite.lb.common/src/events_parse.c.T b/org.glite.lb.common/src/events_parse.c.T index 438c769..e95070d 100644 --- a/org.glite.lb.common/src/events_parse.c.T +++ b/org.glite.lb.common/src/events_parse.c.T @@ -60,7 +60,7 @@ char *my_edg_wll_ULMGetValueAt( p_edg_wll_ULMFields, int ); #define MISUSE { \ char *e = edg_wll_EventToString(eventcode); \ char *k = edg_wll_KeyNameToString(keycode); \ - sprintf(err_desc,"Key %s schouldn't be used for event type %s.", k,e); \ + sprintf(err_desc,"Key %s shouldn't be used for event type %s.", k,e); \ free(e); \ free(k); \ ret=edg_wll_SetError(context,EDG_WLL_ERROR_PARSE_KEY_MISUSE,err_desc); \ diff --git a/org.glite.lb.common/src/mini_http.c b/org.glite.lb.common/src/mini_http.c index 0788cdf..472d578 100644 --- a/org.glite.lb.common/src/mini_http.c +++ b/org.glite.lb.common/src/mini_http.c @@ -97,7 +97,14 @@ edg_wll_ErrorCode edg_wll_http_recv(edg_wll_Context ctx,char **firstOut,char *** first = strdup(connPTR->buf); bshift(cr-connPTR->buf+2); pstat = HEAD; - } else rdmore = 1; + } else { + if (connPTR->bufUse >= connPTR->bufSize) { + edg_wll_SetError(ctx,E2BIG,"HTTP Request FIRST line too long"); + free(connPTR->buf); connPTR->buf = NULL; + connPTR->bufUse = 0; connPTR->bufSize = 0; + goto error; } + rdmore = 1; + } break; case HEAD: if ((cr = memchr(connPTR->buf,'\r',connPTR->bufUse)) && @@ -119,7 +126,14 @@ edg_wll_ErrorCode edg_wll_http_recv(edg_wll_Context ctx,char **firstOut,char *** clen = atoi(connPTR->buf+sizeof(CONTENT_LENGTH)-1); bshift(cr-connPTR->buf+2); - } else rdmore = 1; + } else { + if (connPTR->bufUse >= connPTR->bufSize) { + edg_wll_SetError(ctx,E2BIG,"HTTP Request HEAD line too long"); + free(connPTR->buf); connPTR->buf = NULL; + connPTR->bufUse = 0; connPTR->bufSize = 0; + goto error; } + rdmore = 1; + } break; case BODY: if (connPTR->bufUse) { @@ -181,7 +195,7 @@ edg_wll_ErrorCode edg_wll_http_recv_proxy(edg_wll_Context ctx,char **firstOut,ch if ( !ctx->connProxy->buf ) { ctx->connProxy->bufSize = BUFSIZ; ctx->connProxy->bufUse = 0; - ctx->connProxy->buf = malloc(BUFSIZ); + ctx->connProxy->buf = malloc(ctx->connProxy->bufSize); } do { @@ -199,7 +213,6 @@ edg_wll_ErrorCode edg_wll_http_recv_proxy(edg_wll_Context ctx,char **firstOut,ch while (!rdmore && pstat != DONE) switch (pstat) { char *cr; - case FIRST: if ((cr = memchr(ctx->connProxy->buf,'\r',ctx->connProxy->bufUse)) && ctx->connProxy->bufUse >= cr-ctx->connProxy->buf+2 && cr[1] == '\n') diff --git a/org.glite.lb.doc/Makefile b/org.glite.lb.doc/Makefile index 490d011..0051699 100644 --- a/org.glite.lb.doc/Makefile +++ b/org.glite.lb.doc/Makefile @@ -53,7 +53,7 @@ doc: LBUG.pdf LBAG.pdf LBDG.pdf LBTP.pdf LBTG.pdf chmod -w $@ >/dev/null ver.tex: - @echo "\def\version{${version}}" > ver.tex + printf "\134def\134version{${version}}\n" > ver.tex stage: doc $(MAKE) install PREFIX=${stagedir} @@ -72,7 +72,7 @@ install: ${INSTALL} -m 644 LBTG.pdf ${DESTDIR}${PREFIX}${prefix}/share/doc/${package}-${version} # install DG example sources for p in ${top_srcdir}/examples/*; do \ - if [ "$$p" == "${top_srcdir}/examples/CVS" ]; then continue; fi; \ + if [ "$$p" = "${top_srcdir}/examples/CVS" ]; then continue; fi; \ ${INSTALL} -m 644 "$$p" "${DESTDIR}${PREFIX}${prefix}/share/doc/${package}-${version}/examples"; \ done @@ -124,7 +124,8 @@ LBTP.pdf: ${COMMON} \ LBTP-IntegrationTests.tex \ LBTP-Tests.tex \ LBTP-PerfTests.tex \ - LBTP-InterTests.tex + LBTP-InterTests.tex \ + LBTP-Nagios.tex LBTG.pdf: ${COMMON} \ LBTG.tex \ diff --git a/org.glite.lb.doc/configure b/org.glite.lb.doc/configure index a67786b..2e34da2 100755 --- a/org.glite.lb.doc/configure +++ b/org.glite.lb.doc/configure @@ -154,14 +154,6 @@ my %externs = ( prefix=>'/opt/activemq-cpp-library', pkg => 'activemq-cpp' }, - apr => { - prefix=>'/opt/apr', - pkg => 'apr-1' - }, - aprutil => { - prefix=>'/opt/apr-util', - pkg => 'apr-util-1' - }, ); my %jar = ( @@ -248,10 +240,18 @@ $externs{'mysql-server'}{prefix}=$externs{mysql}{prefix} if $externs{'mysql-serv $externs{'mysql-devel'}{prefix}=$externs{mysql}{prefix} if $externs{'mysql-devel'}{prefix} eq ''; $externs{'gsoapxx'}{prefix}=$externs{gsoap}{prefix} if $externs{'gsoapxx'}{prefix} eq ''; +$externs{'mysql-server'}{withprefix}=$externs{mysql}{withprefix} if $externs{'mysql-server'}{withprefix} eq ''; +$externs{'mysql-devel'}{wihtprefix}=$externs{mysql}{withprefix} if $externs{'mysql-devel'}{withprefix} eq ''; +$externs{'gsoapxx'}{withprefix}=$externs{gsoap}{withprefix} if $externs{'gsoapxx'}{withprefix} eq ''; + %project = %{$projects{$project}}; -for $_ (keys %{$project{etics_externs}}) { - $etics_externs{$_} = $project{etics_externs}{$_}; +for my $platform (keys %{$project{etics_externs}}) { + for $_ (keys %{$project{etics_externs}{$platform}}) { + $etics_externs{$platform}{$_} = $project{etics_externs}{$platform}{$_}; + } } +reshuffle_platforms(\%etics_externs, $project{supported_platforms}); +reshuffle_platforms(\%{$project{etics_externs_devel}}, $project{supported_platforms}); for $_ (keys %{$project{etics_projects}}) { $etics_projects{$_} = $project{etics_projects}{$_}; } @@ -423,7 +423,9 @@ sub mode_build { open MAK,">Makefile" or die "Makefile: $!\n"; - print MAK "all: @modules\n\nclean check:\n"; + print MAK "all: @modules\n\n"; + print MAK "stage: ".(join '-stage ', @modules)."-stage\n\n"; + print MAK "clean check install:\n"; for (@modules) { my $full = full($_); @@ -446,11 +448,13 @@ sub mode_build { @ldeps{@{$deps{$_}}} = 1; for my $x (split /,/,$staged) { delete $ldeps{$x}; } my @dnames = $module ? () : keys %ldeps; + my $snames = $#dnames == -1 ? '' : join('-stage ', @dnames).'-stage'; my $full = full($_); my $build = $buildroot{$_}; print MAK "$_: @dnames\n\tcd $full/$build && \${MAKE} && \${MAKE} install\n\n"; + print MAK "$_-stage: $snames\n\tcd $full/$build && \${MAKE} && \${MAKE} stage\n\n"; } close MAK; @@ -500,18 +504,18 @@ sub mode_checkout() { BEGIN{ %etics_externs = ( - 'myproxy-devel'=>'myproxy-devel', - 'myproxy-libs'=>'myproxy-libs', - 'myproxy-server'=>'myproxy-server', - 'myproxy-admin'=>'myproxy-admin', - cares=>'c-ares', - voms=>'org.glite.security.voms-api-cpp', - utiljava=>'org.glite.security.util-java', - gpt=>'gpt', - fetchcrl=>'fetch-crl', - activemq=>'activemq-cpp-library', - apr=>'apr-dev', - aprutil=>'aprutil-dev', + default => { + 'myproxy-devel'=>'myproxy-devel', + 'myproxy-libs'=>'myproxy-libs', + 'myproxy-server'=>'myproxy-server', + 'myproxy-admin'=>'myproxy-admin', + cares=>'c-ares', + voms=>'org.glite.security.voms-api-cpp', + utiljava=>'org.glite.security.util-java', + gpt=>'gpt', + fetchcrl=>'fetch-crl', + activemq=>'activemq-cpp-library', + }, ); %etics_projects = ( @@ -523,7 +527,7 @@ BEGIN{ 'lb.doc' => [ qw/tetex-latex:B/ ], 'lb.logger' => [ qw/cppunit:B libtool:B/ ], 'lb.logger-msg' => [ qw/cppunit:B activemq libtool:B/ ], - 'lb.server' => [ qw/globus_essentials:R globus:B expat cares mysql:R mysql-server:R mysql-devel:B cppunit:B gsoap:B classads voms lcas gridsite bison:B libtool:B libxml2/ ], + 'lb.server' => [ qw/globus_essentials:R globus:B expat cares mysql:R mysql-server:R mysql-devel:B cppunit:B gsoap:B classads voms lcas gridsite bison:B libtool:B libxml2 flex:B/ ], 'lb.state-machine' => [ qw/classads libtool:B libxslt:B expat:B/ ], 'lb.utils' => [ qw/cppunit:B libtool:B/ ], 'lb.ws-interface' => [ qw/libxslt:B/ ], @@ -556,7 +560,7 @@ BEGIN{ 'gridsite.services' => [ qw/curl:R gsoap:R/ ], 'gridsite.service-clients' => [ qw/curl:R gsoap:R gsoapxx:R/ ], 'gridsite.gsexec' => [ qw// ], - 'px.proxyrenewal' => [ qw/globus:B globus_essentials:R myproxy-devel:B myproxy-libs:R voms libtool:R/ ], + 'px.proxyrenewal' => [ qw/globus:B globus_essentials:R myproxy-devel:B myproxy-libs:R voms libtool:B/ ], 'px.myproxy-config' => [ qw/myproxy-admin:R/ ], # in myproxy-config.spec ); @@ -716,10 +720,11 @@ for my $ext (keys %deps_aux) { ); %conflicts = ( - 'lb.glite-LB' => [ qq/emi-lb/ ], - 'px.glite-PX' => [ qq/emi-px/ ], - 'lb.emi-lb' => [ qq/glite-LB/ ], - 'px.emi-px' => [ qq/glite-PX/ ], +); + +%provides = ( + 'lbjp-common.gss' => [ qq/glite-security-gss/ ], + 'lbjp-common.gsoap-plugin' => [ qq/glite-security-gsoap-plugin/ ], ); %cvs_prefix = ( @@ -749,6 +754,7 @@ for my $ext (keys %deps_aux) { # (${NAME.location}, ETICS conf. dependencies) # etics_projects ....... ETICS project names of externals # etics_externs_devel .. ETICS modules names of devel versions of externals +# etics_locations ...... ETICS locations in ${NAME.location} properties # need_externs_aux ..... project-specific external dependencies # supported_platforms .. platforms supported by the project # modules .............. additional modules in subsystems @@ -760,29 +766,37 @@ for my $ext (keys %deps_aux) { flavours => '--thrflavour=${globus.thr.flavor} --nothrflavour=${globus.nothr.flavor}', local_prefix => '', etics_externs => { - globus_essentials=>'vdt_globus_essentials', - globus=>'globus', - gridsite=>'org.gridsite.shared', - yaim_core=>'org.glite.yaim.core', - gip_release=>'glite-info-provider-release', - gip_service=>'glite-info-provider-service', - bdii=>'bdii', - glite_version=>'glite-version', - glite_info_templates=>'glite-info-templates', - glue_schema=>'glue-schema', - trustmanager=>'org.glite.security.trustmanager', - axis=>'axis', - lcas=>'org.glite.security.lcas', - gsoapxx=>'-', - build_common_cpp=>'org.glite.build.common-cpp', + default => { + globus_essentials=>'vdt_globus_essentials', + globus=>'globus', + gridsite=>'org.gridsite.shared', + yaim_core=>'org.glite.yaim.core', + gip_release=>'glite-info-provider-release', + gip_service=>'glite-info-provider-service', + bdii=>'bdii', + glite_version=>'glite-version', + glite_info_templates=>'glite-info-templates', + glue_schema=>'glue-schema', + trustmanager=>'org.glite.security.trustmanager', + axis=>'axis', + lcas=>'org.glite.security.lcas', + gsoapxx=>'-', + build_common_cpp=>'org.glite.build.common-cpp', + jdk=>'jdk', + }, }, etics_externs_devel => { - gridsite=>'org.gridsite.devel', + default => { + gridsite=>'org.gridsite.devel', + }, }, etics_projects => { vdt=>[qw/globus globus_essentials gpt/], 'org.glite'=>[qw/voms gridsite lcas gip_release gip_service bdii glite_version glite_info_templates glue_schema yaim_core/], }, + etics_locations => { + '*' => '', + }, need_externs_aux => { 'lb.client-java' => [ qw/ant:B jdk:B axis:B trustmanager utiljava libtool:B/ ], 'lb.glite-LB' => [ qw/fetchcrl:R gpt:R gip_release:R gip_service:R bdii:R glite_version:R glite_info_templates:R glue_schema:R/ ], @@ -790,10 +804,18 @@ for my $ext (keys %deps_aux) { 'px.glite-PX' => [qw/myproxy-server:R myproxy-admin:R fetchcrl:R gip_service:R bdii:R glite_version:R gpt:R glue_schema:R/], 'px.myproxy-yaim' => [ qw/yaim_core:R/ ], }, + supported_platforms => { + sl5_x86_64_gcc412 => 1, + sl5_ia32_gcc412 => 1, + deb5_x86_64_gcc432 => 1, + deb5_ia32_gcc432 => 1, + slc4_x86_64_gcc346 => 1, + slc4_ia32_gcc346 => 1, + }, modules => { 'lb' => [ qw/glite-LB/ ], 'px' => [ qw/glite-PX/ ], - } + }, }, emi => { @@ -810,46 +832,55 @@ for my $ext (keys %deps_aux) { flavours => '--thrflavour= --nothrflavour=', local_prefix => '/usr', etics_externs => { - globus_essentials=>'globus-gssapi-gsi', - globus=>'globus-gssapi-gsi-devel', - gridsite=>'emi.gridsite.shared', - yaim_core=>'emi.yaim.yaim-core', - yaim_bdii=>'emi.bdii.yaim-bdii', - gip_release=>'emi.bdii.glite-info-provider-release', - gip_service=>'emi.bdii.glite-info-provider-service', - bdii=>'emi.bdii.core', - glite_version=>'emi.misc.glite-version', - glue_schema=>'emi.bdii.glue-schema', - trustmanager=>'emi.java-security.trustmanager', - trustmanager_axis=>'emi.java-security.trustmanager-axis', - axis=>'axis1.4', - lcas=>'emi.sac.lcas', - gsoapxx=>'-', - build_common_cpp=>'emi.misc.glite.build-common-cpp', - jdk=>'java', + default => { + globus_essentials=>'globus-gssapi-gsi', + globus=>'globus-gssapi-gsi-devel', + gridsite=>'emi.gridsite.shared', + yaim_core=>'emi.yaim.yaim-core', + yaim_bdii=>'emi.bdii.yaim-bdii', + gip_service=>'emi.bdii.glite-info-provider-service', + bdii=>'emi.bdii.core', + glite_version=>'emi.misc.glite-version', + glue_schema=>'emi.bdii.glue-schema', + trustmanager=>'emi.java-security.trustmanager', + trustmanager_axis=>'emi.java-security.trustmanager-axis', + axis=>'axis1.4', + lcas=>'emi.sac.lcas', + gsoapxx=>'-', + build_common_cpp=>'emi.misc.glite.build-common-cpp', + jdk=>'java', + }, + sl5_x86_64_gcc412EPEL => { + 'myproxy-devel' => 'myproxy-devel.x86_64', + }, }, etics_externs_devel => { - cares => 'c-ares-devel', - classads => 'classads-devel', - cppunit => 'cppunit-devel', - expat => 'expat-devel', - gsoap => 'gsoap-devel', - voms => 'org.glite.security.voms-api', - libtar => 'libtar-devel', - log4c => 'log4c-devel', - postgresql => 'postgresql-devel', - curl => 'curl-devel', - libxml2 => 'libxml2-devel', - openssl => 'openssl-devel', - gridsite=>'emi.gridsite.devel', - jdk=>'java-devel', + default => { + cares => 'c-ares-devel', + classads => 'classads-devel', + cppunit => 'cppunit-devel', + expat => 'expat-devel', + gsoap => 'gsoap-devel', + voms => 'org.glite.security.voms-api', + libtar => 'libtar-devel', + log4c => 'log4c-devel', + postgresql => 'postgresql-devel', + curl => 'curl-devel', + libxml2 => 'libxml2-devel', + openssl => 'openssl-devel', + gridsite=>'emi.gridsite.devel', + jdk=>'java-devel', + }, }, etics_projects => { - 'emi'=>[qw/voms voms-devel gridsite lcas gip_release gip_service bdii glite_version glue_schema yaim_core yaim_bdii trustmanager trustmanager_axis/], + 'emi'=>[qw/voms voms-devel gridsite lcas gip_service bdii glite_version glue_schema yaim_core yaim_bdii trustmanager trustmanager_axis/], + }, + etics_locations => { + axis => 'axis', }, need_externs_aux => { 'lb.client-java' => [ qw/ant:B jdk:B axis:B trustmanager trustmanager_axis libtool:B/ ], - 'lb.glite-LB' => [ qw/fetchcrl:R gip_release:R gip_service:R bdii:R glite_version:R glue_schema:R/ ], + 'lb.glite-LB' => [ qw/fetchcrl:R gip_service:R bdii:R glite_version:R glue_schema:R/ ], 'lb.yaim' => [ qw/yaim_core:R yaim_bdii:R perl-LDAP:R/ ], 'px.glite-PX' => [qw/myproxy-server:R myproxy-admin:R fetchcrl:R gip_service:R bdii:R glite_version:R glue_schema:R/], 'px.myproxy-yaim' => [ qw/yaim_core:R yaim_bdii:R/ ], @@ -861,7 +892,7 @@ for my $ext (keys %deps_aux) { modules => { 'lb' => [ qw/emi-lb/ ], 'px' => [ qw/emi-px/ ], - } + }, }, ); @@ -1033,28 +1064,30 @@ sub mode_etics { close V; } + # XXX: --with ignored for platform-dependend packages my @copts = (); my %ge; @ge{@{$etics_projects{$project{etics_name}}}} = (1) x ($#{$etics_projects{$project{etics_name}}}+1); for (@{$need_externs{"$subsys.$module"}}) { if ($need_externs_type{"$subsys.$module"}->{$_}=~/B/ and (defined $externs{$_} or defined $jar{$_})) { - my $eext = $etics_externs{$_} ? $etics_externs{$_} : $_; + my $eext = $etics_externs{default}{$_} ? $etics_externs{default}{$_} : $_; next if ($eext eq '-'); - if ($project ne 'glite') { + if (defined $project{etics_locations}{'*'} or defined $project{etics_locations}{$_}) { + $eext = $project{etics_locations}{$_} if ($project{etics_locations}{$_}); + push @copts,$ge{$_} ? "--with-$_=\${stageDir}" : "--with-$_=\${$eext.location}"; + } else { if ($ge{$_} and not defined $externs{$_}{pkg}) { push @copts, "--with-$_=\${stageDir}"; } - } else { - push @copts,$ge{$_} ? "--with-$_=\${stageDir}" : "--with-$_=\${$eext.location}"; } } } for (@{$need_jars{"$subsys.$module"}}) { - my $eext = $etics_externs{$_} ? $etics_externs{$_} : $_; + my $eext = $etics_externs{default}{$_} ? $etics_externs{default}{$_} : $_; - push @copts,"--with-$_ \${$eext.location}$jar{$_}" if ($project eq 'glite'); + push @copts,"--with-$_ \${$eext.location}$jar{$_}" if (defined $project{etics_locations}{'*'} or defined $project{etics_locations}{$_}); } my $conf; @@ -1129,18 +1162,18 @@ sub mode_etics { if ($project ne 'glite') { $flags = 'RELEASE_VERSION=${age}.${platformFamily} libdir=${libdir} GSOAPDIR=`pkg-config gsoap --variable=prefix` OPENSSL_GLOBUS_FLAGS=`pkg-config globus-openssl --cflags` OPENSSL_GLOBUS_LIBS=`pkg-config globus-openssl --libs` FLAVOR_GLOBUS_EXT= HTTPD_FLAGS="-I/usr/include/httpd -I/usr/include/apache2 -I/usr/include/apr-${aprSuffix} -I/usr/include/pcre"'; - $prefix = "prefix=${prefix}/usr"; + $prefix = 'prefix=${prefix}/usr'; } else { $flags = 'RELEASE_VERSION=${age}.${platformFamily} libdir=${libdir} GSOAPDIR=${gsoap.location} OPENSSL_GLOBUS_FLAGS=-I${globus.location}/include/${globus.dbg.nothr.flavor} OPENSSL_GLOBUS_LIBS=-L${globus.location}/${libdir}/ FLAVOR_GLOBUS_EXT=_${globus.dbg.nothr.flavor} HTTPD_FLAGS="-I${httpd-devel.location}/include/httpd -I${httpd-devel.location}/include/apache2 -I${httpd-devel.location}/include/apr-${aprSuffix} -I${httpd-devel.location}/include/pcre"'; - $prefix = "prefix=${prefix}"; + $prefix = 'prefix=${prefix}'; } $cmd{compile} = "echo 'make $flags' > build.sh\n\tmake $flags build"; $cmd{clean} = "rm -rvf build.sh; $cmd{clean}"; $cmd{install} = "make $prefix $flags install"; - $cmd{packaging} = "mkdir ${moduleDir}/src/tgz + $cmd{packaging} = "mkdir \${moduleDir}/RPMTMP/SOURCES \${moduleDir}/src/tgz make $prefix $flags rpm && \ - cp ${moduleDir}/RPMTMP/SOURCES/gridsite-${version}.src.tar.gz ${moduleDir}/src/tgz"; + cp \${moduleDir}/RPMTMP/SOURCES/gridsite-\${version}.src.tar.gz \${moduleDir}/src/tgz"; } else { $cmd{clean} = 'None'; @@ -1157,6 +1190,10 @@ sub mode_etics { $cmd{compile} = 'make'; $cmd{test} = 'make check'; $cmd{install} = 'make install'; + if ($subsys eq 'lb' and $module eq 'client') { + $cmd{compile} = "make rpath=$project{local_prefix}/\${libdir}"; + $cmd{install} = "make install post-install rpath=$project{local_prefix}/\${libdir}"; + } } my $defprops = ''; @@ -1218,6 +1255,9 @@ $package_description$package_summary$defprops}; for (@{$conflicts{"$subsys.$module"}}) { print C "package.conflicts = $_\n"; } + for (@{$provides{"$subsys.$module"}}) { + print C "package.provides = $_\n"; + } for my $pp (keys %{$platform_properties{"$subsys.$module"}}) { next if $pp eq 'default'; @@ -1233,36 +1273,59 @@ package.SRPMSLocation = \${moduleDir}/RPMTMP/SRPMS\n"; print C "$package_description$package_summary\n"; } - print C qq{ -[Platform-default:DynamicDependency] + for my $platform ('default', keys %{$project{supported_platforms}}) { + my $used = 0; + + for (@{$need_externs{"$subsys.$module"}},@{$need_jars{"$subsys.$module"}}) { + my $eext = $etics_externs{$platform}{$_} ? $etics_externs{$platform}{$_} : $_; + my $edev = $project{etics_externs_devel}{$platform}{$_}; + next if ($eext eq '-'); + # dependencies not listed in etics_externs only for + # default platform + if (not defined $etics_externs{$platform}{$_} and + $platform ne 'default') { +#print "skipping $_ on $platform\n"; + next; + } + + if (not $used) { + print C qq{ +[Platform-$platform:DynamicDependency] }; - for (@{$need_externs{"$subsys.$module"}},@{$need_jars{"$subsys.$module"}}) { - my $eext = $etics_externs{$_} ? $etics_externs{$_} : $_; - my $edev = $project{etics_externs_devel}{$_}; - next if ($eext eq '-'); + $used = 1; + } - my $proj = 'externals'; - for my $p (keys %etics_projects) { - for $m (@{$etics_projects{$p}}) { - $proj = $p if $m eq $_; + my $proj = 'externals'; + for my $p (keys %etics_projects) { + for $m (@{$etics_projects{$p}}) { + $proj = $p if $m eq $_; + } } - } - my $type = $need_externs_type{"$subsys.$module"}->{$_}; + my $type = $need_externs_type{"$subsys.$module"}->{$_}; - if ($edev) { - if ($type eq 'B') { - $eext = $edev; # no runtime - change to devel pkg - } elsif ($type eq 'BR' or $type eq 'RB') { - print C "$proj|$edev = B\n"; # additional devel pkg + if ($edev) { + if ($type eq 'B') { + $eext = $edev; # no runtime - change to devel pkg + } elsif ($type eq 'BR' or $type eq 'RB') { + print C "$proj|$edev = B\n"; # additional devel pkg + } } + print C "$proj|$eext = $type\n"; } - print C "$proj|$eext = $type\n"; - } - for (@{$deps{"$subsys.$module"}}) { - my $type = $deps_type{"$subsys.$module"}->{$_}; - print C "$project{etics_name}|$project{etics_name}.$_ = $type\n"; + if ($platform eq 'default') { + for (@{$deps{"$subsys.$module"}}) { + my $type = $deps_type{"$subsys.$module"}->{$_}; + if (not $used) { + print C qq{ +[Platform-$platform:DynamicDependency] +}; + $used = 1; + } + print C "$project{etics_name}|$project{etics_name}.$_ = $type\n"; + } + } } close C; @@ -1333,6 +1396,37 @@ sub getlibdir { return $libdir; } +sub reshuffle_platforms($$) { + my ($data, $platforms) = @_; + my ($platform, %blacklist, $value); + + return if not $platforms; + + for $platform (keys %$data) { +#print "plat: $platform: $data->{$platform}\n"; + next if $platform eq 'default'; + for $_ (keys %{$data->{$platform}}) { +#print " blacklist: $_ = $data->{$platform}{$_}\n"; + $blacklist{$_} = 1; + } + } + + for $_ (keys %blacklist) { + if (defined $data->{default}{$_}) { + $value = $data->{default}{$_}; + $data->{default}{$_} = '-'; +#print " deleted $_ from default\n"; + for $platform (keys %$platforms) { + next if $platform eq 'default'; + if (not defined $data->{$platform}{$_}) { + $data->{$platform}{$_} = $value; +#print " added $value to $platform\n" + } + } + } + } +} + sub usage { my @ext = keys %externs; my @myjars = keys %jar; diff --git a/org.glite.lb.doc/project/ChangeLog b/org.glite.lb.doc/project/ChangeLog index b0bcc7d..3f0802c 100644 --- a/org.glite.lb.doc/project/ChangeLog +++ b/org.glite.lb.doc/project/ChangeLog @@ -78,6 +78,11 @@ 1.1.11-3 - Module rebuilt +1.1.12-1 +- Extended information on logging +- More on logging to syslog +- A few typos fixed + 1.2.0-1 - Documentation updated to cover new features to be released with EMI-1 @@ -118,3 +123,16 @@ - Update on changes in L&B 3.0 - Grammar fixes +1.2.8-1 +- Portable syntax of test condition in install commands. +- Extended information on logging +- More on logging to syslog +- A few typos fixed +- Support for GLITE_LB_WMS_DN and GLITE_LB_AUTHZ_* yaim parameters +- More thorough distinction between EMI and gLite installation +- Polishing of the installation documentation +- Switch to yet another EMI template + +1.2.9-1 +- New FAQ on WMS and LB_SUPER_USERS + diff --git a/org.glite.lb.doc/project/version.properties b/org.glite.lb.doc/project/version.properties index 0a3bff5..edba09e 100644 --- a/org.glite.lb.doc/project/version.properties +++ b/org.glite.lb.doc/project/version.properties @@ -1,3 +1,3 @@ # $Header$ -module.version=1.2.7 +module.version=1.2.9 module.age=1 diff --git a/org.glite.lb.doc/src/LBAG-Installation.tex b/org.glite.lb.doc/src/LBAG-Installation.tex index 43d5926..76bb361 100644 --- a/org.glite.lb.doc/src/LBAG-Installation.tex +++ b/org.glite.lb.doc/src/LBAG-Installation.tex @@ -95,6 +95,7 @@ where all \verb'glite-lbjp-common-*' packages are common both to \LB and Job Provenance (\JP). \subsection{Common logging format} +\label{inst:comlog} Since \LBver{2.1} \LB service follows the \textbf{gLite common logging recommendations v1.1}: \begin{center} \url{https://twiki.cern.ch/twiki/pub/EGEE/EGEEgLite/logging.html}. @@ -112,10 +113,37 @@ A file \texttt{log4crc.example-debugging} may be useful to copy to \texttt{\$HOME/.log4crc} (or by setting the \texttt{LOG4C\_RCPATH} environment variable to a directory containing the \texttt{log4crc} file) to obtain detailed debugging output. One can debug only specific parts of the LB system, for example -by uncommenting \texttt{LB.SERVER.DB} cathegory in the \texttt{log4crc} file, +by uncommenting \texttt{LB.SERVER.DB} category in the \texttt{log4crc} file, one gets only the debugging info related to the underlying database subsystem calls. +Currently supported log categories are: + +\begin{tabularx}{\textwidth}{>{\tt}lX} +SECURITY & Security matters \\ +ACCESS & Communication issues \\ +CONTROL & \LB server control \\ +LB & \emph{unused} \\ +LB.LOGD & Messages from the \LB local logger \\ +LB.INTERLOGD & Messages from the \LB interlogger \\ +LB.NOTIFINTERLOGD & Messages from the notification interlogger \\ +LB.SERVER & Processing within the \LB server \\ +LB.SERVER.DB & DB calls made by the server \\ +LB.SERVER.REQUEST & Processing \LB server requests \\ +LB.HARVESTER & Messages from the \LB harvester \\ +LB.HARVESTER.DB & DB calls made by the harvester \\ +LB.AUTHZ & Authentication matters \\ +\end{tabularx} + +The following log priorities are recognized, in a descending order of severity: \texttt{fatal}, \texttt{error}, \texttt{warn}, \texttt{info}, \texttt{debug}. Note that running with any of the logging categories set do \texttt{debug} for a prolonged period of time will result in the logfile growing uncontroledly. + +In a typical setup, logging messages generated by the \LB service will be found in \texttt{/var/log/messages}. + +\note\ \emph{syslog} is typically configured to drop log messages with priority \texttt{debug}. You may want to enable it, for example by using something like this in \texttt{/etc/syslog.conf} and then restarting {syslog}: +\begin{verbatim} +*.debug;mail.none;authpriv.none;cron.none -/var/log/messages +\end{verbatim} + \subsection{\LB server} \subsubsection{Hardware requirements} @@ -163,7 +191,7 @@ offered load. Install and configure a clean system, the \textbf{EPEL} repository, and the \textbf{EMI} repository as per instructions given in \htmladdnormallink{https://twiki.cern.ch/twiki/bin/view/EMI/GenericInstallationConfigurationEMI1}{https://twiki.cern.ch/twiki/bin/view/EMI/GenericInstallationConfigurationEMI1}. Then install metapackage \texttt{emi-lb}. -\item Installing from \textbf{gLite's note-type repository} (applies to \LBver{up to 2.1}): +\item Installing from \textbf{gLite's node-type repository} (applies to \LBver{up to 2.1}): % XXX Don't forget to increase version if ever LB 3 releases with gLite Install and configure OS and basic services (certificates, CAs, time synchronization, software repositories) according to the \htmladdnormallink{https://twiki.cern.ch/twiki/bin/view/LCG/GenericInstallGuide320}{https://twiki.cern.ch/twiki/bin/view/LCG/GenericInstallGuide320}. Then install metapackage \texttt{glite-LB} from an appropriate gLite software repository. @@ -176,11 +204,11 @@ YAIM configuration can be done then: \texttt{/opt/glite/yaim/bin/yaim -c -s site-info.def -n glite-LB} \end{quote} -Available parameters specific to LB server are: +Available parameters specific to LB server are (mandatory parameters are \textbf{highlighted}): %variable&meaning&default value &further details\\ \begin{itemize} -\item \texttt{MYSQL\_PASSWORD} -- root password of MySQL server (mandatory) +\item \textbf{MYSQL\_PASSWORD} -- root password of MySQL server (mandatory) \item \texttt{GLITE\_LB\_EXPORT\_PURGE\_ARGS} -- purge timeouts (default: \texttt{--cleared 2d --aborted 15d --cancelled 15d --other 60d}) According to local retention policy you may want to use different purge timeouts (for example WLCG would need \texttt{--cleared 90d --aborted 90d --cancelled 90d --other 90d}). @@ -196,14 +224,14 @@ According to local retention policy you may want to use different purge timeouts Authorization: \begin{itemize} -\item \texttt{GLITE\_LB\_SUPER\_USERS} -- additional super-users (default: empty) -\item \texttt{GLITE\_LB\_WMS\_DN} -- DNs of WMS servers (default: empty) +\item \texttt{GLITE\_LB\_SUPER\_USERS} -- additional super-users (default: empty)\footnote{The use of this parameter is a FAQ. See section \ref{FAQ:WMS_superusers}.} +\item \texttt{GLITE\_LB\_WMS\_DN} -- DNs of WMS servers (default: empty)\footnotemark[\thefootnote] \item \texttt{GLITE\_LB\_RTM\_DN} -- DNs using to get notifications from \LB server\\ (default: \texttt{heppc24.hep.ph.ic.ac.uk} machine certificate) -\item \texttt{GLITE\_LB\_AUTHZ\_} -- more detailed tuning of access grants, see Section~\ref{inst:authz} (default: empty, '.*' for logging and job registrations) +\item \texttt{GLITE\_LB\_AUTHZ\_} -- more detailed tuning of access grants, see Section~\ref{inst:authz} (default: empty, '\texttt{.*}' for logging and job registrations) \end{itemize} -Additional helper or legacy parameters for \LB: +Additional helper or legacy parameters: \begin{itemize} \item \texttt{GLITE\_LB\_LOCATION} -- \LB prefix (default: \texttt{/opt/glite} or \texttt{/usr}) \item \texttt{GLITE\_LB\_LOCATION\_ETC} -- system config directory (default: \texttt{/opt/glite/etc} or \texttt{/etc}) @@ -216,8 +244,15 @@ export data are written for use by lgcmon/R-GMA (default: \texttt{/var/glite/logging/status.log}). \emph{Note: This feature is now obsolete and only available in \LBver{1.x}.} \end{itemize} + In addition to those, YAIM LB module uses following parameters: -\texttt{INSTALL\_ROOT}, \texttt{GLITE\_LOCATION\_VAR}, \texttt{GLITE\_USER}, \texttt{SITE\_EMAIL}. +\begin{itemize} +\item \texttt{INSTALL\_ROOT} -- installation root, shouldn't be changed (default: '/opt' or '/') +\item \texttt{GLITE\_LOCATION\_VAR} -- directory for local state files (default: '/opt/glite/var' or '/var/glite') +\item \texttt{GLITE\_USER} -- unprivileged user name (default: 'glite') +\item \textbf{SITE\_NAME} -- site name (mandatory) +\item \textbf{SITE\_EMAIL} -- site email, for cron scripts (mandatory) +\end{itemize} Lists are separated by comma. @@ -340,7 +375,13 @@ Correct broker settings are infered from BDII by YAIM on configuration. By defau \end{verbatim} \end{quote} -Alongside the broker address and port, \texttt{msg.conf} also specifies the messaging plugin to be used by the notification interlogger. Plugin settings should be correct \emph{ab initio} and do not require modification by administrators. Broker settings may require an adaptive change in case the currently configured broker disapears and automatic checks fail to switch the settings to another one on time. +Overall, \texttt{msg.conf} specifies the following information: + +\begin{itemize} +\item The messaging plugin to be used by the notification interlogger. Plugin settings should be correct \emph{ab initio} and do not require modification by administrators. +\item Broker settings (attribute \texttt{broker}). They may require an adaptive change in case the currently configured broker disappears and automatic checks fail to switch the settings to another one on time. +\item Permissible topic title prefixes (attribute \texttt{prefix}). Registrations for delivery to topics not matching the prefix will be rejected. In case no prefix is specified, \LB applies the default EGI prefix: \texttt{grid.emi.} +\end{itemize} \subsubsection{Index configuration} diff --git a/org.glite.lb.doc/src/LBAG-Running.tex b/org.glite.lb.doc/src/LBAG-Running.tex index 09dfa02..56d19a3 100644 --- a/org.glite.lb.doc/src/LBAG-Running.tex +++ b/org.glite.lb.doc/src/LBAG-Running.tex @@ -35,6 +35,10 @@ as standard manual pages installed with the \LB packages. In normal operation \LB server sends error messages to syslog. Informational messages are generally avoided in order to prevent syslog congestion. +Since \LBver{2.1}, the service implements a common logging format\footnote{\url{http://en.wikipedia.org/wiki/Common_Log_Format}} (see section\,\ref{inst:comlog}, page\,\pageref{inst:comlog}). + +For \LBver{2.0 and lower}, the following instructions apply: + \begin{sloppypar} When tracing problems, GLITE\_LB\_SERVER\_DEBUG environment variable can be set to non-empty value when starting the service. diff --git a/org.glite.lb.doc/src/LBTP-Introduction.tex b/org.glite.lb.doc/src/LBTP-Introduction.tex index 7fd0278..d1631ba 100644 --- a/org.glite.lb.doc/src/LBTP-Introduction.tex +++ b/org.glite.lb.doc/src/LBTP-Introduction.tex @@ -111,7 +111,7 @@ Nagios\footnote{\url{http://www.nagios.org}} is a host and service monitor designed to inform you of network problems before your clients, end-users or managers do. -%\TODO{ruda: More about Nagios. How LB is integrated - LB sensors for Nagios} +There is a Nagios plugin that tests the status of the \LB server. It is discussed in detail in section~\ref{s:nagios}, page~\pageref{s:nagios}. \subsubsection{ETICS} diff --git a/org.glite.lb.doc/src/LBTP-Nagios.tex b/org.glite.lb.doc/src/LBTP-Nagios.tex new file mode 100644 index 0000000..3ede076 --- /dev/null +++ b/org.glite.lb.doc/src/LBTP-Nagios.tex @@ -0,0 +1,124 @@ +% +%% Copyright (c) Members of the EGEE Collaboration. 2004-2010. +%% See http://www.eu-egee.org/partners for details on the copyright holders. +%% +%% Licensed under the Apache License, Version 2.0 (the "License"); +%% you may not use this file except in compliance with the License. +%% You may obtain a copy of the License at +%% +%% http://www.apache.org/licenses/LICENSE-2.0 +%% +%% Unless required by applicable law or agreed to in writing, software +%% distributed under the License is distributed on an "AS IS" BASIS, +%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +%% See the License for the specific language governing permissions and +%% limitations under the License. +% +% System tests + +\section{Nagios Probe} +\label{s:nagios} + +There is a Nagios probe to check the service status of an \LB server node. It is distributed from the EMI repository and the name of the package is \texttt{emi-lb-nagios-plugins}. + +\subsection{Tests Performed} +Before starting the actual test the probe checks for existence and validity of a proxy certificate, and for availability of commands (essential system commands, various \LB Client commands and grid proxy manipulation commands). + +The following tests are performed by the probe. Various tests check the working status of various processes running on the \LB server node: + +\begin{enumerate} +\item Register job + \begin{itemize} + \item \LB server (\texttt{glite-lb-bkserverd}) + \end{itemize} +\item Register to receive notifications + \begin{itemize} + \item \LB server (\texttt{glite-lb-bkserverd}) + \end{itemize} +\item Log events resulting in state \emph{cleared} + \begin{itemize} + \item \LB logger (\texttt{glite-lb-logd}) + \end{itemize} +\item Check job state + \begin{itemize} + \item \LB server (\texttt{glite-lb-bkserverd}) + \item Interlogger (\texttt{glite-lb-interlogd}) + \end{itemize} +\item Receive notifications + \begin{itemize} + \item Notification interlogger (\texttt{glite-lb-notif-interlogd}) + \end{itemize} +\end{enumerate} + +The test also tries to drop the test notification and purge the test job to clean up after itself. However, purging the job won't probably be allowed by the \LB server's policy and the test job will remain registered on the \LB server until removed by a regular purge. + +\subsection{Return Values} +Return values follow the Nagios pattern: + +\begin{description} +\item[0] The service is running normally +\item[1] The service is running but there were warnings +\item[2] The service status is critical +\item[3] The service status is unknown, probe could not run +\end{description} + +\subsection{Console Output} +Text output indicates the results of the probe and gives a more detailed description of failure causes. + +The probe can return one of the following: + +\begin{tabularx}{\textwidth}{|c|p{5cm}|X|} +\hline +\multirow{3}{*}{WARNING} & \emph{Unexpected version output} & The server responded to a query for server version over the WS interface, but the format of the response did not match the expected pattern. \\ +& \emph{Unexpected state of test job} & The state of the test job did not remain unchanged (\texttt{Submitted}) but neither did it reach status \texttt{Cleared} in the alotted time. All deamons seem to work but the processing is slow.\\ +& \emph{Could not drop notification} & The owner should be able to drop their own notification. Failure to do so is unexpected but does not mean that the service is not functioning. \\ +\hline +\multirow{6}{*}{DOWN} & \emph{Unable to Get Server Version} & The server did not respond to a query for server version over the WS interface. It is probably not running, is unaccessible or SSL handshake failed due to faulty/outdated certificates/CRLs. \\ +& \emph{Job Registration Failed Locally} & The probe was unable to perform the local side of job registration. This should be rare. \\ +& \emph{\LB Server Not Running} & The probe was unable to register a test job or a test notification with the \LB server. It is probably not running or is unaccessible. \\ +& \emph{Event Delivery Chain (Logger/Interlogger) Not Running} & The server process is running but events are not being delivered by \LB's local logger/interlogger. Check the Logger and the Interlogger. \\ +& \emph{Notification Interlogger Not Running} & Events are being delivered correctly and server responds properly to status queries, but it its not delivering notification messages. The notification interlogger is probably not running.\\ +\hline +\multirow{5}{*}{UNKNOWN} & \emph{Probe timed out} & The probe was unable to finish before the alotted time. Consider increasing the timeout with \texttt{-t}. The minimum reasonable value is 10\,s. \\ +& \emph{No server specified} & Server address was not specified when running the probe. Give one with \texttt{-H} \\ +& \emph{Probe could not write temporary files} & The temporary directory was not writable. Check the default location or specify a new one with \texttt{-T}.\\ +& \emph{Some commands are not available} & Probe could not run. Some of the required commands are not present on the system. Run probe from command line with \texttt{-v[vv]} and check output. \\ +& \emph{No Credentials} & No proxy certificate was found. Probe could not run. \\ +& \emph{Credentials Expired} & A proxy certificate was found, but expired. Probe could not run. \\ +\hline +\end{tabularx} + +\subsection{Running the Probe} + +\subsubsection{Command Line Arguments} +The probe recognizes the following command line arguments: + +\begin{tabularx}{\textwidth}{l l X} + \texttt{-h} & \texttt{-{}-help} & Print out simple console help \\ + \texttt{-v[vv]} & \texttt{-{}-verbose} & Set verbosity level (\texttt{-{}-verbose} denotes a single \texttt{v}). \\ + \texttt{-H} & \texttt{-{}-hostname} & \LB node address. Environmental variable \texttt{GLITE\_WMS\_QUERY\_SERVER} used if unspecified. \\ + \texttt{-p} & \texttt{-{}-port} & \LB server port. Other port numbers (logger, WS interface) are derrived from it. Environmental variable \texttt{GLITE\_WMS\_QUERY\_SERVER} or default port \texttt{9000} used if unspecified. \\ + \texttt{-t} & \texttt{-{}-timeout} & Timeout in seconds. The minimum reasonable timeout is approx.~10\,s. There is no default, except the internal waiting cycle for notifications, which will time out after approx.~20\,s.\footnote{The probe adjusts the internal waiting cycle to spend a maximum of $\frac{3}{4}$ of the specified timeout interval while waiting for notifications to deliver. It will finish correctly before timing out if undelivered notifications are the only problem.} \\ + \texttt{-T} & \texttt{-{}-tmpdir} & Directory to store temporary files. By default the probe uses \texttt{/var/lib/grid-monitoring/emi.lb} and falls back to \texttt{/tmp} if the former does not exist or is not writable. \\ +\end{tabularx} + +\subsubsection{Environmental Variables} +In essence the probe recognizes the same environmental variables as the \LB client. No environmental variables need to be set if hostname is specified as a command line argument to the probe. + +\begin{tabularx}{\textwidth}{p{4.5cm} X} +\texttt{GLITE\_WMS\_QUERY\_SERVER} & \textbf{The} \LB server. This is the server that will be contacted and tested if no hostname is supplied to the probe. \\ +\texttt{GLITE\_LB\_SERVER\_PORT GLITE\_LB\_LOGGER\_PORT} & Specifies the \LB server port or the \LB local logger port, respectively. It is used only in case a hostname is given as a command line argument to the probe wit no port number. \\ +% This is not a very nice way to set two parapgraps aside. I hate the fixed width setting but I could not find any other solution. +\end{tabularx} + +\subsubsection{Sample Nagios Service Definition} +Simple definition to be included in \texttt{/etc/nagios/commands.cfg}: + +\begin{verbatim} +define command{ + command_name check-lb-server + command_line /usr/libexec/grid-monitoring/probes/emi.lb/LB-probe \$HOSTADDRESS$ + } +\end{verbatim} + + diff --git a/org.glite.lb.doc/src/LBTP-Tests.tex b/org.glite.lb.doc/src/LBTP-Tests.tex index 825e098..a7cba80 100644 --- a/org.glite.lb.doc/src/LBTP-Tests.tex +++ b/org.glite.lb.doc/src/LBTP-Tests.tex @@ -71,6 +71,10 @@ Besides pure System Functionality Tests, this list also includes In-the-Wild tes \hline {\tt lb-test-notif-msg.sh} & Implemented & Test delivery of \LB notifications over ActiveMQ \\ \hline +{\tt lb-test-permissions.sh} & Implemented & Check ownership and permission settings for config and runtime files \\ +\hline +{\tt lb-test-nagios-probe.sh} & Implemented & Run the nagios probe and check results \\ +\hline \end{tabularx} \subsubsection{Event logging examples} @@ -197,6 +201,33 @@ states. Thorough tests may also cross check the values supplied in the events (e.g. destination computing element) wrt. the values reported in the job states. +\subsubsection{Sandbox Transfers} + +\req\ All \LB\ services running + +\what\ +\begin{enumerate} +\item Register a compute job. +\item Register input sandbox transfer. +\item Register output sandbox transfer. +\item Generate events to trigger job state changes in one of the sandbox transfer jobs. + \begin{enumerate} + \item Start the transfer and check that state has changed appropriately. + \item Finish the transfer and check that state has changed appropriately. + \end{enumerate} +\item Use another sandbox transfer job registered above to start, then fail the transfer and check that this is reflected by the resulting transfer job status. +\item Check that the compute job and its sandbox transfer jobs link up correctly. + +\end{enumerate} + +\how\ \ctblb{lb-test-sandbox-transfer.sh} + +\note\ The test includes artificial delays. Takes approx. 50\,s to finish. + +\result\ Job states should change on event delivery as expect, related jobs should ``know'' their IDs. + + + %\subsubsection{Non-simple job states} @@ -365,7 +396,7 @@ immediately. \subsubsection{Delivery to ActiveMQ} -\label{notif1} +\label{notifamq} \req\ All \LB\ services running, ActiveMQ broker configured and running \what @@ -389,6 +420,7 @@ The \path{glite-lb-notify} example can be used to register a notification and \p + \subsection{Server purge} \textbf{WARNING: This test is destructive, it destroys ALL data in an @@ -406,11 +438,11 @@ artificially. that the sets can be distinguished from each other. \item \label{purgel} Using \code{edg\_wll\_JobLog} retrieve events of all the jobs -\item \label{purge1} +\item \label{purge2} Purge the first set of jobs (by specifying appropriate timestamp), letting the server dump the purged events. -\item \label{purge2} Purge the other set of jobs, also dumping the events. -\item \label{purge3} Run purge once more. +\item \label{purge3} Purge the other set of jobs, also dumping the events. +\item \label{purge4} Run purge once more. \end{enumerate} \how\ \ctblb{lb-test-purge.pl} @@ -429,30 +461,7 @@ The example \path{org.glite.lb.client/examples/purge\_test} does exactly this se including the checks. \end{hints} -\subsubsection{Sandbox Transfers} - -\req\ All \LB\ services running - -\what\ -\begin{enumerate} -\item Register a compute job. -\item Register input sandbox transfer. -\item Register output sandbox transfer. -\item Generate events to trigger job state changes in one of the sandbox transfer jobs. - \begin{enumerate} - \item Start the transfer and check that state has changed appropriately. - \item Finish the transfer and check that state has changed appropriately. - \end{enumerate} -\item Use another sandbox transfer job registered above to start, then fail the transfer and check that this is reflected by the resulting transfer job status. -\item Check that the compute job and its sandbox transfer jobs link up correctly. - -\end{enumerate} - -\how\ \ctblb{lb-test-sandbox-transfer.sh} - -\note\ The test includes artificial delays. Takes approx. 50\,s to finish. - -\result\ Job states should change on event delivery as expect, related jobs should ``know'' their IDs. +\subsection{Other Service Tests} \subsubsection{ACL Parsing} @@ -505,10 +514,43 @@ including the checks. \how\ \ctblb{lb-test-threaded.sh} -\note\ The is not a thorough test. It is not capable of discovering rare or improbable problems but it will check the essentials of multi-threaded opration. +\note\ This is not a thorough test. It is not capable of discovering rare or improbable problems but it will check the essentials of multi-threaded opration. \result\ The test must not hang. Meaningful results (albeit errors) must be returned by all threads. +\subsubsection{Config and Runtime File Permissions} +\label{permissions} +\req\ All \LB\ services configured and running. + +\what +\begin{enumerate} +\item Decide on permission/ownership masks for various files identified for checking. +\item Check ownership and permission settings for selected files. +\item Compare that with a pre-determined mask. +\end{enumerate} + +\how\ \ctblb{lb-test-permissions.sh} + +\result\ The status of all files should match the pre-determined mask. + + +\subsubsection{Nagios probe} +\label{permissions} +\req\ All \LB\ services configured and running, nagios probe\footnote{see also page \pageref{s:nagios}} installed. + +\what +\begin{enumerate} +\item Check probe for presence +\item Run the probe +\item Check if text and exit code are OK or at least consistent +\end{enumerate} + +\how\ \ctblb{lb-test-nagios-probe.sh} + +\result\ The probe has returned OK and exit code was 0. + +\note\ The probe includes artificial delays. The test takes approx. 10\,s to finish. + \section{LB ``In the Wild''---Real-World WMS Test} \req\ All \LB services running, working grid infrastructure accessible (including permissions). diff --git a/org.glite.lb.doc/src/LBTP.tex b/org.glite.lb.doc/src/LBTP.tex index 1aaa7b5..3809cca 100644 --- a/org.glite.lb.doc/src/LBTP.tex +++ b/org.glite.lb.doc/src/LBTP.tex @@ -19,7 +19,7 @@ \input{definitions} -\title{Logging and Bookkeeping -- Test Plan Test Suite Documentation} +\title{Logging and Bookkeeping -- Test Plan \& Test Suite Documentation} %\Subtitle{Test Plan Test Suite Documentation} \author{CESNET EGEE III JRA1 and SA3 team} %\DocIdentifier{glite-lb-doc-tp-\version} @@ -59,6 +59,9 @@ \newpage \input{LBTP-InterTests} +\newpage +\input{LBTP-Nagios} + %\appendix %\newpage %\input{LBTP-Appendix} diff --git a/org.glite.lb.doc/src/LBUG-Introduction.tex b/org.glite.lb.doc/src/LBUG-Introduction.tex index cd68a49..7c37170 100644 --- a/org.glite.lb.doc/src/LBUG-Introduction.tex +++ b/org.glite.lb.doc/src/LBUG-Introduction.tex @@ -707,11 +707,11 @@ The \LB infrastructure can notify its users when something interesting happens o Users register for notifications via the notification client \verb'glite-lb-notify', described in Section \ref{s:lb-notify} -Conditions under which the notifications are sent can be specified. For example -- job XY reaches status +Conditions under which the notifications are sent can be specified. For example -- job XY reaches state DONE. In \LBver{1.x}, one or more JOBID's are required in the condition and only a single occurence -of a specific attribute is allowed among ANDed conditions. More complex conditions are allowed since \LBver{2.0} +of a specific attribute is allowed among ANDed conditions. More complex conditions are allowed since \LBver{2.0}, including specification of job owner, or requesting to receive notifications only on actual job state change. \LBver{3.0} introduces an option to deliver notification messages over OpenWire or STOMP-based messaging infrastructure.\footnote{Such as Apache's ActiveMQ.} -The registration is then delivered to the \LB server where it is stored. +Each registration is delivered to the \LB server where it is stored. At the same time, the server generates a unique notification ID for the registration and returns it to the user. @@ -719,10 +719,10 @@ The registration exists only for a limited amount of time. Validity information the notification ID when registering. During this period the user can attach to the server and receive notification messages, change conditions which triger the notification, prolong validity of the registration, or remove the registration from the \LB server. -It is also possible to specify on registration that notification messages for a given registration are not supposed to be delivered through the notification client but through the messaging infrastructure instead. While the registration is valid, the user is able to repeatably connect to the \LB server from different places in the -network and continue receiving notifications associated with the given notification ID. When relying on \LB's event delivery infrastructure to deliver messages, even notifications generated +network and continue receiving notifications associated with the given notification ID.\footnote{Should the user have opted to receive notification messages over the messaging infrastructure, then---obviously---they need to connect to the correct topic on a messaging broker, rather than contacting the \LB sever. If unsure what messaging brokers are available in your grid environment, read that information from BDII or use the \LB Server's configuration page (Section \ref{s:findbroker}). +} Notifications generated while the user was not connected are stored and waiting until the user reconnects. \subsubsection{Caveats} diff --git a/org.glite.lb.doc/src/LBUG-Tools.tex b/org.glite.lb.doc/src/LBUG-Tools.tex index 1136501..119ca98 100644 --- a/org.glite.lb.doc/src/LBUG-Tools.tex +++ b/org.glite.lb.doc/src/LBUG-Tools.tex @@ -73,6 +73,10 @@ where verbosity level can be from 0 to 3. \subsection{HTML and plain text interface} + +It is possible to use a standard Web browser or a command-line tool such as \texttt{wget} or \texttt{curl} to extract information from the \LB server. Although the querying power is higly limited, the HTTP or Plain Text interface can still serve as a simple tool to access information. + +\subsubsection{Job ID or Notification ID as URL} \label{simple} Since the gLite jobId has the form of a unique URL, it is possible to cut and paste it directly to the web browser to view the information about the job (esp. its status), e.g. @@ -83,7 +87,7 @@ To list all user's jobs, it is possible to query only the \LB server address, e. \begin{verbatim} firefox https://pelargir.ics.muni.cz:9000 \end{verbatim} -To list all user's notification registration curently valid on a given \LB server, use a URL constructed as in folowing example: +To list all user's notification registrations curently valid on a given \LB server, use a URL constructed as in folowing example: \begin{verbatim} firefox https://pelargir.ics.muni.cz:9000/NOTIF \end{verbatim} @@ -93,6 +97,7 @@ A notification ID also have a form of URL. If you direct your browser to a parti \end{verbatim} In all cases it is necessary to have the user certificate installed in the browser. +\subsubsection{Plain Text Modifier} Since \LBver{2.0}, it is also possible to obtain the above results in a machine readable \verb'key=value' form by adding a suffix \verb'text' to the above URLs. For example @@ -108,6 +113,21 @@ or https://pelargir.ics.muni.cz:9000/1234567890?text \end{verbatim} +\subsubsection{\LB Server Configuration} + +As of \LBver{3.0}, it is also possible to use the HTTPs interface to retrieve essential information on \LB Server configuration. For example: +\begin{verbatim} + firefox https://scientific65.zcu.cz:9010/?configuration +\end{verbatim} + +Among others, the following fields may be discerned from the URL: + +\begin{tabularx}{\textwidth}{lX} +\label{s:findbroker} +\texttt{msg\_brokers} & A list of messaging brokers that \LB server uses to deliver messages.\\ +\texttt{msg\_prefixes} & A list of permissible prefixes that must be used in messaging topics.\\ +\end{tabularx} + \subsection{Job state changes as an RSS feed} The \LB includes an RSS interface allowing users to keep trace of their jobs in a very simple way using an RSS reader. The parameters of the RSS feeds are predefined, so no configuration is required. diff --git a/org.glite.lb.doc/src/emi.cls b/org.glite.lb.doc/src/emi.cls index 28221d9..e51e47b 100644 --- a/org.glite.lb.doc/src/emi.cls +++ b/org.glite.lb.doc/src/emi.cls @@ -54,6 +54,7 @@ \usepackage[hang,bf,small]{caption} \usepackage[T1]{fontenc} \usepackage[scaled]{helvet} +\usepackage{multirow} \renewcommand*\familydefault{\sfdefault} % % We now define a new \if command to test for PDF being enabled. diff --git a/org.glite.lb.doc/src/faq.tex b/org.glite.lb.doc/src/faq.tex index 9fb76d0..b8e5d33 100644 --- a/org.glite.lb.doc/src/faq.tex +++ b/org.glite.lb.doc/src/faq.tex @@ -22,3 +22,62 @@ Jobs stay in state \emph{Running} until a \emph{Done} event is received from the workload management system. \emph{Done} events from local resource managers are not enough since the job in question may have been resubmitted in the meantime. +\subsection{WMS Cannot Purge Jobs or Perform Other Privileged Tasks} +\label{FAQ:WMS_superusers} + +In short, WMS has not been given adequate permissions when configuring the \LB server. You need to modify your configuration and restart the server: + +\subsubsection{For \LBver {3.0.11 or higher}, using YAIM} +\label{FAQ:WMS_superusers_3_0_11} +Modify your \texttt{siteinfo.def}, specifying the DN of your WMS server in YAIM parameter \texttt{GLITE\_LB\_WMS\_DN}; for instance: + +\begin{center} +\texttt{GLITE\_LB\_WMS\_DN=/DC=cz/DC=cesnet-ca/O=CESNET/CN=wms01.cesnet.cz} +\end{center} + +Then rerun YAIM: +\texttt{/opt/glite/yaim/bin/yaim -c -s site-info.def -n glite-LB} + + This will give your WMS exactly the right permissions to carry out all required operations. + +\subsubsection{For all versions of \LB, using YAIM} + +Modify your \texttt{siteinfo.def}, specifying the DN of your WMS server in YAIM parameter \texttt{GLITE\_LB\_SUPER\_USERS}; for instance: + +\begin{center} +\texttt{GLITE\_LB\_SUPER\_USERS=/DC=cz/DC=cesnet-ca/O=CESNET/CN=wms01.cesnet.cz} +\end{center} + +Then rerun YAIM: +\texttt{/opt/glite/yaim/bin/yaim -c -s site-info.def -n glite-LB} + +This will give your WMS adequate rights to perform its operations and requests (running purge, querying for statistics, etc.) but it will also grant it additional administrator rights (such as granting job ownership). On newer installations, the method explained in section \ref{FAQ:WMS_superusers_3_0_11} is preferrable. + +\subsubsection{For \LBver {2.1 or higher}, without YAIM} + +\LB{}'s authorization settings can be found in file \texttt{[/opt/glite]/etc/glite-lb/glite-lb-authz.conf} + +Permit actions \texttt{PURGE}, \texttt{READ\_ALL} and \texttt{GET\_STATISTICS} for your WMS and restart the \LB server. +This will lead to results equivalent to \ref{FAQ:WMS_superusers_3_0_11}. +For instance, change the adequate sections in \texttt{glite-lb-authz.conf} to: + +\begin{verbatim} +action "READ_ALL" { + rule permit { + subject = "/DC=cz/DC=cesnet-ca/O=CESNET/CN=wms01.cesnet.cz" + } +} + +action "PURGE" { + rule permit { + subject = "/DC=cz/DC=cesnet-ca/O=CESNET/CN=wms01.cesnet.cz" + } +} + +action "GET_STATISTICS" { + rule permit { + subject = "/DC=cz/DC=cesnet-ca/O=CESNET/CN=wms01.cesnet.cz" + } +} +\end{verbatim} + diff --git a/org.glite.lb.doc/src/images/LB-components-LB-WMS.pdf b/org.glite.lb.doc/src/images/LB-components-LB-WMS.pdf index f6a8e96d742b2b22235a0b6261789fc8f44f10ab..52b83a5ae5a22568ba58c6884523b279768d22cb 100755 GIT binary patch delta 82731 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μ9Cu5;W8ZznpBbCkK7?LF3t!YnAS@&R4+L3uXy3>a2d{JGUu7}Dt zkQS|;o(n&^Jg6&gU}?!#?UWG@Srq~xN~xC`>_cw!e@WY?_w7!ew1K+Z`QV4IFNz37 zXDKN~q+6@T-x=44(KEXUD_KXyRc^z6ncNKmNQo5{K-*m7kySKGd-DgyNcY}QFa$0# z>85tOgkxQ`-|S|O<>H2Y{2d;+0mzaXH2IT~fr!XVr74G!Lpi$BVwf|IpDS+fSSr-& zE(c3{e|{mx!3K&pYf}e~0g&BdVvqzf+HR&udw;^)vXUOIxmVe ztTEtXC523aD=r676^8-l)+ny6#xjBCVqe>-fAyQ%aJnNUBrghAb{~R8J789w2w0V8 zF+whFNNWn(Fin3w{o@Y08DUgd-lSP1g!koxNvt70HdFZAN;h{ynzdNnOkzsGn3B$i zb%nH8am~__j`2n_eYnXAsl}RNt}IgZF*IlYu3)m{l&mhLFF9rCu!e_J=)v8yNN&hf zf7SlPWQ@WpGkT{DvB&NbCtB8%HFGM;r|ab=XLya5E?zb*UM|6{lXPA|T?cWQS%S|O zY3&xO)uz`{AIlE;S*X;#hxC_0Por5)>Z5t&(9K=ij(yo%-l&qah2+VV=qb3(8oC@c z8BjB@K^DK7kD~UWD+toagV)fOuwDc`e~=nV7_2fVhH3h8kN~bmUQ$V3O=wWuJZpzz zlSB{g6K&|xW+IVY`uh$@#bfO{CsgZORjN<3~go!9N`svH7)Smvi_O&H$PvseGN0wXCCP>iOOBPv zmUpCX_sUeX<*w~4$UOva$Sw&je`#Y{l9(>xRpmdAsS5J*HF>#y25djRn6UMI%>oh& zV#mV=KBX{F6MHLC7dgd1LemI8^Fsi{Rd0aDovi~ zQz^}fAFC$H(jW)T73ZwXrc9hu7$4={Lkb>{wj@W*rh*<4ZOlO#VZH3!f8Vv3PA;Lc zUJ_lUBtofHwH{;(^7DoMa5}!8yXN<2vm-&@Z&(^{XXrZybI>W?BeO^|UB$n3;3Gyk za?7TruzI+jXXu5BEa703x$aLgQ)4U0T0s?>^WHCTWu(EN%8XmYqfteBACq^8Tof7} z!VMzE;;Mte=Ejrt1)-E zZk+)!lJC4!PcBBL=G+RIA#HfV32BLmWze3(xjkynnR^J1HCnA`@?rI^u8#cMSI%RdWYwWH* zTlL(h^Z-j-<*$W~bwfP&Li>yT72|(En2K|vI)(_7aTQ#ef4S@~HpiNX3VE4Le>56X zPtU)m>wR#(G=kO zt|HfkV#WPC^i(KOc}@%^(&>^Iia6}U0EWgie!ya^5!u#VL^T#kbWto&#CndiCX_T^*n;NwzHnZk9waF z*ZTQtN7IAXAlX4Gx@#`F7S9d2E5bgckUA+BSu~sH9;DgDqWSI61|YQ+ha0@0P(<#p zf3&v~Ej`O)yA>%Y&+inTYrEa6R4dY{C)+CpdN`Bo$ham z5juzk_8X#HWF`*he#?(y+PlYqEG9*ne=7GHuES`4i1Njv(0|fa>p)RbgjsJT`l~;; znw7EpckCc<)Iin}PhUnb!xW?Yo0bkuDN5vn#;VWh52_=XqgisCw3I|>L1m0t<)%>= zy5+H(n~qm;2;vl$W(ywTWGR~X!t3XpMIgO0A7>RP^BU*(bnT;#!@jzYI_DK%f5owD zQ|1tfXQU^<2st9L@0h}$uSt2&HAbBAUd2SaaxR?RyCJ135YB?DQk`OO9G%p3cO8le z78Lxms12#=i%gU&62?OH&&�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 delta 77425 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 diff --git a/org.glite.lb.doc/src/images/LB-components-query.pdf b/org.glite.lb.doc/src/images/LB-components-query.pdf index ab433de1ffb9138ba7b78ec90d7ca1e2741c1968..bb4f16630b113c255ed8f10a478e1fc8eed6d77d 100644 GIT binary patch literal 56629 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 Lmz2~o(PjTXc4aw@ literal 47744 zcmV)IK)k;tP((&8F)lL-CCBWKq6#)3Fd%PYY6?6&FHB`_XLM*FHy|(|QZGhnY;k~7FeMAq#DO}9bc)G{2j*EKY#KV`MZ|`DRcJk z*uLTn`8(%ZP9=WV^7Zp)L+biguV1@^j4!v>6+xoQ!)c$8d^7zj6E45lN#NP!e?Yp)YNRHneb|2p<5z^ND z<}0Lrw{&{`{rJ}Jpa0{3TEJPpYhIm~u?H~5_lyg&2HYDP&Y&SJ2)c|jevhnjMRCnI zskplMQKx+hk_&3I@9Zu!iv4@^U0n53c=>&e^t-YDi4m-F`yTi?EqG&tw5S6gNR>!U zX(1IorpYOua<1Pasf8hBO`a{{cfp+2a&(l}rxWq8kgOK5eg}NDbRs*2`CYm&)$olF zHAqy^41C9N=c0lTP=H%yh#wXT7$CvU#yjuv;)}&|oVh

mx z`GlBzLnQc(OW6D2q<{X1v@W+TvPhce;@*jQr8Q2Bq6U*{4jRT{N>V{irlSbDx#dN9 zM)rXO(Bdjbu2x%Jle*L5GxWG9G!4;e`%YE#KQty%$r>xiK+MJi`F(}d^a?3pqE(&}(F-R7Qyf|~vZ>a6 zX{E?XcCOpv&Q2UOA#HU%`YEHqT8=&+H5L!$-2rg2xU5eqYRQCP1=h$gw;UXk5+=x_c+h+GXb($-=cA8}%N-R!|vWQqj{bh;9dVgO#3`vZxVv&GB|E#{u3mE~bzDQZ@UVxOG z>aovg$GpymmSh$Iv9p6nU7STI8^>zTnMVW%ptEVIJjW zHf?ecr{&zq&8J58@vMmmjp6@2X46$BCw3I1J?2jtzwU=jkF{fmVA+T06Yc!!g zN=0SJw=M-DC6<@mC2J*`P#A<(v#7xm98_7*ANoYLh*`sjV$IMSl=#~IVfiQz*1CCl zlNM-IoWx9*S-2Dk=e_8m-?DKVo;4Q6C^>T$uGcDT0^=rjL9B{leys|N7ujW$k#)+; z44kZg07+wdl%pFo?*c6E0qKHJtDqdM-CeFW4~*EoQ2^lg0_yZPVR2`%YiOc}I<tjv`2wm3AR(Um^)c$SNl@ z34JeX)ZW1*lHZReR?TH-fX!vJ9mfVi8yy%+BIs9)3e9B^z@Mz_o@mavPuWLxPi2RSX03ejBEozoi!P=s(g@YgCYKxj=wry=u zv76Oz-l|XqD(tBwyt=c4Ru9b*aM|q zT~XmkxvHWrd6&yo6_{afPgPNEdv8@ymymjBiW;RZucoMrTIfl04a}nLJt4?vYA1L# z1=lZKO;Hv<$8^>6lD;_))N>)omWqki4E~XO_bTqSW**M z8j3@!2`pTW4>eJjnV$Mp6F>`$l&u6n3G*Kh}p|-|eu5x%oq_7MB z?nT@`0Hi&vPTa!dn~9mI4;0Y>SrUKOY78Sg5mRsu1>=r5tm9yZ@MTZramr}XL3thG*N5BKprFjC-&T^A(S%Qr^Xq78DTdaVxReaW{7C@q5 zN@T3Eq)`-sVPEKZ&OIstx_hj~oYX?=5*d)m`xA0=lk)J(A|;|GX#BaEL%pxIT^#a=D<~ zzqcW+`cVf6V18DJ@_s<-;sZzMRtcI8m(26`Y0=pD*}lY^y6aZReJjeYwd$Et24)^- z0CUYkTb$Ml`I?6z98vKXhnz!Qr#G0O)~eTFx!yRIz630^5;1^2fecKE)RgGPeOqImY_v7H;f0wz+1L<_g5qp?S%bjSk|78XgCNM9;pT1*nxy9}hb#fHcd>D=eR6$eCDtEQ!| zldH=BgnI0#kT!V}MOfM<-ZZw1Cssv8z*LI(Q zJ@VJ}u7R7W^89nKsj_;jUP75HUDjlqRmSy_?bKX{Y=W@xN=9;h4HE#6R(SkzAW=$c zBH5Xx9WMGKJWvws5m`c=svHq4qv)*_)}mtUXN8Y~RgD!E(X&O3;SKMPSa=T~6HD z^={K|NWJ0vB!nv&y|>^I{uiet$`PY>9Gc%Ua2j?4)fn+c1q`mjwu$$a3+oiT+>z^6 zY*lxn=WV4aSq6^SUm_Gn>^7aZX5xAejid@t%?M&t42?tS(u-LCWaTDfZ@?8WF5Qn1 zB!!!d#Xj4!OnhE|_1VNPDrxg<2hpHu+f%)7yyd+c+z{Y{YtS_FZJYEq zj(G7RYC`9frT1*JSf?9(TQg8=o`y|pXf_f?mO8+(F{d@8urn1miCy+tmPVZI$Vf<- z5wt708^VDjhw`WaE2OCda9`|4Y)hw)6m0=Zu!96x!@h_idHZDVtkt^*sbdMc{0ey` zB$+E?n(eluWK3zr?I;Y0#O)>-?e3qnPR+3( zw*JNvH1Ww5UEvxJu2|xBK5I;Ks@)`5%S~4@6=t|wu!XG|Y{c75a?0CHask?aJj-!6 zuv0|#(bVDKag(4-y=voR1}mlQCjlmpcm4O2x0eLuDq54=0v&9Rg%-XtI%hjcMyucP zdO$!}y*zy+Ly-xm!bsoodPqR1u{}H_!)}A^ApwqSxgHWQcf9_PpLceljOcL2$FDe` z0AYT>LW+yLH{|z1W}}6$Ad5uP>iTbx!1IIO)A0x3^oy@UPdC)cQP$6e1RnXWc2FR_ zzd%4#?LeT-#;hpQxjz<-v_;?%D>~zv`9KKV1SCQ}L1uS$8A+CpGW~sMupx;D=5K4m5nK7fAS(xbP)*29!pZ1RL4 zn(I*q-=3WA+8L)W7<`>WDX{1Tox05V+gn2p8;QIa3!8Z_1igog^~L9?qoq{Juu z`-DbWvxC($Ni|Vp0@w62GZ+|w_-fuOzR#Wbz(Fee6{P_mi;G`r4-tFqLa3wFPsh=- zEIE(|{Cu3u5XCzjw2mgArOCAf z3qgb1Rgy>NHxS55n#FdlxYbvX#^ zb@QVvKM7hK2oE99=j1m653sm#;GiK?HK?L*Kwwu;F`_~)7lW$9tf%~QSM172c^ zgH=NxW-u5h&`OmU5#)D4y0N}&?WH9kPa{zf>B5B~p5k*x^{(MI7=HCg9mrS_x+Vk( z8_5`Ff{W;cb=P1#ndHwGtRK;6Xxal0>{Znv9j1`Eo#n_K$3QFy2e430LSV#lJAmH> zfVA?c7lMGNVu6Qs2A>puA%e6pMC|*Fa}IGSbYZxWe4#e925qBZE!MLJ5Tza_$+dQK z2+)KEbqkP1bc-{f=_p{eUpvKQkJxN3|4y3o9chCIE-u=wfHSLU(jgWf3eem*D=;)eYa z4~Z1DsB$(1zi0Y4x!zm$u63slW+#jBr8(fcc+4JJT++ITOKB^`Q(i4Vq|X}I2ay8c zyIK^{;I*6jMk799NJozX>sz->%nU{bD~T%8W{kIqi3d>|)sFI?Fvpf@aG4jB-`Lf% zb}EE2bmr{!34w3FPEmAXD}-F5pIc`cN3)KXR@kYb38mAYa9LVIW~UZ&Z2inpZ# zr95dtQenc`Q}RP9tkEunmLnA=t{HH2;`zCVtvt%B1!K6{tueE&K$P|WZ3=9mFd-Y& zo6{fY#BjOqeZL29V{T=sOosGU1lDP`D6D1$IC*P%NN-($*0R zb8We%xSV1E1MDRouE!Lnj0%f|Wz?+yTtTt0!Z_D07lgI^kP8db^gnF5a0yIu;X!bg z3-2TdxuAaALoO^xu?VDK(3-a+80H)j!ACI6r5b{aF3x{W#`tZnp9A+7=0h%!Odk~x z%t!1JPC1{Tkzu3P8BDyQBijfeWyu!uzz$f;a@5hf^_EM11rI?_Nl$GF@ZH zK{Q{w@S5p*TjfbQ4w(*at`yxG3*zBcVJ?*Y-NZFrEQ^SdT}F$-*wkC2CP{+owX6*K zl-a5Y)`6&*ICY2~!=lM);X7Dn%$4jowP?JXupkLBYO7rI%{<*hl|El~T-H3mI8&6s z3R`0YH*k6F9A;JnL5|>C!({yPUm%dkGrvG^Qi^`-@OOr$B3}^6p?mUK=qZeFTIieK z#d?O!16RU4Wg?g!fmHKd7#rY{RufVP0}9>kG=}=K#0T2hH(G? z9dg-YxB7%^8+bv6RKO?Xwwh7~e}UYu?^Yj>$7EmUrO7Vt7v5sg#ft?Ql3{}UzC!97 zgkgQFOt&xf77X7Q=~<_COeCr(k0=#OV2x@`Mm4d@43oavcQpt?)~+Gh%-eqhMYALv z>AFvd9T1f#&pTJSi-y+VKx3yIqlM3f6b(Buu94cUvPBiQMW23g5abQ`O4%Yx*d$SU zj4)!QHax1xTT9fC4Vda8bX`qa<)&Hb-~|mrkqw|=iB-eUFAsyw|~S1Njw1a%7Q$mP7O4nHWhRTW$woBBk$bb{E#Tq6}g(>hx@viHRl; z)u~b7xH-a(bjz|_j$F^|LF6G)m&QgAz%9xNV_XZ;gsEullV!o8L*gm(ilKQ$qK=o9 zR@sJU7M!bP3Q3;D);_`f*F^zo8dE`XE)Ds@h^cP*8I4O?$BCW^;#w{G{sts%kqR4J zPmw$&F3Z-UxKE=6#f-X`h2PL2JK2kre9FExc_E}@gU zAr%Dkc4K1pQ#N+ByK#-cJ6{o}1Qcb}awUFi{g(Xcd*8qcQL7U?t5*ri1KkEcA1^P1 zE#eZZ2w)nZ8$*6C1lMmSA&t?opMaEc6#o0@_5-kcg+FzPlnx1!uxG@_F9b9QZwv$+ z444DJrOZ$^pwpR@QKV}gF(Emy?Athq3JD9r4y4N!+1cr2?O68xAc?%aoC^v;ITtumkLvkGo4Fb`S4*pj+Yh-KD z)@GIi-5biz*w?Cot$`>CJSK(q++vc4`~Y-pzp-2X~K=1EY-7*eu(Z=08k#f6Q?)hxPu4gY-EVxWJ~eNV#XT;T5?x2O}9apyX8 zOMI0o9fCNuBTeRE7a+U_Fs$%BxFB(HQe`=-VUBA&%|1q~ZX5^lyC4uvNqsEr490X> zCc-O-7-MLJl$`})C?1dKoN{jqyU2t97re+P4WnQwKBAQXq9|$cK%av_1`?Ab|87}< zo#Mji+Mh>_mzwsL;f>?!9!LYu&|c)(X-MG%lB)`1z=;ShLN)PFUL(S-Ys#Ndb%H<~ zkLn|e!p`v-KB`4l+XQaow#v_#b{~vBq8@(@B*?Y^fbE#-;eQyHy&m?5 zwOaY{&Hi!^^auOXzp_QhLIrH#-1=dE?5pO3`MD8`V{<>wc9YC7a5rY8B{TP9b6M~2 z#E)j=lO2fg@!)?R$cy2{WC(nU{Rn_t-U8r4C;-qwX#EHPd_r`!1;F4XoO%QR##p#$ zi*|r7f-|r20%^RUKQU$Iqv}CZfnR2b3V4vw;a_Q*TWxft2O0S|J(^x9 zj;J93pzfcL&cdsjv1pJ0?uQmFf*qoIE?VX#V)my4%FuV#f1OCeT?eAIO`WO~b74bj z9~5ITf$Chd(&a_2TsS?1wg_lZ_$^mEmoMaC@DT7PWD_ubpMlrWubR7%uAL&%e5IWJ z2G||lHXo2D_-*t7*b{x9(>~we%|_5P0Q2Sd%9&Q~}g52os@Hz~4|$1}}? z)2cD25?Md)MJsIseg$BKq;n7W_|=|=H8lw1z3p>JUX|H8hE&sRD)XeJc(2nPk;VhH z(VsQK5oRJ#6q&q13#hMSU4c4MSQnw(a@h230PjW!)lFiI6qx0RPpzGUqAo#JbtIm3 z>H|wCdTC4x=?uPFdlV5I*SbZYWmW0N7VHWKdWuD3Gy<(RYEzL7R@q-zw40@lIu}rG zd5F^C^R;Y}_i@@3`Bfintq(~e(0h1`MV_7uf#*yV5yjTi^h9SwPWxQ2ddm)bHA)av zZ%2)SmUnT>m~ns4MdY4?5AUMoM&8H0s+jDEfgp62Mb76{F8X>(&~azN6_5UfO@Cbr z1)DJ}vi!gPcVA**@NMKtZqX$cK?)8G8PzU%!pm0(?#>J`kFY`~Z}p8uAdr|0cViqg z(<906J5gqE$u2X#R&wCfsJyFidr+YE^Bb*cRC^Sl-l$P35?W=%GZnWm1c#EWA+CeD z7OTDiTsC;!9reqwaO6W9{6@_bfHZhfE(}B75h0D2gTiPo7z$C5b+I`dE(7m&G#T_-;cskp{1gIA0`Lva2{ zGU(FKxZcJK7ELE2I6}!Mg1^uRW8f7>Imw#r^N^a$4$7zS-!*X2d#VTB?UB023AH2O zjZIQDYY5vsIe(PB9_F^GM%WXzsv8?RE5qSpR!ld~`4&4)-*3R&5XW2`<*qX&Yz`*_ z=?k$FmG%wCv^sp0Wsn$w)bH=uMWRET*)ICV5f6lja{8b?PX8cPVE-3X(D^Sgf%VyC z+;>r8tplOK^a}uQjqnr+$mBP;^;unD$ZPtMTTzC2bC5b8#KA8IX=}y|!}FMO%Em(I zx5iLLxhN5r#_*7k4a?U+GLNue#SpRBL3z1IhAuxOgCRV!V0?b29*2Mc;t{rq1IeCz zeG+4U?+W_6@V)_WfPgomR|X`cA}7sTjOTa7T}51_V>v1039*w?S153=W{m(A1IU_q zo|G%~xl}z^EL;dY@|kO6qw^Dj%k*VDAvo3sHgQ;4NTQkJlEH^~<(Buju=&NY1g?0% z6H}?*xY^YX}J7YvR#9SsO+Ir#!j8CL*V;fl#$u6!;4=R{lilEbvYy<;mDvDUiJvC ze8KuJ2l9I%J<;|cBxo?7kW1&fXY&`xz{K5@;GI$h!fn2P5bv_|yb=D&0V0jI$q`8<8Jqi2YklzbI7DhHatv(^A z)xU1LLm&ro27cOoLe4PX`|-e2@SfoR!y3+EYB!BM7E#k%79J$CA-{rPMc|BIL&(_A zU|)m_JBvLsY=5YuYMU=}H!6*V>Xlbpw&|M@wHWKeI9?F#z)lTi@`cjH4tA9b2Z_xA zrNn}C&X~ECD{9C!hGLD3Wcq#4>hCRr8!fE%G>)7*U(+w!}b3rwnVE za^^r_bMhNm5o(PdYJS4fL`EwIfvppCal;^B_8xZPEb#MTuN->Zma=NVi@^5v;B8QN z&Z!|OeI|xbu>K}7Y$=J@T}H4^V}n;B6mN{InKC#Gbg6_~5u578uUc|#0dSjdmFZ%Q zbXIDnYtsGBeN9afq89s^0k!F&7(}Yi8dyE-DL8Ire2a*IG({99$76zht*=x)vj~C; ziw2-M{Jc+!e7Y>_wNC%>Cl}m?{>nUis9(5zS{Iu#UEf+yv1?>S-qy~Ot|laq!C85s z0b2Ja7wYXl|Aeo9`yW^T_f?IbXOilM$PUJzbQ zacfZ;60mlbEB5ydVHUjQz95kF>~(2|uUrEUeGnqlRHhemmsbm9v|9^%YeXhnLJ!z= ztuj4}_(tG8>0A>}DjJ5n_-&PG1R{@7?<{v1C2a)WrCaFUlI8(OUo}8(9iw2R(JB|-9603)ZqqjmNeG@N_Nvme{{?~spEX~ zt_`3IVGkJip7{o##mjva6VM7RjP$Z2pO&r|)h}f_MI9*T+ z5g+o(_D8uk-g5i7IFQ9&P)cM7?0t!cVt&b*ToPL0MJMIe_+ZsQ$0 z^3pUX7@LrF&eAGZb)VovrD$&8CpQs*}ihqziWg__tC6qk`B24sPIa+umK zGv#wt3qcCvXV{`(Yt$HfQ1p$puLN0SFVUo7#hhaqGlkuXGR`LIB{i41L_DIqH7Zjr zqlZEvqO?@Z*W?yLCT>Gbe8RYf)2u(rUJdSdGIM2IZu{p#KunYThvaR>*gNE?nbYbW zf(S?mTR<{z34B7HtqOgve}mkw?^Yj>D>L5aC7IDG(>No07B~x&t-J}aA-@Om9Hd%( zLT;;n-JTwZG~_WAxBG-V2L9TQ2R?W_`|P|kRQlP_5C&wZ^VTIdKOuJjodHaLflOpc zeuZ>isLaeHxK`HjZ5dLdEtK(+w>S#BJJguGH=5Z!P`Joutx5*wYCmPPnDp*!$nS;V zPKHMY!Pg1tncwAJwC@wE-BmT zvb`$5Q+J|G#1si16gGVU4={u)!GYgAp!lEG+b(HRp4{n9E%<@LZL z15w}5V>lavg&e$Q(Rd3IZHDlj6Hk`dCsqvCw?DR!O~8c1H)$y)SOF+)%$YjMqX8F9i>%xK7AEj>@k*OTxvP3A)(yG#CrsZYoqz;5*pc_?gin4=sY zGN(Sv!-rfD(HPS4As56qB0U#6j4HT$q@s93L{v^bl_!a&bbP?L$6fXCLw@A0P68Jdi1B{s6pq zkof{l`a;^{$@~;_f#-H0zZb$ZT!OgOC*-vH*KG&CVC~Pok(w;NwEKj()$d0?c75yd z$K4QaRppg@bafzL)~-VdEaMm4ifb9act}yu3%HeKW~hJ<9EpW^_(2mCy-ppl@S!PY zvYqfqA{hOa>4D^_^Q}>+|0+YQo1Da>^BaK)fER@6A@CkZn)Y%Qi~{`1GQ*xLay{wb zu{MU2R$h7Oa$Vyaj0CJIkJSRv&z?tPj9EqE+Ky2)n&)trw)rUIt%2=(733}ix?cwS zUm)PR++HAHS@wGcF<6fp%zwjm z#;%_4+z4OQ-$)Gj1|kF3Akm9fu?^rT6Yq{-l%eVyyy-;@YE2?fhAIz#yUKNPo`Kh# z3BelRY*j5peGCwPlo8ae^X3hC;L}w72{}|v;@6vW56;>UAaSZ8rORI-mqB)`56Ijj`ZyKeg-4VUBmwr2SkGuGZ1St^@{fG*pt4g#@dy>d9W>P{ zy=ax$=16rA&x@BTgZ5ZsvWy3C`OU^F_m#Oo)I!&*HpJd)NDB~G#mpLGDDhSDEfg$f z#w;5{UrnN+y2r_vgDYakvS+ro$h(Xd+OXaliEar#I7RHmsxf4afoDJ5%7aM;XBL=p zgy++J+%kN3*)0U&9T)T&c%=>EBEp-;S3D#Is-z-D5h7(XR0>B4Nz9iEIWImLxXWB2 z@$9KVA;TU9PpFzDOJuHPv}jXuvPf=jT0^XQe3Y>nHm+W&QO6#Qo=R{!s1Fnhc`WJB zH4^4X!gmreTW#TF#b?u$U&&SNnkg!DSQ~J=K-JhJiArFZ#>5%*zBr?~f4>tlP zi4bI;ToZ0OGT{P3=W0sIt5}(g70%bdo0AlEDhtt!M3j>l5Xqq|IfOnS+M7LS z_zK3(TyRaJfGoq^6%)baQ5)3-$;KGrHv3sdLT4@3E6(;&2=iWVAmZUeLZ;C*>9wPB zq#OLn7!G)esR9p#zQ7LOE|U|&n5l@J!uvmzJ6LY6Bc7QFl6DnRgs;rhE6aLg^zcL4 zb?$8+HF}fW**)+E=*u?-H(_@agD;eGl%VKchC25*48f6YXN@LAN8VrNH)tzhTi-OQ zCYp!6(dDD20?XoG%p=`0XWk@Nb`9Oa<6@IQO51X1ZhyY8S(WhoU>lYaNBO!Q+}w9P z@d{X!HM$|V+sN@ z;eSu@DO3BDO;<&6xht%KQn^3M8M}L}sv&$Xm^JuXcBN;w>l@UQnL3WE%7jgfhk{hW zIZnL#=Fr;JKb=T<)F`~%eDn_!-;4I5M`djCA_dn(*v3ux{wRArbj%Om`f60*B4(QN zjMN!xatIT`bTd+GEEMB4QDjBQd`$)|5Q^UAk!I#iY)Qy^BlERrLZ2zLFT=RtxX^-|3885q%b(#~K+tAnodJ!G@-UTlIE2aWGj=FAxm zcWdaLF!y`>X5~xkii&F6(GEVu0Vd~BWuf5){=Dmhdvf);K3DO$b24S&-!4Nt%I&C199kR-z13;;`7y2h-7BVw!z%Cz5IW^MC|dZpbMFTN=ln-PDz2 z1$XzGcn%Kw67?ima?!S*8F80=L};C-8bv#}(?it`nORoaW<=WS*%)owu;5dBrMYKr zlsaB&@2aCXjTe_07dHJ3d=v52rdXPY)JK$D5Et=b_w9LHyU(k3YowwU)>p)pzA?Sd z#wJuBM`dh7@8(C@>tSg*)4Q~sd~NeeOXVoL(sIr>Y02E84{14>(CW%UWLK%gkLw6r?kYys5Y*&gzxg*{hUpY>qa`bmmxglFrj`=DoXL%QulR0CLpz|wGM-Z9| zAEJ^^^gKi*FFlS&4~Z!)9-x(LKdH_2q8Im|JK(H*C1BR??%!tXr(nJ%tApT6wsq z3SLaO-lkR9xIKD<%|7x2KO_DXTZts~%-;sFsE;&`Rz6pPs@g`?i~U?@HwQC?UMbo!`( z$n@)yn!FYLbV=d81gMnllH!7n>yqL#RS%EU+oXQQflPaH{ZYl~@2|JzK#m$=qx5&k z_DAuk6^h>eD4s3?VfIJy{E;iS{ZTxjOyl^Y3hrKoar{yH==J)e2+8H)kK*xdEXN zmAH%0soggf1;AUTSbDWCh&97|hwgrt{U{{l&aQzVDInDyobvg?hU_8i9`*>|rvT5) zzn_UA!7j3^o{4RM2aYUmeUwwA3{Q7r$U!xsxZRriHl2^|@}1bJ;bHF%PWgP{Ks+|N5F@Vn8bHFD|4oHFQF@U|8gc zhT*#~e5{ve3yG1!331p>p0dhi9lQgEyNXi!@4a$h{}m}4zPP6U>sR>t-~KG^&iC1& zxl0rcDD6!_K3hI5^Y6ZIsWaozXli2F(K~MDRyydj9sq!uJ0TNtU=%Tq&5_bIGs$M7 zL0_0~<-J#59ZkGCT9LVtH&Yo|{?+iB&9YIrJDT=?|5wk#S402DZT@}L;r3BloRLPV z!)M%Ma>xHaYH95XmbXQ{I3KZg1p#7h9?0*7bY}B_j`N(gq)r+QivQr zr7oAwKY(!awjsX@lK3jH0W~nnR%Mi-q2poTdvMF{D2hsf(uhuk)k;L-D6>} zDq93oVKqvb{%Vztj?7GXtIUg*L@~E53EE^v^@+ENnN^-1Yd(3Ex^g1(8+v9Qw_4=W z#=D_d6!~dyIVtDig+%${7AW%(1C zY?yE_D{Wc=mk%)p6bt1^*W(@}l*Lq(10odW=-hIlVmHQTzo+x079)f(jG;2^0S7o_Sv`k>>G0N0CV zMfRS0^qVgPxIxg9_eqfj%)No4$$J-vvN;|AFKc|UInkZF0xV`cq-&AO$0bPpl%KPj z`lpCu(&e%ECvCh2z1EIXOhiur3B8C1htb5}=@SuNi{{Xh)(ZLhDNuPsh$}&{pfcA^ zFO;7exmyHB$FpFLx-Nw3#Vm_#r#!OI%h;Ws$FD<8d7K7#U1$S-@xj4$SX88wL#A6J zRx-bzw<3#YfSeMtkZ=l&5G2|dmV!3~Pmws_M($RKNmwh6r3ogLlD(4A55e>97V(^g zgItVfmlKD;78}CMlIo#JS*ScY3qItjL78cyhzo-x9s|YcVG)gu+zVo-6|m^vpVED{dWp z1^rAG{`<#FX0-s>b4?*?0bC=6>MsPB`OG^cG847d#B6*X0$piU%t?d%7AH0mtS>-T zJP4bUM3~5w{YxNgIuhWIAX@ zj^g?Cz7W{skHv2YRqRSBW-_gp zij1*aCXgg|IcPuacE;h?v45HWw<@rv^n@<{xL5f)KL~z<&Dvwx+ z5&#Hb3ROfbE$fXm@i?2+Dtx!l*w(uF!H6z%CAjIoHRNb!4;1%=1MKOco>Q>C8+4h~TVg|{Ut(YaAm1K576sdKXK#KX5Cw{cKgQM-SWvj>< zUed!nIuLGWIw938`U#;cR**zvuy#c}R?n7MqEPPIW;8~iU=3RECMZgfw4z1Tv#6C1 zD~(e|i!OU}R~VL6O#zU2`$-I1xAeptEn5~bZ1DM09ybM`)KLmt@RBkg~KAed(4 zSBOFlkp-M1Da;5{k@vb=ii$Xp`g-r)II?boMmeb}a#_b)Cc3nky8?EfYR?e2Y6D2m zs-k}7xl!`FQG4OL5;dP0?v|&USoA`-I zXT-*r(jdbS(h4E8FXMrMFYeZ0vgDY(TN}3Sa^ymbEO`(*un8k^gFWDr;zHzVd6R?H zQD$nRRo=Ty$>m$#*2RTPEe0f2lNg9x>}X59o6vKtBEuGid>zOfjRr*3_SAVf+o0Gr zvW+61KcGBCFLhXwr(}6pq9?O~3?Mx19VE^g%p#?&>JbWw__g9XIKv zF$#gs7HNpA+0S&!L|2wm`qZEsfn{>qU>Y#(vNU@K00~ zsL!YnQIxysgY<(%?$RLp8{{&o2&#lxWoYZX<(6}_>3$#wpPS%5Auo!(G$RoXS)6HH zNM^FZTIy8UCQPZ_y=U*X}VMD*_nT}%bqza6^ zDLq6C>2W!lqhgt&8;{altif2-W55>N%eiIZv}nG&Ml}wtJxjA`Q@2m2G?P))cD%GM zkzcFh-iCxH40e5^lc=RF8RC(I!zxp>^eO|Z`t6%qnD*VH;Juiv7JHOq2orZ6vp#25 zk&selZ88z4!X7b7t{V=ohn05WT?gAYMfXZiIakZP4SB5VWQ6BmAh3GhA=G>osWFqk z15to$w!}`U8^en1CzUp~2riq7M|X=u=en+UYjl6J@Mx~$5Hx3f!&KX=R!s?JSGh=> zWC`0_4#wApJmzW+{)Cvz#rjAlSo=}={{T|N4oZzw5s*WLRHWk(#v!(Bc6{KTaQ1|F zQrLWcWs9qdMRpl2YLblJHOlZg-S7p|a#&wTL?}zL)y9jm*>-={UJkKJG|6(?-*}xF z&wq3qMKZN&w%K2fy2w~@;iOA)LyuJvoOTNyNf#4Zztn0b^bUjpCwE6e`~;tSxJJ_< z1g&Y>gFpFoG7kB(x#FfK(sP1YLR_Hswcl(Kl2x>4cI_t2edb4v(tSWveUXpuHrf%|GSoaRkiF8mN=*b`V$uau z9inJve5G2J1_UkQR-{RN0V!Ee#?7J#uk3c$^7JrAFP|w(iW^;lt!Du zM-Wx-n>`LG5HT##>l(10+yez|H+JjZ9oOE4-KxDV^TD#r%}_=1(b^AZlG2*`ELGP` zm?cHRigY!m1fZUsV+$J(SqFu<(aaTNGOkBikA$Gbfn>dT_s+QzUM=RQ)B`)u`5G5+ zAXk^Sm_#0*kV+}~tDcj!`{d=zd#bB)7jw0}>1c5t?G7?U7M8rVAmYc9p3S*h@j%M( zByks2s2sYh5Qhb;FLW{-|BG8ZIZrUIY{HzpNS=?T&^UK_8}4s7bI?%9`Y?k!fXKdm zAi9RO1_#Tu_fzNhqZK7A?b|NiV_;F`4&lY%YKq`~Ko}YD3=64L$gdD)Re5Pu``P#y zqNA(*_1};2c)Bylc4LM)4ss4|_zYPMM<~|ggjC$w(J8$G$MMYguo{#b0k?k2KF80f zQ6yk%vr#b^~=7)g2%@|yv6g)iE)1NprW?5G7{;Q#m=1b*+rY&fUqPsr|>1E^IGok46c z^sDlXMU@%UmHD)x0INs`Y0Oy{Lih#_+gF_ZAWozE#k|b75LY?#%_+Kj9>u~~A~x8N zj-wfNz}exzZs-#TaLknvO=!{ds9{Db2#l%n;T1S4kUa=5BbRo{KaW`o^7}q-#*_11 z-6D)7t_9|v$ASFn%l!a2RK6QDn{MPFtr%i4A(b>#>=6KZ%%%!~0T2R>cG78}A;ek=z+P>fp;eEfQdRQj1O=sw{Yv7#X{+!y@*#p&_o&T&40 zhrjv4an+#u@N2S}Y|us02(z9hj>vcW60aB{FZkhp1#4b8gW3pWd67ID@{lvHl;QAA z963K^SVdN{k{&%B2zh)EQh4L%ZxHMZ2|$Vh)L;Zo#Z3Y}&51oGig*?jMa;G0sZ~i0 z#QjygA;b0N!>X%jdM%=dibsRS{dq(Wukv;c-XJ15@ zGUq@ZNa$1VSbadi&#AmXlCGlQQ6G*Zb=|P+)#5ma(H2CHBvT^u&ZU=#A$Y53;m9Hp zHTf!(f3AEenStJzc+FY^?A=s5T7*>HLDX8~gkqLQk@)+0rv(Sxz~!4H#d2d%$A$!@ zK0~k&c_*uw^aL8DCg+H^ow9`#FM;J?p+(_Q`Nq{aWwg*Gl3N4Yy`v2)o;0eK%NlsZ zzNu>r#bI7WBjgu%Ir8xS=g); z^wB_B6nWamyDNTSmkC;8)Hn0kNQ2=FzKXu?H~g%p?h7N-jW~sEu4PFK`4XdgASrb7~e2-es6p{dCHBgI^Vw;|! zpM0N^B+JDOQLl)TrukN8C0}fc4^#I^UwK03e~1baYPO2o5QtG`2CR6TEatyLj*2_2 zJ|SD7DrPDE6>?f3?y2{`Lhjdhs}IQ4KX3DrxK6rRKfxH5c>1PpL z^277Fil|bldWXC*q77j>MUNEbMoXT7KZ!L4Zz;vw| zn_psNh#Wsa83jCP2sP_X>*~wfm1m%<%&4bZF3nQxLJlVOus$Idqh6U$$m;?QI_w{0 zC$IK{>^9&M*>3X*d61o(Jt$*$bVt3LeLx=6^V*L?tLhN{1{xNK4A6-k1rY22Zg{c; zudXmxi`^LN)O*9SK#Cvo2{InF^gUx@D>x?6*T@d>~?v7`9YBWk^*~-+>G&UGxyT zG$g4H5e-E;G`K~RBF_xrWzY%$zbMq!P1UI-oUyA=Pd4CE8Dio)lL`>M;8V zg3t&2BOTPm9&&TJ?Qbak9bGsuNolH9(K<&}vPeP<|MMXNEEl>q7?^IS&^eGW z#C1Bb;dCh{`0$LkB>)`ZQ16O%^}#trx)c`7WY?ZB`WLeThn$DW7CFi)dii z7)IJAJKx>Lx;g~NSWMcNA1o*O0N>Yv+ny4ot*=735QdB4%w6{`C?kbAOLe_zU2(OT zTT~dwLVcIi9t?+Gueqf8JQKakI3B43u}2CC)MorTE-B;js*Fn zI7ah3vsGp7zpqb<^Nf!g#=~|?ZA2Zn)WM|vQU}xWOT8@x1#}JOh2xjH5c#DLh^C3q zKxO_U3o`ko>e&y=FI7VqCNhK2qTj9GekrB?`Z|s&WQ~g3QsnAJA@(??5LvQiQuO+B z-gY|yb225jV~UYa&lGW8p)QF)$7lj_{T9-l~#K@rkIAp(~x5d0bI@M6OJil z_K{CQjwu9u5sk+&g+P;PmCzL<#xCucy5;Sdx)8c>7^p(NkzKkoQLh*LF-PW7%~~@sWaf9aB}0hdmrq4EBoGGsR$~dHqg@8INZQ%f%heu92$6 zou-wxpJ{uhKoKQg&lD+U-c1w&AGt?5o2Y6nwLMcv3l{6$MKN1q{(5+(7+x8_wrlDT zy*E*BY$4Yao<5HCDJKyb^x_^lkSizaG?#ut_UQ{cmT=YaOPzKX==i11X6>Y*Pv$4x z$1ivvA$jA(lysY&eEiaM_wD?iET??_()5Dl76GcU_4WLTx%Rz7xqKga z2jk)qk;C(T0ub<``)&p>HYFSFkRU^ufG9a-8jn=ZIU8gvB1?9h1BCM_m+cg}5K;9| z$`TSie17-_PcZA2d>BRAfeok;o8uOWf{LmOKaVN$^`o~LbEP)uiUwq)kK+ZOhTK&^ z{7Zj@#3E)Eq#|#!&9_t(Qp2-})@-jMW$%U{mMC=x4=BGGV|45d^}MrBPZ62ED&!qI zFvx@hvAzuODBp_mDM3#C%Ihr^S+0F-1O;)5%z(lA0_3dfdFaq8c?Q^@HZi?e2t#f> z??()Rs6$#1l6-9YLFMOS2=e=Ze3NByMlS&s6VwqCH0K(rf`Xi`Z2dxY*Lc}n@3r-; zhs~Ia>6fXXX3*1qI9Ops9L~S^>O2US7C4T6hTbk4Osc6sRpug4+Ee;)z>ul=`s_=u z96X{2{__uaYq&p!o3D{XH5AOgAsiNcBI#MHDBo$yN+j_s*F#-Z@P_f%DYdFpkglFe z@fyB$X@v3xvFCUCq{w=F2d}6i5X~PtMSp2GxLc_m{*G;c(N zKP%zp3xYfXA5!A9mG&YA=j%D;z^it<1)^W7!f;tmx#Ee%4b(x_6>#8 zLN}*=K6>4Y9w@W!r#jwbeEAfgxxHW7MStkjKOcJQ(=&(PTko6my-^8@1MrIb$=6e< z@UkTzO69w(wManXjg-jzq%I>+1L8;x_9Lc0AARmwGwAK{AtXF}dx83RzM7XAS-;A|;k3wXjA(b}wOM2~ zeT6n=1#Qk0^o_i4%+1IwEvEvmn5#!z8A4WdB+H1YI9~$NjThEnf~Hlbvo9gWK`;5a z9H!;-h4Aq&H4l@y`}u)_Vz&O`0M-bDJXIVYL_`?6yN<-*NOa*c=PaReYfRS|#u|;d zgfJrA`J2A$8YcC`Di4M&BWV(Q@Jb->lXeHQDB|CcUqI>}IAUG#Z0P-kUUCm{#IFujhXQL6p09Bp*a--gV$D>lA|K0dg?-yZu$+KF|RQdSxGw9NjO%| z&*I({A4p_Ct~w~9w_f!LM32XF(11Zql1t&X2!m{-Cxuo|D$rfz;&f&OITe%-uRt%9}u_t{pg3&Yfv%)2+2H9P#*Z3^!Je)c)Ck-~i1#we+>?p-c-%54^Cf`wu)RPG zE0`6yFE8c8NgLt}kW;t8C~5KhDf97)3#w)jbQKD$H-M_hw56M~I131r!+VWsDbu5d zg51Qs8*|0%ZDdy~7_#*xv&hSKFJxEU;)M`F`RbQqg@pAFRzNoxqFjhrc55{tGfU7h zKuJ`Blf!W)kC)3lbtUAa=?_WU;NKD3lf z@3hLgp%azGxPefm_nn?;L5el~t}!fVy_7S0oX+6Vs5bZwS{n^2I@&bIEHkSHZ38By zY7r^-r_hRr+(GSOiiXhx%8jzyo59A+iW1eVpEQP8U4NH-LF_<|@N1M5366<}IdHe%9b~(OP6KA?-{dtFc8> zVv(pc4Xdn7f>3OYW#vx8D3cbwZF4V5vNfgPfa%30ZJuND2eN1}@*Va=c6wLomc!U= zX2=7TCg)GcA!ks%ndGXr1Br47{bJ>YS?&XJIODYXglyH?qI1pu1#(;AKJ54_Uv6s@w%hccKQi zU)QW{h$R5C5jm8L-)D-t2VIRI3seBQ(8k00B=9ePUAjJKCioUs`1i9>H*oxTMHf<)~Tk=eEa$6Pe`w!WZ#IGbZxvXqD-}Cl%A% z-4MD>$sMa^QG#r!NU?Ow3UFnM4QbqUp$GD+UVYU!s|26a305c8W2LT9NAv$)izZIY zXDwRvMr*Id7Qan+XkB>8&SuqOSIW((3%xD+x;o^8i(>w?rEM$bF+zU5p4&FYH?|_> zGa(!kS0@df)sRBUII4)NL%qDl(3)0fo+3#sf4ArFk#{e*lq1dh3uPm&S+ou=j?C~i z!e=3Enm>>zES2Hao}$QN3nmVw5F)u0n@zC9FapjfHm!a&+HlBmrjRHHi)gr3$z5f$ zUFB}Qo|Qa_Si*)93Wc-gA%qC&Tmyqw=r%&OGN!%pZ@pL}W20d~>Z`4tiEB*$wxj zFJX_1Cy5ds@o*Zt5P4*i&$cLL3Bern7_uPzD3mnHc(Q8Gkoz2^a$Du3EecNX@otDy zDI=>rH!=Jw#|7^9D5$ET#Z;uQPgAMSGMZAujG~*e@95D(!7%wTnaaDn{|LaHbEVyo zVc~N>Rp`>nxC#axfPGlhm#Xsr!$OXH&4mF>37a{-YSP4EDDwn3!&)M3=BYmW5N+bD z0J9mo5gn9A7A*$T45y&?MKg3BH?w@hOJ(XpW%pqVB~YPp%@#_^5Om`?gUr!k@5=U= zVbX<5{~1>J*!0h76f5MU1Tr}&3k4wo@77eMmW8>++3hvl-J+P6x(A_BVGSJR(cSa4d6MD?LgBdvvE}62MaKZXEHIimV z51DR75*Nu^e{P^M`ikEA2XM{mDX@nqVUS_SOrX2-A-@cpn=QKeY8rbj>5w=FXYT^m zI%_D?D3a{+m7k$xiy#U;15HteJ~AC$8F+=T$NK|lpp|AZifUSrM9NW1ShFUYi|B5< z^|IX!nIB7{ZXz@5EF|#Vwy*c)kWAy|cWM(H$wZL+vb|^q{0buK;k`~kVidIu8dVtz zso32Dg5{kuJNN=I1~r-NPg%d@=sd%afr~jZ_sc~(g1*-bb0itkPy@jl>R@%0c~7n$ ziGT*R+M~k^SD7|u7I8HdMSFgSBjbh^kzV--WaiDLC`RR&l*@&zEFOSf;V2a-lBq_3 zhfK3GW4}q(hVi8q$&`T58qS+fG_wUHGB!k+0;XG9!W@{EFGOv&grZE$P}JQrEV)4x zDrK*6!DL+Fqk9P%pFlOB+F~obUQKNKRWkx5KNolRh z@XD|b$ZMT7Gc7%_du4I^3WJVuxvW#vjSh2>;M48i?433#uY1zj>`=`P%)LS3%31Su zL40v&C%`oercFG$2t4y30HL~H?+am8<%_Z+SDxKv*BO}E-j}QvKlaXayOT>$R8TY877M<0j@;vf=Hgp(mdljC(uW}dq z%2w}4LQZw2{6;x#9;gh*VwviHr{^F<@|IeQJ#a{kb{D_VEuk6api!VjW4IVcNr!<_ zf@Eg4mm(^jwX(Tj1<07wE7Hk1t1NFn)r;0}D&ZFHglE=JPWhmx4_TIq4a#iK73|Y8 zi#4h+sgsvg9-8Ki3f<=Fk^E=X#FZwC#&wUHMsRta<)DI`WGtelHr0S=PKt1+r7QMG zn|dert(iCHEX<(}Q?j#tWSbi)${j-Uf(ij&X?tcdAhKx7Rn zUv<#LxPz>aG-$qKw#kNF_GV@&8bqflN@kMmsmh+WAWS78vN0uYE!BjFsUr7VneiN5 zgjcFi%jQXo%jL%gd@~BUyYoH~*OsiLJdmqgv=eGgZpw@V|Fjwq^9igbuVjnDYGOJX z2ptW_FYqv}0w$ciDtd;5U!;9poTgr5$`bL_6QHZA$dJU0i;8uxGi6xWi;zSKh02v& zvNd4OhZCpO5X9%q@;500^j&gFoZ_-2x1EIw7UDF|S@oh``Iqd8TWWfvrQECc$6=i$OwkK%u8FP z?1wyn3L6ljW_)E#>hZnuI!bQn+eKgf+S%R=Hg3 zMU&{>A~OY0PO@LAi6Xu*bt-_e6g8skd$X<@Kugdzhle&9S7>M~!&iv8xof~~h66cwIvaZ!F8o+#vEnTnl?I^_Pe`bKv~kmNAiYZ@lT zD%TpOwad(=mvOO9yF+@NiK%Ywj0R2ofmzF+!aVLtvuZ$f-SeIjXjRFJgXATO!8;pR z!C7w_if38Y={Px-4VqF|gN%sRuIC)E@q}E$#meT5=+wf<`x|xBCNoj`)F})Yl($u< zSXjF)Vl_#x6xJ9LRfDIKqPQxGjbN z^67XmZ9MZRmQF#a?MnEHauyMGC8`Ak_9w1QW@-G$VpY6I(GkW1B>f(Rd^`6cK;aPq z^6kiCPQtf2ng6CNLhLvP_w;2d#XdIkiM{|{AZfC&_#(!tQ;uJBh?eKJB%AKK<}w}5 z*5qw1!{>rxp;Z<>=x@@>4F}aIL3A$KDUkyp-%B?;$b2u&#%kqJUPd}}(k`eO)%8%a zcF9~4q*&)hyK&RA%2^ZZGWb!>!WaVwa`BsuK`Coj**>JHy>6*Nr)9x+hBETr^VCL) zeht#GEV@jZOP8iKzR{u=ou^0g(kc&yrbRxROsq&2JA-&GdLoTyFjI)FK7+xQj)3zF{bUys^u8f*5$Nkv?z#(U*dXIt6M2c%vH=@y{p5L zF{m!k$(oBYnMgaaY>5cjCv^H0w&+dRqRxqS9jLb+k*hE#7pA@^!@uxRIDd9KOsN?gV!x^T&o zYO(S3I3sB_6||B*<(lofK~N7HWW7~P-x(|Di2`|jG zV9g>L`2~X03b}(EyI63tay;izuGQ->M&fCGOtcM-B7sAqk z?M<-Sl;Bp|uptO1e+$vp2*X2G+3qj!Evcymdl!}UAmbXHoc_|O4HD53pX7v_dEJpi zOuLaAFY9m~nJtPPe~1TOAJ7|&JfUg&q+$^%6B23!?OGcLm2nksm(7RD20;jEwofZA z9iK40f7P^`5Ygm9;5HG+ZPv%iILUIl=htjuRR=c&mZ#~JOr8aRZ+euT!hG1EH-`yU z2?sf=6^z1Z=us?eBlHEOqS(R88CMjm!WkfZ8zaPG)R8=~N-hjMVa-i<%c)$zJT3X~ zdIt0D8x2y4AyYfeQ#^G8vc!63hw+Fa=*y3CvyniCBgJ$C4ibt*BZJX|3#bf5iHwBE zRT(;2uEPDGHj{k>ww8UR5D6fvJ02#q%~HMC($l6NoDv*+gkuumzS?!7)q0(mdC*rT z=$qqyu;pNZ;^4518?Jj%q+ynfGtxkAvF$e~VhPl^2H-%&d znRgg=vGIYu4a(i-vhe^|W zB^*VE(=)%ymJ+y~P6Ul1Vb}R)+}dww146L^l+J1ST7B${XULlU*H~&~^G`k-hmOO= zq2kSzjwtX3R+D5(_}%Aqg90k|ef%(nZMd#0^E$!j_5*J`>}vuri23YtlcCeqrG&nd zfMq_zC9ME~+k;P>8po9J!pSaI;bH#w#@-}Za$Q-r?B7wu2#ydnFpQKpgpe=)HsW-$ z^QNEFr3R4hI~pm`*a35bL}{=JYB|KX=~H6vI0ISp?s4_yfw3KWeUunjqM7gV^|%&P zzpvw#@!IVxxE&(ET_NIhgJ<*+mrvpdnU+i0Kx)98vDhkRdQ#Qa9UaHCL{x9K8+n*F z?TA~3*}E$c#2M5a$Gk+j5jO{r-IL3{aT73o-z$(6ukKm5n|)J~oz=-|fbNry9m>yWIl-^KX(?0_ zIO1^g@JC>rk=!Wfumd_+;>4Y)Z5Qt(zwG5acYLCS)6m9`$g*q4B%jE~HVEISGc2zo zZ1oz69cZj&P-a9V07_WK;r@Y2R)((>Si9tj;`m#y3MF3fy2>FviqhkpgZCK9!6BK; zpI8xv8Ut1KRh8~;*J4dOvwoNxhsMu{V^KeQP;v}@jk6^u53Mg}L?YKhE}poqQ8azM z1S^=HoL=KdubT%uHxEar5BU+9f9RRkOlz^r7(|u?yD|kp8|`c%77W@Mah%QxO3!9+ zpzNM09hnJxC`Lr=Ge1OZc$daHzT$wlKS1T9bx|r?%BT zj_Mm17r`YZ@|W0j$kuXHg~}7p>lQ5m-!fyf%)rz9&0{l5-{_6f4e`5?4G&3ptwI_#FIfw&Sa# z#s~8ZAFILBif<_5ju{))(k{-m0-UpNufr86mBs8)9yUWLT^P+T(hknM1jf?NI0 zgu|^knMFmvD}rLUA|1fx8aa|qR7cj4o4NZ78a=@~v;eDfP?LNt4IqeNt9QuFSI<+_>)Ty6JSQdbdX@-O4=1>7- zv>RC{rR@l+Mya{V_7z=`B>)?D4m9CBY>zf*DkwE(MKmy=7{yYHuQ2btEx5vfTP=$_jsH;C{8{`D5@)jdMX0+~O0h*tgjNd#c#sN`i*G?f+Ucv?<%i z@NOND8HmXswb_{xfK|S|_S>$p)&lfb!`qEQuFvC4xgr%$kMKe{zETdnNzKp1???qk z&o@bv9HsWp=*=5FZrJYy3eFY9Vwkq8J8Kyf1Dj*ap+XL*{~9i;iQ@08OXp_Y$#=o)o>XFfNOD_s=R+CG8C}(+cd084lAXcP@Z9|-F8w8L~QW^yEFz&h*P(KpV z(BlZL z2aX!Q)(C*IVXKaOQX6ozc!PH0im8#Zmu;Xzv!mN(+^}_pF+jjYHPRdDFkzPjLa!`M zUz6dZLZGiCopG>-+!am<&PKM^TAn{|~!J1s7HB(-M(U69liz7@Q9e&?_PyVj(g!|f!KMf z#L!B*U@;kIjVS#JO5e5m6@Zk}dBLIV zBUeXoby`IZX?%md1xjLEbG<3+9Q-(v?SX)2H|3y|xJba)rfa!xpRaMdn}Wc98648iiCQDg4x&v_w%`%C@i>(>W@d`K zVx?_tFzz)KrJXGSEHCv)o-ttE(hl`kir8ktz^^jQdXvK>Nk6@O#>5w-w{*8je32yA z(Q5o9R|{m<7V%LaJI)X@hHLa{B|Wh?qXf3$4w{xIh6Oq~{JbM0-M3wS z%M|H->Nv@yM)t^^GN1_&rj zV0I%CjHroPu4fWf86VSYEN8iv!G(EivJ z(zY5Uj6icji^_C5c;gkrVl=qv`FGx&lG<@6E~BL4)MDHXYG}2jwPN;jr3jh++&Ez$ zzamM)#FQvQ^B%qB5C-|wRv?bnWv5Esh@&=l9zi5_$MSpxCO=M<7Ldc?BAJ0tc{vzR zF0g32;w%P{7j?-@EH((LZipl@RvE$3X<0P z^*s^DsUV)Run{7eoEqN+uZHgcF>AX6E>jTY`xQ~Na;uX3Xgitb@)K>^KRKII__bvW z2|QXk-T_k>Y~++JiQAXhy}fLK7hE$(Y)`0hc&H$iTkcAu*cbb8LtyYd1Lmg(b~jgxn2!v&pZNIODX>6YQZ4F&9vKSK%tx%5r=nB(n$*Gg$5V#o6r z>2R*RUz1CuSSZ^=l}l(amr-5t{N+IYo#o~FL%^``Aita`Jx=9b)2Wrh8Rm?UguZ4| zuGruyV#a#CP75t9@hy7MBIfnospw{}PTHEtEP@AZ97?pgMP8D;<09lq4U4-Mex`>KsGj7Dt+) zx624jV(}w$C{gyojb9+mKmZ0h59dyc97N$GN>^m6bp(-|JM8o25d9u_&gi2)DprjI zbK&lpE8y&h4;z^aet~w~!Z#M#Stg-l8d@uxy#He&%reIn-9n1`*OX}+2+qDyPregE z24;-B4Mlu1vIQF15;y79pW{sqMOe$#wj01mH1IFGIcprn*4#C+?1fd2cdZ3SRJ_w& z90yWY(KB+s)tDTIIIDsge-E!{Hp^|x23UJJykgRx9Avw?Z0^2_&$NmU=I)l024y0! z==ZRgWN3L-EibV1fK~1-d>pAGS>QB61Ab3V4r2y=PsZ=?tBuH(L%aU956oExmjiM! z?mI6+4)!*DL&j%*81q9Y!Hw8bR2X4)kQ2m+@iT1sBXTdyu*|2hjm$m7z6|KR%UIT@ zQ&s3Ton}$?^Jszh`>7lIKQ^ zd4=KzmJVf$-;OpqZ|LFUS0ngnO`%kcaalB}JH%-?z{q++JX2%hxE0M4K;KV?u&C=! zT(d7o4ue3kFWazJ!U@Y96e1_YTrNjs0GEcDQXCzvSgKeA-7$k@a~F5Tm??Z>;+5!; zmScvO!ifyjs0b#gH5ye36{zJ5Z?ey72Euqm4%8g#rDL|q@2+CUHB*!G#f}u~U0zBi zytc3&4a{k^hhg|@ZTq;Gwpb-y1T&b2vfA_AGU7}Vinnusr?A7!lM3VtQ;G7}+YVg~ z#v#n)8rcK1!)J+?Oi)zsa*gE{=$|*G$1ZZn`7BS`gnKbF4;+1JkhooD4Vj95PCO5@_Y;$DquY$Au zF57pL4HRt>7kch%ot{tyl>!YeoCxxDM!+V~4YIo5YSR^({K+(E`3HjE+?;k4>VRK3y zR3+lRv^dShkO1ZOP&+6O#L2rHo|w^gJ7$hNxEPM^t~uEhW)!_)%<9I4?(-RoqvI3^>qV;Ka6weG`46xeO4VKZG07hs1-xO1tiZ3fS3ivIE>|;#?gS<`A(9e~8J6(Xop4((^V%K#+S!>zw)TZ= zbPr#cg5ti;@;dhFjY*ubo*O5CCKdZ=;x-&*R$kuf!q>Kg=d9$Ug_>%c@7Gqxs&yrO z8P8iKDvy?#=Wplva^NrvEEVs?7{JC%?;~Ny%dc&jExxU^xTb#>9df#Sq4+LumoyU{ z2W;^?v(0Mr;I!-p2&TpJ9OK^%o1uM)$Yl?YcV!F4y8MM2X_}PwjkOqNHa=KFm>4ZC zNooe!bi>!o1mEAoiY~EIV?w9L6*{Q4$kx4P_qg&z1n_^&gw>oiV=|l_ThpV%Dk#It zb40GUiLGJHoq{~O`0)l$dXMFoOWdE;TZ=bR+qL3gnK?dUfh%um|LY~e*=K0?1${_w zUg7B#Tch4ev06raE6i?UnsB%k#uDFLzRSgjXP$fMuV!g4+by!z@aD-F?yAs>85D(U zXo=pG@=p-%y-@`o4KvCFHPy@EV7w3?M-^i7{%E-$NO9aa!N^@s|Adq?{d@}5(E;YJ zP@|W8aak!Vp~T*lFx^%RCA0~xfLm=t6G^I+XuE*r18~8iI`{G_5 z^@_~87>M#7sT9g*QVpj=W#_3v8n&$TWdX4YCUAJ)42_eq0+Frm6O}THp-sCqs&EFc zFji|zK=5|Q-d=?j-omQY*E5^F8UD(%-{YIz>jRG8@$fKLB?L1#6btN{9;u`SawU7b zoYbx?r_$w(Ii_=XHpqqZi|IZ6iZVZMI~ns|-L0JCf#T_ep)6;N&W_!UPuObTq7h+B zXw`gkMGhc?3Db?2wT7J(-D+3{>9{R~!Pc~ly#!m2RbDMf%;sId?AL(kVJeX9YLBT1 zH-K}rGW|6~lNCEF3@A>J%5s3W8y}6|y*0DD4W)VOrtD9k;^i7I$ezp`c%?KO$s=L2 zqL=KX#C?()`1XjSmb2Li(-aB#Yel?6W)HH}uqxyohP8BAv$|E8CnEoGu@3yjIbr|x zDt7)$(wK|9OC=Jf_hM6f4dhPN5w{GhFfdz~9EvH%jv}(|&p7q+)+OU!xbPp0CY+ z_7N;%npWo<(6Q0;4bab5!2S&J}5>B9~~DLs)AKp_D7Q5 zFsAj49*E6VLG~?NU(M|t#eB8ll&iXe$LZ48eiZ=F?2X#JV!IuOl2?Dxjp99*v_*RH z2G|KdzX!`Bm~xz9&XfADD53XO;t6W<^^7ex)f6F0+RSLB6(IWQhKTP4$Q&$2#~ybf z@?klu;rJ{1#<{oRRBJJQhMy3Nq2)qCFu!0lXAf%t5fGG9$OhA+J7fGEx>-To9C1?X z^;alM`5zC>s^&Nf(bDfY+$AIHtl{oP_nN|AUUiv<_a`hHm79yhHHLbeLwHSbjj}2V zpJO*;v|`+IZ0ucr&4c_2jQkZE11?y`-rptWgYQ_w#q3*C3fsN0eQ0Ue)f zNn?kh<`r+r7Rr?e}~Buz$p-`C!2f%d1%jzC;w&Olfw*`eRhecEf(XCYrsvVg=G1gW1i6gcumW!&9Ve?wuuNm-u2227+HbNVpovvUECMbGicGLjqgZCGuWx!^y za7or&e6l&GN5x{h%;k1@nI)M?VR~jGV?gGCD^&ENCXr(snF`^uVk`=K^1b*gR)ZNE zTV2x4qF?A9_+V>}gn1a8^@S@8U6m{ERb7KK*FZU`pkEF%4+-)bd9=2|`Sv{%W}Jdx zHgC<|KrH{xn%+zfF9Vr{7q>5F^!~*>1^rGdgzqk>_B4@g;5sNsjFcT)g78&{!)=x?1 zpHpG^G`F}aP@UVh<{q+j4OAp3C0vQ-Z({Bv&V043M~>)9+;v4p4ROb7f0WRK374$d z7`t{DXywhzZj3ti@XmTD>_?*k@`eQRri9)KZr5s2`9$`vCN~(nJR3d_7 zyyoy6=3p=Gd=I~Q!7ot>feWip7PsgzmRCHUEhH2x=(*=Jx)#LW|XB`%x&j19UfzEdNVR@oJ@4eD@2eIok`Qu6)$ zO1S=t?y*g{95c*Bv;uYGA+6vs&1FP^EACW4VcajyZ`YX7QGHVkFQlU7M)|51fV9!5 z6lZ6mQMSva>^p0fEXUoPu~iS$@}{6uDO&|K;xH9L7s|XsWzYKL@wi7~sV^SqoGTnp zo|tiVHp6b)^9tjDM&4#O?;kbU&J&C#HR9|kUv-aC2~(al0uT{t zD0_MN4b`)o+@dsX+|I@8FRifaatyIca&X5P3o_diWB=jPCj(p3>k$ji`hCd}hALxF ztZ|!u@R~D>BP9P=!=;*^rsk1UQco{(oj#g=mR!2xywddB9faCj=zUpmy)q(slhd*TYvH)%3Toc{Ym73N2$;Z8|Yt zi9O+tjfrjB$;8^hOf<1=JDE6{*qGQhzWqD*+q(`HB;kidm zQHBBPG3%)dKdt(46xNt5(@nV-AAI^Ldd7atP7?LSYUcQEO^sQ3zi|?|(m?>}0oq&h z!-l5^$o^~rQ3MtukVKbe2ORT^L)4Fx0YD-x3k=df1AogH5uY`bCay0VxV8$8q2E(( zn5-7xdmjX$x^-33c%_m=?S8B1TNr5?ly$z2a(@^<2&p`|y9U+=xDns7Y@WuGV>9we z3H1n)yau22&a3qp4uHOP|JkZhpQ)TZ6NMvZv0~0oasKBE7WfZk$kPes){76xaRuEd zfIgH_t;_s4w~!|Hfz{5@hPjX8@bqESXszPu6G?F&u8W(%urvD2CsHSb%S+8=l<4tZ z#9h#0rMp8k#QOFTG2|GSs*I_K=#?@f&j^0$02|yx>}9#as1Oi0sik8=xwm2(^S&Q# znh<9oj-tv@Vf`0xxML}H_|Bvk25i#8U;1&5-M(e4wmKb1c+0`TS3wTx1n z9=vMCHMsV>!qxdEoZ=Cq zU;S*IU9DU)Tgw!*-&iUllCpUBr(-B41?ft0Fx|4sE-|q9&TFa{oDevlp$hN^-59F1 zIu)wg!()yag8;L{aTYN*1hH0wMs(A^d|U!lg%6c+r4GGVyFH9E{F%EIz0+2!?^A9J z{ZuZSgdZ|&6AwU5r$p3%|hv?%4003$$O5r%O}g?i~n%? znh{#-;8Rq=8bnuS@oQMd_kL6RVlH&~ef1DtY&t^=H@z<5NL%h;uwBAe{#UZ}-~$2V zaNQowxyz=lo0=$AcFz=|+q=d@F2Id+3rA`G`}LRYh2I}ppC?k2j_`T>yeqeowgKWd zN;iBPh z8d%;wGl;fpxlYw0>#9r3(O)O5l`BUeREq*o ziNC_OWG$+}T&B+Xs)faouSIPprcj6N0gw>kgk&>bH)AyxNVLpBSnbO1yB&G|-HTDP6jil$Z+KBokbJzD71cy{OUT z`YFSRC}5KgjeT;B6dfY7qJoGR;Q^$Q67FkXkMTFQ6Xi>;oj;$N^}z4I?aHn9F}}+^ zj6$M=7I3-4D;v(4+$8m7YGcZ$HK{}%zZb&)T9Fwsj%BfGpHE7qX8nS67}h*9V{_s0 zv;L!EEeg>)@r=zjpqAMA`Iz8B=e%U%4GqsDXXabf(pROzGc1u4>nLV!Mq=W#)=_Ta z^OADv#_>TIUlHj2vl7{_H(*+2FOXFZKcZKx@xYb|Z8jT)x9DkOO*$0PC1}0?!a7M_ zx`s;u&4<{bz^d!5)r7-jI8t@(;fXo6w#q||9{NKl%x1f?z`V|>MxksGdiK6LWX>T~qThpB&N@(wc?;#0aNo~Q>xH6I;AN%csPsa=b0{(X z;~7VSXMaIl>qX29kzD0eDC9avi&g(T^UC4&P%nQnM(>LCJV344LnOApQNvcOuHH1^ zLMW^AnrQP|zOYQgwjHg8pEjOh3B)%1u8Yr*Kmep z-_WR482G9JhPpA<#gaRf?lP^o^P+hX>4+`}(6?o^MkOGFWZe%yHKlvBT$gD3{0ZAI z9$s}-wC*^jdC`$K7Z0LObM$6>w1I=EQoab!dez)mXt>T>M-}*+L)*XIn(AvzZAdyM zH1h*w<;h`KT$x5 zps4L>I5$p1lx}9kv%?M_<}D;PvBuA7CTDkQjRsykr8~QwkfngOs0CP-&T@4V);|=jZfVDQKr zOMy#512uKFY!MvSPg5EXAsP$f!!eaI>A%4wIhZu~t2_EI)CU zDFeOk`>!`|6}O_QpW>zciCYG;>@Q@Nsc6>iqCFkXnBke6-^a&8K4eA*in# z)Cfi&{a5xpn}wY`K954a;*dX6INHNi+>&k4c*(sh8IgmOjV`3&#)r5)_}AP6;RcmY z-o|XEx8Rb01QBjPQJXk1CgRNpzT_Qj5??Hr6wBDmR1K@s&HQ51kuM`|=XAN`P*V|_ zKZNgKO-kgdha_TyiGKQnwEO4VFF_D*0TuVojT`1}0gVTQkYjYcJ%>xRD3&H{s7u@W z0xfhdx7JtPNUFaxzlVQfx~R>qXWi^0qDEdJnKA9>0xjunheFQ_Sg8qKFD1a;t{pa< z2pq}|bgW$>D7C&=hyZNGqA!wBwE4T87)2|}$e{)I=_{m7MW-O+L}L!2h1%Zy@?G=( zT1y^6UFs7}1MqtsT;qNnv53D95thRkIBQ?Wm5ZgX6}GGJ*pGiLGDEhZ`l}(RcoNa7 z57Y=H{5=gBp7a-*TUw5i_F3qK*i`l@CTF>z=J(UXsV`5VkA;{q_SY(28ag-(h>nxq zsU|>|1V^_+6GiK!(;MYPaF>x?Kh!*Dhv}Dzf(d0Xi(A22@O{!fiF_my%FMbaLYQ>2 zaD)NIQdolHcqtV)dkX-~(IzM3x5SS6Q`NKw=7{&vXgrlZo$b`RBUKU^ZWY@wtJ4S2 z!nQg4Ke~bdtPp1}2}5>e!)ALgVbEUpET`}ZjV9m|)0><-n5KLP9*zxxsL(i)^@W0d zOQ()N*YYe~5xQj&7%X!>*}ww9reZbVTilJG|I$lw=kt|i&jeHPQP~Yc6<}^Rl=>?@++UhW}QvV0~^g#rnfA`9Ezq>5e6kZn^dGK zP@}+k$5ZX2ldfeQ6Nr$Ej76-TJhu&r;F`^_R-5dXcwDtm4Qs%N*#psVj3Z%o9GG5E zGwVV(?IkJjA?`iAaC@6_!yUIi@5kC>QLC{`Gxa4j471Bw*Y-e7_42nZAtB$O%Snf010_*q(=>Va-Di+ zL#xmqImAp5uTASq9(K8(fiF&B{%|zczPlfM5p_b3vLWqiz%)Q^qUPEc$}M^E^l2TK z{+)h3iTy)v1=-8y{a4mp2i%jCDd^3pJhe^nhIj1aMeQ{6#_gfQXm+LFd{G90KBTym zHP{5xP%-w42t6x3Re6`p?4`FmB}luI@clZ?$`x|;Z1x6~y78@JUB5ZR00=AC!*xX= z81U*-1nj>RlWuZEW93V)g~E9~e!4w`Rz?)yS~^kx6-Wr5XxH(h9U zW2*8+jA~ESi|WPrKH*=zHdd-)f8Z;{9dhGA)jDqdUU#n3!+O;Qr}%NzMlL(j`3Jtc z?c-Jhn8lq&@Im1GYoy8h2TQ1I?fvU3^MaoL>0={QLE8PRiUhzay@uGS?Z50t6C@tXjcKOVf^An8bWsONcIi%5=(nP}5vr(@NZra2dAiYE-LMVe!We>KK0J~d7|?>HT@{1rFwxXn!XX7>WxU8RlWuM_&j z2wn}Xi?+2Lkp;p)y(tJ0NBnaT4S$8)W=~|HGV#HIf?JPTV@g~c>y~6Hm;Lp*4y9q< zj0o}c%Ft)+%Nuauiys^)_>2YxpS39IdwY0zrT$dZrV9>Zxu|k+;iN#4b^aYMX%FVu z{GD`J8Ir$emD?B?>0X8eK|)ytlu<_ak2@4li9fdha4RybM(bKzdDJWraii#0FuU*IC5{0R7mPb*{R{$oPfOjBEH`_J! zcwX%q*QzjD`BaCb_5*8pjI~pYlV)RK$skO8-Fz_C%)AlP%an$aJw$w#+C!%*B^@UD zI}2bujUQ*+srKvF%mIUo*`(^Pp9yi{IFbXyUhqX=a4r4QIoe5l}!|CDxl*D(S6+h&6*7ZFybJ2wQ5sBiKsKmGEl{zF2K&GR{nJhgp z;ZG}?L+{&H-H0h3Kw%+Xun7YaL!d-hGOm*VSQ`mT62Q_x(P#Bw-ESInMW*_veke~( z;AyOR#27I&g2Wk+0XIw!bu|oYN-QVlpo*M>5Q)lZ>t2i=;V{@9%rTf{ItSyGL*Dlx_Kkq^nzU5vsA+~5#W$-KIeE&Z@P&X^ZIY!H}Q19d{U zyNbt%mcM~x{#=0h5r^~a{K^{Lq5zfbl37##;?6)vB>85AB}{;|&2w7gwST5Bw3>@` z;0fK~$!jA=yG`iO_-*}u@FLBrS1q1E4E;{pQ$|c0?d+v}Kc@I9Qja4u+PQtjjIuXx z{SxTf*s(FV;GwCerV!uX3PrK|!Xkf4Hug;oDsL_5fDdcqt$Kcz(A-P)ZTe%6VdW{S zL$MzB2xZ2hVY@}Z{wV`6T?g^(&>iAjF}l0<9fKkA<}mN*C9=f8Sa<_@u99&~@-i{F zrW6hi%oT}3Dus6UfUAF`d!D1{ODlu90k$g=!Mzj3_zl z9hSs}`0zq3*z`^KZP_{X%^n5_;qGsK=Hx<*$&K)XpPK58SNdCJ=waIW-)F5t!h7&z z*vhcC0Xp_*n}&KNO!{x`*#!AWMl64N@wX0XrEtcfJ+38w7*?O?XpVCX$ZlQMsb@W2 zeDUm>ZySCR*d_@rTr7qdS)}J6zRkUU5#k+|zM`I>c}&G;+#OqWJGe~snec>IRaTrC z0#6Gq=9Q{{EcT5W4^21N5%vujrKtWcfiwT-YdlRZZ9r5Vm!Yd}&)5LUekkXx<74(*ZVZ@u`_HFvRw&VBPNOaKHeE!tE&`V&9&1xU|Y63@&>WzM1(IG<6jQk+4+})aK8(jWQ)VN;J zfe~p6*?_p39E>8#3BcGyK_~hRJw;1AW;c|)0TJdUM7Q<_5-kN&Fsy|Wc?j9D+8XtN z`OnE`OJvnz7t;wiVKadKARZ6%$Iqt#L2%$gzm=|%PKSu}wlW4*j~J{Db$OcOddM(uXJX~Qnbm^n5}!;L?>9-9q2I^9VV&rQ-Q++1R)dR*or#Z-E6Vvu6+dI|%4 z@LwulyU%HI-gF}fIC=jiIQbR;;Ob0ahb$4f`K!2-KLbH}p-Ers!V?Cat>uaDkG#Yc zDc_@PA}IYBa+I!?!z79yIR@r)QEx*B^>!cBTe^IV0n_1!Fbl3-(4>R=nqu&MIa*Zac8RxrCvA^$8#xDoTKS|D>z#nAbQNnd55@2Y$EB9XNZun&)rH`V>M5*ezwFKa_N)HNx^@EghXse|x zqTeC(^+}CD+-?pby%Qz8s^+d8mGEl!Ey%B zF6pL?vkx~(>r6}7(`kBP4dMq5kQctWbqJy-@1QGBMYv!=6GjUONHk?S>%_vF!an1S zZ&(qPs4fgm>zGkzb8Nu0Jb6>-D7UaovoViv@>@i9qOKapJx`d4FH$HX>DeLD|ERkN zy&*D^Jx*UVqN{ngWzJv)|7^-x?(E?^1vNMja4?6?tQ0_K!3oh03K+B53kN>pznxdzq?>eouSH{q9iA_b-DDOXvLg;ptIy0VvLYstT7dm3E#x^T<{@dsJGx zpBpLMFc=>J&Ww+l^{KBUwMTj#hnU)t%^mZ>a36JwUuDI5}$WNGWpCulJpkI zbY1oX44$8bkYY72JCv=*c1hdWJb^F!~=D9sdis*#P=lwgmQCc5PABiQLzv1-cb+O&ivMA& z;h_JcV?5#gQQ7eC@~Y?cz|ERGh1jmM<$Va4^BbjsS49TPnaJ_4Zz3P5EQ5I15cRtD$)6bKUyrdjuK+u?0qJ)|GnRXGa)YGn?Kc zI#$+dybf3d6MA|qUG*-KFN5W)%6V%0qG^WVet7HhN|tfxjzzD*2@VGvFXduvYvyIp z$teQVw||Rq0f~Kv3~uQvBGke~07nO!(09t>zIxx{6)MqrdS2!32MPKhpGl1nJu~S- zj4e{mX`D*DmPoWId^)>bjK4HlB|^F+iQk3UIYX{z`qs50-ePHp@l&myf*W}6NZ;F> zD08x47sF*X>xrWN#v-@XarL7phWl|Rh~8V06oNlM0XI?n&4$RKr4ro-b|nF3`1`Kb zi4Dr|_Y8b;LsUETyM8q9!av{gf5X>}$4ZbfoY8WWokK;tC`!kJO$7^42+|LD!Rgc4 zjaN8*i}y-*ck;3^@lBf5Oi5|26R49h3lwi>e1MzYAGCsGAaEVnNRMjDYsD?fxpCBM zhAwl;v7(yIT&6TRYa*|c@$&dmE#K+JrALDmi~dsqFt|zC6L|J>Sx(Mp=o>)lh~7t{ z6zn)B*7xOO>l0H`ej@vZb&6-%G3F>!@%dI+8M#0H2-NYHECvF)HbRy9O*0H(S-N2-y5K3Xt4}WF2+Sz`+no81dzwzM$jyhj&2DY z!!50-y}S5?S}qx5sxQCaLXnpYl;ze*99y!Pl{2eRjm+_4+S?3fBl{)dfuRGyma~j4 z#gEs3BF!2G0V9Q^LWF(*ulj+->ibo9o~eU|^LBAn_bx^r4K0pA#-3*4=9vWA8#d9< zK}~#SmtR4E!}wDX)jYnN>}kN&Fn(_tU+KR4?wM4OWfg63%-rvXX%c)&9^0Nn5p|LtxAdW zPuBqNqK75SDebE2N&H)0Bqq;^=3%y!%?wlNoe)ahR8+dvO`=?(wGK39M@J)f&*YZ< zuDno)yCaTpeYt2^r(2r-6Uo=ws53)|Zy$r-`BH8qpL8V$EJXD>Jd zM9^oV`42eyHlL;OPR#x!Geq2=(|q-I=yOb>NE;pInibZkq?MqQe?8(+m5UaAwc?@C z?49SjHpWibi?|7Hsw0?f;kfTW;+n?hR^YF!VQl27=}``9YI}i|dXZ^py0}Ts^rOXw zeBdh7{^GdKeut{Z?tYM`Uz(@IA>BAW@f{OzM$57r^JA|c$O6fgAK2P&u3k@)X{`h~ z(j3^FRPQYmpK-gwi{yy5P-Bu6lc(IugkJa9Vl$u;w#>kNOpXsn<; zS~puU_Fmo1mk6~4{f-bZF>Egd+RIIFQ>I@O&I!R0c?~AKHu_UfWQ4hbup7G3A-?Wm z3^}epwyI4qy;-G=>~Kg_TO5^H$WbfD2Qj4Le$h=RPo`-f8;r$oXCme-P3(_0w#8fd zwA6bYj<74*JqVin}C6VA_KXip)=O2Z&Np{PJUOc7eLUFF+q%79@s-` zJy>K{KV4Q9QK?jq)=JRL#~{T}9S;u05{oT5c1I46l($*^RvS`T3tqXkpzTnVNM=je zPg$7~J#t)q-JA<$PFvkb@Tw)ujo?RwpxZlqULQ2Cp*w2YA4zAWD^}w~#e+W2W|_;@ ztQY!kTc3sHrvp7NjpR{Zm@0?QH|qjoX7<;Jbyp-IJW! zpX@gBr0cxj%_5~ojUJA2LtdTqkE=?1ahU7(g-8_o7@OR<#K|*TK&sAHB|VJ7#QN-q zUCD|PeafZXm|d#TPO&PhDPJDoStV~Z(G_@*aEe2+mXP5nZ;QZ#TmSx+NIOgTP9F0O zQCDPv7Hv+?mipJTw|qLoC$x+F%H*gHFe&7Pxb?ycDgEM3c$4p=xTiweZWFNQ6$)9X z*dY{_aE?qD-63Cj7yKGAUVzoG+@N zJGVXHWPjb8wbja$jWHn1OyBXE0oGg;>Ost`QKXeh;^YC8o` zLUv|xrxsyiDyI>$oAzVGl^a$GWd>7$!`6Qhm}P~Bvctjrk(WF(fU)0xSR4B1w@uc3 zt9JsfEo%+MF{amMSaQK+_Vu)O`LTGBf*l3($%VRjeb2~`vza>2l-{a?0qOvel>4i= zn&aC5t^P>RSn7^_M@b_+^f#=}&S>}U=pQO7H?YWl9jyqi>4etknN1yAK16U?^Jm)f ziZ1D!z3!Z;Z5NH>onmfCkT4#kb7wEDc@6+<7VgG(LR=|fBQ}D&dk%{ zrqZsRwnUSJ)+(`kO;^^y!d%!I_Idy@H;j(ve9NI-%cIMuRq-3ac)HbBUsd_QP@<=!;~u@V!OFPV&eMEF788Y{Y@i1w$@k+vOyy zyF)u{S^$zNDu>iI^tp=&yiN1ryo=+#;8+j0bl5|4*kP98GF9?fNfsOGBAcCc=lG?P zvnx&#)acp7l==m)+}GYkSQobWamu(lRjhnGEAq~MmHxZDL$%^1B}BiR?@)VtIdbfF zKtLR5J~_2vkBL2!s!K~h_Rk20!e;Z41 zdjjvq|HL>b9cpXkv5azYq3%yhSi>-5OU0aA0;RuEVcquVotczpHPh4k;!_l&bYzUp z@K$4tlj{(-wfoLXV014&`%A|Sby_7>N?EgK1`WIL%eWyX{h7fg89HNcBh)d$a#uau znNb<=S=s;dApJ&EJM-Lluoe1MGwp>$QcTbVCYzj4566eDDML%~u%f4Ed76MSbFR~- zQ{-$I>SQmbD&D`7xH+(pZ|WH&B<3}^ zQ@ICUifT!1wr5RiZLo|JxiWxhF;Mxm3!iy&X1UP*p~N4nv7_}Hw@(Ki z_!HG~;eJ$jE6W{$@4&b+dQl(MNMn7zY12;w*a#rKWQueoohoCZT^uDN)h? z-bKMDLZmXSc7$^`&r4$^+!4k09{a&ab#7&t&s4Ab%X))&%H^eGCg_q~W5RKT`~e`PZv`1M2f#45^(T z69^Ya`dONg_Ea6zLOu;}r@ub^Or804jOTC}jzEk(_=of&yKn};Si>OTLZbTBu0)m{aUy5pGOs*mWuP1C}K(esvGPr#R+KzcxE zw;b7n{gd3JapsxS9PWMgl@g3tXEqthofJ+_bU5+!=91Gg^X71bDWcKxZPU+Ki z45fa#Si9>%jNZaatZh7HPMwFKN&-Iv^cZQ%4C*x*1r0Zr^Kg>XrQR_xb`EpmVtFsr zIcPfkf^Zw?oX@}=h0&yOOS-%uZMDIuyVOLmTrybO_`Z92S*T6I4t<*3kw)Ig#XzR_^h~PC)=C!I`>=1Jng!zYw7mrJ^)9_7lk_@ zKswfs?U1)Ln-~wvx&h1EG;teJBR03-!@9BCTzT*Pr4em<=Q98|xsVQgJZXc~Oh^Ay zZYZ=XtbaRZC}f~EF9s}*V6xPil9aA+307^vWtm1JWJ!^8)Gd(zjvS;Gkts>TeeF+x zZN4uNhra@hO=^fljwccw@B00OOhHdTnSL!73>8CZDbztkj3zO&a?fs5WAMoxswZ#_ zUOJiDHHFLX%1eF6t8^fi=7vRy;v+kgCpX(VbpL&8v5BPtn%Za>Kf-*ASPpXQsw1?& z&#?xUqxEbTNL=C542ZB}dr;%MPUDM_R)#N|#qv@fCcrt(#Oc+nD)E!J}x3)&Hk>ga$)6%)Q) za1gVm$vj}<2P>?(Sl=fVB?HtQ+k+pV*CdXwC@=%hTPbs;aBU_J85%{Hm_+qWkOQ^Z zJr~GDOr{ufXQ>H0ZCW#!*gs!h^Y_qROO;vX^7hiIfwi?vTF zuj4Q}a{Wdc`vvWOFw2dvxmKp)zdyYfSk|Ev(%09A?2i<7#JysG?(Mw73s(dH!F#4f z)7u zHp`){58;&(-pl0p+pAl2^-%lI`Bp6H9UO1j=Ch`JsTsP4o`(&nr8op#3Zy@4!AF$O zKKRUO%)Fs5Xn|JioSn4Fw57viuLe`9eQAuE%Yf~>l&|dcDXDQZi_Rh7CU@F>-pY5_`d{P&4~_H)8!ftq@McTSi-VLFN8JNUF)0v4oE8(z4d~+` z1p$u*-l9cZC&<(*n`bVulDajts-A59LuFZ6%gdJak5GO2MBFKLsq%GBi(C;DV}qoY zT0!{@#U`bkT)6evp}A}nPH5Vc6f{hZ;4JjZEX(q14Rg2jbC(v!4}!)hv=RHyqmdg= z-E=M=Rae@N6-}Bbs zpHL2GgqR0}`l8vH9IRl5?DL5E8H#x+$;4uF=)af3p&gnYue_D(V>2C|O~)qUKF|=! zG3{JocqqkSMO%+p2sGS|5tmLpWA>Oy@w(@2Nu+W!(j{#&=L z@4M{$aVQC5h^{sXKUw=#GL}hm4lNfPD~TfG-*6QoXT5`nXG5g3*?mu}JB* zovuWet)`^8<6H>pSZ?Hvl}X3HR~9(B9zS;EX4jtjs~L8_p9=M@SqApVu^REAZPp-+ zp<5L@3Xuj!FgCCTTgbloAacofS_wnMU35OCix&8PJWKqV&2Hh^0`O5z;aH_zs&+vU zY=mU821~cJU&c8>5wL^=z;VfoA|!}XYP0yeAaXGRsL6$h9}fdHDQR!;?A^I zty{oYi6~@;ru4AWg zqct}LjuRKhu%MgyeR+V@Tsy<+7QhbG$7+rMMCA?2tlWu3CKD&xh%teuYdnF67zo0k z>s({ZH|u`*SJ%Z;hD@z2bsSi?|inJBV+4sv^G~_sNr;RuMg>-`l@;I z8l}wK%rp6Z-@;MV#dcVrz*%&wQrwhz5Xterz}}n(p^TWc0~HUU=ZlDPCUaLZcpl=b zw?6%uFd!A4Pj`2{SAuZ0x0_a|BRYiM>m3bt68v-a_^THRc4DqCSfqasC-CheCOevI z!g%g?e7DwM#9u6eAY>QnT`p0}v+j9&16<2olaGO>+xtb4%NeiZ^pHgLo68IDbfc5J z^>Mf#M30q3R4UcZ{`Zf8C{kb2h)S;`7#^$ebo@-y>-gmTeR2{ByL&ck#}5fJ>-Flk zYW1EsQ2TD)5_~-$Tj@F!$1XO2dVy+IuU*kGELg?@(JqDp?+(gPdifO;ugD=#qepfh z!z`c8se!^+t2u^_-*0Z?B%(CWc+WHg9w~j6D*H6d!K_-%eg=`=ydRAE`!gG^8l~#w z1U&{8NcemWC1uoaA;n_ya%`vIyyt$W%9F{w8NnhjLD=^tKxktW8OQBQh|Eu&MxNl^ z7cY+TWC&@I(J_j^*Po=wA2^Fyp$#&-KBM5-Y% z!aW3DifpKiCA+VbD%PsvM)Xu}zDEgA>!kB0iGK+ycr0BVVlaf}dJv*W_OO8y0WI;u zSg^(+a-H1aRcBhcBxU6;7Ry;l&TuBX;DOgcnT5Apeb>gM`x#Du!OLwO0S&9(gMaR? zj=I*MTmSm`T6A3$Ea`#|_j!?g#`g9UI9f8sh?SdB&4IH`mc`fP;~hZXj(uz?z6pb$DCY112Equ zgC7GCxzdL#yE;E+{=fq7NJRea1pe4eF{P(No8}tp*9Cld6M5|UM7`xg@;7%db9Hku zH?~IrojID=An=m0k^S?}#lz3X_TM1)zd=DkR&{SDb5> z4<`o;FFP3rFCPmBy8!~Ls-v5+n>iU9NY=&N!HtX)B%=y~&0QVcT};hgL8g>l98J~C z-Sk+MC8a?cQeJK{YX4H=`EM0-~WSgaDwvxKNu$`|Nn=v@qrrQf60L^*g+Nj zzc4OdHlF_<<6;9$vR0GME2M`265Cs44ukane0{;2$&!2z(*Z;kL{rCU(pFY3m%>C;>{z>00=J@r$ z{S$W45W*Z^|K*=H+xX63d9?IhzyAC)a?anSZNx04eUI^#b4uTTy&O2T7QScu`uS&L z;+*q4_OD$*EOmaD_~iyR`14O~A%DkmFr|$7-P5UH!%q_%vpcbCa35cX@bk~V{`ohL zGk*R1Kdtuo-PXr*RWiyNVyk0(hxAoKuivqK{VvRG-zmRfM*PloeKq@cE5Nk4#@Svm z^*hZ|^Y2GnzyJJyU;oQ0R?2rmbFI4rEsyWE5bIAItf_?WP=r~37aYGUKFR%iCcs(1 z`u;~XmLW`U__-Ni+5TN07{%-T^P*B_)f0^`xGk!cP||l8EZxI*L*-?Ww)KP-7BIi_ zxZt{muD%@1;x-hBn3^@%{LR)lfCW~dQNES$E@CX^Sd<5U!528t{DPx;CzxZM;DV<_ z;Wz|yxCPU}3g;%yMeg6l4~yVkGoB{8!zth>Ih%{poP+wE%L}IF?|Bfb=K;X@o+Mkw zOqUQMxSs>--w7QJ<(ma2`n$mS-7au(QF3`>(i(CTsW6UIz9(2<(TOaP*mZv3iCKe) z=ua)8#2QL}6c>n=f?xP#msp)O_(d*^n<(niB2(KK^kKoN9 zxjC5VFS_U$`gc_WUCgvQlr@A9KwU1hVsTW-Zv#VEa0M~RFO^br>40x9d@_8*vf#Yc zBsdg{2@G{%OjNAJa)cSVX*|LWUnENCO8|mH$Zl@@--v<*w7>yo-~!AG%)!!`LZGi{V_%nG$9(l%zl(?iV)e!PwH+8Atff)LRicpa zs-OT~#9{T{q3MHxWvll2!5U{#|FAkAxLZ;lOjM6qBRQg?M^lSAZsG!yx!ePq1O>#M zWU|&YW@?G#L2i;PCUujEjV~^aR1_Wjn#AXS9MyqIc79<@$?W8+5^J?|(=BRx>t-7C ziR)yoO%EdwY~*T^@qtaZKCTiqp=vE|!d3jT@Z$Vlhjc>WuogV6lPXuj0|!Z^7mV64 zyn08%0p8+ZoG(m>F;s%G7L2lCE9k6&S4*{pN#fWGQ;J3w1$IMjGmKqB9K!7KR?Pi> z1sZJ^w@hm+9YrUs$|8Q7Lo%=&4y9(7;sn2O?iM@&TAmQ}3W(S5+03-2esb!&W)d>i zQ(whgs|Q?xMFOpG;vV=R^1)QF0IL+yBZy6A;gF#6ykx3%WP=g~NLwZ~$$$k9|NML~ z)4_07GWd$isF4@Ccp(<*v;!~6Gd;6^8v}t!h8(sO*lSHB#p)PG6by+$l4_Bb(nWSA z$4Og5u*K6|AUzde>QhDM*@9VR*$7?2sBjtETwJ<9%Xq`pb9oSrrppbphmt82PWgN= zglPUCT6)c|cX|CoAwHI+5|8xx14OpD0bRMkD76lbUv-XX>tQj7?2QrAR@*RtH%91M zWZ*!25H5}s-KM3DOY}uB@mw=psHM?@K3IF8;Wfzu%l7E%A?dP|QfOxkKktL0@i>;4 zrEw6c4>{0o>Uf|DoIws58mHB+7;3B!oAfFc;s_MJoPC%#ea)&i4P&pY(WRSriNWcT zuEzZLVqM=h3oh+n%(LL2=7kb}W%xbt#E1M~FQp>Quxu~VKGED}g%s1dY<;vWqHRM_ z+jMIq2oiQ`h{v@5;4mU3)-uwlA=l(c@^jbL*Wf6GVP$)E6DOzA5GP%@mY1f$sKE~9 zfl1gP0kTWPAvUd9lulXvg}nwRcS_e3a^{-ZWc5c2>459AEN(cM#4bI5aOA`T6r^HXx8qwNk*rEby+QA z35xPqEoilyw`g`7QOgSkd)#p_>`1V*B6rlGnJr+yAB`<}iNO{cHEKVWxpEd9p!XI# z4KwsBMNQ@7*WRMvG#pKAdJwZoj)q{feJ&kT?{6mh5MRE3S=-Q;xqEF_oq^EH z^VSkna{XwDxny05kCvEYExvebiMeEWdbGp@;q#*dCicz!))Eu@#!E{~Omlv;#9U+? z^HviRMooXz#KbT2(G#;o8T&_1yp4;B0_&&NTTws<&~+0$)-}d{6a|J_=B+8_ny4`! zRWa8lFXTrN%*8FJB()!yngU>(x2hnf zKdORod{hPCnr~G>D!!dR)X^1S{aznkF&9DNqa4U!ecsA~&ecm< zVEM)RC<~A_#amfSsQvyZ3le)i+5#({i|uHOw}nH=(cw5t^%7$p6}H>o+F``UOG;4)L({MTfJILfrb|ou(%A z+ynv5Kf`or@O^lR9h8|rFMcBAgbuQh!;MFtRb_MX7 z>6j0UFP2FW=2c=%lV);>V1Ppsp}?Jr^02))v2c_vu&4`#+q?(Hp3@&}4B3)!u^6iY z*`vh{Q{}VfCxI*kix+ff14$BMt;VP^W7~Rb#5JaA@qI8$t+pyLF_JK5zts#T889+e zPog)DaN!rw89(}8`Sxbkq?GP7+0nuhhiq_uPz!50mQ& zBp(t`jMaSxXqy0=G4?1dqqn?JGIY}a#*B(1n``aAFq19{F@G;MhJu(iq%Ej11JyPR zM5ex2HcXEa)GV<~)@eZvnG+#~=YjD>Z`Sm?!~|au?x=6{8VpjG#bKt{1IsRLsU5l&)Rqb{dDhZ0C#jet?ac*y)i1f#UtnvS2cwM^>y#lj zG&$2&C^VgTb$@k}>!Wa3YZS#|b&9!PCmd%MJ;H|;wRUqO6KsrJFALsN%zey)s~NUR ze=khe8p%`3uF_PaH;gsFW|^0bLq?L+Ts_8&ChMJ~g}-*>(<0MNtZm5_nk>;RqAIQR z1rKqJV9scl(XdM_a;eUYCNUqw>$Hm8O}1dc94~Ncp?^XamJ41~i7LMlG*T8kwD55f z$_ko@f{nR8sABx}!&>?aPRCC{DosnsIjn3W*fol6Ie$_{3r^xX$c8Etxrt26jHXpR z2HAK~CH3Q6<4Oq+Ou81I+qy)x;9gZuPi3-+Gxf!q{$fLl>g+I35S?EcivF>l)^ur$ zz+{b)`k@XOF2})v$k0IRB;)UrxNw+7sYwN@L2?i6_hF5v=sbM~H0PA~7Ku(q@ zVq6?#Twt7@p$CH@q;17ED2D_+S8rLFGMP*#^M4$3I4lH~No%a_f$>G%U%14Qwqh#j zqtvWpgLh_Ys;sdBT}aPV!o+G{?~_e2lX}JUUKT9s9WQE(Q*Nm}lQ7jwLTh$)tz~WK z3L0L_I=w{{t)SiNVgFRU;Ttj{Q)xF$a&^q#QzCPB#ulPyM~XyCIGUpZO_l{$F+>bv zn12J$-N42qDT)-EEh$+nsIhr>?HNo#szk>v3$}g~(~$+bg?#iEQ<4pbY8XTImM?OF zVvNIruWABuEMZ}~)|lvGQ3*MNrIhbYBPm_tRbmP3=Dh`%R_jNAOU;8x$OMw`n12?K z=VHO#Yi}>_QDm{~v(cWGl#8#JS0<7blYfhs-1e$0%(#5-3$(>1ugZdxwUfOnJ!kI~ z+_{|7?R@WfRUIEef-i71c?q8!%k6yc8OmXMZuA90A*{VsBA#7zB^)#-+pY3GFt}BE z#*97tMGSVIr3DYRd(#RNnPb(CbT8h#BvXsWt+K{8wF{QhWWioz+pV(3mcSiPiGNV- zxsl17mflMJa;q#%zC7>?46=dcR=MD_N;XDrl?BJ!1J4S(m9gx#1Q}t$OKl+Kx!o$O zlUY{uF*))QnevR#ufi$PwhVriHOj1Iwf!m!vt1{&$Vi!atrBoWd0^7EdY|SJCEq@H zGUoIVGHr-l?GBJ@Wx-ul(zWt{+kdrkVUqfEU>YrXFVpQ>Atu{OfixkUAFBm$vWu%p zhR!KQ+^&@i<3?ea*01eaAw%3=c#^jC<5}VA;QnMjl)Sz03(?I|E&w-MKaLd=cIL~m zvM}@Z!jsgG7k+_Nt8M#L-dB!f2Xx=!l3165hYM)&Z{vpcdu`*}*Z=e1Y=69T7^@Kx zZN6OO|D{wai`$e@eFwPFNWFWF*@n8lKQU3#LzC!=zzmB;YQQ zmw8$1Qv+6Id1)hKXVFh5a%89g`_odwga#ZJ*Qjddby zgMBQhU@gz=QLqBRWF}7JQ-4DKE>@7LDOJ@(&=;GOgT~oK{7zPQn+zKlJfS6S{r2a^ zOtpg@GHVroBpAjXNR`YQ^w%s*m*$^5CSLH=7n3V(!z9L<{HH*UQB6!bd?`Li-N^|f zm*Wt9^`WT%juooV4I_7@FPTt zN(?P0g?y~_8$q>&q5D9hlO+OYIM<=|AQ)dX3fHGZo4ZP^*$l4%d(h0Rxhr}Xy)2lZ zHTa%QjDEo|a>N1$gMX9qUsb`;%koqsBzUJShCU1moTD=u!xAWh)JxBC(Tc&i^u=CN z8Gh?|l_=a8sZPLocPe5S6qYcbIc2a~^CAcfV9N3ZKa$~KrX>8TfQxRiE{Ttz-Rk8d zTZLLPB6yhNtn@^1aa4~Yr2})^3HtUafo%pQ!;pN_hF|MZ!hfe*s?MrT^``a5Bba9{ z#4{0&oSvfP+bq#+>V<%p5*@dwUrM`n4Sm)F z|Hx$H6z>wHi<*gsmCOcAXc}9K%V-qyf6<16^2k+kT2|3sT|Xb|O{OE_sjFsr(9v@+ zO+J;3$m=Qvl7F)q%Y365D0C8#voy=QnJLojH7J;~oVBcXiRKc!h9ynvZX)hQ*xZLE zYEvw?DrVnsKNilxbdtYwyGs3`MVt(`)2AV!IHM-G;q;m+>P3(UzUOO~DD=Oxf;dd4 zt;Do`HYHalrkA8>FXzVFTu4Y3Yylr*WKB?k_n;rl?|+4v$qZa%$o&;F4yJi6ePTE- z7p5(h0lJkWHg7@pN6Aq6vBhLXP%_V(A|n4G6AAj@Mj`?7m0 zGL|q>M`$092={yt!BK9uo}3HI0cH%!;ckK=H5>% z5|N2Vw;|ZL+bx4G5>mb0uma=x#m0C!qlP50SkyxNx@=W+ArGlv2uXA?J`0Is(C>R; z)qfPNTU{bq#!dB+bjxakm!B49$fR3+gQUsM8^G~Ok`wq_!`UJwwJ)kHQy ztL(f{J;zzwgAv#%ES!2q@$)e*uG4{gEq_?26HW`>QR7{S{*`#Hv`URO=q^gw=u)&V z3@w#7;khRU(ehX%bOJSEps{fAY#;<5h#)OF)2^nkF$x2b>sqi?Ly$v=Y6*_mh$xs| zi0Fm-eZrZUgrV;)VW+-!=)hEMT4v!<>F>uVHFQJ*$D+z9TL&WWA*K<8Lr=vjLw~R8 z>LNQo5KIhNF?ErMzfX;chAxM|3wx2lybI21Ir40J!LrV0wEv8R0@KdO9sEFmb4Rzd z{aY}N0DciVzktK31H(w4fhcT}I`SBE!3-!|y$agN4@6xLQW_DugVzAi?M!AHh_Mdn z0?zl0{cOd+o+){b`&JvvW z#=YY}v^+jo`>p8y;P8AQcu7IsLxG;uBTP8z>pXknfGHyuhAVUQroA-aiWVBT6_Eiq z8bqguaA5*Gh69nJ&^wHPLmRzm8kR&1YNPW+dX0kTbSyDZ1ER)?Y9M;DjQd5M zl|ekaCBb>)GZ;I7$jbAO={ z)$=V=5tI{$bxwDUn_$t3s()t9iy3;1HV{a zZM3L?W?qmWDan-br;D^8Ob&;(mPHB@VTnQEkS~slV=wf|sBbRx?qy1j3&W%4mE8r~ zz#X`=LB0-*v(dWgf;pM=>MpQL0YW?hoZ|UZG}Y1kn6hfyCxJsZAAcy!aJjfAX{DK{ z9^VDzkEG_*ZU(}KzRNK(xit=)hg0^CC6(eBbg_;B<+#AkIIc04km`he^>XlL0x?Bg zZ({}U0O5IYgB2vP=u!$54dk;@;Z;P4tYF?QUUUfi1KpAaVK}Zfr5_?MEUpi-rQ?vX zqQxF9AW>j=>e=Vj0e{LJGEdY@4F(pG-7@AD=MPyTk*onfv>BG_dySgMGn5WXj1FF0 zu*@VlU7;f@7U8lON{7$`Vd5~4P$h)uQ0N_-j9i$A$R`KmdN?hPh6c~MI ze~poM&S%glaFpIQ15jqcAxc?ZrPjl=tRGq`A#J5RI3TV9a=>DL^7$B&%)BVdRpG^l zLlAtR>$Ync6n};brk8E-VoTHSV`|{MQ@k*00yAE@(hz}8LPDpFdGst|!@4BQpe^^d zdT9vlv<3C+-~Z{DYP10c&R-3(@2kKPTnwa5n~S3`1_RF&<|v^w_CTvVg6I}UseHmT z{>Mog@L&FCKD%=a^vS!aDQXbQ9G^P8*_huO6Jgj8!++J05IqO)1LXdakqc(LLx-kV ziZn5Hl5uuZSNRr(Vz^WLED&dm1mTR^Aj%_yLcR(#-VNsW@Ww;Kj-(a}-E=TlDlybe z9mYsuA1IhRqJ5W~O$hPR2@In1m(j5>TwZJTI6Dhw+z8>$FCv%?Uku*kNntPyfH1}x z7SFJk8-MP@+k%5Z+;}JLcpdvMh!JG&KM4A*IIxH+7LSv-veVe@kVUKp#l40~)3C#O zXq=v;p;yK@Z5UtR4B{$KxV6&^b3Q3hMJqM2#6cykhD*>^STIF1Iid}9(({pd0wn5z zHkk%oLcrvPE8#8yNet;f6z8z{E+8sA)mI*1&cN$TL?!kilPUV(Nohyd2191CvH}fPZFQ zFpfV(i;ckz4^Ue6X+rXm%DEZeN!-x&L4VnjgP{}bBiBz!`e1XIU`|h!blN2X?_#os zF-@tiHgu|UXt_GU6}M@P9nSoEpAFflNQRNpSz~`54Cqs7r-T*`#ojSnTRvZXU=m|B zfsrrdZV!x^KC?Wkf%;`X?-|26NwRq}$L1=T2 zAbwVn7z44o7Pz`nHLLT!g2}Zs+Jc!{C!rvAVi7mP4u}urwb_{83#0HmVvxgth-I*^ zI&t2?K1B9G+9xK4(6bZ8^ExQaqJNS>Ex5XZ4Re_8wydB-iQS98U=Be&F`t;%`D?qm z!+6zHJ$z@x!({uLPt47B`s`wi`aYrUV_?Qyyz^3v`ka&ufGR#fcn^fn4%;r+944i~ zqV0ldNVtL`JA-H60|A(2Gaw5@&SK!@u7N1+&<>1Az^Cacfl&YMl@2Aj41ad1RopFL z69}`fR!i`Y;C2Dm{o3))e!;qxz%PtxbQ3={G@fO%jcpz1gDHmIx*eV53|seO80E1R zIPQ33NQXfD57n)J`m;?819$Y^NKon zV9jnvR#`1-hCP3XcD3wLFMsJ&I2s4z8jl7dCAwvkN`O?&Dv7ktGFWgOOY_;A4JU?E zj;OoIR7o%z4&0kr=3s^tC2AP953-ub;)mwhoU&TF7-Y(F^SWMR@QOX_oTDsP3CIks z4)JuAD8WwIgr=LCOiV6UrWx|!Anb|II{EonIa*GL*P25{#IpbXTz{CsQ_+FYzG|Bq zzTu<*yuE`##jw7;9AHDH!H5?w7tUCp{(a9FBZk^lqP3&SSwl$rl5Lyp?o;( zC5)j1_v-a=Fip-~*5C!z-3Ixpc3ZaWh3z9aOVCTQCVZA2M}1&?fstMX5ZdMnW;LnU z#PEVT#Dr^dem%s-6@UBw^*$XiS07yE4ZT0AB~P_G*iKi+?My{%>@mtT_hX8nh1UiL zL#w@HC;|~;cR&l8}lf(Q_m+xlkCNr!)=EBc`%QSiHObmSHx-leDi@h zIy{4&-odAQ-DLR0oM!X<0I%V_j>N-j;(*8e$o0kO75MaOm;c0Erbm9YNL9zv@%_aI z=IZQ+p_G-I<$v1DAB;Ei8BwhH*+=KO_wIYAohSWPM_(7+^*Y+Pz-u*ceO)xFr$kD7 z`^E~EG9L480s%R-Kb>GeO8h#T`2(NL{K0rL&l>XA+0CPkKEJNrJUS8TvztdJ!?m3+ zfiC!KM~{KV@suDT%Cn`@EF) z&zAmRyrnNndv~_p)Zwp`5qteD9z>i%UnAMnD^bH07R3zn&GAMk>wW+0p;01s{a z+CJa~H?=Dt?Mvs zYRICwyub@)B;2-d2BUrWg}uPU43v-;c)?7;vSq!%54^p=59Y`*1nh+TSIqVUUl=-q zIW~$AIf6O**1sM{@WSvsdOLy_y_$Vv^z$x?Q#wD6;Dy<~{aqqKxNJ`_XK`$Lsf|Vz zzdgYVW>S{z30^P{{U1*-IVH@m?Fn8m&w{s;{2Lp8Pt5HL?#w!a)5d8%c+PDU{}XYCkLNZctJUdq8I*ir`V^Cn19yqpbj&%nYn{6&wqehB zU|nv4!z}u}x2Ev-{YlEASs(^s!Bwj{fnn4Yp`s z3=Z00Rz!;rZCcm#HXqt-mTNw=*>F9FHXHNs_h#i!%(#zja22Fq%jv<4mzk*)xf5)8G&sQIqhm&5%W&dAt_+F(~3WHtD%DEEeR~R0D z_ZNkxLCGs}P+}5^Mi>Q=n>XIH%976J;WP>(i9fOrrQ|K!Fuq{W)&6-7ad>9r<>1~c zDZIeWwcuDlUB4L6)Pxm>H<&$#aIxfu2bSSV!qDaH$O)NhG3weH`b>||65qj5gYrtD z8x%RZdq0AbjWSGv2O-0;Kj|Em3^T=lF0t1|@=*yQzM|T!KJjr_OXd}|forDZ`_e`0 z4cDeC)eojM^{P(wyBD1*wW?l?bE?#%!pTP0fm)x6qnmO(QDN2tb9Sae30(q)kYYS} zPgJxkW29u~D!{(TdU}@Ep*GE0^csvhn zMP1M+em=(KrC1y|c;rsZFAG@Ukpeir7=J~??YS>e3TzZjldtYT4I_>R2Oh=KxKBKW z=r@>EW+2gr1SI9tf=yqgD8v_kwJ4Yt)X};seyw82B^J3xx&oe%Hin|BHwQSOlU5Db za~&#pSN*_wFT+d@a!SXl;gj7lBQ2U#sNL{co%3kSrRk0(6`+j$=Q71LANAliAQa? zBH&kp>%o)3ixW%C4xG`m8pp`B_oioI-Ov>+H=>4f#A{H1Wjiv4786Gx8E4RZ#W`{F5q=UT{r%`z=OOU`g8`$$iTmBsHo z(BM5Y-U6vQkDAYl`uSL6G=kC&La&^nKNkjZ#t=HKNcl0{g*b~6X6!SKuB#WiY^77I zA+5yk_qxmHERu=Fp8|87F#4FaD$;Ht@3rSheJ+z2w2W}^AYO27_6QwJqd-*!MS35n zMQ9>h&`$S%X`DSyWT%pC5g*#`Q5;KdPuM8|GMN4IUV>JRR=}H*JxGLYN;gI8zRiUM zBkond3P$EJxCA4U4LyP}>#e9uFy@+G1Y@r47L2*YSHZ~J%8y{oy}SxW23tRZad^wW z1>>l%f^ox-U_6*37)N>)jD5TcM(!AnV9Y&QF!Bn2|0VY@mKVX8_f4-|Kv(RKV9dF{ z3C8UEnOiXCG+qSbfsbH37z;+$5Ff#aHeLnePDQZ=V^)O35qlWMt6;=HZ^4**d=-qn zz6(Y~2G2_}j`S)S_bfb;abq4iIC-4=H_Rg$H)c!58RRjdWE@p)fk!g#Wn;;Rf!vZ2 zLw}Wjj7Yn2OU7Kri(~{bUnOH!Lcb#!k*(m8jL5b1DjDAvna=rgdy|X@W66kwK$m39 zrMyW-^z@R9S!b_D@STNsBqI_z+y#1mm5hCeu^!1dvL<O`lhm;nLhtw90ZJ)2Lfe4WkirJ@@KmwT!BHurWf6^di66Js1CGbp6{yGk( zg1MMqmxHO)Y!M>|Q>jg`9Za}EpC5M;j|RFH*>N!O$ikP=co^91lD3Db)T)6U4-@)- zG3*dlKeKLK+OWsS$ezdYXX=NmfRd*j(;u|$-dxDRRD!mD_AeD>L_7Ya10Vm=!Pviq z3fOD=m(WDDGjg6oQHmG)mx^v89q$oFG2_?eU&0HSEnX!mv(F#@5-8W~!}1rciQ4ur z9Y(W%>0!L>UwUIj3J})Iv2Fhnp4{YrYL$P9({A5755sHnve^EmQu7G2WBmo1F9fQynY?`5~gsl$?aY$vFg5${Y#*@R-XJzMVACF|I*vIO)7sU3CY~UAI@>uv4Yube<x!|7rVw{4{@E zekNjkj3GZ$IVV2Sx6D@1zmBU3rK*Yrj+=a!t7m4z`w zNO;k_`4fhz0fznEv0QMN&Y89`xLJnti(SL$QE9;3hGC~@+Bg{Z zV%M;H`8E!{3wy9V(&u!I&Y07GcU=8X4~T>UY21TrPS>+5Xi8ypnlO9~ZkO0y-!&Zg zw6QVn#I9iX@of|y+Z&Dk{PSM%FG{`5)}Mdghlo;4t@s~!TPQKu1+gI_7hG^SE*X=; z>sJjo-3u%fWGq#rf+o2W2^FJ-U}fwB^K|dygvtE+UHlxa*4}F+cmCIZugD8-49Dj}12K;0<<<51@H)xqBPCWR*o9oMmgFRLO6 zK5in*?bj6^^Iqx8O~p26TAly*e`Z&DJ!2csvZncnZgs6UGIN?UI-Nx`n9Uk39$&W^S)K|pB1|AL(Z~u26rb|pUfcE4(9j4 zM4cZ1GkGHY7Yu?P_!7la^CxE4jP91gi!uezMoe(UL~f>e5csZ=+c##yUSaFZmoZ@i z;c?BFqiz9DtaH51gqsG->X?YgK)%~3H|hfyMxpbIjp0U_HQ>E}7Mw$*p*GN`>O0!A zDBHxsFm!hoW!)=L=`$wOaXaA8HBMoEKSmBifH=O81)V`+)S!pZi1<~*dBc;YoM^0p zWj??(3sa&^1SxR}=zg0p4f$%-Wbo;MqnwNUU}JdSbUMmuX?AAuX9IYiC+e9oeu3!l z!pkqD18*#pC@0u|>A&HhXNbo9z7N`TVEFrHus<3%p6D`0Jt3S7cQFMLBd{GMZ!1xc zFE3bZrJTqQ7@6Vuz`Q@KpCg&d&2>F~8gtwO@7#Ek3&|qzU;<=3{X;oi16TO~sOZoKIFHKp8-6G%RXY{s_0YHq@cJG?h5Q*vMYC)YOj>>6+9DTQp(eHc{ zz2NzOqJX~gbz;hwF47jkSv|=r9mndbuSFBox3S?h;o84Q{#zC&+$Z;#&8} z1{ud0=${Ltks=eLmWW2$_@MVSQY1Cx`-&caDc(sh&(Id!^!Vx-YRgh9r$p|8CvA?| zisi45LCE=?#jAd_lS5?!dI>?S?Wn%<`Z`<#jNbFm$9^XJCk9D?91k~ZXj zVdc)Hz)?S$;4ewwKu99Px-C8Q5{_Z5W*J%NMYXu8_?_=jMkO9wgQDu9cnBJmvS3r* zOcE;UdxV>#fuu*O4U^DX|GPjg8bM(f7Ca1RGj7wvpX>xgWYZII6iVz=*&_h@4RxkoiLS%Iyn4e6a})!%r- ziY!fbtbRRON6iZkG9?hgwD~t%wV~4`OB#%%AwwQZHJTeU*CSPDAywnitPs;@6$&Q* z($;@U$oymt*;8HBgqJN|gR!+T#IAfIS;`lT)VFzH#`8n;TlqpVUAlLgB1iRqa@M!r z-E6+~?(0JMk?+h`OJ#zw2C9SavI6t#$(J2Aif`|0hPKY);kNZx69d80_+(hl+sj%#Abf3^6F?l1IMI445{>fWPLM2W=N+6^Djz@$v=DzE2+_I3?9D7$4a zK8HG*QkIh1@b-`!X)4Ztp3RGi3h{zfeSTOqxxT&R)g8Si8}-U8JJdL(v6u&x@&D+p zzFjCsu`y#|zDhJb1&JCGXL*PONb4pp>I}>0GDjymQyR+JC0zKV36?`?n=@iQ7_hD~ z3djI2nrsTn%uOZoO%B!QChOEd^;Rf3lZ2H8z+t@@1jyx>;$0wr9>YjfiBWVN;*>JZ znkJ`|aW?s)^oF~#7+#ocUXt#@)WU4MqNNMM7;(_kYwV9{rud|HgOW3dj4td zZQe+Jj(O4`ncJc`ZXWx@yy$MEPHa{hd{y$oOfJhYdBs^a3gE#|40(jrxY;0T*Ex}< zl-kkzw$be%J3G748Q6Z62(L9XTP3Aj7oN79E#ha0#>gu^gLPw}lW#IyuDT6= z5QDod1AsAe_30$D%f1W)QEBxW#`G)OQSa?e28?WnwmPNY6LfR^T=-@V9a)gZ2R>?Q zW1cC0Wt2+%8-`i4(hEi&v&s0RsCJe{M~F$V$IZ8%g1O^3vE|>-{aR`ZdM1o(vpNQbtG-3(e6IBg_ znb2D2Won}bEzYC^F+^~XnGy}5i5MF#`L1>LJ~AHCAjV}xnbC-P<7ec#z@5@`JcG2B zJ3_u_0pPh9?5%#MA>v^k-;y zjCiGDi;-Md_qL45j~@8=m>&!e>R5w+)QW7Jsr!L)?rGe99@5S|rhJdGz0pS{N22K- zJqW#4%iMNN>{ato4veO;AlJT+IdE?ox#%^o;{r@Ye>qRUVxzUbOH76~v4*1QmS?p@ z5lRcA9E}AAiGuY|*Mf@<0m8#!ZHoZ1VC>&^daAtr{E?~w2)fIBO*G(wZOt+xIgA13LyfC^(rN3hIqO>qvVW3AM#ftW1MWLS|6b*N) z@P(;idy^sxR8^oeAiyHmR(%g9r?W__yOEwoELF$ugx$!|lTfzdMJkFMB>D}N#Y*I(H!m2qaO=@Q^P6o`|%9~>B1EX5qLCQO>Qq!0l_?9F^U5?=b&hM zykSy^-*5E{9+2IbE_P$nzwdqVIQb5=$Q8sbcsjfu3>!oKo`V5AzO7;qeI8QLy1>g_ zq-ZK41U%}A1?smASI)tK{ldV5DY`zv8pt?ZvzUrbE#Oku2bpKqQLhkx116-mZ8(N` z;Gb)p!u)=WT(f1|wRTcyZ)?Yxdonm_M1K1I4EpV;Ecz4VOo0EQBir& z$&z{q4l}|lc*t^T%7fejDgPxi{F}r5QIR$0#qbH7@Tm <(n}K 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

QQ65 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%0AML;R( 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 b?jB}t9^P(N))<1^d=LQ)CMFp*S&aV!ye?nJ delta 82822 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 p)xyxo+11X5po&;7J3Fr8lEk8tilWpsE( #include +#include #include #include diff --git a/org.glite.lb.logger/configure b/org.glite.lb.logger/configure index a67786b..2e34da2 100755 --- a/org.glite.lb.logger/configure +++ b/org.glite.lb.logger/configure @@ -154,14 +154,6 @@ my %externs = ( prefix=>'/opt/activemq-cpp-library', pkg => 'activemq-cpp' }, - apr => { - prefix=>'/opt/apr', - pkg => 'apr-1' - }, - aprutil => { - prefix=>'/opt/apr-util', - pkg => 'apr-util-1' - }, ); my %jar = ( @@ -248,10 +240,18 @@ $externs{'mysql-server'}{prefix}=$externs{mysql}{prefix} if $externs{'mysql-serv $externs{'mysql-devel'}{prefix}=$externs{mysql}{prefix} if $externs{'mysql-devel'}{prefix} eq ''; $externs{'gsoapxx'}{prefix}=$externs{gsoap}{prefix} if $externs{'gsoapxx'}{prefix} eq ''; +$externs{'mysql-server'}{withprefix}=$externs{mysql}{withprefix} if $externs{'mysql-server'}{withprefix} eq ''; +$externs{'mysql-devel'}{wihtprefix}=$externs{mysql}{withprefix} if $externs{'mysql-devel'}{withprefix} eq ''; +$externs{'gsoapxx'}{withprefix}=$externs{gsoap}{withprefix} if $externs{'gsoapxx'}{withprefix} eq ''; + %project = %{$projects{$project}}; -for $_ (keys %{$project{etics_externs}}) { - $etics_externs{$_} = $project{etics_externs}{$_}; +for my $platform (keys %{$project{etics_externs}}) { + for $_ (keys %{$project{etics_externs}{$platform}}) { + $etics_externs{$platform}{$_} = $project{etics_externs}{$platform}{$_}; + } } +reshuffle_platforms(\%etics_externs, $project{supported_platforms}); +reshuffle_platforms(\%{$project{etics_externs_devel}}, $project{supported_platforms}); for $_ (keys %{$project{etics_projects}}) { $etics_projects{$_} = $project{etics_projects}{$_}; } @@ -423,7 +423,9 @@ sub mode_build { open MAK,">Makefile" or die "Makefile: $!\n"; - print MAK "all: @modules\n\nclean check:\n"; + print MAK "all: @modules\n\n"; + print MAK "stage: ".(join '-stage ', @modules)."-stage\n\n"; + print MAK "clean check install:\n"; for (@modules) { my $full = full($_); @@ -446,11 +448,13 @@ sub mode_build { @ldeps{@{$deps{$_}}} = 1; for my $x (split /,/,$staged) { delete $ldeps{$x}; } my @dnames = $module ? () : keys %ldeps; + my $snames = $#dnames == -1 ? '' : join('-stage ', @dnames).'-stage'; my $full = full($_); my $build = $buildroot{$_}; print MAK "$_: @dnames\n\tcd $full/$build && \${MAKE} && \${MAKE} install\n\n"; + print MAK "$_-stage: $snames\n\tcd $full/$build && \${MAKE} && \${MAKE} stage\n\n"; } close MAK; @@ -500,18 +504,18 @@ sub mode_checkout() { BEGIN{ %etics_externs = ( - 'myproxy-devel'=>'myproxy-devel', - 'myproxy-libs'=>'myproxy-libs', - 'myproxy-server'=>'myproxy-server', - 'myproxy-admin'=>'myproxy-admin', - cares=>'c-ares', - voms=>'org.glite.security.voms-api-cpp', - utiljava=>'org.glite.security.util-java', - gpt=>'gpt', - fetchcrl=>'fetch-crl', - activemq=>'activemq-cpp-library', - apr=>'apr-dev', - aprutil=>'aprutil-dev', + default => { + 'myproxy-devel'=>'myproxy-devel', + 'myproxy-libs'=>'myproxy-libs', + 'myproxy-server'=>'myproxy-server', + 'myproxy-admin'=>'myproxy-admin', + cares=>'c-ares', + voms=>'org.glite.security.voms-api-cpp', + utiljava=>'org.glite.security.util-java', + gpt=>'gpt', + fetchcrl=>'fetch-crl', + activemq=>'activemq-cpp-library', + }, ); %etics_projects = ( @@ -523,7 +527,7 @@ BEGIN{ 'lb.doc' => [ qw/tetex-latex:B/ ], 'lb.logger' => [ qw/cppunit:B libtool:B/ ], 'lb.logger-msg' => [ qw/cppunit:B activemq libtool:B/ ], - 'lb.server' => [ qw/globus_essentials:R globus:B expat cares mysql:R mysql-server:R mysql-devel:B cppunit:B gsoap:B classads voms lcas gridsite bison:B libtool:B libxml2/ ], + 'lb.server' => [ qw/globus_essentials:R globus:B expat cares mysql:R mysql-server:R mysql-devel:B cppunit:B gsoap:B classads voms lcas gridsite bison:B libtool:B libxml2 flex:B/ ], 'lb.state-machine' => [ qw/classads libtool:B libxslt:B expat:B/ ], 'lb.utils' => [ qw/cppunit:B libtool:B/ ], 'lb.ws-interface' => [ qw/libxslt:B/ ], @@ -556,7 +560,7 @@ BEGIN{ 'gridsite.services' => [ qw/curl:R gsoap:R/ ], 'gridsite.service-clients' => [ qw/curl:R gsoap:R gsoapxx:R/ ], 'gridsite.gsexec' => [ qw// ], - 'px.proxyrenewal' => [ qw/globus:B globus_essentials:R myproxy-devel:B myproxy-libs:R voms libtool:R/ ], + 'px.proxyrenewal' => [ qw/globus:B globus_essentials:R myproxy-devel:B myproxy-libs:R voms libtool:B/ ], 'px.myproxy-config' => [ qw/myproxy-admin:R/ ], # in myproxy-config.spec ); @@ -716,10 +720,11 @@ for my $ext (keys %deps_aux) { ); %conflicts = ( - 'lb.glite-LB' => [ qq/emi-lb/ ], - 'px.glite-PX' => [ qq/emi-px/ ], - 'lb.emi-lb' => [ qq/glite-LB/ ], - 'px.emi-px' => [ qq/glite-PX/ ], +); + +%provides = ( + 'lbjp-common.gss' => [ qq/glite-security-gss/ ], + 'lbjp-common.gsoap-plugin' => [ qq/glite-security-gsoap-plugin/ ], ); %cvs_prefix = ( @@ -749,6 +754,7 @@ for my $ext (keys %deps_aux) { # (${NAME.location}, ETICS conf. dependencies) # etics_projects ....... ETICS project names of externals # etics_externs_devel .. ETICS modules names of devel versions of externals +# etics_locations ...... ETICS locations in ${NAME.location} properties # need_externs_aux ..... project-specific external dependencies # supported_platforms .. platforms supported by the project # modules .............. additional modules in subsystems @@ -760,29 +766,37 @@ for my $ext (keys %deps_aux) { flavours => '--thrflavour=${globus.thr.flavor} --nothrflavour=${globus.nothr.flavor}', local_prefix => '', etics_externs => { - globus_essentials=>'vdt_globus_essentials', - globus=>'globus', - gridsite=>'org.gridsite.shared', - yaim_core=>'org.glite.yaim.core', - gip_release=>'glite-info-provider-release', - gip_service=>'glite-info-provider-service', - bdii=>'bdii', - glite_version=>'glite-version', - glite_info_templates=>'glite-info-templates', - glue_schema=>'glue-schema', - trustmanager=>'org.glite.security.trustmanager', - axis=>'axis', - lcas=>'org.glite.security.lcas', - gsoapxx=>'-', - build_common_cpp=>'org.glite.build.common-cpp', + default => { + globus_essentials=>'vdt_globus_essentials', + globus=>'globus', + gridsite=>'org.gridsite.shared', + yaim_core=>'org.glite.yaim.core', + gip_release=>'glite-info-provider-release', + gip_service=>'glite-info-provider-service', + bdii=>'bdii', + glite_version=>'glite-version', + glite_info_templates=>'glite-info-templates', + glue_schema=>'glue-schema', + trustmanager=>'org.glite.security.trustmanager', + axis=>'axis', + lcas=>'org.glite.security.lcas', + gsoapxx=>'-', + build_common_cpp=>'org.glite.build.common-cpp', + jdk=>'jdk', + }, }, etics_externs_devel => { - gridsite=>'org.gridsite.devel', + default => { + gridsite=>'org.gridsite.devel', + }, }, etics_projects => { vdt=>[qw/globus globus_essentials gpt/], 'org.glite'=>[qw/voms gridsite lcas gip_release gip_service bdii glite_version glite_info_templates glue_schema yaim_core/], }, + etics_locations => { + '*' => '', + }, need_externs_aux => { 'lb.client-java' => [ qw/ant:B jdk:B axis:B trustmanager utiljava libtool:B/ ], 'lb.glite-LB' => [ qw/fetchcrl:R gpt:R gip_release:R gip_service:R bdii:R glite_version:R glite_info_templates:R glue_schema:R/ ], @@ -790,10 +804,18 @@ for my $ext (keys %deps_aux) { 'px.glite-PX' => [qw/myproxy-server:R myproxy-admin:R fetchcrl:R gip_service:R bdii:R glite_version:R gpt:R glue_schema:R/], 'px.myproxy-yaim' => [ qw/yaim_core:R/ ], }, + supported_platforms => { + sl5_x86_64_gcc412 => 1, + sl5_ia32_gcc412 => 1, + deb5_x86_64_gcc432 => 1, + deb5_ia32_gcc432 => 1, + slc4_x86_64_gcc346 => 1, + slc4_ia32_gcc346 => 1, + }, modules => { 'lb' => [ qw/glite-LB/ ], 'px' => [ qw/glite-PX/ ], - } + }, }, emi => { @@ -810,46 +832,55 @@ for my $ext (keys %deps_aux) { flavours => '--thrflavour= --nothrflavour=', local_prefix => '/usr', etics_externs => { - globus_essentials=>'globus-gssapi-gsi', - globus=>'globus-gssapi-gsi-devel', - gridsite=>'emi.gridsite.shared', - yaim_core=>'emi.yaim.yaim-core', - yaim_bdii=>'emi.bdii.yaim-bdii', - gip_release=>'emi.bdii.glite-info-provider-release', - gip_service=>'emi.bdii.glite-info-provider-service', - bdii=>'emi.bdii.core', - glite_version=>'emi.misc.glite-version', - glue_schema=>'emi.bdii.glue-schema', - trustmanager=>'emi.java-security.trustmanager', - trustmanager_axis=>'emi.java-security.trustmanager-axis', - axis=>'axis1.4', - lcas=>'emi.sac.lcas', - gsoapxx=>'-', - build_common_cpp=>'emi.misc.glite.build-common-cpp', - jdk=>'java', + default => { + globus_essentials=>'globus-gssapi-gsi', + globus=>'globus-gssapi-gsi-devel', + gridsite=>'emi.gridsite.shared', + yaim_core=>'emi.yaim.yaim-core', + yaim_bdii=>'emi.bdii.yaim-bdii', + gip_service=>'emi.bdii.glite-info-provider-service', + bdii=>'emi.bdii.core', + glite_version=>'emi.misc.glite-version', + glue_schema=>'emi.bdii.glue-schema', + trustmanager=>'emi.java-security.trustmanager', + trustmanager_axis=>'emi.java-security.trustmanager-axis', + axis=>'axis1.4', + lcas=>'emi.sac.lcas', + gsoapxx=>'-', + build_common_cpp=>'emi.misc.glite.build-common-cpp', + jdk=>'java', + }, + sl5_x86_64_gcc412EPEL => { + 'myproxy-devel' => 'myproxy-devel.x86_64', + }, }, etics_externs_devel => { - cares => 'c-ares-devel', - classads => 'classads-devel', - cppunit => 'cppunit-devel', - expat => 'expat-devel', - gsoap => 'gsoap-devel', - voms => 'org.glite.security.voms-api', - libtar => 'libtar-devel', - log4c => 'log4c-devel', - postgresql => 'postgresql-devel', - curl => 'curl-devel', - libxml2 => 'libxml2-devel', - openssl => 'openssl-devel', - gridsite=>'emi.gridsite.devel', - jdk=>'java-devel', + default => { + cares => 'c-ares-devel', + classads => 'classads-devel', + cppunit => 'cppunit-devel', + expat => 'expat-devel', + gsoap => 'gsoap-devel', + voms => 'org.glite.security.voms-api', + libtar => 'libtar-devel', + log4c => 'log4c-devel', + postgresql => 'postgresql-devel', + curl => 'curl-devel', + libxml2 => 'libxml2-devel', + openssl => 'openssl-devel', + gridsite=>'emi.gridsite.devel', + jdk=>'java-devel', + }, }, etics_projects => { - 'emi'=>[qw/voms voms-devel gridsite lcas gip_release gip_service bdii glite_version glue_schema yaim_core yaim_bdii trustmanager trustmanager_axis/], + 'emi'=>[qw/voms voms-devel gridsite lcas gip_service bdii glite_version glue_schema yaim_core yaim_bdii trustmanager trustmanager_axis/], + }, + etics_locations => { + axis => 'axis', }, need_externs_aux => { 'lb.client-java' => [ qw/ant:B jdk:B axis:B trustmanager trustmanager_axis libtool:B/ ], - 'lb.glite-LB' => [ qw/fetchcrl:R gip_release:R gip_service:R bdii:R glite_version:R glue_schema:R/ ], + 'lb.glite-LB' => [ qw/fetchcrl:R gip_service:R bdii:R glite_version:R glue_schema:R/ ], 'lb.yaim' => [ qw/yaim_core:R yaim_bdii:R perl-LDAP:R/ ], 'px.glite-PX' => [qw/myproxy-server:R myproxy-admin:R fetchcrl:R gip_service:R bdii:R glite_version:R glue_schema:R/], 'px.myproxy-yaim' => [ qw/yaim_core:R yaim_bdii:R/ ], @@ -861,7 +892,7 @@ for my $ext (keys %deps_aux) { modules => { 'lb' => [ qw/emi-lb/ ], 'px' => [ qw/emi-px/ ], - } + }, }, ); @@ -1033,28 +1064,30 @@ sub mode_etics { close V; } + # XXX: --with ignored for platform-dependend packages my @copts = (); my %ge; @ge{@{$etics_projects{$project{etics_name}}}} = (1) x ($#{$etics_projects{$project{etics_name}}}+1); for (@{$need_externs{"$subsys.$module"}}) { if ($need_externs_type{"$subsys.$module"}->{$_}=~/B/ and (defined $externs{$_} or defined $jar{$_})) { - my $eext = $etics_externs{$_} ? $etics_externs{$_} : $_; + my $eext = $etics_externs{default}{$_} ? $etics_externs{default}{$_} : $_; next if ($eext eq '-'); - if ($project ne 'glite') { + if (defined $project{etics_locations}{'*'} or defined $project{etics_locations}{$_}) { + $eext = $project{etics_locations}{$_} if ($project{etics_locations}{$_}); + push @copts,$ge{$_} ? "--with-$_=\${stageDir}" : "--with-$_=\${$eext.location}"; + } else { if ($ge{$_} and not defined $externs{$_}{pkg}) { push @copts, "--with-$_=\${stageDir}"; } - } else { - push @copts,$ge{$_} ? "--with-$_=\${stageDir}" : "--with-$_=\${$eext.location}"; } } } for (@{$need_jars{"$subsys.$module"}}) { - my $eext = $etics_externs{$_} ? $etics_externs{$_} : $_; + my $eext = $etics_externs{default}{$_} ? $etics_externs{default}{$_} : $_; - push @copts,"--with-$_ \${$eext.location}$jar{$_}" if ($project eq 'glite'); + push @copts,"--with-$_ \${$eext.location}$jar{$_}" if (defined $project{etics_locations}{'*'} or defined $project{etics_locations}{$_}); } my $conf; @@ -1129,18 +1162,18 @@ sub mode_etics { if ($project ne 'glite') { $flags = 'RELEASE_VERSION=${age}.${platformFamily} libdir=${libdir} GSOAPDIR=`pkg-config gsoap --variable=prefix` OPENSSL_GLOBUS_FLAGS=`pkg-config globus-openssl --cflags` OPENSSL_GLOBUS_LIBS=`pkg-config globus-openssl --libs` FLAVOR_GLOBUS_EXT= HTTPD_FLAGS="-I/usr/include/httpd -I/usr/include/apache2 -I/usr/include/apr-${aprSuffix} -I/usr/include/pcre"'; - $prefix = "prefix=${prefix}/usr"; + $prefix = 'prefix=${prefix}/usr'; } else { $flags = 'RELEASE_VERSION=${age}.${platformFamily} libdir=${libdir} GSOAPDIR=${gsoap.location} OPENSSL_GLOBUS_FLAGS=-I${globus.location}/include/${globus.dbg.nothr.flavor} OPENSSL_GLOBUS_LIBS=-L${globus.location}/${libdir}/ FLAVOR_GLOBUS_EXT=_${globus.dbg.nothr.flavor} HTTPD_FLAGS="-I${httpd-devel.location}/include/httpd -I${httpd-devel.location}/include/apache2 -I${httpd-devel.location}/include/apr-${aprSuffix} -I${httpd-devel.location}/include/pcre"'; - $prefix = "prefix=${prefix}"; + $prefix = 'prefix=${prefix}'; } $cmd{compile} = "echo 'make $flags' > build.sh\n\tmake $flags build"; $cmd{clean} = "rm -rvf build.sh; $cmd{clean}"; $cmd{install} = "make $prefix $flags install"; - $cmd{packaging} = "mkdir ${moduleDir}/src/tgz + $cmd{packaging} = "mkdir \${moduleDir}/RPMTMP/SOURCES \${moduleDir}/src/tgz make $prefix $flags rpm && \ - cp ${moduleDir}/RPMTMP/SOURCES/gridsite-${version}.src.tar.gz ${moduleDir}/src/tgz"; + cp \${moduleDir}/RPMTMP/SOURCES/gridsite-\${version}.src.tar.gz \${moduleDir}/src/tgz"; } else { $cmd{clean} = 'None'; @@ -1157,6 +1190,10 @@ sub mode_etics { $cmd{compile} = 'make'; $cmd{test} = 'make check'; $cmd{install} = 'make install'; + if ($subsys eq 'lb' and $module eq 'client') { + $cmd{compile} = "make rpath=$project{local_prefix}/\${libdir}"; + $cmd{install} = "make install post-install rpath=$project{local_prefix}/\${libdir}"; + } } my $defprops = ''; @@ -1218,6 +1255,9 @@ $package_description$package_summary$defprops}; for (@{$conflicts{"$subsys.$module"}}) { print C "package.conflicts = $_\n"; } + for (@{$provides{"$subsys.$module"}}) { + print C "package.provides = $_\n"; + } for my $pp (keys %{$platform_properties{"$subsys.$module"}}) { next if $pp eq 'default'; @@ -1233,36 +1273,59 @@ package.SRPMSLocation = \${moduleDir}/RPMTMP/SRPMS\n"; print C "$package_description$package_summary\n"; } - print C qq{ -[Platform-default:DynamicDependency] + for my $platform ('default', keys %{$project{supported_platforms}}) { + my $used = 0; + + for (@{$need_externs{"$subsys.$module"}},@{$need_jars{"$subsys.$module"}}) { + my $eext = $etics_externs{$platform}{$_} ? $etics_externs{$platform}{$_} : $_; + my $edev = $project{etics_externs_devel}{$platform}{$_}; + next if ($eext eq '-'); + # dependencies not listed in etics_externs only for + # default platform + if (not defined $etics_externs{$platform}{$_} and + $platform ne 'default') { +#print "skipping $_ on $platform\n"; + next; + } + + if (not $used) { + print C qq{ +[Platform-$platform:DynamicDependency] }; - for (@{$need_externs{"$subsys.$module"}},@{$need_jars{"$subsys.$module"}}) { - my $eext = $etics_externs{$_} ? $etics_externs{$_} : $_; - my $edev = $project{etics_externs_devel}{$_}; - next if ($eext eq '-'); + $used = 1; + } - my $proj = 'externals'; - for my $p (keys %etics_projects) { - for $m (@{$etics_projects{$p}}) { - $proj = $p if $m eq $_; + my $proj = 'externals'; + for my $p (keys %etics_projects) { + for $m (@{$etics_projects{$p}}) { + $proj = $p if $m eq $_; + } } - } - my $type = $need_externs_type{"$subsys.$module"}->{$_}; + my $type = $need_externs_type{"$subsys.$module"}->{$_}; - if ($edev) { - if ($type eq 'B') { - $eext = $edev; # no runtime - change to devel pkg - } elsif ($type eq 'BR' or $type eq 'RB') { - print C "$proj|$edev = B\n"; # additional devel pkg + if ($edev) { + if ($type eq 'B') { + $eext = $edev; # no runtime - change to devel pkg + } elsif ($type eq 'BR' or $type eq 'RB') { + print C "$proj|$edev = B\n"; # additional devel pkg + } } + print C "$proj|$eext = $type\n"; } - print C "$proj|$eext = $type\n"; - } - for (@{$deps{"$subsys.$module"}}) { - my $type = $deps_type{"$subsys.$module"}->{$_}; - print C "$project{etics_name}|$project{etics_name}.$_ = $type\n"; + if ($platform eq 'default') { + for (@{$deps{"$subsys.$module"}}) { + my $type = $deps_type{"$subsys.$module"}->{$_}; + if (not $used) { + print C qq{ +[Platform-$platform:DynamicDependency] +}; + $used = 1; + } + print C "$project{etics_name}|$project{etics_name}.$_ = $type\n"; + } + } } close C; @@ -1333,6 +1396,37 @@ sub getlibdir { return $libdir; } +sub reshuffle_platforms($$) { + my ($data, $platforms) = @_; + my ($platform, %blacklist, $value); + + return if not $platforms; + + for $platform (keys %$data) { +#print "plat: $platform: $data->{$platform}\n"; + next if $platform eq 'default'; + for $_ (keys %{$data->{$platform}}) { +#print " blacklist: $_ = $data->{$platform}{$_}\n"; + $blacklist{$_} = 1; + } + } + + for $_ (keys %blacklist) { + if (defined $data->{default}{$_}) { + $value = $data->{default}{$_}; + $data->{default}{$_} = '-'; +#print " deleted $_ from default\n"; + for $platform (keys %$platforms) { + next if $platform eq 'default'; + if (not defined $data->{$platform}{$_}) { + $data->{$platform}{$_} = $value; +#print " added $value to $platform\n" + } + } + } + } +} + sub usage { my @ext = keys %externs; my @myjars = keys %jar; diff --git a/org.glite.lb.logger/project/ChangeLog b/org.glite.lb.logger/project/ChangeLog index 81ca9f3..379e796 100644 --- a/org.glite.lb.logger/project/ChangeLog +++ b/org.glite.lb.logger/project/ChangeLog @@ -171,3 +171,6 @@ - Using proper method for setting signal handlers - Daemonize before initializing security +2.2.6-1 +- Further globus signal handler fixes + diff --git a/org.glite.lb.logger/project/version.properties b/org.glite.lb.logger/project/version.properties index 4495a9b..e381f4a 100644 --- a/org.glite.lb.logger/project/version.properties +++ b/org.glite.lb.logger/project/version.properties @@ -1,3 +1,3 @@ # $Header$ -module.version=2.2.5 +module.version=2.2.6 module.age=1 diff --git a/org.glite.lb.logger/src/interlogd.c b/org.glite.lb.logger/src/interlogd.c index 90a03d0..17d1046 100644 --- a/org.glite.lb.logger/src/interlogd.c +++ b/org.glite.lb.logger/src/interlogd.c @@ -512,7 +512,9 @@ main (int argc, char **argv) /* get credentials */ if (CAcert_dir) setenv("X509_CERT_DIR", CAcert_dir, 1); - edg_wll_gss_watch_creds(cert_file,&cert_mtime); + ret = edg_wll_gss_watch_creds(cert_file,&cert_mtime); + if (ret < 0) + glite_common_log(LOG_CATEGORY_SECURITY,LOG_PRIORITY_WARN,"edg_wll_gss_watch_creds failed, unable to access credentials\n"); cred_handle = malloc(sizeof(*cred_handle)); if(cred_handle == NULL) { glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_FATAL, "Failed to allocate structure for credentials."); diff --git a/org.glite.lb.logger/src/logd.c b/org.glite.lb.logger/src/logd.c index 7a1d4ca..03490c1 100644 --- a/org.glite.lb.logger/src/logd.c +++ b/org.glite.lb.logger/src/logd.c @@ -457,7 +457,9 @@ This is LocalLogger, part of Workload Management System in EU DataGrid & EGEE.\n } edg_wll_gss_initialize(); - edg_wll_gss_watch_creds(cert_file,&cert_mtime); + ret = edg_wll_gss_watch_creds(cert_file,&cert_mtime); + if (ret < 0) + glite_common_log(LOG_CATEGORY_SECURITY,LOG_PRIORITY_WARN,"edg_wll_gss_watch_creds failed, unable to access credentials\n"); /* XXX DK: support noAuth */ ret = edg_wll_gss_acquire_cred_gsi(cert_file, key_file, &cred, &gss_stat); if (ret) { @@ -593,7 +595,7 @@ This is LocalLogger, part of Workload Management System in EU DataGrid & EGEE.\n } break; case -1: - glite_common_log(LOG_CATEGORY_SECURITY,LOG_PRIORITY_WARN,"edg_wll_gss_watch_creds failed\n"); + glite_common_log(LOG_CATEGORY_SECURITY,LOG_PRIORITY_WARN,"edg_wll_gss_watch_creds failed, unable to access credentials\n"); break; } diff --git a/org.glite.lb.logger/src/recover.c b/org.glite.lb.logger/src/recover.c index 20a9d9e..b4bf988 100644 --- a/org.glite.lb.logger/src/recover.c +++ b/org.glite.lb.logger/src/recover.c @@ -56,11 +56,13 @@ recover_thread(void *q) exit(1); } glite_common_log(LOG_CATEGORY_SECURITY, LOG_PRIORITY_DEBUG, "Checking for new certificate."); - if (edg_wll_gss_watch_creds(cert_file, &cert_mtime) > 0) { + int ret; + ret = edg_wll_gss_watch_creds(cert_file, &cert_mtime); + if (ret > 0) { edg_wll_GssCred new_creds = NULL; - int ret; - ret = edg_wll_gss_acquire_cred_gsi(cert_file,key_file, + int int_ret; + int_ret = edg_wll_gss_acquire_cred_gsi(cert_file,key_file, &new_creds, NULL); if (new_creds != NULL) { if(pthread_mutex_lock(&cred_handle_lock) < 0) @@ -87,6 +89,9 @@ recover_thread(void *q) new_creds->name); } } + else if ( ret < 0) + glite_common_log(LOG_CATEGORY_SECURITY,LOG_PRIORITY_WARN,"edg_wll_gss_watch_creds failed, unable to access credetials\n"); + #ifndef LB_PERF sleep(RECOVER_TIMEOUT); #else diff --git a/org.glite.lb.nagios/Makefile b/org.glite.lb.nagios/Makefile index 4c230e1..1676c7e 100644 --- a/org.glite.lb.nagios/Makefile +++ b/org.glite.lb.nagios/Makefile @@ -10,10 +10,12 @@ INSTALL=install install: mkdir -p ${DESTDIR}${PREFIX}/var/lib/grid-monitoring/emi.lb + mkdir -p ${DESTDIR}${PREFIX}${prefix}/share/doc/${package}-${version} chmod 750 ${DESTDIR}${PREFIX}/var/lib/grid-monitoring/emi.lb -chown nagios:nagios ${DESTDIR}${PREFIX}/var/lib/grid-monitoring/emi.lb mkdir -p ${DESTDIR}${PREFIX}${prefix}/libexec/grid-monitoring/probes/emi.lb ${INSTALL} -m 0755 src/LB-probe ${DESTDIR}${PREFIX}${prefix}/libexec/grid-monitoring/probes/emi.lb + ( cd ${top_srcdir}/project && ${INSTALL} -m 644 ChangeLog package.description package.summary ${DESTDIR}${PREFIX}${prefix}/share/doc/${package}-${version} ) stage: $(MAKE) install PREFIX=${stagedir} diff --git a/org.glite.lb.nagios/configure b/org.glite.lb.nagios/configure index 5f94259..62e2c66 100755 --- a/org.glite.lb.nagios/configure +++ b/org.glite.lb.nagios/configure @@ -24,6 +24,7 @@ # use Getopt::Long; +use POSIX qw(locale_h strftime); my $pwd = `pwd`; chomp $pwd; my $prefix = '/usr'; @@ -731,6 +732,7 @@ for my $ext (keys %deps_aux) { %provides = ( 'lbjp-common.gss' => [ qq/glite-security-gss/ ], 'lbjp-common.gsoap-plugin' => [ qq/glite-security-gsoap-plugin/ ], + 'lb.nagios' => [ qq/glite-lb-nagios-plugins/ ], ); %cvs_prefix = ( @@ -865,7 +867,7 @@ for my $ext (keys %deps_aux) { 'myproxy-devel' => 'myproxy-devel.x86_64', }, deb6_x86_64_gcc445 => { - globus_essentials => 'globus-gssapi-gsi4', + globus_essentials => 'libglobus-gssapi-gsi4', globus => 'libglobus-gssapi-gsi-dev', globus_proxy_utils=>'globus-proxy-utils', axis => 'libaxis-java', @@ -880,6 +882,9 @@ for my $ext (keys %deps_aux) { 'jakarta-commons-codec' => 'libcommons-codec-java', 'jakarta-commons-lang' => 'libcommons-lang-java', 'tetex-latex' => 'texlive-latex-extra', + 'perl-LDAP' => 'libnet-ldap-perl', + 'fuse-lib' => 'libfuse2', + 'fuse' => 'fuse-utils', }, }, etics_externs_devel => { @@ -911,6 +916,8 @@ for my $ext (keys %deps_aux) { openssl => 'libssl-dev', 'tetex-latex' => 'texlive-latex-extra', libxslt=>'xsltproc', + 'httpd-devel' => 'apache2-prefork-dev', + 'fuse-devel' => 'libfuse-dev', }, }, etics_projects => { @@ -969,6 +976,9 @@ for my $ext (keys %deps_aux) { 'lb.yaim' => { default => { 'package.buildarch' => 'noarch' }, }, + 'lb.nagios' => { + default => { 'package.buildarch' => 'noarch' }, + }, 'px.yaim' => { default => { 'package.buildarch' => 'noarch' }, }, @@ -992,6 +1002,7 @@ sub full sub mkinc { my %aux; + my ($old_locale, $date); undef %aux; my @m=qw/ lb.client lb.doc lb.state-machine lb.ws-interface lb.logger lb.logger-msg lb.nagios lb.types lb.common lb.server lb.utils lb.ws-test lb.client-java lb.harvester lb.yaim lb.glite-LB @@ -1028,10 +1039,23 @@ px.proxyrenewal px.myproxy-yaim px.glite-PX px.myproxy-config } } } + + mkdir $build."project" unless (-d $build."project"); + open PKGCHL,">".$build."project/changelog" + or die $build."project/changelog: $!\n"; + $old_locale = setlocale(LC_TIME); + setlocale(LC_TIME, "C"); + $date = strftime("%a %b %d %Y", gmtime()); + setlocale(LC_TIME, $old_locale); + print PKGCHL qq{* $date CESNET team +- automatically generated package +}; + close PKGCHL; + unless ($top_srcdir eq '.') { unlink $build."Makefile"; symlink "$top_srcdir/Makefile",$build."Makefile" or die "symlink $top_srcdir/Makefile ".$build."Makefile: $!\n"; - for my $file ('.pre', '.post', '.preun', '.postun changelog') { + for my $file ('.pre', '.post', '.preun', '.postun') { my $pfile = "project/$file"; if (-f "$full/$pfile") { mkdir "$build/project" unless (-d "$build/project"); diff --git a/org.glite.lb.nagios/project/ChangeLog b/org.glite.lb.nagios/project/ChangeLog index 139597f..37a33d8 100644 --- a/org.glite.lb.nagios/project/ChangeLog +++ b/org.glite.lb.nagios/project/ChangeLog @@ -1,2 +1,3 @@ - +1.0.0-1 +- Initial version of the nagios module diff --git a/org.glite.lb.nagios/project/package.description b/org.glite.lb.nagios/project/package.description index c97e3c2..a0d9316 100644 --- a/org.glite.lb.nagios/project/package.description +++ b/org.glite.lb.nagios/project/package.description @@ -1 +1 @@ -This is a package to distribute a nagios probe that checks the EMI L&B server. It is a shell-based script titled check_lb_server. +This is a nagios probe, a shell script to check the L&B server. diff --git a/org.glite.lb.nagios/project/version.properties b/org.glite.lb.nagios/project/version.properties index 3d509b5..aa496b1 100644 --- a/org.glite.lb.nagios/project/version.properties +++ b/org.glite.lb.nagios/project/version.properties @@ -1,3 +1,3 @@ # $Header module.version=1.0.0 -module.age=0 +module.age=1 diff --git a/org.glite.lb.server/configure b/org.glite.lb.server/configure index a67786b..2e34da2 100755 --- a/org.glite.lb.server/configure +++ b/org.glite.lb.server/configure @@ -154,14 +154,6 @@ my %externs = ( prefix=>'/opt/activemq-cpp-library', pkg => 'activemq-cpp' }, - apr => { - prefix=>'/opt/apr', - pkg => 'apr-1' - }, - aprutil => { - prefix=>'/opt/apr-util', - pkg => 'apr-util-1' - }, ); my %jar = ( @@ -248,10 +240,18 @@ $externs{'mysql-server'}{prefix}=$externs{mysql}{prefix} if $externs{'mysql-serv $externs{'mysql-devel'}{prefix}=$externs{mysql}{prefix} if $externs{'mysql-devel'}{prefix} eq ''; $externs{'gsoapxx'}{prefix}=$externs{gsoap}{prefix} if $externs{'gsoapxx'}{prefix} eq ''; +$externs{'mysql-server'}{withprefix}=$externs{mysql}{withprefix} if $externs{'mysql-server'}{withprefix} eq ''; +$externs{'mysql-devel'}{wihtprefix}=$externs{mysql}{withprefix} if $externs{'mysql-devel'}{withprefix} eq ''; +$externs{'gsoapxx'}{withprefix}=$externs{gsoap}{withprefix} if $externs{'gsoapxx'}{withprefix} eq ''; + %project = %{$projects{$project}}; -for $_ (keys %{$project{etics_externs}}) { - $etics_externs{$_} = $project{etics_externs}{$_}; +for my $platform (keys %{$project{etics_externs}}) { + for $_ (keys %{$project{etics_externs}{$platform}}) { + $etics_externs{$platform}{$_} = $project{etics_externs}{$platform}{$_}; + } } +reshuffle_platforms(\%etics_externs, $project{supported_platforms}); +reshuffle_platforms(\%{$project{etics_externs_devel}}, $project{supported_platforms}); for $_ (keys %{$project{etics_projects}}) { $etics_projects{$_} = $project{etics_projects}{$_}; } @@ -423,7 +423,9 @@ sub mode_build { open MAK,">Makefile" or die "Makefile: $!\n"; - print MAK "all: @modules\n\nclean check:\n"; + print MAK "all: @modules\n\n"; + print MAK "stage: ".(join '-stage ', @modules)."-stage\n\n"; + print MAK "clean check install:\n"; for (@modules) { my $full = full($_); @@ -446,11 +448,13 @@ sub mode_build { @ldeps{@{$deps{$_}}} = 1; for my $x (split /,/,$staged) { delete $ldeps{$x}; } my @dnames = $module ? () : keys %ldeps; + my $snames = $#dnames == -1 ? '' : join('-stage ', @dnames).'-stage'; my $full = full($_); my $build = $buildroot{$_}; print MAK "$_: @dnames\n\tcd $full/$build && \${MAKE} && \${MAKE} install\n\n"; + print MAK "$_-stage: $snames\n\tcd $full/$build && \${MAKE} && \${MAKE} stage\n\n"; } close MAK; @@ -500,18 +504,18 @@ sub mode_checkout() { BEGIN{ %etics_externs = ( - 'myproxy-devel'=>'myproxy-devel', - 'myproxy-libs'=>'myproxy-libs', - 'myproxy-server'=>'myproxy-server', - 'myproxy-admin'=>'myproxy-admin', - cares=>'c-ares', - voms=>'org.glite.security.voms-api-cpp', - utiljava=>'org.glite.security.util-java', - gpt=>'gpt', - fetchcrl=>'fetch-crl', - activemq=>'activemq-cpp-library', - apr=>'apr-dev', - aprutil=>'aprutil-dev', + default => { + 'myproxy-devel'=>'myproxy-devel', + 'myproxy-libs'=>'myproxy-libs', + 'myproxy-server'=>'myproxy-server', + 'myproxy-admin'=>'myproxy-admin', + cares=>'c-ares', + voms=>'org.glite.security.voms-api-cpp', + utiljava=>'org.glite.security.util-java', + gpt=>'gpt', + fetchcrl=>'fetch-crl', + activemq=>'activemq-cpp-library', + }, ); %etics_projects = ( @@ -523,7 +527,7 @@ BEGIN{ 'lb.doc' => [ qw/tetex-latex:B/ ], 'lb.logger' => [ qw/cppunit:B libtool:B/ ], 'lb.logger-msg' => [ qw/cppunit:B activemq libtool:B/ ], - 'lb.server' => [ qw/globus_essentials:R globus:B expat cares mysql:R mysql-server:R mysql-devel:B cppunit:B gsoap:B classads voms lcas gridsite bison:B libtool:B libxml2/ ], + 'lb.server' => [ qw/globus_essentials:R globus:B expat cares mysql:R mysql-server:R mysql-devel:B cppunit:B gsoap:B classads voms lcas gridsite bison:B libtool:B libxml2 flex:B/ ], 'lb.state-machine' => [ qw/classads libtool:B libxslt:B expat:B/ ], 'lb.utils' => [ qw/cppunit:B libtool:B/ ], 'lb.ws-interface' => [ qw/libxslt:B/ ], @@ -556,7 +560,7 @@ BEGIN{ 'gridsite.services' => [ qw/curl:R gsoap:R/ ], 'gridsite.service-clients' => [ qw/curl:R gsoap:R gsoapxx:R/ ], 'gridsite.gsexec' => [ qw// ], - 'px.proxyrenewal' => [ qw/globus:B globus_essentials:R myproxy-devel:B myproxy-libs:R voms libtool:R/ ], + 'px.proxyrenewal' => [ qw/globus:B globus_essentials:R myproxy-devel:B myproxy-libs:R voms libtool:B/ ], 'px.myproxy-config' => [ qw/myproxy-admin:R/ ], # in myproxy-config.spec ); @@ -716,10 +720,11 @@ for my $ext (keys %deps_aux) { ); %conflicts = ( - 'lb.glite-LB' => [ qq/emi-lb/ ], - 'px.glite-PX' => [ qq/emi-px/ ], - 'lb.emi-lb' => [ qq/glite-LB/ ], - 'px.emi-px' => [ qq/glite-PX/ ], +); + +%provides = ( + 'lbjp-common.gss' => [ qq/glite-security-gss/ ], + 'lbjp-common.gsoap-plugin' => [ qq/glite-security-gsoap-plugin/ ], ); %cvs_prefix = ( @@ -749,6 +754,7 @@ for my $ext (keys %deps_aux) { # (${NAME.location}, ETICS conf. dependencies) # etics_projects ....... ETICS project names of externals # etics_externs_devel .. ETICS modules names of devel versions of externals +# etics_locations ...... ETICS locations in ${NAME.location} properties # need_externs_aux ..... project-specific external dependencies # supported_platforms .. platforms supported by the project # modules .............. additional modules in subsystems @@ -760,29 +766,37 @@ for my $ext (keys %deps_aux) { flavours => '--thrflavour=${globus.thr.flavor} --nothrflavour=${globus.nothr.flavor}', local_prefix => '', etics_externs => { - globus_essentials=>'vdt_globus_essentials', - globus=>'globus', - gridsite=>'org.gridsite.shared', - yaim_core=>'org.glite.yaim.core', - gip_release=>'glite-info-provider-release', - gip_service=>'glite-info-provider-service', - bdii=>'bdii', - glite_version=>'glite-version', - glite_info_templates=>'glite-info-templates', - glue_schema=>'glue-schema', - trustmanager=>'org.glite.security.trustmanager', - axis=>'axis', - lcas=>'org.glite.security.lcas', - gsoapxx=>'-', - build_common_cpp=>'org.glite.build.common-cpp', + default => { + globus_essentials=>'vdt_globus_essentials', + globus=>'globus', + gridsite=>'org.gridsite.shared', + yaim_core=>'org.glite.yaim.core', + gip_release=>'glite-info-provider-release', + gip_service=>'glite-info-provider-service', + bdii=>'bdii', + glite_version=>'glite-version', + glite_info_templates=>'glite-info-templates', + glue_schema=>'glue-schema', + trustmanager=>'org.glite.security.trustmanager', + axis=>'axis', + lcas=>'org.glite.security.lcas', + gsoapxx=>'-', + build_common_cpp=>'org.glite.build.common-cpp', + jdk=>'jdk', + }, }, etics_externs_devel => { - gridsite=>'org.gridsite.devel', + default => { + gridsite=>'org.gridsite.devel', + }, }, etics_projects => { vdt=>[qw/globus globus_essentials gpt/], 'org.glite'=>[qw/voms gridsite lcas gip_release gip_service bdii glite_version glite_info_templates glue_schema yaim_core/], }, + etics_locations => { + '*' => '', + }, need_externs_aux => { 'lb.client-java' => [ qw/ant:B jdk:B axis:B trustmanager utiljava libtool:B/ ], 'lb.glite-LB' => [ qw/fetchcrl:R gpt:R gip_release:R gip_service:R bdii:R glite_version:R glite_info_templates:R glue_schema:R/ ], @@ -790,10 +804,18 @@ for my $ext (keys %deps_aux) { 'px.glite-PX' => [qw/myproxy-server:R myproxy-admin:R fetchcrl:R gip_service:R bdii:R glite_version:R gpt:R glue_schema:R/], 'px.myproxy-yaim' => [ qw/yaim_core:R/ ], }, + supported_platforms => { + sl5_x86_64_gcc412 => 1, + sl5_ia32_gcc412 => 1, + deb5_x86_64_gcc432 => 1, + deb5_ia32_gcc432 => 1, + slc4_x86_64_gcc346 => 1, + slc4_ia32_gcc346 => 1, + }, modules => { 'lb' => [ qw/glite-LB/ ], 'px' => [ qw/glite-PX/ ], - } + }, }, emi => { @@ -810,46 +832,55 @@ for my $ext (keys %deps_aux) { flavours => '--thrflavour= --nothrflavour=', local_prefix => '/usr', etics_externs => { - globus_essentials=>'globus-gssapi-gsi', - globus=>'globus-gssapi-gsi-devel', - gridsite=>'emi.gridsite.shared', - yaim_core=>'emi.yaim.yaim-core', - yaim_bdii=>'emi.bdii.yaim-bdii', - gip_release=>'emi.bdii.glite-info-provider-release', - gip_service=>'emi.bdii.glite-info-provider-service', - bdii=>'emi.bdii.core', - glite_version=>'emi.misc.glite-version', - glue_schema=>'emi.bdii.glue-schema', - trustmanager=>'emi.java-security.trustmanager', - trustmanager_axis=>'emi.java-security.trustmanager-axis', - axis=>'axis1.4', - lcas=>'emi.sac.lcas', - gsoapxx=>'-', - build_common_cpp=>'emi.misc.glite.build-common-cpp', - jdk=>'java', + default => { + globus_essentials=>'globus-gssapi-gsi', + globus=>'globus-gssapi-gsi-devel', + gridsite=>'emi.gridsite.shared', + yaim_core=>'emi.yaim.yaim-core', + yaim_bdii=>'emi.bdii.yaim-bdii', + gip_service=>'emi.bdii.glite-info-provider-service', + bdii=>'emi.bdii.core', + glite_version=>'emi.misc.glite-version', + glue_schema=>'emi.bdii.glue-schema', + trustmanager=>'emi.java-security.trustmanager', + trustmanager_axis=>'emi.java-security.trustmanager-axis', + axis=>'axis1.4', + lcas=>'emi.sac.lcas', + gsoapxx=>'-', + build_common_cpp=>'emi.misc.glite.build-common-cpp', + jdk=>'java', + }, + sl5_x86_64_gcc412EPEL => { + 'myproxy-devel' => 'myproxy-devel.x86_64', + }, }, etics_externs_devel => { - cares => 'c-ares-devel', - classads => 'classads-devel', - cppunit => 'cppunit-devel', - expat => 'expat-devel', - gsoap => 'gsoap-devel', - voms => 'org.glite.security.voms-api', - libtar => 'libtar-devel', - log4c => 'log4c-devel', - postgresql => 'postgresql-devel', - curl => 'curl-devel', - libxml2 => 'libxml2-devel', - openssl => 'openssl-devel', - gridsite=>'emi.gridsite.devel', - jdk=>'java-devel', + default => { + cares => 'c-ares-devel', + classads => 'classads-devel', + cppunit => 'cppunit-devel', + expat => 'expat-devel', + gsoap => 'gsoap-devel', + voms => 'org.glite.security.voms-api', + libtar => 'libtar-devel', + log4c => 'log4c-devel', + postgresql => 'postgresql-devel', + curl => 'curl-devel', + libxml2 => 'libxml2-devel', + openssl => 'openssl-devel', + gridsite=>'emi.gridsite.devel', + jdk=>'java-devel', + }, }, etics_projects => { - 'emi'=>[qw/voms voms-devel gridsite lcas gip_release gip_service bdii glite_version glue_schema yaim_core yaim_bdii trustmanager trustmanager_axis/], + 'emi'=>[qw/voms voms-devel gridsite lcas gip_service bdii glite_version glue_schema yaim_core yaim_bdii trustmanager trustmanager_axis/], + }, + etics_locations => { + axis => 'axis', }, need_externs_aux => { 'lb.client-java' => [ qw/ant:B jdk:B axis:B trustmanager trustmanager_axis libtool:B/ ], - 'lb.glite-LB' => [ qw/fetchcrl:R gip_release:R gip_service:R bdii:R glite_version:R glue_schema:R/ ], + 'lb.glite-LB' => [ qw/fetchcrl:R gip_service:R bdii:R glite_version:R glue_schema:R/ ], 'lb.yaim' => [ qw/yaim_core:R yaim_bdii:R perl-LDAP:R/ ], 'px.glite-PX' => [qw/myproxy-server:R myproxy-admin:R fetchcrl:R gip_service:R bdii:R glite_version:R glue_schema:R/], 'px.myproxy-yaim' => [ qw/yaim_core:R yaim_bdii:R/ ], @@ -861,7 +892,7 @@ for my $ext (keys %deps_aux) { modules => { 'lb' => [ qw/emi-lb/ ], 'px' => [ qw/emi-px/ ], - } + }, }, ); @@ -1033,28 +1064,30 @@ sub mode_etics { close V; } + # XXX: --with ignored for platform-dependend packages my @copts = (); my %ge; @ge{@{$etics_projects{$project{etics_name}}}} = (1) x ($#{$etics_projects{$project{etics_name}}}+1); for (@{$need_externs{"$subsys.$module"}}) { if ($need_externs_type{"$subsys.$module"}->{$_}=~/B/ and (defined $externs{$_} or defined $jar{$_})) { - my $eext = $etics_externs{$_} ? $etics_externs{$_} : $_; + my $eext = $etics_externs{default}{$_} ? $etics_externs{default}{$_} : $_; next if ($eext eq '-'); - if ($project ne 'glite') { + if (defined $project{etics_locations}{'*'} or defined $project{etics_locations}{$_}) { + $eext = $project{etics_locations}{$_} if ($project{etics_locations}{$_}); + push @copts,$ge{$_} ? "--with-$_=\${stageDir}" : "--with-$_=\${$eext.location}"; + } else { if ($ge{$_} and not defined $externs{$_}{pkg}) { push @copts, "--with-$_=\${stageDir}"; } - } else { - push @copts,$ge{$_} ? "--with-$_=\${stageDir}" : "--with-$_=\${$eext.location}"; } } } for (@{$need_jars{"$subsys.$module"}}) { - my $eext = $etics_externs{$_} ? $etics_externs{$_} : $_; + my $eext = $etics_externs{default}{$_} ? $etics_externs{default}{$_} : $_; - push @copts,"--with-$_ \${$eext.location}$jar{$_}" if ($project eq 'glite'); + push @copts,"--with-$_ \${$eext.location}$jar{$_}" if (defined $project{etics_locations}{'*'} or defined $project{etics_locations}{$_}); } my $conf; @@ -1129,18 +1162,18 @@ sub mode_etics { if ($project ne 'glite') { $flags = 'RELEASE_VERSION=${age}.${platformFamily} libdir=${libdir} GSOAPDIR=`pkg-config gsoap --variable=prefix` OPENSSL_GLOBUS_FLAGS=`pkg-config globus-openssl --cflags` OPENSSL_GLOBUS_LIBS=`pkg-config globus-openssl --libs` FLAVOR_GLOBUS_EXT= HTTPD_FLAGS="-I/usr/include/httpd -I/usr/include/apache2 -I/usr/include/apr-${aprSuffix} -I/usr/include/pcre"'; - $prefix = "prefix=${prefix}/usr"; + $prefix = 'prefix=${prefix}/usr'; } else { $flags = 'RELEASE_VERSION=${age}.${platformFamily} libdir=${libdir} GSOAPDIR=${gsoap.location} OPENSSL_GLOBUS_FLAGS=-I${globus.location}/include/${globus.dbg.nothr.flavor} OPENSSL_GLOBUS_LIBS=-L${globus.location}/${libdir}/ FLAVOR_GLOBUS_EXT=_${globus.dbg.nothr.flavor} HTTPD_FLAGS="-I${httpd-devel.location}/include/httpd -I${httpd-devel.location}/include/apache2 -I${httpd-devel.location}/include/apr-${aprSuffix} -I${httpd-devel.location}/include/pcre"'; - $prefix = "prefix=${prefix}"; + $prefix = 'prefix=${prefix}'; } $cmd{compile} = "echo 'make $flags' > build.sh\n\tmake $flags build"; $cmd{clean} = "rm -rvf build.sh; $cmd{clean}"; $cmd{install} = "make $prefix $flags install"; - $cmd{packaging} = "mkdir ${moduleDir}/src/tgz + $cmd{packaging} = "mkdir \${moduleDir}/RPMTMP/SOURCES \${moduleDir}/src/tgz make $prefix $flags rpm && \ - cp ${moduleDir}/RPMTMP/SOURCES/gridsite-${version}.src.tar.gz ${moduleDir}/src/tgz"; + cp \${moduleDir}/RPMTMP/SOURCES/gridsite-\${version}.src.tar.gz \${moduleDir}/src/tgz"; } else { $cmd{clean} = 'None'; @@ -1157,6 +1190,10 @@ sub mode_etics { $cmd{compile} = 'make'; $cmd{test} = 'make check'; $cmd{install} = 'make install'; + if ($subsys eq 'lb' and $module eq 'client') { + $cmd{compile} = "make rpath=$project{local_prefix}/\${libdir}"; + $cmd{install} = "make install post-install rpath=$project{local_prefix}/\${libdir}"; + } } my $defprops = ''; @@ -1218,6 +1255,9 @@ $package_description$package_summary$defprops}; for (@{$conflicts{"$subsys.$module"}}) { print C "package.conflicts = $_\n"; } + for (@{$provides{"$subsys.$module"}}) { + print C "package.provides = $_\n"; + } for my $pp (keys %{$platform_properties{"$subsys.$module"}}) { next if $pp eq 'default'; @@ -1233,36 +1273,59 @@ package.SRPMSLocation = \${moduleDir}/RPMTMP/SRPMS\n"; print C "$package_description$package_summary\n"; } - print C qq{ -[Platform-default:DynamicDependency] + for my $platform ('default', keys %{$project{supported_platforms}}) { + my $used = 0; + + for (@{$need_externs{"$subsys.$module"}},@{$need_jars{"$subsys.$module"}}) { + my $eext = $etics_externs{$platform}{$_} ? $etics_externs{$platform}{$_} : $_; + my $edev = $project{etics_externs_devel}{$platform}{$_}; + next if ($eext eq '-'); + # dependencies not listed in etics_externs only for + # default platform + if (not defined $etics_externs{$platform}{$_} and + $platform ne 'default') { +#print "skipping $_ on $platform\n"; + next; + } + + if (not $used) { + print C qq{ +[Platform-$platform:DynamicDependency] }; - for (@{$need_externs{"$subsys.$module"}},@{$need_jars{"$subsys.$module"}}) { - my $eext = $etics_externs{$_} ? $etics_externs{$_} : $_; - my $edev = $project{etics_externs_devel}{$_}; - next if ($eext eq '-'); + $used = 1; + } - my $proj = 'externals'; - for my $p (keys %etics_projects) { - for $m (@{$etics_projects{$p}}) { - $proj = $p if $m eq $_; + my $proj = 'externals'; + for my $p (keys %etics_projects) { + for $m (@{$etics_projects{$p}}) { + $proj = $p if $m eq $_; + } } - } - my $type = $need_externs_type{"$subsys.$module"}->{$_}; + my $type = $need_externs_type{"$subsys.$module"}->{$_}; - if ($edev) { - if ($type eq 'B') { - $eext = $edev; # no runtime - change to devel pkg - } elsif ($type eq 'BR' or $type eq 'RB') { - print C "$proj|$edev = B\n"; # additional devel pkg + if ($edev) { + if ($type eq 'B') { + $eext = $edev; # no runtime - change to devel pkg + } elsif ($type eq 'BR' or $type eq 'RB') { + print C "$proj|$edev = B\n"; # additional devel pkg + } } + print C "$proj|$eext = $type\n"; } - print C "$proj|$eext = $type\n"; - } - for (@{$deps{"$subsys.$module"}}) { - my $type = $deps_type{"$subsys.$module"}->{$_}; - print C "$project{etics_name}|$project{etics_name}.$_ = $type\n"; + if ($platform eq 'default') { + for (@{$deps{"$subsys.$module"}}) { + my $type = $deps_type{"$subsys.$module"}->{$_}; + if (not $used) { + print C qq{ +[Platform-$platform:DynamicDependency] +}; + $used = 1; + } + print C "$project{etics_name}|$project{etics_name}.$_ = $type\n"; + } + } } close C; @@ -1333,6 +1396,37 @@ sub getlibdir { return $libdir; } +sub reshuffle_platforms($$) { + my ($data, $platforms) = @_; + my ($platform, %blacklist, $value); + + return if not $platforms; + + for $platform (keys %$data) { +#print "plat: $platform: $data->{$platform}\n"; + next if $platform eq 'default'; + for $_ (keys %{$data->{$platform}}) { +#print " blacklist: $_ = $data->{$platform}{$_}\n"; + $blacklist{$_} = 1; + } + } + + for $_ (keys %blacklist) { + if (defined $data->{default}{$_}) { + $value = $data->{default}{$_}; + $data->{default}{$_} = '-'; +#print " deleted $_ from default\n"; + for $platform (keys %$platforms) { + next if $platform eq 'default'; + if (not defined $data->{$platform}{$_}) { + $data->{$platform}{$_} = $value; +#print " added $value to $platform\n" + } + } + } + } +} + sub usage { my @ext = keys %externs; my @myjars = keys %jar; diff --git a/org.glite.lb.server/project/ChangeLog b/org.glite.lb.server/project/ChangeLog index 83eb9f5..aad65ab 100644 --- a/org.glite.lb.server/project/ChangeLog +++ b/org.glite.lb.server/project/ChangeLog @@ -219,6 +219,17 @@ 2.1.16-1 - Increased severity for DB open errors +2.1.17-1 +- Proper handling of background purge error messages (fix for bug #77974) +- Handling HTTP requests that are too long to fit into the server-side buffer + - Throw error for HTTP requests longer than allocated buffer. +- Minor fixes in server-side L&B dump code +- Benign reaction to unknown event types in edg_wll_get_event_flesh() for forward compatibility +- Refactoring of server state storing routine to avoid unnecessary error reports +- fixed RSS feeds with disable indexing +- fixed empty RSS feeds +- Support zombification of single SB transfer jobs + 2.2.0-1 - Fixes for parallel release in EMI & gLite - Extended authorization: Support for the TAG operation in the ACLs @@ -282,3 +293,20 @@ - '--stage=/' behaviour fixed in configure - wsdl files moved +2.2.8-1 +- fixed empty RSS feed and disabling RSS with no indexing also on HEAD +- Proper handling of background purge error messages (fix for bug #77974) +- Handling HTTP requests that are too long to fit into the server-side buffer + - Throw error for HTTP requests longer than allocated buffer. +- Minor fixes in server-side L&B dump code +- Benign reaction to unknown event types in edg_wll_get_event_flesh() for forward compatibility +- Refactoring of server state storing routine to avoid unnecessary error reports +- fixed RSS feeds with disable indexing +- fixed empty RSS feeds +- Support zombification of single SB transfer jobs +- Reading Messaging broker names and topic prefixes from a configuration file (option -F) +- Publishing server configuration over HTTPs -- initial implementation + +2.2.9-1 +- Proper permission category for statistics + diff --git a/org.glite.lb.server/project/version.properties b/org.glite.lb.server/project/version.properties index 62eccf5..f3d4510 100644 --- a/org.glite.lb.server/project/version.properties +++ b/org.glite.lb.server/project/version.properties @@ -1,3 +1,3 @@ # : /cvs/jra1mw/org.glite.lb.server/project/version.properties,v 1.185 2008/06/25 13:12:58 akrenek Exp $ -module.version=2.2.7 +module.version=2.2.9 module.age=1 diff --git a/org.glite.lb.server/src/bkserverd.c b/org.glite.lb.server/src/bkserverd.c index 2240dc9..69de46c 100644 --- a/org.glite.lb.server/src/bkserverd.c +++ b/org.glite.lb.server/src/bkserverd.c @@ -181,8 +181,8 @@ static time_t rss_time = 60*60; char * policy_file = NULL; struct _edg_wll_authz_policy authz_policy = { NULL, 0}; static int exclusive_zombies = 1; - - +static char **msg_brokers = NULL; +static char **msg_prefixes = NULL; static struct option opts[] = { @@ -207,7 +207,8 @@ static struct option opts[] = { {"jpreg-dir", 1, NULL, 'J'}, {"enable-jpreg-export", 1, NULL, 'j'}, {"super-user", 1, NULL, 'R'}, - {"super-users-file", 1, NULL,'F'}, +// {"super-users-file", 1, NULL,'F'}, + {"msg-conf", 1, NULL,'F'}, {"no-index", 1, NULL, 'x'}, {"strict-locking",0, NULL, 'O'}, {"limits", 1, NULL, 'L'}, @@ -270,7 +271,6 @@ static void usage(char *me) "\t-J, --jpreg-dir\t JP registration temporary files prefix (implies '-j')\n" "\t-j, --enable-jpreg-export\t enable JP registration export (disabled by default)\n" "\t--super-user\t user allowed to bypass authorization and indexing\n" - "\t--super-users-file (deprecated)\t the same but read the subjects from a file\n" "\t--no-index=1\t don't enforce indices for superusers\n" "\t =2\t don't enforce indices at all\n" "\t--strict-locking=1\t lock jobs also on storing events (may be slow)\n" @@ -293,6 +293,7 @@ static void usage(char *me) "\t-I,--rss-time\t age (in seconds) of job states published via RSS\n" "\t-l,--policy\tauthorization policy file\n" "\t-E,--exclusive-zombies-off\twith 'exclusive' flag, allow reusing IDs of purged jobs\n" + "\t-F,--msg-conf\t path to configuration file with messaging settings\n" ,me); } @@ -402,6 +403,7 @@ int main(int argc, char *argv[]) struct timeval to; int request_timeout = REQUEST_TIMEOUT; char socket_path_prefix[PATH_MAX] = GLITE_LBPROXY_SOCK_PREFIX; + char * msg_conf = NULL; name = strrchr(argv[0],'/'); @@ -471,9 +473,7 @@ int main(int argc, char *argv[]) case 'Y': notif_ilog_file_prefix = strdup(optarg); break; case 'i': strcpy(pidfile,optarg); pidfile_forced = 1; break; case 'R': add_root(ctx, optarg, ADMIN_ACCESS); break; - case 'F': glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_FATAL, - "%s: Option --super-users-file is deprecated, specify policy using --policy instead", argv[0]); - return 1; + case 'F': msg_conf = strdup(optarg); break; case 'x': noIndex = atoi(optarg); if (noIndex < 0 || noIndex > 2) { usage(name); return 1; } break; @@ -569,6 +569,22 @@ int main(int argc, char *argv[]) return 1; } + if (msg_conf) { + int retv_msg; + glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_DEBUG, "Parsing MSG conf file: %s", msg_conf); + retv_msg = edg_wll_ParseMSGConf(msg_conf, &msg_brokers, &msg_prefixes); + if (retv_msg) { + switch(retv_msg) { + case -1: glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_WARN, "Error opening MSG conf file: %s", msg_conf); break; + case -2: glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_WARN, "Error parsing MSG conf file: %s", msg_conf); break; + } + } + } + if (!msg_prefixes) { // Prefixes not extracted from file, put in defaults + msg_prefixes = (char**) calloc(sizeof(char**), 2); + asprintf(&(msg_prefixes[0]), "grid.emi."); + } + if (enable_lcas) { char s[3]; @@ -725,7 +741,10 @@ int main(int argc, char *argv[]) glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_WARN, "%s: key or certificate file not specified - unable to watch them for changes!", argv[0]); if ( cadir ) setenv("X509_CERT_DIR", cadir, 1); - edg_wll_gss_watch_creds(server_cert, &cert_mtime); + int ret; + ret = edg_wll_gss_watch_creds(server_cert, &cert_mtime); + if (ret < 0) + glite_common_log(LOG_CATEGORY_SECURITY,LOG_PRIORITY_WARN,"edg_wll_gss_watch_creds failed, unable to access credentials\n"); if ( !edg_wll_gss_acquire_cred_gsi(server_cert, server_key, &mycred, &gss_code) ) { glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_INFO, "Server identity: %s", mycred->name); @@ -1045,6 +1064,7 @@ int bk_handle_connection(int conn, struct timeval *timeout, void *data) *name_num = NULL, *name = NULL; int h_errno, ret; + int npref, totpref; @@ -1060,7 +1080,7 @@ int bk_handle_connection(int conn, struct timeval *timeout, void *data) } break; case -1: - glite_common_log(LOG_CATEGORY_SECURITY, LOG_PRIORITY_ERROR, "[%d] edg_wll_gss_watch_creds failed", getpid()); + glite_common_log(LOG_CATEGORY_SECURITY, LOG_PRIORITY_ERROR, "[%d] edg_wll_gss_watch_creds failed, unable to access credentials", getpid()); break; } @@ -1279,6 +1299,16 @@ int bk_handle_connection(int conn, struct timeval *timeout, void *data) ctx->greyjobs = greyjobs; ctx->exclusive_zombies = exclusive_zombies; + for (totpref = 0; msg_prefixes[totpref]; totpref++); + ctx->msg_prefixes = (char**) calloc(sizeof(char*), totpref+1); + for (npref = 0; nprefmsg_prefixes[npref]=strdup(msg_prefixes[npref]); + + for (totpref = 0; msg_brokers && msg_brokers[totpref]; totpref++); + ctx->msg_brokers = (char**) calloc(sizeof(char*), totpref+1); + for (npref = 0; nprefmsg_brokers[npref]=strdup(msg_brokers[npref]); + return 0; } @@ -1442,7 +1472,6 @@ static int handle_server_error(edg_wll_Context ctx) int err,ret = 0; - errt = errd = NULL; switch ( (err = edg_wll_Error(ctx, &errt, &errd)) ) { case ETIMEDOUT: @@ -1450,6 +1479,7 @@ static int handle_server_error(edg_wll_Context ctx) case EPIPE: case EIO: case EDG_WLL_IL_PROTO: + case E2BIG: glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_WARN, "[%d] %s (%s)", getpid(), errt, errd); /* fallthrough @@ -1466,8 +1496,10 @@ static int handle_server_error(edg_wll_Context ctx) case EPERM: case EEXIST: case EDG_WLL_ERROR_NOINDEX: - case E2BIG: case EIDRM: + glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_WARN, + "[%d] %s (%s)", getpid(), errt, errd); + break; case EINVAL: case EDG_WLL_ERROR_PARSE_BROKEN_ULM: case EDG_WLL_ERROR_PARSE_EVENT_UNDEF: @@ -1483,7 +1515,16 @@ static int handle_server_error(edg_wll_Context ctx) * no action for non-fatal errors */ break; - + + case EDG_WLL_ERROR_ACCEPTED_OK: + glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_INFO, + "[%d] %s (%s)", getpid(), errt, errd); + /* + * all OK, but slave needs to be restarted + */ + ret = -EINPROGRESS; + break; + case EDG_WLL_ERROR_DB_INIT: case EDG_WLL_ERROR_DB_CALL: case EDG_WLL_ERROR_SERVER_RESPONSE: diff --git a/org.glite.lb.server/src/dump.c b/org.glite.lb.server/src/dump.c index ff785bd..c25f552 100644 --- a/org.glite.lb.server/src/dump.c +++ b/org.glite.lb.server/src/dump.c @@ -50,7 +50,7 @@ int edg_wll_DumpEventsServer(edg_wll_Context ctx,const edg_wll_DumpRequest *req, char *tmpfname; time_t start,end; glite_lbu_Statement q = NULL; - char *res[10]; + char *res[11]; int event; edg_wll_Event e; int ret,dump = 2; /* TODO: manage dump file */ @@ -76,11 +76,11 @@ int edg_wll_DumpEventsServer(edg_wll_Context ctx,const edg_wll_DumpRequest *req, glite_lbu_TimeToStr(to, &to_s); trio_asprintf(&stmt, - "select event,dg_jobid,code,prog,host,u.cert_subj,time_stamp,usec,level,arrived " + "select event,dg_jobid,code,prog,host,u.cert_subj,time_stamp,usec,level,arrived,seqcode " "from events e,users u,jobs j " "where u.userid=e.userid " "and j.jobid = e.jobid " - "and j.dg_jobid like 'https://%|Ss:%d%%' " + "and j.dg_jobid like 'https://%|Ss:%d/%%' " "and arrived > %s and arrived <= %s " "order by arrived", ctx->srvName,ctx->srvPort, diff --git a/org.glite.lb.server/src/get_events.c.T b/org.glite.lb.server/src/get_events.c.T index 4ff6ca5..cff249e 100644 --- a/org.glite.lb.server/src/get_events.c.T +++ b/org.glite.lb.server/src/get_events.c.T @@ -65,12 +65,18 @@ int edg_wll_get_event_flesh(edg_wll_Context ctx,int n,edg_wll_Event *e) edg_wll_ParseEvent(ctx,nameval[0],&f); free(nameval[0]); - f->any.arrived = e->any.arrived; - edg_wll_FreeEvent(e); + if(f) { + f->any.arrived = e->any.arrived; + edg_wll_FreeEvent(e); - memcpy(e, f, sizeof *e); - free(f); - ret=edg_wll_CheckEvent(ctx,e); + memcpy(e, f, sizeof *e); + free(f); + ret=edg_wll_CheckEvent(ctx,e); + } + else { + glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_WARN, "Unknown event type encountered during dump; jobid %s, event %d", jobid, n); + ret = EINVAL; + } } else ret = ENOENT; free(q); q = NULL; glite_lbu_FreeStmt(&sh); diff --git a/org.glite.lb.server/src/lb_authz.c b/org.glite.lb.server/src/lb_authz.c index ab20cdb..b6130e2 100644 --- a/org.glite.lb.server/src/lb_authz.c +++ b/org.glite.lb.server/src/lb_authz.c @@ -30,6 +30,7 @@ limitations under the License. #include #undef WITHOUT_TRIO +#include #include "glite/jobid/strmd5.h" #include "glite/jobid/cjobid.h" @@ -38,8 +39,9 @@ limitations under the License. #include "authz_policy.h" -/* XXX should be defined in gridsite-gacl.h */ +#if GRST_VERSION <= 010713 GRSTgaclEntry *GACLparseEntry(xmlNodePtr cur); +#endif extern char *server_key; extern char *server_cert; diff --git a/org.glite.lb.server/src/lb_http.c b/org.glite.lb.server/src/lb_http.c index 917bf25..8d9b8e2 100644 --- a/org.glite.lb.server/src/lb_http.c +++ b/org.glite.lb.server/src/lb_http.c @@ -57,6 +57,9 @@ int edg_wll_AcceptHTTP(edg_wll_Context ctx, char **body, char **resp, char ***hd if ((err = edg_wll_Proto(ctx,req,hdr,*body,resp,hdrOut,bodyOut,httpErr))) edg_wll_Error(ctx,NULL,&err_desc); } + else + asprintf(resp,"HTTP/1.1 %d %s", HTTP_BADREQ, edg_wll_HTTPErrorMessage(HTTP_BADREQ)); + free(req); if (hdr) { diff --git a/org.glite.lb.server/src/lb_proto.c b/org.glite.lb.server/src/lb_proto.c index 7c532be..e8c8065 100644 --- a/org.glite.lb.server/src/lb_proto.c +++ b/org.glite.lb.server/src/lb_proto.c @@ -381,7 +381,7 @@ static int getJobsRSS(edg_wll_Context ctx, char *feedType, edg_wll_JobStat **sta } else{ *statesOut = NULL; - free(can_peername); + free(can_peername); return -1; } @@ -843,8 +843,13 @@ edg_wll_ErrorCode edg_wll_Proto(edg_wll_Context ctx, if (edg_wll_WSDLOutput(ctx, &message, filename)) ret = HTTP_INTERNAL; free(filename); + /* GET /?version */ } else if (strncmp(requestPTR, "/?version", strlen("/?version")) == 0) { asprintf(&message, "%s", VERSION); + /* GET /?configuration*/ + } else if (strncmp(requestPTR, "/?configuration", strlen("/?configuration")) == 0) { + // also browser-readable HTML version here? + edg_wll_ConfigurationToText(ctx, &message); /* GET [something else]: not understood */ } else ret = HTTP_BADREQ; free(requestPTR); requestPTR = NULL; @@ -926,10 +931,8 @@ edg_wll_ErrorCode edg_wll_Proto(edg_wll_Context ctx, retCode; if (flags & EDG_WLL_STAT_NO_JOBS) { - flags -= EDG_WLL_STAT_NO_JOBS; jobsOut = NULL; if (flags & EDG_WLL_STAT_NO_STATES) { - flags -= EDG_WLL_STAT_NO_STATES; statesOut = NULL; retCode = edg_wll_QueryJobsServer(ctx, (const edg_wll_QueryRec **)conditions, flags, NULL, NULL); } @@ -938,7 +941,6 @@ edg_wll_ErrorCode edg_wll_Proto(edg_wll_Context ctx, } else { if (flags & EDG_WLL_STAT_NO_STATES) { - flags -= EDG_WLL_STAT_NO_STATES; statesOut = NULL; retCode = edg_wll_QueryJobsServer(ctx, (const edg_wll_QueryRec **)conditions, flags, &jobsOut, NULL); } @@ -1026,7 +1028,7 @@ edg_wll_ErrorCode edg_wll_Proto(edg_wll_Context ctx, default: /* client request handler */ ret = HTTP_ACCEPTED; /* to end this parent */ - edg_wll_SetError(ctx, EDG_WLL_ERROR_SERVER_RESPONSE, edg_wll_HTTPErrorMessage(ret)); + edg_wll_SetError(ctx, EDG_WLL_ERROR_ACCEPTED_OK, edg_wll_HTTPErrorMessage(ret)); goto err; } } @@ -1046,7 +1048,7 @@ edg_wll_ErrorCode edg_wll_Proto(edg_wll_Context ctx, if (edg_wll_PurgeResultToXML(ctx, &result, &message)) ret = HTTP_INTERNAL; else - printf("%s", message); + glite_common_log_msg(LOG_CATEGORY_CONTROL, LOG_PRIORITY_DEBUG, message); } /* result is now packed in message, free it */ @@ -1061,9 +1063,19 @@ edg_wll_ErrorCode edg_wll_Proto(edg_wll_Context ctx, /* forked cleaner sends no results */ if ((request.flags & EDG_WLL_PURGE_BACKGROUND)) { - *response = NULL; + char *et, *ed; + free(message); message = NULL; + if (ret != HTTP_OK && ret != HTTP_ACCEPTED) { + edg_wll_Error(ctx, &et, &ed); + glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_ERROR, "Background purge failed, %s (%s)",et, ed); + free(et); + free(ed); + } else { + glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_INFO, "Background purge done successfully."); + } + *response = NULL; if (requestPTR) free(requestPTR); exit(0); } diff --git a/org.glite.lb.server/src/lb_text.c b/org.glite.lb.server/src/lb_text.c index 0712737..9913e0d 100644 --- a/org.glite.lb.server/src/lb_text.c +++ b/org.glite.lb.server/src/lb_text.c @@ -87,6 +87,35 @@ int edg_wll_QueryToText(edg_wll_Context ctx UNUSED_VAR, edg_wll_Event *eventsOut free(a); a=NULL; \ } +#define TRS(name,type,field) \ +{ \ + int l; \ + if (field) \ + l = asprintf(&a,"%s=" type "", \ + name, field); \ + else \ + l = asprintf(&a,"%s=", name); \ + b = realloc(b, sizeof(*b)*(pomL+l+1)); \ + strcpy(b+pomL, a); \ + pomL += l; \ + free(a); a=NULL; \ +} + +#define TRA(type,field) \ +{ \ + int l; \ + if (field) \ + l = asprintf(&a,"," type "", \ + field); \ + else \ + l = asprintf(&a,"\n"); \ + b = realloc(b, sizeof(*b)*(pomL+l+1)); \ + strcpy(b+pomL, a); \ + pomL += l; \ + free(a); a=NULL; \ +} + + int edg_wll_UserInfoToText(edg_wll_Context ctx, edg_wlc_JobId *jobsOut, char **message) { char *a = NULL, *b; @@ -243,6 +272,32 @@ int edg_wll_JobStatusToText(edg_wll_Context ctx UNUSED_VAR, edg_wll_JobStat stat return 0; } +int edg_wll_ConfigurationToText(edg_wll_Context ctx, char **message){ + char *a = NULL, *b; + int pomL = 0; + int i; + b = strdup(""); + + if (ctx->msg_brokers) + for (i = 0; ctx->msg_brokers[i]; i++){ + if (i == 0) TRS("msg_brokers", "%s", ctx->msg_brokers[i]) + else TRA("%s", ctx->msg_brokers[i]); + } + if (i > 0) + TRA("%s", NULL); + + if (ctx->msg_prefixes) + for (i = 0; ctx->msg_prefixes[i]; i++) + if (i == 0) TRS("msg_prefixes", "%s", ctx->msg_prefixes[i]) + else TRA("%s", ctx->msg_prefixes[i]); + if (i > 0) + TRA("%s", NULL); + + *message = b; + + return 0; +} + char *edg_wll_ErrorToText(edg_wll_Context ctx,int code) { char *out,*et,*ed; diff --git a/org.glite.lb.server/src/lb_text.h b/org.glite.lb.server/src/lb_text.h index 008e7e9..6e70004 100644 --- a/org.glite.lb.server/src/lb_text.h +++ b/org.glite.lb.server/src/lb_text.h @@ -28,6 +28,7 @@ int edg_wll_JobStatusToText(edg_wll_Context, edg_wll_JobStat, char **); int edg_wll_UserInfoToText(edg_wll_Context, edg_wlc_JobId *, char **); int edg_wll_UserNotifsToText(edg_wll_Context ctx, char **notifids, char **message); int edg_wll_NotificationToText(edg_wll_Context ctx, notifInfo *ni, char **message); +int edg_wll_ConfigurationToText(edg_wll_Context ctx, char **message); char *edg_wll_ErrorToText(edg_wll_Context,int); #endif /* GLITE_LB_TEXT */ diff --git a/org.glite.lb.server/src/notification.c b/org.glite.lb.server/src/notification.c index 0fe1d95..968f240 100644 --- a/org.glite.lb.server/src/notification.c +++ b/org.glite.lb.server/src/notification.c @@ -81,6 +81,8 @@ int edg_wll_NotifNewServer( edg_wll_QueryRec **nconds = NULL; char *add_index = NULL; notif_stream_t *arg = NULL; + int npref, okpref; + char *msgpref; /* Format notification ID @@ -138,10 +140,30 @@ int edg_wll_NotifNewServer( edg_wll_SetError(ctx, EINVAL, "Addres override not in format host:port"); goto cleanup; } - if ( strstr(address_override, "x-msg")) { - // XXX: Quick ugly hack. This will be made configurable soon - if ( !strstr(address_override,"x-msg://grid.emi.")) { - edg_wll_SetError(ctx, EINVAL, "This site requires that all topic names start with prefix 'grid.emi.'"); + if ( !strncmp(address_override, "x-msg", 5)) { + npref = 0; okpref = 0; + while (ctx->msg_prefixes[npref]) { + asprintf(&msgpref, "x-msg://%s", ctx->msg_prefixes[npref++]); + if ( !strncmp(address_override, msgpref, strlen(msgpref))) { + okpref = 1; + free(msgpref); + break; + } + free(msgpref); + } + if (!okpref) { + char *prefmsg, *prefmsg2; + asprintf(&prefmsg,"This site requires that all topic names start with prefix %s", ctx->msg_prefixes[0]); + npref = 1; + while (ctx->msg_prefixes[npref]) { + prefmsg2 = prefmsg; + asprintf(&prefmsg,"%s or %s", prefmsg2, ctx->msg_prefixes[npref++]); + free(prefmsg2); + } + + glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_DEBUG, "Rejecting notification with disallowed prefix (%s)", address_override); + edg_wll_SetError(ctx, EINVAL, prefmsg); + free(prefmsg); goto cleanup; } } @@ -253,6 +275,8 @@ int edg_wll_NotifBindServer( { char *time_s = NULL, *addr_s = NULL; + int npref, okpref; + char *msgpref; if ( !address_override ) @@ -297,10 +321,31 @@ int edg_wll_NotifBindServer( edg_wll_SetError(ctx, EINVAL, "Addres override not in format host:port"); goto rollback; } - if ( strstr(address_override, "x-msg")) { - // XXX: Quick ugly hack. This will be made configurable soon - if ( !strstr(address_override,"x-msg://grid.emi.")) { - edg_wll_SetError(ctx, EINVAL, "This site requires that all topic names start with prefix 'grid.emi.'"); + if ( !strncmp(address_override, "x-msg", 5)) { + + npref = 0; okpref = 0; + while (ctx->msg_prefixes[npref]) { + asprintf(&msgpref, "x-msg://%s", ctx->msg_prefixes[npref++]); + if ( !strncmp(address_override, msgpref, strlen(msgpref))) { + okpref = 1; + free(msgpref); + break; + } + free(msgpref); + } + if (!okpref) { + char *prefmsg, *prefmsg2; + asprintf(&prefmsg,"This site requires that all topic names start with prefix %s", ctx->msg_prefixes[0]); + npref = 1; + while (ctx->msg_prefixes[npref]) { + prefmsg2 = prefmsg; + asprintf(&prefmsg,"%s or %s", prefmsg2, ctx->msg_prefixes[npref++]); + free(prefmsg2); + } + + glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_DEBUG, "Rejecting notification with disallowed prefix (%s)", address_override); + edg_wll_SetError(ctx, EINVAL, prefmsg); + free(prefmsg); goto rollback; } } @@ -340,8 +385,10 @@ int edg_wll_NotifChangeServer( /* Format notification ID */ - if ( !(nid_s = edg_wll_NotifIdGetUnique(nid)) ) + if ( !(nid_s = edg_wll_NotifIdGetUnique(nid)) ) { + edg_wll_SetError(ctx, EINVAL, "Malformed notification ID"); goto err; + } do { if (edg_wll_Transaction(ctx) != 0) goto err; @@ -586,8 +633,10 @@ static int check_notif_request( return edg_wll_Error(ctx, NULL, NULL); } - if ( !(nid_s = edg_wll_NotifIdGetUnique(nid)) ) + if ( !(nid_s = edg_wll_NotifIdGetUnique(nid)) ) { + edg_wll_SetError(ctx, EINVAL, "Malformed notification ID"); goto cleanup; + } trio_asprintf(&stmt, "select destination from notif_registrations " @@ -714,7 +763,7 @@ static int update_notif( if ( !(nid_s = edg_wll_NotifIdGetUnique(nid)) ) { - edg_wll_SetError(ctx, EINVAL, "Malformed notification ID."); + edg_wll_SetError(ctx, EINVAL, "Malformed notification ID"); goto cleanup; } @@ -864,8 +913,10 @@ static int drop_notif_request(edg_wll_Context ctx, const edg_wll_NotifId nid) { errCode = edg_wll_Error(ctx, NULL, &errDesc); - if ( !(nid_s = edg_wll_NotifIdGetUnique(nid)) ) + if ( !(nid_s = edg_wll_NotifIdGetUnique(nid)) ) { + edg_wll_SetError(ctx, EINVAL, "Malformed notification ID"); goto rollback; + } trio_asprintf(&stmt, "delete from notif_registrations where notifid='%|Ss'", nid_s); glite_common_log_msg(LOG_CATEGORY_LB_SERVER_DB, LOG_PRIORITY_DEBUG, stmt); @@ -908,8 +959,10 @@ static int check_notif_age(edg_wll_Context ctx, const edg_wll_NotifId nid) { *q = NULL; int ret; - if ( !(nid_s = edg_wll_NotifIdGetUnique(nid)) ) + if ( !(nid_s = edg_wll_NotifIdGetUnique(nid)) ) { + edg_wll_SetError(ctx, EINVAL, "Malformed notification ID"); goto cleanup; + } glite_lbu_TimeToStr(now, &time_s); if ( !time_s ) diff --git a/org.glite.lb.server/src/query.c b/org.glite.lb.server/src/query.c index 1020b5e..9fcda60 100644 --- a/org.glite.lb.server/src/query.c +++ b/org.glite.lb.server/src/query.c @@ -349,6 +349,7 @@ typedef struct { glite_jobid_t *jobs; edg_wll_JobStat *states; size_t maxn, n; + int flags; } queryjobs_cb_data_t; @@ -364,15 +365,19 @@ static int queryjobs_cb(edg_wll_Context ctx, glite_jobid_t jobid, edg_wll_JobSta return edg_wll_SetError(ctx, errno ? : ENOMEM, NULL); store->jobs = tmp; - if ((tmp = realloc(store->states, maxn * sizeof(*store->states))) == NULL) - return edg_wll_SetError(ctx, errno ? : ENOMEM, NULL); - store->states = tmp; + if (!(store->flags & EDG_WLL_STAT_NO_STATES)) { + if ((tmp = realloc(store->states, maxn * sizeof(*store->states))) == NULL) + return edg_wll_SetError(ctx, errno ? : ENOMEM, NULL); + store->states = tmp; + } store->maxn = maxn; } store->jobs[n] = jobid; - if (status) store->states[n] = *status; - else memset(&store->states[n], 0, sizeof(*store->states)); + if (!(store->flags & EDG_WLL_STAT_NO_STATES)) { + if (status) store->states[n] = *status; + else memset(&store->states[n], 0, sizeof(*store->states)); + } store->n++; return 0; @@ -390,6 +395,7 @@ int edg_wll_QueryJobsServer( size_t i; memset(&store, 0, sizeof store); + store.flags = flags; if (edg_wll_QueryJobsServerStream(ctx, conditions, flags, queryjobs_cb, &store)) goto cleanup; diff --git a/org.glite.lb.server/src/server_state.c b/org.glite.lb.server/src/server_state.c index a95610e..f64d32a 100644 --- a/org.glite.lb.server/src/server_state.c +++ b/org.glite.lb.server/src/server_state.c @@ -51,28 +51,39 @@ int edg_wll_GetServerState(edg_wll_Context ctx,const char *name,char **val) int edg_wll_SetServerState(edg_wll_Context ctx,const char *name,const char *val) { char *stmt = NULL; + int sql_retval; - trio_asprintf(&stmt,"insert into server_state (prefix,name,value) " - "values ('https://%|Ss:%d','%|Ss','%|Ss')", - ctx->srvName,ctx->srvPort,name,val); + // Check if record exists + trio_asprintf(&stmt,"select value from server_state " + "where prefix = 'https://%|Ss:%d' and name = '%|Ss'", + ctx->srvName,ctx->srvPort,name); glite_common_log_msg(LOG_CATEGORY_LB_SERVER_DB, LOG_PRIORITY_DEBUG, stmt); - switch(edg_wll_ExecSQL(ctx,stmt,NULL)) { - case 1: break; - case -1: if (edg_wll_Error(ctx,NULL,NULL) == EEXIST) { - free(stmt); - trio_asprintf(&stmt,"update server_state set value = '%|Ss' " - "where prefix = 'https://%|Ss:%d' " - "and name = '%|Ss'", - val,ctx->srvName,ctx->srvPort,name); - glite_common_log_msg(LOG_CATEGORY_LB_SERVER_DB, - LOG_PRIORITY_DEBUG, stmt); - edg_wll_ExecSQL(ctx,stmt,NULL); - } - break; + sql_retval = edg_wll_ExecSQL(ctx,stmt,NULL); - default: abort(); - } free(stmt); + + if (!sql_retval) { + trio_asprintf(&stmt,"insert into server_state (prefix,name,value) " + "values ('https://%|Ss:%d','%|Ss','%|Ss')", + ctx->srvName,ctx->srvPort,name,val); + glite_common_log_msg(LOG_CATEGORY_LB_SERVER_DB, LOG_PRIORITY_DEBUG, stmt); + edg_wll_ExecSQL(ctx,stmt,NULL); + free(stmt); + } + else { + if (sql_retval > 0) { + trio_asprintf(&stmt,"update server_state set value = '%|Ss' " + "where prefix = 'https://%|Ss:%d' " + "and name = '%|Ss'", + val,ctx->srvName,ctx->srvPort,name); + glite_common_log_msg(LOG_CATEGORY_LB_SERVER_DB, + LOG_PRIORITY_DEBUG, stmt); + edg_wll_ExecSQL(ctx,stmt,NULL); + free(stmt); + } + else abort(); + } + return edg_wll_Error(ctx,NULL,NULL); } diff --git a/org.glite.lb.server/src/srv_purge.c b/org.glite.lb.server/src/srv_purge.c index ee917e5..b6370b6 100644 --- a/org.glite.lb.server/src/srv_purge.c +++ b/org.glite.lb.server/src/srv_purge.c @@ -562,6 +562,8 @@ static int get_jobid_suffix(edg_wll_Context ctx, glite_jobid_const_t job, enum e case EDG_WLL_STAT__PARTITIONABLE_UNUSED: case EDG_WLL_STAT__PARTITIONED_UNUSED: case EDG_WLL_STAT_COLLECTION: + case EDG_WLL_STAT_FILE_TRANSFER: + case EDG_WLL_STAT_FILE_TRANSFER_COLLECTION: // glite jobs, no suffix *suffix = strdup(""); *unique = strdup(dbjob); @@ -609,6 +611,8 @@ static int get_jobid_prefix(edg_wll_Context ctx, glite_jobid_const_t job, enum e case EDG_WLL_STAT__PARTITIONABLE_UNUSED: case EDG_WLL_STAT__PARTITIONED_UNUSED: case EDG_WLL_STAT_COLLECTION: + case EDG_WLL_STAT_FILE_TRANSFER: + case EDG_WLL_STAT_FILE_TRANSFER_COLLECTION: // glite job prefix ser = glite_jobid_getServer(job); asprintf(prefix,"%s/",ser); @@ -723,6 +727,7 @@ int purge_one(edg_wll_Context ctx,edg_wll_JobStat *stat,int dump, int purge, int if ( !purge && dump < 0 ) return 0; do { + if (edg_wll_Transaction(ctx)) goto err; switch (edg_wll_jobMembership(ctx, job)) { @@ -777,6 +782,7 @@ int purge_one(edg_wll_Context ctx,edg_wll_JobStat *stat,int dump, int purge, int dbjob = glite_jobid_getUnique(job); /* XXX: strict jobid already checked */ + if ( purge ) { enum edg_wll_StatJobtype jobtype = get_job_type(ctx, job); @@ -787,10 +793,11 @@ int purge_one(edg_wll_Context ctx,edg_wll_JobStat *stat,int dump, int purge, int || get_jobid_prefix(ctx, job, jobtype, &prefix)) { glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_WARN, - "[%d] unknown job type of the '%s'.", - getpid(), dbjob); + "[%d] unknown job type %d of job %s", + getpid(), jobtype, dbjob); edg_wll_ResetError(ctx); } + } if ( purge ) diff --git a/org.glite.lb.server/src/stats.c b/org.glite.lb.server/src/stats.c index f9f5678..2219232 100644 --- a/org.glite.lb.server/src/stats.c +++ b/org.glite.lb.server/src/stats.c @@ -37,6 +37,7 @@ limitations under the License. #include "glite/jobid/strmd5.h" #include "stats.h" +#include "authz_policy.h" #define GROUPS_HASHTABLE_SIZE 1000 @@ -546,11 +547,16 @@ static int findStat( ) { edg_wll_JobStatCode later_state; + struct _edg_wll_GssPrincipal_data princ; + edg_wll_ResetError(ctx); + memset(&princ, 0, sizeof princ); + princ.name = ctx->peerName; + princ.fqans = ctx->fqans; switch (ctx->count_statistics) { case 0: return edg_wll_SetError(ctx,ENOSYS,NULL); - case 1: if (!ctx->noAuth) return edg_wll_SetError(ctx,EPERM,NULL); - break; + case 1: if (!ctx->noAuth && !check_authz_policy(&ctx->authz_policy, &princ, GET_STATISTICS)) + return edg_wll_SetError(ctx, EPERM, NULL); case 2: break; default: abort(); } diff --git a/org.glite.lb.server/src/ws_typeref.c.T b/org.glite.lb.server/src/ws_typeref.c.T index 069400c..aa3a330 100644 --- a/org.glite.lb.server/src/ws_typeref.c.T +++ b/org.glite.lb.server/src/ws_typeref.c.T @@ -19,6 +19,7 @@ limitations under the License. #include #include #include +#include #include "soap_version.h" #include "bk_ws_H.h" @@ -248,6 +249,10 @@ int edg_wll_StatusToSoap(struct soap *soap,edg_wll_JobStat const *src,struct lbt gen "\tjs->$usuc->tvUsec = src->$_.tv_usec;\n"; } elsif ($ft eq 'string') { gen "\tjs->$usuc = soap_strdup(soap,src->$_);\n"; + } elsif ($ft eq 'cclassad') { + gen "\ts = src->$_ ? cclassad_unparse(src->$_) : NULL;\n"; + gen "\tjs->$usuc = s ? soap_strdup(soap, s) : NULL;\n"; + gen "\tfree(s);\n"; } elsif ($f->{null}) { gen qq{ ! if (src->$_ == $f->{null}) js->$usuc = NULL; @@ -326,6 +331,11 @@ void edg_wll_SoapToStatus(struct soap *soap,struct lbt__jobStatus const *src,edg } elsif ($ft eq 'string') { gen "\tdest->$_ = src->$usuc;\n"; gen "\tsoap_unlink(soap,src->$usuc);\n"; + } elsif ($ft eq 'cclassad') { + gen "\tif (src->$usuc) {"; + gen "\t\tdest->$_ = cclassad_create(src->$usuc);\n"; + gen "\t\tsoap_unlink(soap,src->$usuc);\n"; + gen "\t}"; } elsif ($f->{null}) { gen "\tdest->$_ = (src->$usuc) ? *(src->$usuc) : $f->{null};\n"; } else { diff --git a/org.glite.lb.state-machine/Makefile b/org.glite.lb.state-machine/Makefile index 55d18c3..fef41c3 100644 --- a/org.glite.lb.state-machine/Makefile +++ b/org.glite.lb.state-machine/Makefile @@ -5,11 +5,12 @@ distdir=. globalprefix=glite lbprefix=lb package=glite-lb-state-machine -version=0.2.0 PREFIX=/opt/glite prefix= -include Makefile.inc +-include ${top_srcdir}/project/version.properties +version=${module.version} VPATH = ${top_srcdir}/src:${top_srcdir}/interface @@ -59,9 +60,10 @@ PLUGIN_LIBS:= -L${stagedir}${prefix}/${libdir} -lglite_lb_common${default_flavou PLUGIN_LOBJS:=seqcode_aux.lo process_event.lo process_event_pbs.lo process_event_condor.lo process_event_cream.lo lb_plugin.lo process_event_file_transfer.lo process_event_file_transfer_collection.lo MACHINE_OBJS:=seqcode_aux.o process_event.o process_event_pbs.o process_event_condor.o process_event_cream.o process_event_file_transfer.o process_event_file_transfer_collection.o intjobstat_supp.o +MACHINE_LOBJS:=${MACHINE_OBJS:.o=.lo} PLUGIN_LIB=glite_lb_plugin.la -MACHINE_LIB=libglite_lb_statemachine.a +MACHINE_LIB=libglite_lb_statemachine.la XSD=lb-job-attrs2.xsd @@ -69,12 +71,27 @@ default all: compile compile: ${MACHINE_LIB} ${PLUGIN_LIB} ${XSD} +# In order to use libtool versioning correcty, we must have: +# +# current = major + minor + offset +# revision = patch +# age = minor +# +# where offset is a sum of maximal released minor's of all previous major's +# + +# counted minors: 1.0 +offset=0 +version_info:=-version-info ${shell \ + perl -e '$$,=":"; @F=split /\./,"${version}"; print $$F[0]+$$F[1]+${offset},$$F[2],$$F[1]' } + ${PLUGIN_LIB}: ${PLUGIN_LOBJS} ${SOLINK} -o $@ ${PLUGIN_LOBJS} ${PLUGIN_LIBS} ${MACHINE_LIB}: ${MACHINE_OBJS} - ar crv $@ ${MACHINE_OBJS} - -ranlib $@ + ${LINK} ${version_info} -o $@ ${MACHINE_LOBJS} +# ar crv $@ ${MACHINE_OBJS} +# -ranlib $@ doc: @@ -84,7 +101,7 @@ stage: compile install: -mkdir -p ${DESTDIR}${PREFIX}${prefix}/${libdir} ${DESTDIR}${PREFIX}${prefix}/interface ${DESTDIR}${PREFIX}${prefix}/include/glite/lb - install -m 644 ${MACHINE_LIB} ${DESTDIR}${PREFIX}${prefix}/${libdir} + ${INSTALL} -m 644 ${MACHINE_LIB} ${DESTDIR}${PREFIX}${prefix}/${libdir} ${INSTALL} -m 755 ${PLUGIN_LIB} ${DESTDIR}${PREFIX}${prefix}/${libdir} install -m 644 ${top_srcdir}/interface/lb-job-attrs.xsd ${DESTDIR}${PREFIX}${prefix}/interface install -m 644 lb-job-attrs2.xsd ${DESTDIR}${PREFIX}${prefix}/interface diff --git a/org.glite.lb.state-machine/project/.post b/org.glite.lb.state-machine/project/.post new file mode 100644 index 0000000..8b0c822 --- /dev/null +++ b/org.glite.lb.state-machine/project/.post @@ -0,0 +1 @@ +/sbin/ldconfig diff --git a/org.glite.lb.utils/configure b/org.glite.lb.utils/configure index a67786b..e2b3330 100755 --- a/org.glite.lb.utils/configure +++ b/org.glite.lb.utils/configure @@ -248,6 +248,10 @@ $externs{'mysql-server'}{prefix}=$externs{mysql}{prefix} if $externs{'mysql-serv $externs{'mysql-devel'}{prefix}=$externs{mysql}{prefix} if $externs{'mysql-devel'}{prefix} eq ''; $externs{'gsoapxx'}{prefix}=$externs{gsoap}{prefix} if $externs{'gsoapxx'}{prefix} eq ''; +$externs{'mysql-server'}{withprefix}=$externs{mysql}{withprefix} if $externs{'mysql-server'}{withprefix} eq ''; +$externs{'mysql-devel'}{wihtprefix}=$externs{mysql}{withprefix} if $externs{'mysql-devel'}{withprefix} eq ''; +$externs{'gsoapxx'}{withprefix}=$externs{gsoap}{withprefix} if $externs{'gsoapxx'}{withprefix} eq ''; + %project = %{$projects{$project}}; for $_ (keys %{$project{etics_externs}}) { $etics_externs{$_} = $project{etics_externs}{$_}; @@ -423,7 +427,9 @@ sub mode_build { open MAK,">Makefile" or die "Makefile: $!\n"; - print MAK "all: @modules\n\nclean check:\n"; + print MAK "all: @modules\n\n"; + print MAK "stage: ".(join '-stage ', @modules)."-stage\n\n"; + print MAK "clean check install:\n"; for (@modules) { my $full = full($_); @@ -446,11 +452,13 @@ sub mode_build { @ldeps{@{$deps{$_}}} = 1; for my $x (split /,/,$staged) { delete $ldeps{$x}; } my @dnames = $module ? () : keys %ldeps; + my $snames = $#dnames == -1 ? '' : join('-stage ', @dnames).'-stage'; my $full = full($_); my $build = $buildroot{$_}; print MAK "$_: @dnames\n\tcd $full/$build && \${MAKE} && \${MAKE} install\n\n"; + print MAK "$_-stage: $snames\n\tcd $full/$build && \${MAKE} && \${MAKE} stage\n\n"; } close MAK; @@ -523,7 +531,7 @@ BEGIN{ 'lb.doc' => [ qw/tetex-latex:B/ ], 'lb.logger' => [ qw/cppunit:B libtool:B/ ], 'lb.logger-msg' => [ qw/cppunit:B activemq libtool:B/ ], - 'lb.server' => [ qw/globus_essentials:R globus:B expat cares mysql:R mysql-server:R mysql-devel:B cppunit:B gsoap:B classads voms lcas gridsite bison:B libtool:B libxml2/ ], + 'lb.server' => [ qw/globus_essentials:R globus:B expat cares mysql:R mysql-server:R mysql-devel:B cppunit:B gsoap:B classads voms lcas gridsite bison:B libtool:B libxml2 flex:B/ ], 'lb.state-machine' => [ qw/classads libtool:B libxslt:B expat:B/ ], 'lb.utils' => [ qw/cppunit:B libtool:B/ ], 'lb.ws-interface' => [ qw/libxslt:B/ ], @@ -556,7 +564,7 @@ BEGIN{ 'gridsite.services' => [ qw/curl:R gsoap:R/ ], 'gridsite.service-clients' => [ qw/curl:R gsoap:R gsoapxx:R/ ], 'gridsite.gsexec' => [ qw// ], - 'px.proxyrenewal' => [ qw/globus:B globus_essentials:R myproxy-devel:B myproxy-libs:R voms libtool:R/ ], + 'px.proxyrenewal' => [ qw/globus:B globus_essentials:R myproxy-devel:B myproxy-libs:R voms libtool:B/ ], 'px.myproxy-config' => [ qw/myproxy-admin:R/ ], # in myproxy-config.spec ); @@ -716,10 +724,11 @@ for my $ext (keys %deps_aux) { ); %conflicts = ( - 'lb.glite-LB' => [ qq/emi-lb/ ], - 'px.glite-PX' => [ qq/emi-px/ ], - 'lb.emi-lb' => [ qq/glite-LB/ ], - 'px.emi-px' => [ qq/glite-PX/ ], +); + +%provides = ( + 'lbjp-common.gss' => [ qq/glite-security-gss/ ], + 'lbjp-common.gsoap-plugin' => [ qq/glite-security-gsoap-plugin/ ], ); %cvs_prefix = ( @@ -815,7 +824,6 @@ for my $ext (keys %deps_aux) { gridsite=>'emi.gridsite.shared', yaim_core=>'emi.yaim.yaim-core', yaim_bdii=>'emi.bdii.yaim-bdii', - gip_release=>'emi.bdii.glite-info-provider-release', gip_service=>'emi.bdii.glite-info-provider-service', bdii=>'emi.bdii.core', glite_version=>'emi.misc.glite-version', @@ -845,11 +853,11 @@ for my $ext (keys %deps_aux) { jdk=>'java-devel', }, etics_projects => { - 'emi'=>[qw/voms voms-devel gridsite lcas gip_release gip_service bdii glite_version glue_schema yaim_core yaim_bdii trustmanager trustmanager_axis/], + 'emi'=>[qw/voms voms-devel gridsite lcas gip_service bdii glite_version glue_schema yaim_core yaim_bdii trustmanager trustmanager_axis/], }, need_externs_aux => { 'lb.client-java' => [ qw/ant:B jdk:B axis:B trustmanager trustmanager_axis libtool:B/ ], - 'lb.glite-LB' => [ qw/fetchcrl:R gip_release:R gip_service:R bdii:R glite_version:R glue_schema:R/ ], + 'lb.glite-LB' => [ qw/fetchcrl:R gip_service:R bdii:R glite_version:R glue_schema:R/ ], 'lb.yaim' => [ qw/yaim_core:R yaim_bdii:R perl-LDAP:R/ ], 'px.glite-PX' => [qw/myproxy-server:R myproxy-admin:R fetchcrl:R gip_service:R bdii:R glite_version:R glue_schema:R/], 'px.myproxy-yaim' => [ qw/yaim_core:R yaim_bdii:R/ ], @@ -1129,18 +1137,18 @@ sub mode_etics { if ($project ne 'glite') { $flags = 'RELEASE_VERSION=${age}.${platformFamily} libdir=${libdir} GSOAPDIR=`pkg-config gsoap --variable=prefix` OPENSSL_GLOBUS_FLAGS=`pkg-config globus-openssl --cflags` OPENSSL_GLOBUS_LIBS=`pkg-config globus-openssl --libs` FLAVOR_GLOBUS_EXT= HTTPD_FLAGS="-I/usr/include/httpd -I/usr/include/apache2 -I/usr/include/apr-${aprSuffix} -I/usr/include/pcre"'; - $prefix = "prefix=${prefix}/usr"; + $prefix = 'prefix=${prefix}/usr'; } else { $flags = 'RELEASE_VERSION=${age}.${platformFamily} libdir=${libdir} GSOAPDIR=${gsoap.location} OPENSSL_GLOBUS_FLAGS=-I${globus.location}/include/${globus.dbg.nothr.flavor} OPENSSL_GLOBUS_LIBS=-L${globus.location}/${libdir}/ FLAVOR_GLOBUS_EXT=_${globus.dbg.nothr.flavor} HTTPD_FLAGS="-I${httpd-devel.location}/include/httpd -I${httpd-devel.location}/include/apache2 -I${httpd-devel.location}/include/apr-${aprSuffix} -I${httpd-devel.location}/include/pcre"'; - $prefix = "prefix=${prefix}"; + $prefix = 'prefix=${prefix}'; } $cmd{compile} = "echo 'make $flags' > build.sh\n\tmake $flags build"; $cmd{clean} = "rm -rvf build.sh; $cmd{clean}"; $cmd{install} = "make $prefix $flags install"; - $cmd{packaging} = "mkdir ${moduleDir}/src/tgz + $cmd{packaging} = "mkdir \${moduleDir}/RPMTMP/SOURCES \${moduleDir}/src/tgz make $prefix $flags rpm && \ - cp ${moduleDir}/RPMTMP/SOURCES/gridsite-${version}.src.tar.gz ${moduleDir}/src/tgz"; + cp \${moduleDir}/RPMTMP/SOURCES/gridsite-\${version}.src.tar.gz \${moduleDir}/src/tgz"; } else { $cmd{clean} = 'None'; @@ -1218,6 +1226,9 @@ $package_description$package_summary$defprops}; for (@{$conflicts{"$subsys.$module"}}) { print C "package.conflicts = $_\n"; } + for (@{$provides{"$subsys.$module"}}) { + print C "package.provides = $_\n"; + } for my $pp (keys %{$platform_properties{"$subsys.$module"}}) { next if $pp eq 'default'; diff --git a/org.glite.lb.utils/project/ChangeLog b/org.glite.lb.utils/project/ChangeLog index 8f04d6a..2cbcfb3 100644 --- a/org.glite.lb.utils/project/ChangeLog +++ b/org.glite.lb.utils/project/ChangeLog @@ -51,6 +51,11 @@ 2.0.8-4 - Module rebuilt +2.0.9-1 +- Essential checking of temporal arguments to glite-lb-dump for validity +- Support for special date values (now, last dump start/end) in glite-lb-dump +- Proper handling of background purge error messages (fix for bug #77974) + 2.1.0-1 - Fixes for parallel release in EMI & gLite - Check result of InitContext calls @@ -84,3 +89,8 @@ - at3 location detection reverted - '--stage=/' behaviour fixed in configure +2.1.4-1 +> - Essential checking of temporal arguments to glite-lb-dump for validity +> - Support for special date values (now, last dump start/end) in glite-lb-dump +> - Proper handling of background purge error messages (fix for bug #77974) + diff --git a/org.glite.lb.utils/project/version.properties b/org.glite.lb.utils/project/version.properties index ed1fb08..6e8c734 100755 --- a/org.glite.lb.utils/project/version.properties +++ b/org.glite.lb.utils/project/version.properties @@ -1,3 +1,3 @@ # $Header$ -module.version=2.1.3 +module.version=2.1.4 module.age=1 diff --git a/org.glite.lb.utils/src/dump.c b/org.glite.lb.utils/src/dump.c index 57d34ad..5bcfb01 100644 --- a/org.glite.lb.utils/src/dump.c +++ b/org.glite.lb.utils/src/dump.c @@ -58,15 +58,32 @@ static struct option opts[] = { static void usage(char *me) { fprintf(stderr,"usage: %s [option]\n" - " -f, --from YYYYMMDDHHmmss beginning of the time interval for events to be dumped\n" - " -t, --to YYYYMMDDHHmmss end of the time interval for events to be dumped\n" + " -f, --from YYYYMMDDHHmmss beginning of the time interval for events to be dumped*\n" + " -t, --to YYYYMMDDHHmmss end of the time interval for events to be dumped*\n" " -h, --help display this help\n" " -v, --version display version\n" " -d, --debug diagnostic output\n" - " -m, --server L&B server machine name\n", + " -m, --server L&B server machine name\n\n" + " * Special values for temporal arguments '-f' and '-t':\n" + " 'now' this exact moment\n" + " 'last_start' last dump starting time\n" + " 'last_end' last dump ending time\n", me); } +double ParseDate(const char *s) { + if (!strcmp(s,"now")) return EDG_WLL_DUMP_NOW; + if (!strcmp(s,"last_start")) return EDG_WLL_DUMP_LAST_START; + if (!strcmp(s,"last_end")) return EDG_WLL_DUMP_LAST_END; + + if(strlen(s)<14) return -16; + + int i; + for (i = 0; i<14; i++) if((s[i]<'0')||(s[i]>'9')) return -16; + + return edg_wll_ULMDateToDouble(s); +} + int main(int argc,char *argv[]) { edg_wll_DumpRequest *request; @@ -76,7 +93,7 @@ int main(int argc,char *argv[]) char *me; int opt; - edg_wll_Context ctx; + edg_wll_Context ctx = NULL; /* initialize request to server defaults */ request = (edg_wll_DumpRequest *) calloc(1,sizeof(edg_wll_DumpRequest)); @@ -94,8 +111,8 @@ int main(int argc,char *argv[]) switch (opt) { - case 'f': request->from = (time_t) edg_wll_ULMDateToDouble(optarg); break; - case 't': request->to = (time_t) edg_wll_ULMDateToDouble(optarg); break; + case 'f': request->from = (time_t) ParseDate(optarg); break; + case 't': request->to = (time_t) ParseDate(optarg); break; case 'm': server = optarg; break; case 'd': debug = 1; break; case 'v': fprintf(stdout,"%s:\t%s\n",me,rcsid); exit(0); @@ -104,6 +121,13 @@ int main(int argc,char *argv[]) } } + if(request->from < -15) { + fprintf(stdout, "Invalid 'from' date\n"); + goto main_end; } + if(request->to < -15) { + fprintf(stdout, "Invalid 'to' date\n"); + goto main_end; } + /* check request */ if (debug) { printf("Dump request:\n"); diff --git a/org.glite.lb.utils/src/purge.c b/org.glite.lb.utils/src/purge.c index f8884b8..2cce1d5 100644 --- a/org.glite.lb.utils/src/purge.c +++ b/org.glite.lb.utils/src/purge.c @@ -108,7 +108,7 @@ int main(int argc,char *argv[]) { edg_wll_PurgeRequest *request; edg_wll_PurgeResult *result; - int i, timeout, background; + int i, timeout, background, err = 1; char *server = NULL; char *me; @@ -288,15 +288,19 @@ int main(int argc,char *argv[]) /* that is the Purge */ dprintf(("Running the edg_wll_Purge...\n")); - if (edg_wll_Purge(ctx, request, result) != 0) { - fprintf(stderr,"Error running the edg_wll_Purge().\n"); + if ((err = edg_wll_Purge(ctx, request, result)) != 0) { + if (err == EDG_WLL_ERROR_ACCEPTED_OK) err = 0; + else fprintf(stderr,"Error running the edg_wll_Purge().\n"); printerr(ctx); + switch ( edg_wll_Error(ctx, NULL, NULL) ) { case ENOENT: case EPERM: case EINVAL: break; + case EDG_WLL_ERROR_ACCEPTED_OK: + /* fall-through */ default: goto main_end; } @@ -329,7 +333,7 @@ main_end: } if (result) free(result); edg_wll_FreeContext(ctx); - return 0; + return err != 0; } diff --git a/org.glite.lb.yaim/config/functions/config_glite_lb.in b/org.glite.lb.yaim/config/functions/config_glite_lb.in index d267f56..8a02c45 100644 --- a/org.glite.lb.yaim/config/functions/config_glite_lb.in +++ b/org.glite.lb.yaim/config/functions/config_glite_lb.in @@ -113,6 +113,7 @@ EOF eval value=\"$`echo GLITE_LB_AUTHZ_$section`\" case "$section" in ADMIN_ACCESS) value="$value,$superusers" ;; + GET_STATISTICS) value="$value,$wms" ;; READ_ALL) value="$value,$wms,$rtm" ;; PURGE) value="$value,$wms" ;; LOG_WMS_EVENTS) value="$value,$wms" ;; @@ -304,6 +305,7 @@ EOF # Create cron for purging mkdir -p /var/log/glite + chown $GLITE_USER:$GLITE_USER /var/log/glite logfile=/var/log/glite/glite-lb-purger.log if $LB_PURGE --help 2>&1 | grep 'target-runtime' > /dev/null; then purge_target_runtime_cmd='export GLITE_LB_PURGE_TARGET_RUNTIME=84600s; ' diff --git a/org.glite.lb.yaim/config/functions/emi/config_info_service_lb b/org.glite.lb.yaim/config/functions/emi/config_info_service_lb index 1af4162..33c62b1 100644 --- a/org.glite.lb.yaim/config/functions/emi/config_info_service_lb +++ b/org.glite.lb.yaim/config/functions/emi/config_info_service_lb @@ -72,6 +72,9 @@ if [ $? != 0 ]; then yaimlog ERROR "Copying glue2 service template failed" exit 1 fi +# workaround SB #85209 ($GLITE_LOCATION/etc in provider scripts) +sed -i 's/\$GLITE_LOCATION//' ${INFO_SERVICE_CONFIG}/glite-info-service-${SERVICE_LC}.conf +sed -i 's/\$GLITE_LOCATION//' ${INFO_SERVICE_CONFIG}/glite-info-glue2-${SERVICE_LC}.conf # Note: the configuration file may need to be altered if non standard values have been used. diff --git a/org.glite.lb.yaim/configure b/org.glite.lb.yaim/configure index a67786b..2e34da2 100644 --- a/org.glite.lb.yaim/configure +++ b/org.glite.lb.yaim/configure @@ -154,14 +154,6 @@ my %externs = ( prefix=>'/opt/activemq-cpp-library', pkg => 'activemq-cpp' }, - apr => { - prefix=>'/opt/apr', - pkg => 'apr-1' - }, - aprutil => { - prefix=>'/opt/apr-util', - pkg => 'apr-util-1' - }, ); my %jar = ( @@ -248,10 +240,18 @@ $externs{'mysql-server'}{prefix}=$externs{mysql}{prefix} if $externs{'mysql-serv $externs{'mysql-devel'}{prefix}=$externs{mysql}{prefix} if $externs{'mysql-devel'}{prefix} eq ''; $externs{'gsoapxx'}{prefix}=$externs{gsoap}{prefix} if $externs{'gsoapxx'}{prefix} eq ''; +$externs{'mysql-server'}{withprefix}=$externs{mysql}{withprefix} if $externs{'mysql-server'}{withprefix} eq ''; +$externs{'mysql-devel'}{wihtprefix}=$externs{mysql}{withprefix} if $externs{'mysql-devel'}{withprefix} eq ''; +$externs{'gsoapxx'}{withprefix}=$externs{gsoap}{withprefix} if $externs{'gsoapxx'}{withprefix} eq ''; + %project = %{$projects{$project}}; -for $_ (keys %{$project{etics_externs}}) { - $etics_externs{$_} = $project{etics_externs}{$_}; +for my $platform (keys %{$project{etics_externs}}) { + for $_ (keys %{$project{etics_externs}{$platform}}) { + $etics_externs{$platform}{$_} = $project{etics_externs}{$platform}{$_}; + } } +reshuffle_platforms(\%etics_externs, $project{supported_platforms}); +reshuffle_platforms(\%{$project{etics_externs_devel}}, $project{supported_platforms}); for $_ (keys %{$project{etics_projects}}) { $etics_projects{$_} = $project{etics_projects}{$_}; } @@ -423,7 +423,9 @@ sub mode_build { open MAK,">Makefile" or die "Makefile: $!\n"; - print MAK "all: @modules\n\nclean check:\n"; + print MAK "all: @modules\n\n"; + print MAK "stage: ".(join '-stage ', @modules)."-stage\n\n"; + print MAK "clean check install:\n"; for (@modules) { my $full = full($_); @@ -446,11 +448,13 @@ sub mode_build { @ldeps{@{$deps{$_}}} = 1; for my $x (split /,/,$staged) { delete $ldeps{$x}; } my @dnames = $module ? () : keys %ldeps; + my $snames = $#dnames == -1 ? '' : join('-stage ', @dnames).'-stage'; my $full = full($_); my $build = $buildroot{$_}; print MAK "$_: @dnames\n\tcd $full/$build && \${MAKE} && \${MAKE} install\n\n"; + print MAK "$_-stage: $snames\n\tcd $full/$build && \${MAKE} && \${MAKE} stage\n\n"; } close MAK; @@ -500,18 +504,18 @@ sub mode_checkout() { BEGIN{ %etics_externs = ( - 'myproxy-devel'=>'myproxy-devel', - 'myproxy-libs'=>'myproxy-libs', - 'myproxy-server'=>'myproxy-server', - 'myproxy-admin'=>'myproxy-admin', - cares=>'c-ares', - voms=>'org.glite.security.voms-api-cpp', - utiljava=>'org.glite.security.util-java', - gpt=>'gpt', - fetchcrl=>'fetch-crl', - activemq=>'activemq-cpp-library', - apr=>'apr-dev', - aprutil=>'aprutil-dev', + default => { + 'myproxy-devel'=>'myproxy-devel', + 'myproxy-libs'=>'myproxy-libs', + 'myproxy-server'=>'myproxy-server', + 'myproxy-admin'=>'myproxy-admin', + cares=>'c-ares', + voms=>'org.glite.security.voms-api-cpp', + utiljava=>'org.glite.security.util-java', + gpt=>'gpt', + fetchcrl=>'fetch-crl', + activemq=>'activemq-cpp-library', + }, ); %etics_projects = ( @@ -523,7 +527,7 @@ BEGIN{ 'lb.doc' => [ qw/tetex-latex:B/ ], 'lb.logger' => [ qw/cppunit:B libtool:B/ ], 'lb.logger-msg' => [ qw/cppunit:B activemq libtool:B/ ], - 'lb.server' => [ qw/globus_essentials:R globus:B expat cares mysql:R mysql-server:R mysql-devel:B cppunit:B gsoap:B classads voms lcas gridsite bison:B libtool:B libxml2/ ], + 'lb.server' => [ qw/globus_essentials:R globus:B expat cares mysql:R mysql-server:R mysql-devel:B cppunit:B gsoap:B classads voms lcas gridsite bison:B libtool:B libxml2 flex:B/ ], 'lb.state-machine' => [ qw/classads libtool:B libxslt:B expat:B/ ], 'lb.utils' => [ qw/cppunit:B libtool:B/ ], 'lb.ws-interface' => [ qw/libxslt:B/ ], @@ -556,7 +560,7 @@ BEGIN{ 'gridsite.services' => [ qw/curl:R gsoap:R/ ], 'gridsite.service-clients' => [ qw/curl:R gsoap:R gsoapxx:R/ ], 'gridsite.gsexec' => [ qw// ], - 'px.proxyrenewal' => [ qw/globus:B globus_essentials:R myproxy-devel:B myproxy-libs:R voms libtool:R/ ], + 'px.proxyrenewal' => [ qw/globus:B globus_essentials:R myproxy-devel:B myproxy-libs:R voms libtool:B/ ], 'px.myproxy-config' => [ qw/myproxy-admin:R/ ], # in myproxy-config.spec ); @@ -716,10 +720,11 @@ for my $ext (keys %deps_aux) { ); %conflicts = ( - 'lb.glite-LB' => [ qq/emi-lb/ ], - 'px.glite-PX' => [ qq/emi-px/ ], - 'lb.emi-lb' => [ qq/glite-LB/ ], - 'px.emi-px' => [ qq/glite-PX/ ], +); + +%provides = ( + 'lbjp-common.gss' => [ qq/glite-security-gss/ ], + 'lbjp-common.gsoap-plugin' => [ qq/glite-security-gsoap-plugin/ ], ); %cvs_prefix = ( @@ -749,6 +754,7 @@ for my $ext (keys %deps_aux) { # (${NAME.location}, ETICS conf. dependencies) # etics_projects ....... ETICS project names of externals # etics_externs_devel .. ETICS modules names of devel versions of externals +# etics_locations ...... ETICS locations in ${NAME.location} properties # need_externs_aux ..... project-specific external dependencies # supported_platforms .. platforms supported by the project # modules .............. additional modules in subsystems @@ -760,29 +766,37 @@ for my $ext (keys %deps_aux) { flavours => '--thrflavour=${globus.thr.flavor} --nothrflavour=${globus.nothr.flavor}', local_prefix => '', etics_externs => { - globus_essentials=>'vdt_globus_essentials', - globus=>'globus', - gridsite=>'org.gridsite.shared', - yaim_core=>'org.glite.yaim.core', - gip_release=>'glite-info-provider-release', - gip_service=>'glite-info-provider-service', - bdii=>'bdii', - glite_version=>'glite-version', - glite_info_templates=>'glite-info-templates', - glue_schema=>'glue-schema', - trustmanager=>'org.glite.security.trustmanager', - axis=>'axis', - lcas=>'org.glite.security.lcas', - gsoapxx=>'-', - build_common_cpp=>'org.glite.build.common-cpp', + default => { + globus_essentials=>'vdt_globus_essentials', + globus=>'globus', + gridsite=>'org.gridsite.shared', + yaim_core=>'org.glite.yaim.core', + gip_release=>'glite-info-provider-release', + gip_service=>'glite-info-provider-service', + bdii=>'bdii', + glite_version=>'glite-version', + glite_info_templates=>'glite-info-templates', + glue_schema=>'glue-schema', + trustmanager=>'org.glite.security.trustmanager', + axis=>'axis', + lcas=>'org.glite.security.lcas', + gsoapxx=>'-', + build_common_cpp=>'org.glite.build.common-cpp', + jdk=>'jdk', + }, }, etics_externs_devel => { - gridsite=>'org.gridsite.devel', + default => { + gridsite=>'org.gridsite.devel', + }, }, etics_projects => { vdt=>[qw/globus globus_essentials gpt/], 'org.glite'=>[qw/voms gridsite lcas gip_release gip_service bdii glite_version glite_info_templates glue_schema yaim_core/], }, + etics_locations => { + '*' => '', + }, need_externs_aux => { 'lb.client-java' => [ qw/ant:B jdk:B axis:B trustmanager utiljava libtool:B/ ], 'lb.glite-LB' => [ qw/fetchcrl:R gpt:R gip_release:R gip_service:R bdii:R glite_version:R glite_info_templates:R glue_schema:R/ ], @@ -790,10 +804,18 @@ for my $ext (keys %deps_aux) { 'px.glite-PX' => [qw/myproxy-server:R myproxy-admin:R fetchcrl:R gip_service:R bdii:R glite_version:R gpt:R glue_schema:R/], 'px.myproxy-yaim' => [ qw/yaim_core:R/ ], }, + supported_platforms => { + sl5_x86_64_gcc412 => 1, + sl5_ia32_gcc412 => 1, + deb5_x86_64_gcc432 => 1, + deb5_ia32_gcc432 => 1, + slc4_x86_64_gcc346 => 1, + slc4_ia32_gcc346 => 1, + }, modules => { 'lb' => [ qw/glite-LB/ ], 'px' => [ qw/glite-PX/ ], - } + }, }, emi => { @@ -810,46 +832,55 @@ for my $ext (keys %deps_aux) { flavours => '--thrflavour= --nothrflavour=', local_prefix => '/usr', etics_externs => { - globus_essentials=>'globus-gssapi-gsi', - globus=>'globus-gssapi-gsi-devel', - gridsite=>'emi.gridsite.shared', - yaim_core=>'emi.yaim.yaim-core', - yaim_bdii=>'emi.bdii.yaim-bdii', - gip_release=>'emi.bdii.glite-info-provider-release', - gip_service=>'emi.bdii.glite-info-provider-service', - bdii=>'emi.bdii.core', - glite_version=>'emi.misc.glite-version', - glue_schema=>'emi.bdii.glue-schema', - trustmanager=>'emi.java-security.trustmanager', - trustmanager_axis=>'emi.java-security.trustmanager-axis', - axis=>'axis1.4', - lcas=>'emi.sac.lcas', - gsoapxx=>'-', - build_common_cpp=>'emi.misc.glite.build-common-cpp', - jdk=>'java', + default => { + globus_essentials=>'globus-gssapi-gsi', + globus=>'globus-gssapi-gsi-devel', + gridsite=>'emi.gridsite.shared', + yaim_core=>'emi.yaim.yaim-core', + yaim_bdii=>'emi.bdii.yaim-bdii', + gip_service=>'emi.bdii.glite-info-provider-service', + bdii=>'emi.bdii.core', + glite_version=>'emi.misc.glite-version', + glue_schema=>'emi.bdii.glue-schema', + trustmanager=>'emi.java-security.trustmanager', + trustmanager_axis=>'emi.java-security.trustmanager-axis', + axis=>'axis1.4', + lcas=>'emi.sac.lcas', + gsoapxx=>'-', + build_common_cpp=>'emi.misc.glite.build-common-cpp', + jdk=>'java', + }, + sl5_x86_64_gcc412EPEL => { + 'myproxy-devel' => 'myproxy-devel.x86_64', + }, }, etics_externs_devel => { - cares => 'c-ares-devel', - classads => 'classads-devel', - cppunit => 'cppunit-devel', - expat => 'expat-devel', - gsoap => 'gsoap-devel', - voms => 'org.glite.security.voms-api', - libtar => 'libtar-devel', - log4c => 'log4c-devel', - postgresql => 'postgresql-devel', - curl => 'curl-devel', - libxml2 => 'libxml2-devel', - openssl => 'openssl-devel', - gridsite=>'emi.gridsite.devel', - jdk=>'java-devel', + default => { + cares => 'c-ares-devel', + classads => 'classads-devel', + cppunit => 'cppunit-devel', + expat => 'expat-devel', + gsoap => 'gsoap-devel', + voms => 'org.glite.security.voms-api', + libtar => 'libtar-devel', + log4c => 'log4c-devel', + postgresql => 'postgresql-devel', + curl => 'curl-devel', + libxml2 => 'libxml2-devel', + openssl => 'openssl-devel', + gridsite=>'emi.gridsite.devel', + jdk=>'java-devel', + }, }, etics_projects => { - 'emi'=>[qw/voms voms-devel gridsite lcas gip_release gip_service bdii glite_version glue_schema yaim_core yaim_bdii trustmanager trustmanager_axis/], + 'emi'=>[qw/voms voms-devel gridsite lcas gip_service bdii glite_version glue_schema yaim_core yaim_bdii trustmanager trustmanager_axis/], + }, + etics_locations => { + axis => 'axis', }, need_externs_aux => { 'lb.client-java' => [ qw/ant:B jdk:B axis:B trustmanager trustmanager_axis libtool:B/ ], - 'lb.glite-LB' => [ qw/fetchcrl:R gip_release:R gip_service:R bdii:R glite_version:R glue_schema:R/ ], + 'lb.glite-LB' => [ qw/fetchcrl:R gip_service:R bdii:R glite_version:R glue_schema:R/ ], 'lb.yaim' => [ qw/yaim_core:R yaim_bdii:R perl-LDAP:R/ ], 'px.glite-PX' => [qw/myproxy-server:R myproxy-admin:R fetchcrl:R gip_service:R bdii:R glite_version:R glue_schema:R/], 'px.myproxy-yaim' => [ qw/yaim_core:R yaim_bdii:R/ ], @@ -861,7 +892,7 @@ for my $ext (keys %deps_aux) { modules => { 'lb' => [ qw/emi-lb/ ], 'px' => [ qw/emi-px/ ], - } + }, }, ); @@ -1033,28 +1064,30 @@ sub mode_etics { close V; } + # XXX: --with ignored for platform-dependend packages my @copts = (); my %ge; @ge{@{$etics_projects{$project{etics_name}}}} = (1) x ($#{$etics_projects{$project{etics_name}}}+1); for (@{$need_externs{"$subsys.$module"}}) { if ($need_externs_type{"$subsys.$module"}->{$_}=~/B/ and (defined $externs{$_} or defined $jar{$_})) { - my $eext = $etics_externs{$_} ? $etics_externs{$_} : $_; + my $eext = $etics_externs{default}{$_} ? $etics_externs{default}{$_} : $_; next if ($eext eq '-'); - if ($project ne 'glite') { + if (defined $project{etics_locations}{'*'} or defined $project{etics_locations}{$_}) { + $eext = $project{etics_locations}{$_} if ($project{etics_locations}{$_}); + push @copts,$ge{$_} ? "--with-$_=\${stageDir}" : "--with-$_=\${$eext.location}"; + } else { if ($ge{$_} and not defined $externs{$_}{pkg}) { push @copts, "--with-$_=\${stageDir}"; } - } else { - push @copts,$ge{$_} ? "--with-$_=\${stageDir}" : "--with-$_=\${$eext.location}"; } } } for (@{$need_jars{"$subsys.$module"}}) { - my $eext = $etics_externs{$_} ? $etics_externs{$_} : $_; + my $eext = $etics_externs{default}{$_} ? $etics_externs{default}{$_} : $_; - push @copts,"--with-$_ \${$eext.location}$jar{$_}" if ($project eq 'glite'); + push @copts,"--with-$_ \${$eext.location}$jar{$_}" if (defined $project{etics_locations}{'*'} or defined $project{etics_locations}{$_}); } my $conf; @@ -1129,18 +1162,18 @@ sub mode_etics { if ($project ne 'glite') { $flags = 'RELEASE_VERSION=${age}.${platformFamily} libdir=${libdir} GSOAPDIR=`pkg-config gsoap --variable=prefix` OPENSSL_GLOBUS_FLAGS=`pkg-config globus-openssl --cflags` OPENSSL_GLOBUS_LIBS=`pkg-config globus-openssl --libs` FLAVOR_GLOBUS_EXT= HTTPD_FLAGS="-I/usr/include/httpd -I/usr/include/apache2 -I/usr/include/apr-${aprSuffix} -I/usr/include/pcre"'; - $prefix = "prefix=${prefix}/usr"; + $prefix = 'prefix=${prefix}/usr'; } else { $flags = 'RELEASE_VERSION=${age}.${platformFamily} libdir=${libdir} GSOAPDIR=${gsoap.location} OPENSSL_GLOBUS_FLAGS=-I${globus.location}/include/${globus.dbg.nothr.flavor} OPENSSL_GLOBUS_LIBS=-L${globus.location}/${libdir}/ FLAVOR_GLOBUS_EXT=_${globus.dbg.nothr.flavor} HTTPD_FLAGS="-I${httpd-devel.location}/include/httpd -I${httpd-devel.location}/include/apache2 -I${httpd-devel.location}/include/apr-${aprSuffix} -I${httpd-devel.location}/include/pcre"'; - $prefix = "prefix=${prefix}"; + $prefix = 'prefix=${prefix}'; } $cmd{compile} = "echo 'make $flags' > build.sh\n\tmake $flags build"; $cmd{clean} = "rm -rvf build.sh; $cmd{clean}"; $cmd{install} = "make $prefix $flags install"; - $cmd{packaging} = "mkdir ${moduleDir}/src/tgz + $cmd{packaging} = "mkdir \${moduleDir}/RPMTMP/SOURCES \${moduleDir}/src/tgz make $prefix $flags rpm && \ - cp ${moduleDir}/RPMTMP/SOURCES/gridsite-${version}.src.tar.gz ${moduleDir}/src/tgz"; + cp \${moduleDir}/RPMTMP/SOURCES/gridsite-\${version}.src.tar.gz \${moduleDir}/src/tgz"; } else { $cmd{clean} = 'None'; @@ -1157,6 +1190,10 @@ sub mode_etics { $cmd{compile} = 'make'; $cmd{test} = 'make check'; $cmd{install} = 'make install'; + if ($subsys eq 'lb' and $module eq 'client') { + $cmd{compile} = "make rpath=$project{local_prefix}/\${libdir}"; + $cmd{install} = "make install post-install rpath=$project{local_prefix}/\${libdir}"; + } } my $defprops = ''; @@ -1218,6 +1255,9 @@ $package_description$package_summary$defprops}; for (@{$conflicts{"$subsys.$module"}}) { print C "package.conflicts = $_\n"; } + for (@{$provides{"$subsys.$module"}}) { + print C "package.provides = $_\n"; + } for my $pp (keys %{$platform_properties{"$subsys.$module"}}) { next if $pp eq 'default'; @@ -1233,36 +1273,59 @@ package.SRPMSLocation = \${moduleDir}/RPMTMP/SRPMS\n"; print C "$package_description$package_summary\n"; } - print C qq{ -[Platform-default:DynamicDependency] + for my $platform ('default', keys %{$project{supported_platforms}}) { + my $used = 0; + + for (@{$need_externs{"$subsys.$module"}},@{$need_jars{"$subsys.$module"}}) { + my $eext = $etics_externs{$platform}{$_} ? $etics_externs{$platform}{$_} : $_; + my $edev = $project{etics_externs_devel}{$platform}{$_}; + next if ($eext eq '-'); + # dependencies not listed in etics_externs only for + # default platform + if (not defined $etics_externs{$platform}{$_} and + $platform ne 'default') { +#print "skipping $_ on $platform\n"; + next; + } + + if (not $used) { + print C qq{ +[Platform-$platform:DynamicDependency] }; - for (@{$need_externs{"$subsys.$module"}},@{$need_jars{"$subsys.$module"}}) { - my $eext = $etics_externs{$_} ? $etics_externs{$_} : $_; - my $edev = $project{etics_externs_devel}{$_}; - next if ($eext eq '-'); + $used = 1; + } - my $proj = 'externals'; - for my $p (keys %etics_projects) { - for $m (@{$etics_projects{$p}}) { - $proj = $p if $m eq $_; + my $proj = 'externals'; + for my $p (keys %etics_projects) { + for $m (@{$etics_projects{$p}}) { + $proj = $p if $m eq $_; + } } - } - my $type = $need_externs_type{"$subsys.$module"}->{$_}; + my $type = $need_externs_type{"$subsys.$module"}->{$_}; - if ($edev) { - if ($type eq 'B') { - $eext = $edev; # no runtime - change to devel pkg - } elsif ($type eq 'BR' or $type eq 'RB') { - print C "$proj|$edev = B\n"; # additional devel pkg + if ($edev) { + if ($type eq 'B') { + $eext = $edev; # no runtime - change to devel pkg + } elsif ($type eq 'BR' or $type eq 'RB') { + print C "$proj|$edev = B\n"; # additional devel pkg + } } + print C "$proj|$eext = $type\n"; } - print C "$proj|$eext = $type\n"; - } - for (@{$deps{"$subsys.$module"}}) { - my $type = $deps_type{"$subsys.$module"}->{$_}; - print C "$project{etics_name}|$project{etics_name}.$_ = $type\n"; + if ($platform eq 'default') { + for (@{$deps{"$subsys.$module"}}) { + my $type = $deps_type{"$subsys.$module"}->{$_}; + if (not $used) { + print C qq{ +[Platform-$platform:DynamicDependency] +}; + $used = 1; + } + print C "$project{etics_name}|$project{etics_name}.$_ = $type\n"; + } + } } close C; @@ -1333,6 +1396,37 @@ sub getlibdir { return $libdir; } +sub reshuffle_platforms($$) { + my ($data, $platforms) = @_; + my ($platform, %blacklist, $value); + + return if not $platforms; + + for $platform (keys %$data) { +#print "plat: $platform: $data->{$platform}\n"; + next if $platform eq 'default'; + for $_ (keys %{$data->{$platform}}) { +#print " blacklist: $_ = $data->{$platform}{$_}\n"; + $blacklist{$_} = 1; + } + } + + for $_ (keys %blacklist) { + if (defined $data->{default}{$_}) { + $value = $data->{default}{$_}; + $data->{default}{$_} = '-'; +#print " deleted $_ from default\n"; + for $platform (keys %$platforms) { + next if $platform eq 'default'; + if (not defined $data->{$platform}{$_}) { + $data->{$platform}{$_} = $value; +#print " added $value to $platform\n" + } + } + } + } +} + sub usage { my @ext = keys %externs; my @myjars = keys %jar; diff --git a/org.glite.lb.yaim/project/ChangeLog b/org.glite.lb.yaim/project/ChangeLog index abb5904..d55b926 100644 --- a/org.glite.lb.yaim/project/ChangeLog +++ b/org.glite.lb.yaim/project/ChangeLog @@ -69,3 +69,12 @@ 4.3.7-2 - Module rebuilt +4.3.8-1 +- Support for GLITE_LB_WMS_DN and GLITE_LB_AUTHZ_* yaim parameters +- Fix locations in automatic purge (SB #81646) +- Make directory with the logs writable (automatic purge runs under glite user) + +4.3.9-1 +- Added missing support for GET_STATISTICS auth section +- Access to statistics granted to WMS_DN by yaim. + diff --git a/org.glite.lb.yaim/project/version.properties b/org.glite.lb.yaim/project/version.properties index 98f5e3d..2127a2b 100644 --- a/org.glite.lb.yaim/project/version.properties +++ b/org.glite.lb.yaim/project/version.properties @@ -1,3 +1,3 @@ # $Header$ -module.version=4.3.7 -module.age=2 +module.version=4.3.9 +module.age=1 diff --git a/org.glite.lb/configure b/org.glite.lb/configure index 0e0c292..b6f37e5 100755 --- a/org.glite.lb/configure +++ b/org.glite.lb/configure @@ -24,6 +24,7 @@ # use Getopt::Long; +use POSIX qw(locale_h strftime); my $pwd = `pwd`; chomp $pwd; my $prefix = '/usr'; @@ -52,7 +53,7 @@ my (%projects, %project); my $debug = 0; my $pkg_config_env = (defined $ENV{PKG_CONFIG_PATH}) ? "$ENV{PKG_CONFIG_PATH}:" : ''; -my @nodes = qw/client server logger logger-msg utils client-java doc ws-test db jpprimary jpindex jpclient harvester lb px proxyrenewal/; +my @nodes = qw/client server logger logger-msg nagios utils client-java doc ws-test db jpprimary jpindex jpclient harvester lb px proxyrenewal/; my @default_nodes = qw/lb px proxyrenewal/; my %enable_nodes; my %disable_nodes; @@ -154,14 +155,6 @@ my %externs = ( prefix=>'/opt/activemq-cpp-library', pkg => 'activemq-cpp' }, - apr => { - prefix=>'/opt/apr', - pkg => 'apr-1' - }, - aprutil => { - prefix=>'/opt/apr-util', - pkg => 'apr-util-1' - }, ); my %jar = ( @@ -187,7 +180,7 @@ my (%etics_externs, %etics_projects); # additional modules from $project{modules} are automatically added # my %lbmodules = ( - 'lb' => [ qw/client client-java common doc logger server state-machine types utils ws-interface ws-test harvester yaim logger-msg/], + 'lb' => [ qw/client client-java common doc logger server state-machine types utils ws-interface ws-test harvester yaim logger-msg nagios/], 'lbjp-common' => [qw/db log maildir server-bones trio jp-interface gss gsoap-plugin/], 'jobid' => [qw/api-c api-cpp api-java/], 'jp' => [ qw/client doc index primary server-common ws-interface/ ], @@ -248,10 +241,18 @@ $externs{'mysql-server'}{prefix}=$externs{mysql}{prefix} if $externs{'mysql-serv $externs{'mysql-devel'}{prefix}=$externs{mysql}{prefix} if $externs{'mysql-devel'}{prefix} eq ''; $externs{'gsoapxx'}{prefix}=$externs{gsoap}{prefix} if $externs{'gsoapxx'}{prefix} eq ''; +$externs{'mysql-server'}{withprefix}=$externs{mysql}{withprefix} if $externs{'mysql-server'}{withprefix} eq ''; +$externs{'mysql-devel'}{wihtprefix}=$externs{mysql}{withprefix} if $externs{'mysql-devel'}{withprefix} eq ''; +$externs{'gsoapxx'}{withprefix}=$externs{gsoap}{withprefix} if $externs{'gsoapxx'}{withprefix} eq ''; + %project = %{$projects{$project}}; -for $_ (keys %{$project{etics_externs}}) { - $etics_externs{$_} = $project{etics_externs}{$_}; +for my $platform (keys %{$project{etics_externs}}) { + for $_ (keys %{$project{etics_externs}{$platform}}) { + $etics_externs{$platform}{$_} = $project{etics_externs}{$platform}{$_}; + } } +reshuffle_platforms(\%etics_externs, $project{supported_platforms}); +reshuffle_platforms(\%{$project{etics_externs_devel}}, $project{supported_platforms}); for $_ (keys %{$project{etics_projects}}) { $etics_projects{$_} = $project{etics_projects}{$_}; } @@ -504,18 +505,18 @@ sub mode_checkout() { BEGIN{ %etics_externs = ( - 'myproxy-devel'=>'myproxy-devel', - 'myproxy-libs'=>'myproxy-libs', - 'myproxy-server'=>'myproxy-server', - 'myproxy-admin'=>'myproxy-admin', - cares=>'c-ares', - voms=>'org.glite.security.voms-api-cpp', - utiljava=>'org.glite.security.util-java', - gpt=>'gpt', - fetchcrl=>'fetch-crl', - activemq=>'activemq-cpp-library', - apr=>'apr-dev', - aprutil=>'aprutil-dev', + default => { + 'myproxy-devel'=>'myproxy-devel', + 'myproxy-libs'=>'myproxy-libs', + 'myproxy-server'=>'myproxy-server', + 'myproxy-admin'=>'myproxy-admin', + cares=>'c-ares', + voms=>'org.glite.security.voms-api-cpp', + utiljava=>'org.glite.security.util-java', + gpt=>'gpt', + fetchcrl=>'fetch-crl', + activemq=>'activemq-cpp-library', + }, ); %etics_projects = ( @@ -527,6 +528,7 @@ BEGIN{ 'lb.doc' => [ qw/tetex-latex:B/ ], 'lb.logger' => [ qw/cppunit:B libtool:B/ ], 'lb.logger-msg' => [ qw/cppunit:B activemq libtool:B/ ], + 'lb.nagios' => [ qw/globus_proxy_utils:R/ ], 'lb.server' => [ qw/globus_essentials:R globus:B expat cares mysql:R mysql-server:R mysql-devel:B cppunit:B gsoap:B classads voms lcas gridsite bison:B libtool:B libxml2 flex:B/ ], 'lb.state-machine' => [ qw/classads libtool:B libxslt:B expat:B/ ], 'lb.utils' => [ qw/cppunit:B libtool:B/ ], @@ -551,15 +553,16 @@ BEGIN{ 'jp.primary' => [ qw/classads gsoap libtar globus_essentials:R globus:B/ ], 'jp.server-common' => [], 'jp.ws-interface' => [], - 'gridsite.core' => [ qw/httpd-devel:B gsoap:B globus:B curl:B doxygen:B fuse-devel:B libxml2 openssl:B build_common_cpp:B doxygen:B/ ], + 'gridsite.core' => [ qw/httpd-devel:B gsoap:B globus:B curl:B doxygen:B fuse-devel:B libxml2:B openssl:B build_common_cpp:B doxygen:B/ ], 'gridsite.commands' => [ qw/curl:R openssl:R/ ], 'gridsite.apache' => [ qw/libxml2:R openssl:R curl:R/ ], 'gridsite.shared' => [ qw/libxml2:R openssl:R/ ], 'gridsite.devel' => [ qw// ], - 'gridsite.slashgrid' => [ qw/curl:R fuse-libs:R fuse:R/], + 'gridsite.slashgrid' => [ qw/curl:R fuse:R/], 'gridsite.services' => [ qw/curl:R gsoap:R/ ], 'gridsite.service-clients' => [ qw/curl:R gsoap:R gsoapxx:R/ ], 'gridsite.gsexec' => [ qw// ], + 'gridsite.1.5-compat' => [ qw/httpd-devel:B gsoap:B globus:B curl:B doxygen:B fuse-devel:B libxml2:B openssl:B build_common_cpp:B doxygen:B/ ], 'px.proxyrenewal' => [ qw/globus:B globus_essentials:R myproxy-devel:B myproxy-libs:R voms libtool:B/ ], 'px.myproxy-config' => [ qw/myproxy-admin:R/ ], # in myproxy-config.spec ); @@ -602,6 +605,11 @@ for my $jar (keys %need_jars) { 'lb.logger-msg' => [ qw/ lb.logger / ], + 'lb.nagios' => [ qw/ + lb.client:R + lb.ws-test:R + lb.utils:R + / ], 'lb.server' => [ qw/ lb.ws-interface lb.types:B lb.common lb.state-machine lbjp-common.db lbjp-common.server-bones lbjp-common.trio lbjp-common.maildir lbjp-common.log @@ -725,6 +733,7 @@ for my $ext (keys %deps_aux) { %provides = ( 'lbjp-common.gss' => [ qq/glite-security-gss/ ], 'lbjp-common.gsoap-plugin' => [ qq/glite-security-gsoap-plugin/ ], + 'lb.nagios' => [ qq/glite-lb-nagios-plugins/ ], ); %cvs_prefix = ( @@ -754,6 +763,7 @@ for my $ext (keys %deps_aux) { # (${NAME.location}, ETICS conf. dependencies) # etics_projects ....... ETICS project names of externals # etics_externs_devel .. ETICS modules names of devel versions of externals +# etics_locations ...... ETICS locations in ${NAME.location} properties # need_externs_aux ..... project-specific external dependencies # supported_platforms .. platforms supported by the project # modules .............. additional modules in subsystems @@ -765,29 +775,38 @@ for my $ext (keys %deps_aux) { flavours => '--thrflavour=${globus.thr.flavor} --nothrflavour=${globus.nothr.flavor}', local_prefix => '', etics_externs => { - globus_essentials=>'vdt_globus_essentials', - globus=>'globus', - gridsite=>'org.gridsite.shared', - yaim_core=>'org.glite.yaim.core', - gip_release=>'glite-info-provider-release', - gip_service=>'glite-info-provider-service', - bdii=>'bdii', - glite_version=>'glite-version', - glite_info_templates=>'glite-info-templates', - glue_schema=>'glue-schema', - trustmanager=>'org.glite.security.trustmanager', - axis=>'axis', - lcas=>'org.glite.security.lcas', - gsoapxx=>'-', - build_common_cpp=>'org.glite.build.common-cpp', + default => { + globus_essentials=>'vdt_globus_essentials', + globus=>'globus', + globus_proxy_utils=>'vdt_globus_essentials', + gridsite=>'org.gridsite.shared', + yaim_core=>'org.glite.yaim.core', + gip_release=>'glite-info-provider-release', + gip_service=>'glite-info-provider-service', + bdii=>'bdii', + glite_version=>'glite-version', + glite_info_templates=>'glite-info-templates', + glue_schema=>'glue-schema', + trustmanager=>'org.glite.security.trustmanager', + axis=>'axis', + lcas=>'org.glite.security.lcas', + gsoapxx=>'-', + build_common_cpp=>'org.glite.build.common-cpp', + jdk=>'jdk', + }, }, etics_externs_devel => { - gridsite=>'org.gridsite.devel', + default => { + gridsite=>'org.gridsite.devel', + }, }, etics_projects => { - vdt=>[qw/globus globus_essentials gpt/], + vdt=>[qw/globus globus_essentials globus_proxy_utils gpt/], 'org.glite'=>[qw/voms gridsite lcas gip_release gip_service bdii glite_version glite_info_templates glue_schema yaim_core/], }, + etics_locations => { + '*' => '', + }, need_externs_aux => { 'lb.client-java' => [ qw/ant:B jdk:B axis:B trustmanager utiljava libtool:B/ ], 'lb.glite-LB' => [ qw/fetchcrl:R gpt:R gip_release:R gip_service:R bdii:R glite_version:R glite_info_templates:R glue_schema:R/ ], @@ -795,10 +814,18 @@ for my $ext (keys %deps_aux) { 'px.glite-PX' => [qw/myproxy-server:R myproxy-admin:R fetchcrl:R gip_service:R bdii:R glite_version:R gpt:R glue_schema:R/], 'px.myproxy-yaim' => [ qw/yaim_core:R/ ], }, + supported_platforms => { + sl5_x86_64_gcc412 => 1, + sl5_ia32_gcc412 => 1, + deb5_x86_64_gcc432 => 1, + deb5_ia32_gcc432 => 1, + slc4_x86_64_gcc346 => 1, + slc4_ia32_gcc346 => 1, + }, modules => { 'lb' => [ qw/glite-LB/ ], 'px' => [ qw/glite-PX/ ], - } + }, }, emi => { @@ -808,49 +835,98 @@ for my $ext (keys %deps_aux) { 'jp' => 'emi-', 'jobid' => 'emi-', 'lbjp-common' => 'emi-', - 'gridsite' => '', + 'gridsite' => 'emi-', 'px' => 'emi-', }, tag_prefix => { %cvs_tag_prefix }, flavours => '--thrflavour= --nothrflavour=', local_prefix => '/usr', etics_externs => { - globus_essentials=>'globus-gssapi-gsi', - globus=>'globus-gssapi-gsi-devel', - gridsite=>'emi.gridsite.shared', - yaim_core=>'emi.yaim.yaim-core', - yaim_bdii=>'emi.bdii.yaim-bdii', - gip_service=>'emi.bdii.glite-info-provider-service', - bdii=>'emi.bdii.core', - glite_version=>'emi.misc.glite-version', - glue_schema=>'emi.bdii.glue-schema', - trustmanager=>'emi.java-security.trustmanager', - trustmanager_axis=>'emi.java-security.trustmanager-axis', - axis=>'axis1.4', - lcas=>'emi.sac.lcas', - gsoapxx=>'-', - build_common_cpp=>'emi.misc.glite.build-common-cpp', - jdk=>'java', + default => { + globus_essentials=>'globus-gssapi-gsi', + globus=>'globus-gssapi-gsi-devel', + globus_proxy_utils=>'globus-proxy-utils', + gridsite=>'emi.gridsite.shared', + yaim_core=>'emi.yaim.yaim-core', + yaim_bdii=>'emi.bdii.yaim-bdii', + gip_service=>'emi.bdii.glite-info-provider-service', + bdii=>'emi.bdii.core', + glite_version=>'emi.misc.glite-version', + glue_schema=>'emi.bdii.glue-schema', + trustmanager=>'emi.java-security.trustmanager', + trustmanager_axis=>'emi.java-security.trustmanager-axis', + axis=>'axis1.4', + lcas=>'emi.sac.lcas', + gsoapxx=>'-', + build_common_cpp=>'emi.misc.glite.build-common-cpp', + jdk=>'java', + }, + sl5_x86_64_gcc412EPEL => { + 'myproxy-devel' => 'myproxy-devel.x86_64', + }, + sl6_x86_64_gcc445EPEL => { + 'myproxy-devel' => 'myproxy-devel.x86_64', + }, + deb6_x86_64_gcc445 => { + globus_essentials => 'libglobus-gssapi-gsi4', + globus => 'libglobus-gssapi-gsi-dev', + axis => 'libaxis-java', + cares => 'libc-ares2', + cppunit => 'libcppunit', + expat => 'libexpat1', + log4c => 'liblog4c3', + curl => 'libcurl3', + 'mysql' => 'libmysqlclient6', + 'mysql-devel' => 'libmysqlclient-dev', + libxslt => 'xsltproc', + 'jakarta-commons-codec' => 'libcommons-codec-java', + 'jakarta-commons-lang' => 'libcommons-lang-java', + 'tetex-latex' => 'texlive-latex-extra', + 'perl-LDAP' => 'libnet-ldap-perl', + 'fuse-lib' => 'libfuse2', + 'fuse' => 'fuse-utils', + }, }, etics_externs_devel => { - cares => 'c-ares-devel', - classads => 'classads-devel', - cppunit => 'cppunit-devel', - expat => 'expat-devel', - gsoap => 'gsoap-devel', - voms => 'org.glite.security.voms-api', - libtar => 'libtar-devel', - log4c => 'log4c-devel', - postgresql => 'postgresql-devel', - curl => 'curl-devel', - libxml2 => 'libxml2-devel', - openssl => 'openssl-devel', - gridsite=>'emi.gridsite.devel', - jdk=>'java-devel', + default => { + cares => 'c-ares-devel', + classads => 'classads-devel', + cppunit => 'cppunit-devel', + expat => 'expat-devel', + gsoap => 'gsoap-devel', + voms => 'org.glite.security.voms-api', + libtar => 'libtar-devel', + log4c => 'log4c-devel', + postgresql => 'postgresql-devel', + curl => 'curl-devel', + libxml2 => 'libxml2-devel', + openssl => 'openssl-devel', + gridsite=>'emi.gridsite.devel', + jdk=>'java-devel', + }, + deb6_x86_64_gcc445 => { + cares => 'libc-ares-dev', + cppunit => 'libcppunit-dev', + expat => 'libexpat1-dev', + libtar => 'libtar-dev', + log4c => 'liblog4c-dev', + postgresql => 'libpq-dev', + curl => 'libcurl4-openssl-dev', + libxml2 => 'libxml2-dev', + openssl => 'libssl-dev', + 'tetex-latex' => 'texlive-latex-extra', + libxslt=>'xsltproc', + 'httpd-devel' => 'apache2-prefork-dev', + 'fuse-devel' => 'libfuse-dev', + gsoap => 'gsoap', + }, }, etics_projects => { 'emi'=>[qw/voms voms-devel gridsite lcas gip_service bdii glite_version glue_schema yaim_core yaim_bdii trustmanager trustmanager_axis/], }, + etics_locations => { + axis => 'axis', + }, need_externs_aux => { 'lb.client-java' => [ qw/ant:B jdk:B axis:B trustmanager trustmanager_axis libtool:B/ ], 'lb.glite-LB' => [ qw/fetchcrl:R gip_service:R bdii:R glite_version:R glue_schema:R/ ], @@ -861,26 +937,35 @@ for my $ext (keys %deps_aux) { supported_platforms => { sl5_x86_64_gcc412EPEL => 1, sl5_ia32_gcc412EPEL => 1, + sl6_x86_64_gcc445EPEL => 1, +# deb6_x86_64_gcc445 => 1, }, modules => { 'lb' => [ qw/emi-lb/ ], 'px' => [ qw/emi-px/ ], - } + }, }, ); +my %gridsite_rpm = ( + 'package.RPMSLocation' => "\${moduleDir}/RPMTMP/RPMS", + 'package.SRPMSLocation' => "\${moduleDir}/RPMTMP/SRPMS", +); +my %gridsite_deb = ( + 'package.DEBSLocation' => "\${moduleDir}/RPMTMP", +); %platform_properties = ( 'gridsite.core' => { - sl5_x86_64_gcc412 => { aprSuffix => '1' }, - sl5_ia32_gcc412 => { aprSuffix => '1' }, - sl5_x86_64_gcc412EPEL => { aprSuffix => '1' }, - sl5_ia32_gcc412EPEL => { aprSuffix => '1' }, - deb5_x86_64_gcc432 => { aprSuffix => '1.0' }, - deb5_ia32_gcc432 => { aprSuffix => '1.0' }, - slc4_x86_64_gcc346 => { aprSuffix => '0' }, - slc4_ia32_gcc346 => { aprSuffix => '0' }, - default => { - } + sl5_x86_64_gcc412 => \%gridsite_rpm, + sl5_ia32_gcc412 => \%gridsite_rpm, + sl5_x86_64_gcc412EPEL => \%gridsite_rpm, + sl5_ia32_gcc412EPEL => \%gridsite_rpm, + deb5_x86_64_gcc432 => \%gridsite_deb, + deb5_ia32_gcc432 => \%gridsite_deb, + slc4_x86_64_gcc346 => \%gridsite_rpm, + slc4_ia32_gcc346 => \%gridsite_rpm, + sl6_x86_64_gcc445 => \%gridsite_rpm, + deb6_x86_64_gcc445 => \%gridsite_deb, }, 'jobid.api-java' => { default => { 'package.buildarch' => 'noarch' }, @@ -897,6 +982,9 @@ for my $ext (keys %deps_aux) { 'lb.yaim' => { default => { 'package.buildarch' => 'noarch' }, }, + 'lb.nagios' => { + default => { 'package.buildarch' => 'noarch' }, + }, 'px.yaim' => { default => { 'package.buildarch' => 'noarch' }, }, @@ -920,9 +1008,10 @@ sub full sub mkinc { my %aux; + my ($old_locale, $date); undef %aux; my @m=qw/ -lb.client lb.doc lb.state-machine lb.ws-interface lb.logger lb.logger-msg lb.types lb.common lb.server lb.utils lb.ws-test lb.client-java lb.harvester lb.yaim lb.glite-LB +lb.client lb.doc lb.state-machine lb.ws-interface lb.logger lb.logger-msg lb.nagios lb.types lb.common lb.server lb.utils lb.ws-test lb.client-java lb.harvester lb.yaim lb.glite-LB lbjp-common.gss lbjp-common.gsoap-plugin jobid.api-c jobid.api-cpp jobid.api-java lbjp-common.db lbjp-common.log lbjp-common.maildir lbjp-common.server-bones lbjp-common.trio lbjp-common.jp-interface lbjp-common.gss lbjp-common.gsoap-plugin @@ -956,10 +1045,23 @@ px.proxyrenewal px.myproxy-yaim px.glite-PX px.myproxy-config } } } + + mkdir $build."project" unless (-d $build."project"); + open PKGCHL,">".$build."project/changelog" + or die $build."project/changelog: $!\n"; + $old_locale = setlocale(LC_TIME); + setlocale(LC_TIME, "C"); + $date = strftime("%a %b %d %Y", gmtime()); + setlocale(LC_TIME, $old_locale); + print PKGCHL qq{* $date CESNET team +- automatically generated package +}; + close PKGCHL; + unless ($top_srcdir eq '.') { unlink $build."Makefile"; symlink "$top_srcdir/Makefile",$build."Makefile" or die "symlink $top_srcdir/Makefile ".$build."Makefile: $!\n"; - for my $file ('.pre', '.post', '.preun', '.postun changelog') { + for my $file ('.pre', '.post', '.preun', '.postun') { my $pfile = "project/$file"; if (-f "$full/$pfile") { mkdir "$build/project" unless (-d "$build/project"); @@ -1013,7 +1115,7 @@ sub mode_etics { die "$0: --module required with --etics\n" unless $fmod; - my ($subsys,$module) = split /\./,$fmod; + my ($subsys,$module) = split /\./,$fmod,2; my ($major,$minor,$rev,$age); @@ -1037,28 +1139,30 @@ sub mode_etics { close V; } + # XXX: --with ignored for platform-dependend packages my @copts = (); my %ge; @ge{@{$etics_projects{$project{etics_name}}}} = (1) x ($#{$etics_projects{$project{etics_name}}}+1); for (@{$need_externs{"$subsys.$module"}}) { if ($need_externs_type{"$subsys.$module"}->{$_}=~/B/ and (defined $externs{$_} or defined $jar{$_})) { - my $eext = $etics_externs{$_} ? $etics_externs{$_} : $_; + my $eext = $etics_externs{default}{$_} ? $etics_externs{default}{$_} : $_; next if ($eext eq '-'); - if ($project ne 'glite') { + if (defined $project{etics_locations}{'*'} or defined $project{etics_locations}{$_}) { + $eext = $project{etics_locations}{$_} if ($project{etics_locations}{$_}); + push @copts,$ge{$_} ? "--with-$_=\${stageDir}" : "--with-$_=\${$eext.location}"; + } else { if ($ge{$_} and not defined $externs{$_}{pkg}) { push @copts, "--with-$_=\${stageDir}"; } - } else { - push @copts,$ge{$_} ? "--with-$_=\${stageDir}" : "--with-$_=\${$eext.location}"; } } } for (@{$need_jars{"$subsys.$module"}}) { - my $eext = $etics_externs{$_} ? $etics_externs{$_} : $_; + my $eext = $etics_externs{default}{$_} ? $etics_externs{default}{$_} : $_; - push @copts,"--with-$_ \${$eext.location}$jar{$_}" if ($project eq 'glite'); + push @copts,"--with-$_ \${$eext.location}$jar{$_}" if (defined $project{etics_locations}{'*'} or defined $project{etics_locations}{$_}); } my $conf; @@ -1117,50 +1221,103 @@ sub mode_etics { print STDERR "package.summary not found for $subsys.$module!\n"; } my %cmd; - @cmd{qw/configure compile test install packaging clean/} = ('None') x 6; - $cmd{clean} = 'make clean'; - $cmd{checkout} = "cvs -d \${vcsroot} co -d \${moduleName} ".($conftag eq 'HEAD' ? '-A' : '-r ${tag}')." $cvs_prefix{$subsys}.$subsys.$module 2>/dev/null"; - #$cmd{checkout} = "(test -d jra1mw/.git && (cd jra1mw; git pull) || git clone http://scientific.zcu.cz/git/jra1mw.git)"; - #$cmd{checkout} .= " && (cd jra1mw; git checkout \${tag})" unless ($conftag =~ /HEAD/); - #$cmd{checkout} .= " && ln -s jra1mw/$cvs_prefix{$subsys}.$subsys.$module \${moduleName}"; - $cmd{tag} = "cvs -d \${vcsroot} tag -R \${tag} ${moduleName}"; + $cmd_vcs{checkout} = "cvs -d \${vcsroot} co -d \${moduleName} ".($conftag eq 'HEAD' ? '-A' : '-r ${tag}')." $cvs_prefix{$subsys}.$subsys.$module 2>/dev/null"; + #$cmd_vcs{checkout} = "(test -d jra1mw/.git && (cd jra1mw; git pull) || git clone http://scientific.zcu.cz/git/jra1mw.git)"; + #$cmd_vcs{checkout} .= " && (cd jra1mw; git checkout \${tag})" unless ($conftag =~ /HEAD/); + #$cmd_vcs{checkout} .= " && ln -s jra1mw/$cvs_prefix{$subsys}.$subsys.$module \${moduleName}"; + $cmd_vcs{tag} = "cvs -d \${vcsroot} tag -R \${tag} ${moduleName}"; + + $cmd{default}{init} = 'None'; + $cmd{default}{configure} = 'None'; + $cmd{default}{compile} = 'None'; + $cmd{default}{test} = 'None'; + $cmd{default}{install} = 'None'; + $cmd{default}{packaging} = 'None'; + $cmd{default}{clean} = 'make clean'; if ($subsys eq 'gridsite') { - $cmd{tag} = 'None'; + $cmd_vcs{tag} = 'None'; if ($module eq 'core') { - my ($flags, $prefix); + my $flags; if ($project ne 'glite') { - $flags = 'RELEASE_VERSION=${age}.${platformFamily} libdir=${libdir} GSOAPDIR=`pkg-config gsoap --variable=prefix` OPENSSL_GLOBUS_FLAGS=`pkg-config globus-openssl --cflags` OPENSSL_GLOBUS_LIBS=`pkg-config globus-openssl --libs` FLAVOR_GLOBUS_EXT= HTTPD_FLAGS="-I/usr/include/httpd -I/usr/include/apache2 -I/usr/include/apr-${aprSuffix} -I/usr/include/pcre"'; - $prefix = 'prefix=${prefix}/usr'; + # don't evaluate pkg-config calls to get them into source package + $flags = 'RELEASE_VERSION=${age}.${platformFamily} + GSOAPDIR=\`pkg-config gsoap --variable=prefix\` + OPENSSL_GLOBUS_FLAGS=\`pkg-config globus-openssl --cflags\` + OPENSSL_GLOBUS_LIBS=\`pkg-config globus-openssl --libs\`'; } else { - $flags = 'RELEASE_VERSION=${age}.${platformFamily} libdir=${libdir} GSOAPDIR=${gsoap.location} OPENSSL_GLOBUS_FLAGS=-I${globus.location}/include/${globus.dbg.nothr.flavor} OPENSSL_GLOBUS_LIBS=-L${globus.location}/${libdir}/ FLAVOR_GLOBUS_EXT=_${globus.dbg.nothr.flavor} HTTPD_FLAGS="-I${httpd-devel.location}/include/httpd -I${httpd-devel.location}/include/apache2 -I${httpd-devel.location}/include/apr-${aprSuffix} -I${httpd-devel.location}/include/pcre"'; - $prefix = 'prefix=${prefix}'; + $flags = 'RELEASE_VERSION=${age}.${platformFamily} + GSOAPDIR=${gsoap.location} + OPENSSL_GLOBUS_FLAGS=-I${globus.location}/include/${globus.dbg.nothr.flavor} + OPENSSL_GLOBUS_LIBS=-L${globus.location}/${libdir} + HTTPD_FLAGS=-I${httpd-devel.location}/include/httpd -I${httpd-devel.location}/include/apache2 -I${httpd-devel.location}/include/apr-1 -I${httpd-devel.location}/include/apr-1.0 -I${httpd-devel.location}/include/apr-0 -I${httpd-devel.location}/include/pcre'; } - $cmd{compile} = "echo 'make $flags' > build.sh\n\tmake $flags build"; - $cmd{clean} = "rm -rvf build.sh; $cmd{clean}"; - $cmd{install} = "make $prefix $flags install"; - $cmd{packaging} = "mkdir \${moduleDir}/RPMTMP/SOURCES \${moduleDir}/src/tgz - make $prefix $flags rpm && \ + $cmd{default}{configure} = "cat > Makefile.inc </dev/null"; + $cmd{default}{init} = 'echo "/sbin/ldconfig" > project/.post + echo "/sbin/ldconfig" > project/.postun'; + $cmd{default}{configure} = "cat > src/Makefile.inc <{$pp}}) { print C $p . ' = ' . $platform_properties{"$subsys.$module"}->{$pp}->{$p} . "\n"; } - print C "package.RPMSLocation = \${moduleDir}/RPMTMP/RPMS -package.SRPMSLocation = \${moduleDir}/RPMTMP/SRPMS\n"; print C "$package_description$package_summary\n"; } - print C qq{ -[Platform-default:DynamicDependency] -}; - for (@{$need_externs{"$subsys.$module"}},@{$need_jars{"$subsys.$module"}}) { - my $eext = $etics_externs{$_} ? $etics_externs{$_} : $_; - my $edev = $project{etics_externs_devel}{$_}; - next if ($eext eq '-'); + for my $platform ('default', keys %{$project{supported_platforms}}) { + my $used = 0; + my $output = ''; + + for (@{$need_externs{"$subsys.$module"}},@{$need_jars{"$subsys.$module"}}) { + my $eext = $etics_externs{$platform}{$_}; + my $edev = $project{etics_externs_devel}{$platform}{$_}; + + # for the default platform using package of the same + # name for runtime dependency + if (not $eext) { + if ($platform eq 'default') { +#print "default runtime $_ on default\n"; + $eext = $_; } + else { +#print "no runtime $_ on $platform\n"; + $eext = '-'; } + } + if ($eext eq '-' and $edev eq '-') { +#print "skipping $_ on $platform\n"; + next; + } - my $proj = 'externals'; - for my $p (keys %etics_projects) { - for $m (@{$etics_projects{$p}}) { - $proj = $p if $m eq $_; + my $proj = 'externals'; + for my $p (keys %etics_projects) { + for $m (@{$etics_projects{$p}}) { + $proj = $p if $m eq $_; + } } - } - my $type = $need_externs_type{"$subsys.$module"}->{$_}; + my $type = $need_externs_type{"$subsys.$module"}->{$_}; - if ($edev) { - if ($type eq 'B') { - $eext = $edev; # no runtime - change to devel pkg - } elsif ($type eq 'BR' or $type eq 'RB') { - print C "$proj|$edev = B\n"; # additional devel pkg + if ($edev) { + if ($type eq 'B') { + # no runtime - change to devel pkg + $eext = $edev; + } elsif ($type eq 'BR' or $type eq 'RB') { + # additional devel pkg + if ($edev ne '-') { $output .= "$proj|$edev = B\n"; } + } + } + if ($eext ne '-') { $output .= "$proj|$eext = $type\n"; } + } + + if ($platform eq 'default') { + for (@{$deps{"$subsys.$module"}}) { + my $type = $deps_type{"$subsys.$module"}->{$_}; + if (not $used) { + $used = 1; + } + $output .= "$project{etics_name}|$project{etics_name}.$_ = $type\n"; } } - print C "$proj|$eext = $type\n"; - } - for (@{$deps{"$subsys.$module"}}) { - my $type = $deps_type{"$subsys.$module"}->{$_}; - print C "$project{etics_name}|$project{etics_name}.$_ = $type\n"; + if ($output) { + print C qq{ +[Platform-$platform:DynamicDependency] +$output}; + } } close C; @@ -1340,6 +1530,62 @@ sub getlibdir { return $libdir; } +sub reshuffle_platforms($$) { + my ($data, $platforms) = @_; + my ($platform, %blacklist, $value); + + return if not $platforms; + + for $platform (keys %$data) { +#print "plat: $platform: $data->{$platform}\n"; + next if $platform eq 'default'; + for $_ (keys %{$data->{$platform}}) { +#print " blacklist: $_ = $data->{$platform}{$_}\n"; + $blacklist{$_} = 1; + } + } + + for $_ (keys %blacklist) { + $value = $data->{default}{$_} ? $data->{default}{$_} : $_; + for $platform (keys %$platforms) { + next if $platform eq 'default'; + if (not defined $data->{$platform}{$_}) { + $data->{$platform}{$_} = $value; +#print "added $value to $platform\n" + } + } + $data->{default}{$_} = '-'; +#print "deleted $_ from default\n"; + } + + # merge dependencies across the supported platforms + %blacklist = []; + for $platform (keys %$platforms) { + next if $platform eq 'default'; + for $_ (keys %{$data->{$platform}}) { + $blacklist{$_} = 1; + } + } + for $_ (keys %blacklist) { + $value = undef; + $same = 1; + for $platform (keys %$platforms) { + if (not $value) { $value = $data->{$platform}{$_}; } + if (not $data->{$platform}{$_} or $value ne $data->{$platform}{$_}) { + $same = 0; + last; + } + } + if ($same and $value) { +#print "merged dependency $_\n"; + $data->{default}{$_} = $value; + for $platform (keys %$platforms) { + delete $data->{$platform}{$_}; + } + } + } +} + sub usage { my @ext = keys %externs; my @myjars = keys %jar; diff --git a/org.glite.lb/etics-tag-with-subsystems.pl b/org.glite.lb/etics-tag-with-subsystems.pl index 3a2e4d4..5ea2cd3 100755 --- a/org.glite.lb/etics-tag-with-subsystems.pl +++ b/org.glite.lb/etics-tag-with-subsystems.pl @@ -235,7 +235,7 @@ usage: $0 [-c ] module.name printf("\nNew tag: $tag\n\n"); - die "This tag already exists; reported by assertion" unless system("cvs log -h $module/Makefile | grep \"$tag\""); + die "This tag already exists; reported by assertion" unless system("cvs log -h $module/project/version.properties | grep \"$tag\""); # ********************************** # Create the execution script diff --git a/org.glite.lb/etics-tag.pl b/org.glite.lb/etics-tag.pl index 9c05576..854951a 100755 --- a/org.glite.lb/etics-tag.pl +++ b/org.glite.lb/etics-tag.pl @@ -24,6 +24,56 @@ $GLITE_LB_LOCATION="./org.glite.lb"; if ($TMPDIR eq "") {$TMPDIR="/tmp";} +sub ConstructChangeLog { + my ($CCLtag,$CCLmod,$CCLchl) = @_; + my $orig_tag = ""; + my $new_tag = ""; + my $filename = ""; + + open(CHANGELOG, ">>$CCLchl"); + + + open(CCLFILES, "cvs diff -r $CCLtag $CCLmod | grep -E '^RCS file' -A 2 | "); + while () { + $inline=$_; + chomp($inline); + + if($inline =~/^RCS file: \/cvs\/.*?\/(.*),.*$/) { + $filename=$1; + $orig_tag=""; + $new_tag=""; + } + if ($inline =~/^retrieving revision ([0-9\.]*)/) { + if ($orig_tag == "") { + $orig_tag=$1; + } + else { + $new_tag=$1; + + open(OUTLINES, "cvs log -S -N -r" . "$orig_tag" . "::$new_tag $filename | egrep -v \"^locks:|^access list:|^keyword substitution:|^total revisions:|^branch:|^description:|^head:|^RCS file:|^---|^===|^revision|^Working[ ]file: \" |"); + $CCLnames = ""; + while () { + $logline=$_; + chomp($logline); + if ($logline=~/^date:.*author:\s+(.*?);\s+state.*/) { + unless ($CCLnames=~/$1/) { + $CCLnames = $CCLnames . ", $1"; + } + } + else { + print CHANGELOG "$_"; + } + } + print CHANGELOG " ==$filename $orig_tag to $new_tag$CCLnames=="; + close(OUTLINES); + } + } + } + close(CCLFILES); + close(CHANGELOG); + +} + getopts('i:c:m:p:gh'); $module = shift; @@ -228,7 +278,7 @@ usage: $0 [-i maj|min|rev|age|none|] [-g] [-c > $tmpChangeLog"); system("echo \"\" >> $tmpChangeLog");} - else { system("cvs log -S -N -r" . "$current_tag" . ":: $module | egrep -v \"^locks:|^access list:|^keyword substitution:|^total revisions:|^branch:|^description:|^head:|^RCS file:|^date:|^---|^===|^revision \" >> $tmpChangeLog"); } + else { ConstructChangeLog($current_tag, $module, $tmpChangeLog); } $ChangeLogRet=system("vim +$editline -c \"norm z.\" $tmpChangeLog"); } diff --git a/org.glite.lb/project/version.properties b/org.glite.lb/project/version.properties index 07c150e..fe762ac 100644 --- a/org.glite.lb/project/version.properties +++ b/org.glite.lb/project/version.properties @@ -1,3 +1,3 @@ # : /cvs/glite/org.glite.lb/project/version.properties,v 1.164 2008/01/09 15:35:55 mmulac Exp $ -module.version=3.0.10 +module.version=3.1.0 module.age=1 diff --git a/org.glite.lbjp-common.gsoap-plugin/configure b/org.glite.lbjp-common.gsoap-plugin/configure index 27f197c..e2b3330 100755 --- a/org.glite.lbjp-common.gsoap-plugin/configure +++ b/org.glite.lbjp-common.gsoap-plugin/configure @@ -248,6 +248,10 @@ $externs{'mysql-server'}{prefix}=$externs{mysql}{prefix} if $externs{'mysql-serv $externs{'mysql-devel'}{prefix}=$externs{mysql}{prefix} if $externs{'mysql-devel'}{prefix} eq ''; $externs{'gsoapxx'}{prefix}=$externs{gsoap}{prefix} if $externs{'gsoapxx'}{prefix} eq ''; +$externs{'mysql-server'}{withprefix}=$externs{mysql}{withprefix} if $externs{'mysql-server'}{withprefix} eq ''; +$externs{'mysql-devel'}{wihtprefix}=$externs{mysql}{withprefix} if $externs{'mysql-devel'}{withprefix} eq ''; +$externs{'gsoapxx'}{withprefix}=$externs{gsoap}{withprefix} if $externs{'gsoapxx'}{withprefix} eq ''; + %project = %{$projects{$project}}; for $_ (keys %{$project{etics_externs}}) { $etics_externs{$_} = $project{etics_externs}{$_}; @@ -423,7 +427,9 @@ sub mode_build { open MAK,">Makefile" or die "Makefile: $!\n"; - print MAK "all: @modules\n\nclean check:\n"; + print MAK "all: @modules\n\n"; + print MAK "stage: ".(join '-stage ', @modules)."-stage\n\n"; + print MAK "clean check install:\n"; for (@modules) { my $full = full($_); @@ -446,11 +452,13 @@ sub mode_build { @ldeps{@{$deps{$_}}} = 1; for my $x (split /,/,$staged) { delete $ldeps{$x}; } my @dnames = $module ? () : keys %ldeps; + my $snames = $#dnames == -1 ? '' : join('-stage ', @dnames).'-stage'; my $full = full($_); my $build = $buildroot{$_}; print MAK "$_: @dnames\n\tcd $full/$build && \${MAKE} && \${MAKE} install\n\n"; + print MAK "$_-stage: $snames\n\tcd $full/$build && \${MAKE} && \${MAKE} stage\n\n"; } close MAK; @@ -523,7 +531,7 @@ BEGIN{ 'lb.doc' => [ qw/tetex-latex:B/ ], 'lb.logger' => [ qw/cppunit:B libtool:B/ ], 'lb.logger-msg' => [ qw/cppunit:B activemq libtool:B/ ], - 'lb.server' => [ qw/globus_essentials:R globus:B expat cares mysql:R mysql-server:R mysql-devel:B cppunit:B gsoap:B classads voms lcas gridsite bison:B libtool:B libxml2/ ], + 'lb.server' => [ qw/globus_essentials:R globus:B expat cares mysql:R mysql-server:R mysql-devel:B cppunit:B gsoap:B classads voms lcas gridsite bison:B libtool:B libxml2 flex:B/ ], 'lb.state-machine' => [ qw/classads libtool:B libxslt:B expat:B/ ], 'lb.utils' => [ qw/cppunit:B libtool:B/ ], 'lb.ws-interface' => [ qw/libxslt:B/ ], @@ -539,7 +547,7 @@ BEGIN{ 'lbjp-common.gss' => [ qw/globus_essentials:R globus:B cares cppunit:B libtool:B/ ], 'lbjp-common.gsoap-plugin' => [ qw/cppunit:B globus_essentials:R globus:B cares:B gsoap gsoapxx libtool:B/ ], 'jobid.api-c' => [ qw/cppunit:B libtool:B openssl:B/ ], - 'jobid.api-cpp' => [ qw/cppunit:B/ ], + 'jobid.api-cpp' => [ qw/cppunit:B libtool:B/ ], 'jobid.api-java' => [ qw/ant:B jdk:B/ ], 'jp.client' => [ qw/gsoap libtar globus_essentials:R globus:B/ ], 'jp.doc' => [], @@ -556,7 +564,7 @@ BEGIN{ 'gridsite.services' => [ qw/curl:R gsoap:R/ ], 'gridsite.service-clients' => [ qw/curl:R gsoap:R gsoapxx:R/ ], 'gridsite.gsexec' => [ qw// ], - 'px.proxyrenewal' => [ qw/globus:B globus_essentials:R myproxy-devel:B myproxy-libs:R voms libtool:R/ ], + 'px.proxyrenewal' => [ qw/globus:B globus_essentials:R myproxy-devel:B myproxy-libs:R voms libtool:B/ ], 'px.myproxy-config' => [ qw/myproxy-admin:R/ ], # in myproxy-config.spec ); @@ -716,10 +724,11 @@ for my $ext (keys %deps_aux) { ); %conflicts = ( - 'lb.glite-LB' => [ qq/emi-lb/ ], - 'px.glite-PX' => [ qq/emi-px/ ], - 'lb.emi-lb' => [ qq/glite-LB/ ], - 'px.emi-px' => [ qq/glite-PX/ ], +); + +%provides = ( + 'lbjp-common.gss' => [ qq/glite-security-gss/ ], + 'lbjp-common.gsoap-plugin' => [ qq/glite-security-gsoap-plugin/ ], ); %cvs_prefix = ( @@ -815,7 +824,6 @@ for my $ext (keys %deps_aux) { gridsite=>'emi.gridsite.shared', yaim_core=>'emi.yaim.yaim-core', yaim_bdii=>'emi.bdii.yaim-bdii', - gip_release=>'emi.bdii.glite-info-provider-release', gip_service=>'emi.bdii.glite-info-provider-service', bdii=>'emi.bdii.core', glite_version=>'emi.misc.glite-version', @@ -845,11 +853,11 @@ for my $ext (keys %deps_aux) { jdk=>'java-devel', }, etics_projects => { - 'emi'=>[qw/voms voms-devel gridsite lcas gip_release gip_service bdii glite_version glue_schema yaim_core yaim_bdii trustmanager trustmanager_axis/], + 'emi'=>[qw/voms voms-devel gridsite lcas gip_service bdii glite_version glue_schema yaim_core yaim_bdii trustmanager trustmanager_axis/], }, need_externs_aux => { 'lb.client-java' => [ qw/ant:B jdk:B axis:B trustmanager trustmanager_axis libtool:B/ ], - 'lb.glite-LB' => [ qw/fetchcrl:R gip_release:R gip_service:R bdii:R glite_version:R glue_schema:R/ ], + 'lb.glite-LB' => [ qw/fetchcrl:R gip_service:R bdii:R glite_version:R glue_schema:R/ ], 'lb.yaim' => [ qw/yaim_core:R yaim_bdii:R perl-LDAP:R/ ], 'px.glite-PX' => [qw/myproxy-server:R myproxy-admin:R fetchcrl:R gip_service:R bdii:R glite_version:R glue_schema:R/], 'px.myproxy-yaim' => [ qw/yaim_core:R yaim_bdii:R/ ], @@ -1129,18 +1137,18 @@ sub mode_etics { if ($project ne 'glite') { $flags = 'RELEASE_VERSION=${age}.${platformFamily} libdir=${libdir} GSOAPDIR=`pkg-config gsoap --variable=prefix` OPENSSL_GLOBUS_FLAGS=`pkg-config globus-openssl --cflags` OPENSSL_GLOBUS_LIBS=`pkg-config globus-openssl --libs` FLAVOR_GLOBUS_EXT= HTTPD_FLAGS="-I/usr/include/httpd -I/usr/include/apache2 -I/usr/include/apr-${aprSuffix} -I/usr/include/pcre"'; - $prefix = "prefix=${prefix}/usr"; + $prefix = 'prefix=${prefix}/usr'; } else { $flags = 'RELEASE_VERSION=${age}.${platformFamily} libdir=${libdir} GSOAPDIR=${gsoap.location} OPENSSL_GLOBUS_FLAGS=-I${globus.location}/include/${globus.dbg.nothr.flavor} OPENSSL_GLOBUS_LIBS=-L${globus.location}/${libdir}/ FLAVOR_GLOBUS_EXT=_${globus.dbg.nothr.flavor} HTTPD_FLAGS="-I${httpd-devel.location}/include/httpd -I${httpd-devel.location}/include/apache2 -I${httpd-devel.location}/include/apr-${aprSuffix} -I${httpd-devel.location}/include/pcre"'; - $prefix = "prefix=${prefix}"; + $prefix = 'prefix=${prefix}'; } $cmd{compile} = "echo 'make $flags' > build.sh\n\tmake $flags build"; $cmd{clean} = "rm -rvf build.sh; $cmd{clean}"; $cmd{install} = "make $prefix $flags install"; - $cmd{packaging} = "mkdir ${moduleDir}/src/tgz + $cmd{packaging} = "mkdir \${moduleDir}/RPMTMP/SOURCES \${moduleDir}/src/tgz make $prefix $flags rpm && \ - cp ${moduleDir}/RPMTMP/SOURCES/gridsite-${version}.src.tar.gz ${moduleDir}/src/tgz"; + cp \${moduleDir}/RPMTMP/SOURCES/gridsite-\${version}.src.tar.gz \${moduleDir}/src/tgz"; } else { $cmd{clean} = 'None'; @@ -1218,6 +1226,9 @@ $package_description$package_summary$defprops}; for (@{$conflicts{"$subsys.$module"}}) { print C "package.conflicts = $_\n"; } + for (@{$provides{"$subsys.$module"}}) { + print C "package.provides = $_\n"; + } for my $pp (keys %{$platform_properties{"$subsys.$module"}}) { next if $pp eq 'default'; diff --git a/org.glite.lbjp-common.gsoap-plugin/project/ChangeLog b/org.glite.lbjp-common.gsoap-plugin/project/ChangeLog index 848f3dd..def390d 100644 --- a/org.glite.lbjp-common.gsoap-plugin/project/ChangeLog +++ b/org.glite.lbjp-common.gsoap-plugin/project/ChangeLog @@ -92,3 +92,6 @@ 3.0.2-6 - Module rebuilt +3.0.2-7 +- Module rebuilt + diff --git a/org.glite.lbjp-common.gsoap-plugin/project/version.properties b/org.glite.lbjp-common.gsoap-plugin/project/version.properties index 10e71b6..2c2d07e 100644 --- a/org.glite.lbjp-common.gsoap-plugin/project/version.properties +++ b/org.glite.lbjp-common.gsoap-plugin/project/version.properties @@ -1,3 +1,3 @@ # $Header$ module.version=3.0.2 -module.age=6 +module.age=7 diff --git a/org.glite.lbjp-common.gss/configure b/org.glite.lbjp-common.gss/configure index 27f197c..2e34da2 100755 --- a/org.glite.lbjp-common.gss/configure +++ b/org.glite.lbjp-common.gss/configure @@ -154,14 +154,6 @@ my %externs = ( prefix=>'/opt/activemq-cpp-library', pkg => 'activemq-cpp' }, - apr => { - prefix=>'/opt/apr', - pkg => 'apr-1' - }, - aprutil => { - prefix=>'/opt/apr-util', - pkg => 'apr-util-1' - }, ); my %jar = ( @@ -248,10 +240,18 @@ $externs{'mysql-server'}{prefix}=$externs{mysql}{prefix} if $externs{'mysql-serv $externs{'mysql-devel'}{prefix}=$externs{mysql}{prefix} if $externs{'mysql-devel'}{prefix} eq ''; $externs{'gsoapxx'}{prefix}=$externs{gsoap}{prefix} if $externs{'gsoapxx'}{prefix} eq ''; +$externs{'mysql-server'}{withprefix}=$externs{mysql}{withprefix} if $externs{'mysql-server'}{withprefix} eq ''; +$externs{'mysql-devel'}{wihtprefix}=$externs{mysql}{withprefix} if $externs{'mysql-devel'}{withprefix} eq ''; +$externs{'gsoapxx'}{withprefix}=$externs{gsoap}{withprefix} if $externs{'gsoapxx'}{withprefix} eq ''; + %project = %{$projects{$project}}; -for $_ (keys %{$project{etics_externs}}) { - $etics_externs{$_} = $project{etics_externs}{$_}; +for my $platform (keys %{$project{etics_externs}}) { + for $_ (keys %{$project{etics_externs}{$platform}}) { + $etics_externs{$platform}{$_} = $project{etics_externs}{$platform}{$_}; + } } +reshuffle_platforms(\%etics_externs, $project{supported_platforms}); +reshuffle_platforms(\%{$project{etics_externs_devel}}, $project{supported_platforms}); for $_ (keys %{$project{etics_projects}}) { $etics_projects{$_} = $project{etics_projects}{$_}; } @@ -423,7 +423,9 @@ sub mode_build { open MAK,">Makefile" or die "Makefile: $!\n"; - print MAK "all: @modules\n\nclean check:\n"; + print MAK "all: @modules\n\n"; + print MAK "stage: ".(join '-stage ', @modules)."-stage\n\n"; + print MAK "clean check install:\n"; for (@modules) { my $full = full($_); @@ -446,11 +448,13 @@ sub mode_build { @ldeps{@{$deps{$_}}} = 1; for my $x (split /,/,$staged) { delete $ldeps{$x}; } my @dnames = $module ? () : keys %ldeps; + my $snames = $#dnames == -1 ? '' : join('-stage ', @dnames).'-stage'; my $full = full($_); my $build = $buildroot{$_}; print MAK "$_: @dnames\n\tcd $full/$build && \${MAKE} && \${MAKE} install\n\n"; + print MAK "$_-stage: $snames\n\tcd $full/$build && \${MAKE} && \${MAKE} stage\n\n"; } close MAK; @@ -500,18 +504,18 @@ sub mode_checkout() { BEGIN{ %etics_externs = ( - 'myproxy-devel'=>'myproxy-devel', - 'myproxy-libs'=>'myproxy-libs', - 'myproxy-server'=>'myproxy-server', - 'myproxy-admin'=>'myproxy-admin', - cares=>'c-ares', - voms=>'org.glite.security.voms-api-cpp', - utiljava=>'org.glite.security.util-java', - gpt=>'gpt', - fetchcrl=>'fetch-crl', - activemq=>'activemq-cpp-library', - apr=>'apr-dev', - aprutil=>'aprutil-dev', + default => { + 'myproxy-devel'=>'myproxy-devel', + 'myproxy-libs'=>'myproxy-libs', + 'myproxy-server'=>'myproxy-server', + 'myproxy-admin'=>'myproxy-admin', + cares=>'c-ares', + voms=>'org.glite.security.voms-api-cpp', + utiljava=>'org.glite.security.util-java', + gpt=>'gpt', + fetchcrl=>'fetch-crl', + activemq=>'activemq-cpp-library', + }, ); %etics_projects = ( @@ -523,7 +527,7 @@ BEGIN{ 'lb.doc' => [ qw/tetex-latex:B/ ], 'lb.logger' => [ qw/cppunit:B libtool:B/ ], 'lb.logger-msg' => [ qw/cppunit:B activemq libtool:B/ ], - 'lb.server' => [ qw/globus_essentials:R globus:B expat cares mysql:R mysql-server:R mysql-devel:B cppunit:B gsoap:B classads voms lcas gridsite bison:B libtool:B libxml2/ ], + 'lb.server' => [ qw/globus_essentials:R globus:B expat cares mysql:R mysql-server:R mysql-devel:B cppunit:B gsoap:B classads voms lcas gridsite bison:B libtool:B libxml2 flex:B/ ], 'lb.state-machine' => [ qw/classads libtool:B libxslt:B expat:B/ ], 'lb.utils' => [ qw/cppunit:B libtool:B/ ], 'lb.ws-interface' => [ qw/libxslt:B/ ], @@ -539,7 +543,7 @@ BEGIN{ 'lbjp-common.gss' => [ qw/globus_essentials:R globus:B cares cppunit:B libtool:B/ ], 'lbjp-common.gsoap-plugin' => [ qw/cppunit:B globus_essentials:R globus:B cares:B gsoap gsoapxx libtool:B/ ], 'jobid.api-c' => [ qw/cppunit:B libtool:B openssl:B/ ], - 'jobid.api-cpp' => [ qw/cppunit:B/ ], + 'jobid.api-cpp' => [ qw/cppunit:B libtool:B/ ], 'jobid.api-java' => [ qw/ant:B jdk:B/ ], 'jp.client' => [ qw/gsoap libtar globus_essentials:R globus:B/ ], 'jp.doc' => [], @@ -556,7 +560,7 @@ BEGIN{ 'gridsite.services' => [ qw/curl:R gsoap:R/ ], 'gridsite.service-clients' => [ qw/curl:R gsoap:R gsoapxx:R/ ], 'gridsite.gsexec' => [ qw// ], - 'px.proxyrenewal' => [ qw/globus:B globus_essentials:R myproxy-devel:B myproxy-libs:R voms libtool:R/ ], + 'px.proxyrenewal' => [ qw/globus:B globus_essentials:R myproxy-devel:B myproxy-libs:R voms libtool:B/ ], 'px.myproxy-config' => [ qw/myproxy-admin:R/ ], # in myproxy-config.spec ); @@ -716,10 +720,11 @@ for my $ext (keys %deps_aux) { ); %conflicts = ( - 'lb.glite-LB' => [ qq/emi-lb/ ], - 'px.glite-PX' => [ qq/emi-px/ ], - 'lb.emi-lb' => [ qq/glite-LB/ ], - 'px.emi-px' => [ qq/glite-PX/ ], +); + +%provides = ( + 'lbjp-common.gss' => [ qq/glite-security-gss/ ], + 'lbjp-common.gsoap-plugin' => [ qq/glite-security-gsoap-plugin/ ], ); %cvs_prefix = ( @@ -749,6 +754,7 @@ for my $ext (keys %deps_aux) { # (${NAME.location}, ETICS conf. dependencies) # etics_projects ....... ETICS project names of externals # etics_externs_devel .. ETICS modules names of devel versions of externals +# etics_locations ...... ETICS locations in ${NAME.location} properties # need_externs_aux ..... project-specific external dependencies # supported_platforms .. platforms supported by the project # modules .............. additional modules in subsystems @@ -760,29 +766,37 @@ for my $ext (keys %deps_aux) { flavours => '--thrflavour=${globus.thr.flavor} --nothrflavour=${globus.nothr.flavor}', local_prefix => '', etics_externs => { - globus_essentials=>'vdt_globus_essentials', - globus=>'globus', - gridsite=>'org.gridsite.shared', - yaim_core=>'org.glite.yaim.core', - gip_release=>'glite-info-provider-release', - gip_service=>'glite-info-provider-service', - bdii=>'bdii', - glite_version=>'glite-version', - glite_info_templates=>'glite-info-templates', - glue_schema=>'glue-schema', - trustmanager=>'org.glite.security.trustmanager', - axis=>'axis', - lcas=>'org.glite.security.lcas', - gsoapxx=>'-', - build_common_cpp=>'org.glite.build.common-cpp', + default => { + globus_essentials=>'vdt_globus_essentials', + globus=>'globus', + gridsite=>'org.gridsite.shared', + yaim_core=>'org.glite.yaim.core', + gip_release=>'glite-info-provider-release', + gip_service=>'glite-info-provider-service', + bdii=>'bdii', + glite_version=>'glite-version', + glite_info_templates=>'glite-info-templates', + glue_schema=>'glue-schema', + trustmanager=>'org.glite.security.trustmanager', + axis=>'axis', + lcas=>'org.glite.security.lcas', + gsoapxx=>'-', + build_common_cpp=>'org.glite.build.common-cpp', + jdk=>'jdk', + }, }, etics_externs_devel => { - gridsite=>'org.gridsite.devel', + default => { + gridsite=>'org.gridsite.devel', + }, }, etics_projects => { vdt=>[qw/globus globus_essentials gpt/], 'org.glite'=>[qw/voms gridsite lcas gip_release gip_service bdii glite_version glite_info_templates glue_schema yaim_core/], }, + etics_locations => { + '*' => '', + }, need_externs_aux => { 'lb.client-java' => [ qw/ant:B jdk:B axis:B trustmanager utiljava libtool:B/ ], 'lb.glite-LB' => [ qw/fetchcrl:R gpt:R gip_release:R gip_service:R bdii:R glite_version:R glite_info_templates:R glue_schema:R/ ], @@ -790,10 +804,18 @@ for my $ext (keys %deps_aux) { 'px.glite-PX' => [qw/myproxy-server:R myproxy-admin:R fetchcrl:R gip_service:R bdii:R glite_version:R gpt:R glue_schema:R/], 'px.myproxy-yaim' => [ qw/yaim_core:R/ ], }, + supported_platforms => { + sl5_x86_64_gcc412 => 1, + sl5_ia32_gcc412 => 1, + deb5_x86_64_gcc432 => 1, + deb5_ia32_gcc432 => 1, + slc4_x86_64_gcc346 => 1, + slc4_ia32_gcc346 => 1, + }, modules => { 'lb' => [ qw/glite-LB/ ], 'px' => [ qw/glite-PX/ ], - } + }, }, emi => { @@ -810,46 +832,55 @@ for my $ext (keys %deps_aux) { flavours => '--thrflavour= --nothrflavour=', local_prefix => '/usr', etics_externs => { - globus_essentials=>'globus-gssapi-gsi', - globus=>'globus-gssapi-gsi-devel', - gridsite=>'emi.gridsite.shared', - yaim_core=>'emi.yaim.yaim-core', - yaim_bdii=>'emi.bdii.yaim-bdii', - gip_release=>'emi.bdii.glite-info-provider-release', - gip_service=>'emi.bdii.glite-info-provider-service', - bdii=>'emi.bdii.core', - glite_version=>'emi.misc.glite-version', - glue_schema=>'emi.bdii.glue-schema', - trustmanager=>'emi.java-security.trustmanager', - trustmanager_axis=>'emi.java-security.trustmanager-axis', - axis=>'axis1.4', - lcas=>'emi.sac.lcas', - gsoapxx=>'-', - build_common_cpp=>'emi.misc.glite.build-common-cpp', - jdk=>'java', + default => { + globus_essentials=>'globus-gssapi-gsi', + globus=>'globus-gssapi-gsi-devel', + gridsite=>'emi.gridsite.shared', + yaim_core=>'emi.yaim.yaim-core', + yaim_bdii=>'emi.bdii.yaim-bdii', + gip_service=>'emi.bdii.glite-info-provider-service', + bdii=>'emi.bdii.core', + glite_version=>'emi.misc.glite-version', + glue_schema=>'emi.bdii.glue-schema', + trustmanager=>'emi.java-security.trustmanager', + trustmanager_axis=>'emi.java-security.trustmanager-axis', + axis=>'axis1.4', + lcas=>'emi.sac.lcas', + gsoapxx=>'-', + build_common_cpp=>'emi.misc.glite.build-common-cpp', + jdk=>'java', + }, + sl5_x86_64_gcc412EPEL => { + 'myproxy-devel' => 'myproxy-devel.x86_64', + }, }, etics_externs_devel => { - cares => 'c-ares-devel', - classads => 'classads-devel', - cppunit => 'cppunit-devel', - expat => 'expat-devel', - gsoap => 'gsoap-devel', - voms => 'org.glite.security.voms-api', - libtar => 'libtar-devel', - log4c => 'log4c-devel', - postgresql => 'postgresql-devel', - curl => 'curl-devel', - libxml2 => 'libxml2-devel', - openssl => 'openssl-devel', - gridsite=>'emi.gridsite.devel', - jdk=>'java-devel', + default => { + cares => 'c-ares-devel', + classads => 'classads-devel', + cppunit => 'cppunit-devel', + expat => 'expat-devel', + gsoap => 'gsoap-devel', + voms => 'org.glite.security.voms-api', + libtar => 'libtar-devel', + log4c => 'log4c-devel', + postgresql => 'postgresql-devel', + curl => 'curl-devel', + libxml2 => 'libxml2-devel', + openssl => 'openssl-devel', + gridsite=>'emi.gridsite.devel', + jdk=>'java-devel', + }, }, etics_projects => { - 'emi'=>[qw/voms voms-devel gridsite lcas gip_release gip_service bdii glite_version glue_schema yaim_core yaim_bdii trustmanager trustmanager_axis/], + 'emi'=>[qw/voms voms-devel gridsite lcas gip_service bdii glite_version glue_schema yaim_core yaim_bdii trustmanager trustmanager_axis/], + }, + etics_locations => { + axis => 'axis', }, need_externs_aux => { 'lb.client-java' => [ qw/ant:B jdk:B axis:B trustmanager trustmanager_axis libtool:B/ ], - 'lb.glite-LB' => [ qw/fetchcrl:R gip_release:R gip_service:R bdii:R glite_version:R glue_schema:R/ ], + 'lb.glite-LB' => [ qw/fetchcrl:R gip_service:R bdii:R glite_version:R glue_schema:R/ ], 'lb.yaim' => [ qw/yaim_core:R yaim_bdii:R perl-LDAP:R/ ], 'px.glite-PX' => [qw/myproxy-server:R myproxy-admin:R fetchcrl:R gip_service:R bdii:R glite_version:R glue_schema:R/], 'px.myproxy-yaim' => [ qw/yaim_core:R yaim_bdii:R/ ], @@ -861,7 +892,7 @@ for my $ext (keys %deps_aux) { modules => { 'lb' => [ qw/emi-lb/ ], 'px' => [ qw/emi-px/ ], - } + }, }, ); @@ -1033,28 +1064,30 @@ sub mode_etics { close V; } + # XXX: --with ignored for platform-dependend packages my @copts = (); my %ge; @ge{@{$etics_projects{$project{etics_name}}}} = (1) x ($#{$etics_projects{$project{etics_name}}}+1); for (@{$need_externs{"$subsys.$module"}}) { if ($need_externs_type{"$subsys.$module"}->{$_}=~/B/ and (defined $externs{$_} or defined $jar{$_})) { - my $eext = $etics_externs{$_} ? $etics_externs{$_} : $_; + my $eext = $etics_externs{default}{$_} ? $etics_externs{default}{$_} : $_; next if ($eext eq '-'); - if ($project ne 'glite') { + if (defined $project{etics_locations}{'*'} or defined $project{etics_locations}{$_}) { + $eext = $project{etics_locations}{$_} if ($project{etics_locations}{$_}); + push @copts,$ge{$_} ? "--with-$_=\${stageDir}" : "--with-$_=\${$eext.location}"; + } else { if ($ge{$_} and not defined $externs{$_}{pkg}) { push @copts, "--with-$_=\${stageDir}"; } - } else { - push @copts,$ge{$_} ? "--with-$_=\${stageDir}" : "--with-$_=\${$eext.location}"; } } } for (@{$need_jars{"$subsys.$module"}}) { - my $eext = $etics_externs{$_} ? $etics_externs{$_} : $_; + my $eext = $etics_externs{default}{$_} ? $etics_externs{default}{$_} : $_; - push @copts,"--with-$_ \${$eext.location}$jar{$_}" if ($project eq 'glite'); + push @copts,"--with-$_ \${$eext.location}$jar{$_}" if (defined $project{etics_locations}{'*'} or defined $project{etics_locations}{$_}); } my $conf; @@ -1129,18 +1162,18 @@ sub mode_etics { if ($project ne 'glite') { $flags = 'RELEASE_VERSION=${age}.${platformFamily} libdir=${libdir} GSOAPDIR=`pkg-config gsoap --variable=prefix` OPENSSL_GLOBUS_FLAGS=`pkg-config globus-openssl --cflags` OPENSSL_GLOBUS_LIBS=`pkg-config globus-openssl --libs` FLAVOR_GLOBUS_EXT= HTTPD_FLAGS="-I/usr/include/httpd -I/usr/include/apache2 -I/usr/include/apr-${aprSuffix} -I/usr/include/pcre"'; - $prefix = "prefix=${prefix}/usr"; + $prefix = 'prefix=${prefix}/usr'; } else { $flags = 'RELEASE_VERSION=${age}.${platformFamily} libdir=${libdir} GSOAPDIR=${gsoap.location} OPENSSL_GLOBUS_FLAGS=-I${globus.location}/include/${globus.dbg.nothr.flavor} OPENSSL_GLOBUS_LIBS=-L${globus.location}/${libdir}/ FLAVOR_GLOBUS_EXT=_${globus.dbg.nothr.flavor} HTTPD_FLAGS="-I${httpd-devel.location}/include/httpd -I${httpd-devel.location}/include/apache2 -I${httpd-devel.location}/include/apr-${aprSuffix} -I${httpd-devel.location}/include/pcre"'; - $prefix = "prefix=${prefix}"; + $prefix = 'prefix=${prefix}'; } $cmd{compile} = "echo 'make $flags' > build.sh\n\tmake $flags build"; $cmd{clean} = "rm -rvf build.sh; $cmd{clean}"; $cmd{install} = "make $prefix $flags install"; - $cmd{packaging} = "mkdir ${moduleDir}/src/tgz + $cmd{packaging} = "mkdir \${moduleDir}/RPMTMP/SOURCES \${moduleDir}/src/tgz make $prefix $flags rpm && \ - cp ${moduleDir}/RPMTMP/SOURCES/gridsite-${version}.src.tar.gz ${moduleDir}/src/tgz"; + cp \${moduleDir}/RPMTMP/SOURCES/gridsite-\${version}.src.tar.gz \${moduleDir}/src/tgz"; } else { $cmd{clean} = 'None'; @@ -1157,6 +1190,10 @@ sub mode_etics { $cmd{compile} = 'make'; $cmd{test} = 'make check'; $cmd{install} = 'make install'; + if ($subsys eq 'lb' and $module eq 'client') { + $cmd{compile} = "make rpath=$project{local_prefix}/\${libdir}"; + $cmd{install} = "make install post-install rpath=$project{local_prefix}/\${libdir}"; + } } my $defprops = ''; @@ -1218,6 +1255,9 @@ $package_description$package_summary$defprops}; for (@{$conflicts{"$subsys.$module"}}) { print C "package.conflicts = $_\n"; } + for (@{$provides{"$subsys.$module"}}) { + print C "package.provides = $_\n"; + } for my $pp (keys %{$platform_properties{"$subsys.$module"}}) { next if $pp eq 'default'; @@ -1233,36 +1273,59 @@ package.SRPMSLocation = \${moduleDir}/RPMTMP/SRPMS\n"; print C "$package_description$package_summary\n"; } - print C qq{ -[Platform-default:DynamicDependency] + for my $platform ('default', keys %{$project{supported_platforms}}) { + my $used = 0; + + for (@{$need_externs{"$subsys.$module"}},@{$need_jars{"$subsys.$module"}}) { + my $eext = $etics_externs{$platform}{$_} ? $etics_externs{$platform}{$_} : $_; + my $edev = $project{etics_externs_devel}{$platform}{$_}; + next if ($eext eq '-'); + # dependencies not listed in etics_externs only for + # default platform + if (not defined $etics_externs{$platform}{$_} and + $platform ne 'default') { +#print "skipping $_ on $platform\n"; + next; + } + + if (not $used) { + print C qq{ +[Platform-$platform:DynamicDependency] }; - for (@{$need_externs{"$subsys.$module"}},@{$need_jars{"$subsys.$module"}}) { - my $eext = $etics_externs{$_} ? $etics_externs{$_} : $_; - my $edev = $project{etics_externs_devel}{$_}; - next if ($eext eq '-'); + $used = 1; + } - my $proj = 'externals'; - for my $p (keys %etics_projects) { - for $m (@{$etics_projects{$p}}) { - $proj = $p if $m eq $_; + my $proj = 'externals'; + for my $p (keys %etics_projects) { + for $m (@{$etics_projects{$p}}) { + $proj = $p if $m eq $_; + } } - } - my $type = $need_externs_type{"$subsys.$module"}->{$_}; + my $type = $need_externs_type{"$subsys.$module"}->{$_}; - if ($edev) { - if ($type eq 'B') { - $eext = $edev; # no runtime - change to devel pkg - } elsif ($type eq 'BR' or $type eq 'RB') { - print C "$proj|$edev = B\n"; # additional devel pkg + if ($edev) { + if ($type eq 'B') { + $eext = $edev; # no runtime - change to devel pkg + } elsif ($type eq 'BR' or $type eq 'RB') { + print C "$proj|$edev = B\n"; # additional devel pkg + } } + print C "$proj|$eext = $type\n"; } - print C "$proj|$eext = $type\n"; - } - for (@{$deps{"$subsys.$module"}}) { - my $type = $deps_type{"$subsys.$module"}->{$_}; - print C "$project{etics_name}|$project{etics_name}.$_ = $type\n"; + if ($platform eq 'default') { + for (@{$deps{"$subsys.$module"}}) { + my $type = $deps_type{"$subsys.$module"}->{$_}; + if (not $used) { + print C qq{ +[Platform-$platform:DynamicDependency] +}; + $used = 1; + } + print C "$project{etics_name}|$project{etics_name}.$_ = $type\n"; + } + } } close C; @@ -1333,6 +1396,37 @@ sub getlibdir { return $libdir; } +sub reshuffle_platforms($$) { + my ($data, $platforms) = @_; + my ($platform, %blacklist, $value); + + return if not $platforms; + + for $platform (keys %$data) { +#print "plat: $platform: $data->{$platform}\n"; + next if $platform eq 'default'; + for $_ (keys %{$data->{$platform}}) { +#print " blacklist: $_ = $data->{$platform}{$_}\n"; + $blacklist{$_} = 1; + } + } + + for $_ (keys %blacklist) { + if (defined $data->{default}{$_}) { + $value = $data->{default}{$_}; + $data->{default}{$_} = '-'; +#print " deleted $_ from default\n"; + for $platform (keys %$platforms) { + next if $platform eq 'default'; + if (not defined $data->{$platform}{$_}) { + $data->{$platform}{$_} = $value; +#print " added $value to $platform\n" + } + } + } + } +} + sub usage { my @ext = keys %externs; my @myjars = keys %jar; diff --git a/org.glite.lbjp-common.gss/interface/glite_gss.h b/org.glite.lbjp-common.gss/interface/glite_gss.h index 5a1e3fc..162069f 100644 --- a/org.glite.lbjp-common.gss/interface/glite_gss.h +++ b/org.glite.lbjp-common.gss/interface/glite_gss.h @@ -186,6 +186,9 @@ int edg_wll_gss_set_signal_handler(int signum, void (*handler_func)(int)); +void +edg_wll_gss_poll_signal(); + #ifdef __cplusplus } #endif diff --git a/org.glite.lbjp-common.gss/project/ChangeLog b/org.glite.lbjp-common.gss/project/ChangeLog index 940aa38..2eeb42a 100644 --- a/org.glite.lbjp-common.gss/project/ChangeLog +++ b/org.glite.lbjp-common.gss/project/ChangeLog @@ -77,3 +77,11 @@ 3.0.3-1 - edg_wll_gss_set_signal_handler() added +3.0.4-1 +- Next stage for globus signal handler fixes: + - globus common module loaded only in edg_wll_initialize() + - using globus_poll_nonblocking() before checking signals in logger, + new function in gss (needed for non-threaded globus flavour) + - warning fixes (type cast, 32/64 portability) + - gss functions documented in code + diff --git a/org.glite.lbjp-common.gss/project/doc/EMI_Logo_std.pdf b/org.glite.lbjp-common.gss/project/doc/EMI_Logo_std.pdf new file mode 100644 index 0000000000000000000000000000000000000000..2e79001001bf2dba006668ab874cc789e55c7219 GIT binary patch literal 34764 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 literal 0 HcmV?d00001 diff --git a/org.glite.lbjp-common.gss/project/doc/Makefile b/org.glite.lbjp-common.gss/project/doc/Makefile new file mode 100644 index 0000000..7591a3e --- /dev/null +++ b/org.glite.lbjp-common.gss/project/doc/Makefile @@ -0,0 +1,3 @@ +all: + pdflatex lbjp-common-gss_FD.tex + diff --git a/org.glite.lbjp-common.gss/project/doc/cesnet.pdf b/org.glite.lbjp-common.gss/project/doc/cesnet.pdf new file mode 100644 index 0000000000000000000000000000000000000000..9b07738d8c962af32dcfad0e592bba658aff31e6 GIT binary patch literal 4518 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\raggedright\arraybackslash}X} +\\ + Document version: & \textbf{\@DocVersion}\\[3mm] + EMI Component Version: & \textbf{\@EMICompVersion}\\[3mm] + Date: & \textbf{\@Date}\\[3mm] + %Document status: & \textbf{\@DocStatus}\\[3mm] + + \end{tabularx} + + } + + {\color{MyTeal}\hrule width \frontboxwidth height 1mm depth 0pt} + %}%centering + } + +} +\end{center} + +%\vfill +%{\sf\underline{Abstract}: \@Abstract} +\vfill +\newpage % end of the first page +\pagestyle{headings} +\setcounter{tocdepth}{3} +} % End of AtBeginningDocument + + +% +% EMI style small-capital section titles. +% +% The numbering is aligned with the WinWord style, +% although it is not common in the english typography... +% +\newcommand{\sectionbreak}{\newpage} +%\renewcommand{\thesection}{\arabic{section}.} +%\renewcommand{\thesubsection}{\thesection\arabic{subsection}.} +%\renewcommand{\thesubsubsection}{\thesubsection\arabic{subsubsection}.} + +\renewcommand\section{\@startsection {section}{1}{\z@}% + {-3.5ex \@plus -1ex \@minus -.2ex}% + {2.3ex \@plus.2ex}% + {\normalfont\Large\bfseries\sffamily\scshape}} + +\renewcommand\subsection{\@startsection{subsection}{2}{\z@}% + {-3.25ex\@plus -1ex \@minus -.2ex}% + {1.5ex \@plus .2ex}% + {\normalfont\large\bfseries\sffamily\scshape}} +\renewcommand\subsubsection{\@startsection{subsubsection}{3}{\z@}% + {-3.25ex\@plus -1ex \@minus -.2ex}% + {1.5ex \@plus .2ex}% + {\normalfont\normalsize\bfseries\sffamily\scshape}} + + + +%% APM NEED TO REDEFINE section +%\titleformat{\section}{\Large\bfseries\sffamily\scshape}{\thesection}{1em}{} +%\titlecontents{section} [2em] {\vspace*{4pt}} +% {\large \sc \bfseries \contentslabel{2em}} +% {\large \sc \bfseries \hspace*{-2em}} +% {\large \textbf{\titlerule*[1ex]{.}\contentspage}} [\vspace*{4pt}] + +%\titleformat{\subsection}{\large\bfseries\sffamily\scshape}{\thesubsection}{1em}{} +%\titlecontents{subsection} [5em] {} +% {\sc \contentslabel{3em}} +% {\sc \hspace*{-3em}} +% {\titlerule*[1ex]{.}\contentspage} + + +% +% common constants +% +%\def\ISTNumber{INFSO-RI-508833} +\newsavebox{\@EMILogo} +%\savebox{\@EMILogo}{\includegraphics[height=0.75\headheight]{EMI_Logo_std}} +\savebox{\@EMILogo}{\includegraphics[height=0.95\headheight]{EMI_Logo_std}} +\def\EMILogo{\usebox{\@EMILogo}} +%\def\LargeEMILogo{\includegraphics[height=\headheight]{EMI_Logo_std}} +\def\SmallEMILogo{\includegraphics[height=\headheight]{EMI_Logo_std}} +\def\LargeCESNETLogo{\includegraphics[height=\headheight]{cesnet}} +% DEL \def\ISTLogo{\includegraphics[height=\headheight]{isi}} + +% +% parameters to be supplied by the author +% +% EG : subtitle seems no more needed +%\def\Subtitle#1{\gdef\@Subtitle{#1}} +%\gdef\@Subtitle{\@latex@warning@no@line{No \noexpand\Subtitle given}} + +%\def\DeliverableId#1{\gdef\@DeliverableId{#1}} +%\gdef\@DeliverableId{\@latex@warning@no@line{No \noexpand\DeliverableId given}} + + +\def\DocVersion#1{\gdef\@DocVersion{#1}} +\gdef\@DocVersion{\@latex@warning@no@line{No \noexpand\DocVersion given % + (e.g. 0.1.2)}} + +\def\EMICompVersion#1{\gdef\@EMICompVersion{#1}} +\gdef\@EMICompVersion{\@latex@warning@no@line{No \noexpand\EMICompVersion given % + (e.g. 1.2.3)}} + +\def\Date#1{\gdef\@Date{#1}} +\gdef\@Date{\@latex@warning@no@line{No \noexpand\Date given % + (e.g. 01/04/2010)}} + +%\def\Activity#1{\gdef\@Activity{#1}} +%\gdef\@Activity{\@latex@warning@no@line{No \noexpand\Activity given % +% (e.g. NA2 Dissemination and Outreach )}} + +%\def\LeadPartner#1{\gdef\@LeadPartner{#1}} +%\gdef\@LeadPartner{\@latex@warning@no@line{No \noexpand\LeadPartner given % +% (e.g. CERN, RAL )}} + +%\def\DocStatus#1{\gdef\@DocStatus{#1}} +%\gdef\@DocStatus{\@latex@warning@no@line{No \noexpand\DocStatus given % +% (e.g. DRAFT, WORKING, DELIVERED)}} + +%\def\Dissemination#1{\gdef\@Dissemination{#1}} +%\gdef\@Dissemination{\@latex@warning@no@line{No \noexpand\Dissemination given % +% (e.g. PUBLIC, INTERNAL, ...)}} + + +\long\def\Abstract#1{\gdef\@Abstract{#1}} +\gdef\@Abstract{\@latex@warning@no@line{No \noexpand\Abstract given}} + +%% +%% Define the abstract using an environment abstract + +% +% This will produce the mailto link in the PDF file +% +% +% We use the URL package, which does this nicely. The old way (\HTTP) was +% a bit buggy as it had problems with '~'s and '_'s +% +\urlstyle{sf} +\ifpdf + \newcommand{\Email}[1]{\href{mailto:#1}{<{#1}>}} + \newcommand{\HTTP}[1]{\href{#1}{\url{#1}}} +\else + \newcommand{\Email}[1]{\textsf{<{#1}>}} + \newcommand{\HTTP}[1]{\url{#1}} +\fi + + +% +% We now redifine \part and \section so that the table of contents +% has the sections/parts in upper case. +% +% Note: need to use \uppercase because \MakeUppercase is not robust +% +\def\@part[#1]#2{% + \ifnum \c@secnumdepth >\m@ne + \refstepcounter{part}% + \addcontentsline{toc}{part}{\thepart\hspace{1em}\uppercase{#1}}% + \else + \addcontentsline{toc}{part}{\uppercase{#1}}% + \fi + {\parindent \z@ \raggedright + \interlinepenalty \@M + \normalfont + \ifnum \c@secnumdepth >\m@ne + \Large\bfseries \partname\nobreakspace\thepart + \par\nobreak + \fi + \huge \bfseries #2% + \markboth{}{}\par}% + \nobreak + \vskip 3ex + \@afterheading} + +\def\@sect#1#2#3#4#5#6[#7]#8{% + \ifnum #2>\c@secnumdepth + \let\@svsec\@empty + \else + \refstepcounter{#1}% + \protected@edef\@svsec{\@seccntformat{#1}\relax}% + \fi + \@tempskipa #5\relax + \ifdim \@tempskipa>\z@ + \begingroup + #6{% + \@hangfrom{\hskip #3\relax\@svsec}% + \interlinepenalty \@M #8\@@par}% + \endgroup + \csname #1mark\endcsname{\uppercase{#7}}% + \addcontentsline{toc}{#1}{% + \ifnum #2>\c@secnumdepth \else + \protect\numberline{\csname the#1\endcsname}% + \fi + \texorpdfstring{\uppercase{#7}}{#7}}% + \else + \def\@svsechd{% + #6{\hskip #3\relax + \@svsec #8}% + \csname #1mark\endcsname{\uppercase{#7}}% + \addcontentsline{toc}{#1}{% + \ifnum #2>\c@secnumdepth \else + \protect\numberline{\csname the#1\endcsname}% + \fi + \texorpdfstring{\uppercase{#7}}{#7}}}% + \fi + \@xsect{#5}} + +% \addcontentsline{toc} expands to \contentsline{NAME} +% which in turn expands to \l@NAME. So, to specify +% the table of contents, we must define \l@chapter, \l@section, +% \l@subsection, ... ; to specify the list of figures, we must define +% \l@figure; and so on. Most of these can be defined with the +% \@dottedtocline command, which produces a contents line with dots +% between the title and the page number. It works as follows: +% +% \@dottedtocline{LEVEL}{INDENT}{NUMWIDTH} +% LEVEL : An entry is produced only if LEVEL < or = value of +% 'tocdepth' counter. Note, \chapter is level 0, \section +% is level 1, etc. +% INDENT : The indentation from the outer left margin of the start of +% the contents line. +% NUMWIDTH : The width of a box in which the section number is to go, +% if TITLE includes a \numberline command. +% + +\def\l@part{\@dottedtocline{1}{4em}{2.0em}} +\def\l@subsection{\@dottedtocline{2}{1.5em}{2.3em}} +\def\l@subsubsection{\@dottedtocline{3}{3.8em}{3.2em}} +\def\l@paragraph{\@dottedtocline{4}{7.0em}{4.1em}} +\def\l@subparagraph{\@dottedtocline{5}{10em}{5em}} + diff --git a/org.glite.lbjp-common.gss/project/doc/lbjp-common-gss_FD.tex b/org.glite.lbjp-common.gss/project/doc/lbjp-common-gss_FD.tex new file mode 100644 index 0000000..0269a10 --- /dev/null +++ b/org.glite.lbjp-common.gss/project/doc/lbjp-common-gss_FD.tex @@ -0,0 +1,34 @@ +\documentclass[]{emi} +\usepackage[ascii]{inputenc} +\usepackage[pdftex]{graphicx} + +\title{gLite GSS \& gSOAP Plugin Libraries -- Functional Description} +%\Subtitle{Functional Description} +\author{CESNET} +%\DocIdentifier{emi-lbjp-common-gss-fd-1.0.0-1} +%\DeliverableId{} +\Date{\today} +%\DocStatus{FINAL} +\DocVersion{1.0.0-1} +%\DocumentLink{\url{http://egee.cesnet.cz/cvsweb/PR/lbjp-common-gss\_FD.pdf}} +\Abstract{ +GSS and gSOAP Plugin are security-oriented modules used exclusively within other EMI products.} +\EMICompVersion{All versions} + +\begin{document} + +\tableofcontents + +\newpage + +\section{Introduction} + +Both security-oriented modules discussed in this Functional Description are internal libraries used exclusively within other EMI products. + +\section{GSS} +The GSS module (\texttt{glite-lbjp-common-gss}) provides GSS functions (GSS-API\footnote{\url{http://tools.ietf.org/html/rfc2744}} and several non-GSS Globus calls) wrapped to a secure network communication library with strict timing control (via timeout arguments) of all remote operations. + +\section{gSOAP Plugin} +The GSS plugin for gSoap (\texttt{glite-lbjp-common-gsoap-plugin}) provides secured communication via GSS, as well as strict timing control of all operations through \texttt{glite-lbjp-common-gss}. + +\end{document} diff --git a/org.glite.lbjp-common.gss/project/version.properties b/org.glite.lbjp-common.gss/project/version.properties index 9a095ee..b349b40 100644 --- a/org.glite.lbjp-common.gss/project/version.properties +++ b/org.glite.lbjp-common.gss/project/version.properties @@ -1,3 +1,3 @@ # $Header$ -module.version=3.0.3 +module.version=3.0.4 module.age=1 diff --git a/org.glite.lbjp-common.gss/src/glite_gss.c b/org.glite.lbjp-common.gss/src/glite_gss.c index db0fdb8..7fada9d 100644 --- a/org.glite.lbjp-common.gss/src/glite_gss.c +++ b/org.glite.lbjp-common.gss/src/glite_gss.c @@ -61,6 +61,9 @@ struct asyn_result { static int globus_common_activated = 0; +static void free_hostent(struct hostent *h); +static int try_conn_and_auth (edg_wll_GssCred cred, char const *hostname, char *addr, int addrtype, int port, struct timeval *timeout, edg_wll_GssConnection *connection, + edg_wll_GssStatus* gss_code); static int decrement_timeout(struct timeval *timeout, struct timeval before, struct timeval after) { (*timeout).tv_sec = (*timeout).tv_sec - (after.tv_sec - before.tv_sec); @@ -81,31 +84,40 @@ static void callback_ares_gethostbyname(void *arg, int status, struct hostent *h #endif { struct asyn_result *arp = (struct asyn_result *) arg; + int n_addr = 0; + int i = 0; switch (status) { case ARES_SUCCESS: - if (h && h->h_addr_list[0]) { - arp->ent->h_addr_list = - (char **) malloc(2 * sizeof(char *)); - if (arp->ent->h_addr_list == NULL) { - arp->err = NETDB_INTERNAL; - break; - } - arp->ent->h_addr_list[0] = - malloc(h->h_length); - if (arp->ent->h_addr_list[0] == NULL) { - free(arp->ent->h_addr_list); + if (h == NULL || h->h_addr_list[0] == NULL){ + arp->err = NO_DATA; + break; + } + /*how many addresses are there in h->h_addr_list*/ + while (h->h_addr_list[n_addr]) + n_addr++; + + arp->ent->h_addr_list = (char **) calloc((n_addr+1), sizeof(char *)); + if (arp->ent->h_addr_list == NULL) { + arp->err = NETDB_INTERNAL; + break; + } + for (i = 0; i < n_addr; i++) { + arp->ent->h_addr_list[i] = malloc(h->h_length); + if (arp->ent->h_addr_list[i] == NULL) { + free_hostent (arp->ent); + arp->ent = NULL; arp->err = NETDB_INTERNAL; break; } - memcpy(arp->ent->h_addr_list[0], h->h_addr_list[0], + memcpy(arp->ent->h_addr_list[i], h->h_addr_list[i], h->h_length); - arp->ent->h_addr_list[1] = NULL; + } + /* rest of h members might be assigned here(name,aliases), not necessery now */ + arp->ent->h_addr_list[n_addr] = NULL; arp->ent->h_addrtype = h->h_addrtype; + arp->ent->h_length = h->h_length; arp->err = NETDB_SUCCESS; - } else { - arp->err = NO_DATA; - } break; case ARES_EBADNAME: case ARES_ENOTFOUND: @@ -139,8 +151,7 @@ static void free_hostent(struct hostent *h){ } } -static int asyn_getservbyname2(int af, struct sockaddr_storage *addrOut, socklen_t *a_len,char const *name, int port, struct timeval *timeout) { - struct asyn_result ar; +static int asyn_getservbyname(int af, struct asyn_result *ar,char const *name, int port, struct timeval *timeout) { ares_channel channel; int nfds; fd_set readers, writers; @@ -150,7 +161,7 @@ static int asyn_getservbyname2(int af, struct sockaddr_storage *addrOut, socklen char *name2, *p; size_t namelen; - name2 = name; + name2 = (char *)name; namelen = strlen(name); if (name[0]=='[' && name[namelen-1]==']') { /* IPv6 literal, strip brackets */ @@ -168,11 +179,10 @@ static int asyn_getservbyname2(int af, struct sockaddr_storage *addrOut, socklen /* ares init */ if ( ares_init(&channel) != ARES_SUCCESS ) return(NETDB_INTERNAL); - ar.ent = (struct hostent *) calloc (sizeof(*ar.ent),1); /* query DNS server asynchronously */ ares_gethostbyname(channel, name2, af, callback_ares_gethostbyname, - (void *) &ar); + (void *) ar); /* wait for result */ while (1) { @@ -185,7 +195,6 @@ static int asyn_getservbyname2(int af, struct sockaddr_storage *addrOut, socklen gettimeofday(&check_time,0); if (timeout && decrement_timeout(timeout, start_time, check_time)) { ares_destroy(channel); - free_hostent(ar.ent); return(TRY_AGAIN); } start_time = check_time; @@ -195,7 +204,6 @@ static int asyn_getservbyname2(int af, struct sockaddr_storage *addrOut, socklen switch ( select(nfds, &readers, &writers, NULL, tvp) ) { case -1: if (errno != EINTR) { ares_destroy(channel); - free_hostent(ar.ent); return NETDB_INTERNAL; } else continue; @@ -206,31 +214,7 @@ static int asyn_getservbyname2(int af, struct sockaddr_storage *addrOut, socklen default: ares_process(channel, &readers, &writers); } } - - if (ar.err == NETDB_SUCCESS) { - struct sockaddr_in *p4 = (struct sockaddr_in *)addrOut; - struct sockaddr_in6 *p6 = (struct sockaddr_in6 *)addrOut; - - memset(addrOut, 0, sizeof *addrOut); - addrOut->ss_family = ar.ent->h_addrtype; - switch (ar.ent->h_addrtype) { - case AF_INET: - memcpy(&p4->sin_addr,ar.ent->h_addr_list[0], sizeof(struct in_addr)); - p4->sin_port = htons(port); - *a_len = sizeof (struct sockaddr_in); - break; - case AF_INET6: - memcpy(&p6->sin6_addr,ar.ent->h_addr_list[0], sizeof(struct in6_addr)); - p6->sin6_port = htons(port); - *a_len = sizeof (struct sockaddr_in6); - break; - default: - return NETDB_INTERNAL; - break; - } - } - free_hostent(ar.ent); ar.ent = NULL; - err = ar.err; + err = ar->err; /* literal conversion should always succeed */ if (name2 != name) free(name2-1); @@ -240,44 +224,38 @@ static int asyn_getservbyname2(int af, struct sockaddr_storage *addrOut, socklen return err; } -static int asyn_getservbyname(struct sockaddr_storage *addrOut, socklen_t *a_len,char const *name, int port, struct timeval *timeout) { - int res; - - res = asyn_getservbyname2(AF_INET6, addrOut, a_len, name, port, timeout); - if (res != HOST_NOT_FOUND) return res; - res = asyn_getservbyname2(AF_INET, addrOut, a_len, name, port, timeout); - return res; -} - static int -do_connect(int *s, char const *hostname, int port, struct timeval *timeout) +do_connect(int *s, char *addr, int addrtype, int port, struct timeval *timeout) { int sock; struct timeval before,after,to; struct sockaddr_storage a; + struct sockaddr_storage *p_a=&a; socklen_t a_len; int sock_err; socklen_t err_len; - int h_errno; int opt; - /* XXX todo: try multiple addresses */ - switch (h_errno = asyn_getservbyname(&a, &a_len, hostname, port, timeout)) { - case NETDB_SUCCESS: - break; - case TRY_AGAIN: - close(sock); - return EDG_WLL_GSS_ERROR_TIMEOUT; - case NETDB_INTERNAL: - /* fall through */ - default: - close(sock); - /* h_errno may be thread safe with Linux pthread libs, - * but such an assumption is not portable - */ - errno = h_errno; - return EDG_WLL_GSS_ERROR_HERRNO; - } + struct sockaddr_in *p4 = (struct sockaddr_in *)p_a; + struct sockaddr_in6 *p6 = (struct sockaddr_in6 *)p_a; + + memset(p_a, 0, sizeof *p_a); + p_a->ss_family = addrtype; + switch (addrtype) { + case AF_INET: + memcpy(&p4->sin_addr, addr, sizeof(struct in_addr)); + p4->sin_port = htons(port); + a_len = sizeof (struct sockaddr_in); + break; + case AF_INET6: + memcpy(&p6->sin6_addr, addr, sizeof(struct in6_addr)); + p6->sin6_port = htons(port); + a_len = sizeof (struct sockaddr_in6); + break; + default: + return NETDB_INTERNAL; + break; + } sock = socket(a.ss_family, SOCK_STREAM, 0); if (sock < 0) return EDG_WLL_GSS_ERROR_ERRNO; @@ -303,6 +281,7 @@ do_connect(int *s, char const *hostname, int port, struct timeval *timeout) case -1: close(sock); return EDG_WLL_GSS_ERROR_ERRNO; case 0: close(sock); + tv_sub(*timeout, *timeout); return EDG_WLL_GSS_ERROR_TIMEOUT; } gettimeofday(&after,NULL); @@ -544,6 +523,9 @@ destroy_proxy(char *proxy_file) return 0; } +/** Load or reload credentials. It should be called regularly (credential files can be changed). + @see edg_wll_gss_watch_creds + */ int edg_wll_gss_acquire_cred_gsi(const char *cert_file, const char *key_file, edg_wll_GssCred *cred, edg_wll_GssStatus* gss_code) @@ -656,18 +638,6 @@ end: return ret; } - -/* XXX XXX This is black magic. "Sometimes" server refuses the client with SSL - * * alert "certificate expired" even if it is not true. In this case the server - * * slave terminates (which helps, usually), and we can reconnect transparently. - * */ - -/* This string appears in the error message in this case */ -#define _EXPIRED_ALERT_MESSAGE "function SSL3_READ_BYTES: sslv3 alert certificate expired" -#define _EXPIRED_ALERT_RETRY_COUNT 10 /* default number of slaves, hope that not all - are in the bad state */ -#define _EXPIRED_ALERT_RETRY_DELAY 10 /* ms */ - /* XXX XXX This is black magic. "Sometimes" server refuses the client with SSL * * alert "certificate expired" even if it is not true. In this case the server * * slave terminates (which helps, usually), and we can reconnect transparently. @@ -679,12 +649,72 @@ end: are in the bad state */ #define _EXPIRED_ALERT_RETRY_DELAY 10 /* ms */ +/** Create a socket and initiate secured connection. */ int edg_wll_gss_connect(edg_wll_GssCred cred, char const *hostname, int port, struct timeval *timeout, edg_wll_GssConnection *connection, edg_wll_GssStatus* gss_code) { - int sock, ret; + int ret; + struct asyn_result ar; + int h_errno; + int addr_types[] = {AF_INET6, AF_INET}; + int ipver = AF_INET6; //def value; try IPv6 first + unsigned int j; + int i; + + memset(connection, 0, sizeof(*connection)); + for (j = 0; j< sizeof(addr_types)/sizeof(*addr_types); j++) { + ipver = addr_types[j]; + ar.ent = (struct hostent *) calloc (1, sizeof(struct hostent)); + switch (h_errno = asyn_getservbyname(ipver, &ar, hostname, port, timeout)) { + case NETDB_SUCCESS: + break; + case TRY_AGAIN: + ret = EDG_WLL_GSS_ERROR_TIMEOUT; + goto end; + case NETDB_INTERNAL: + errno = h_errno; + ret = EDG_WLL_GSS_ERROR_HERRNO; + goto end; + default: + /* h_errno may be thread safe with Linux pthread libs, + * but such an assumption is not portable + */ + errno = h_errno; + ret = EDG_WLL_GSS_ERROR_HERRNO; + continue; + } + + i = 0; + while (ar.ent->h_addr_list[i]) + { + ret = try_conn_and_auth (cred, hostname, ar.ent->h_addr_list[i], + ar.ent->h_addrtype, port, timeout, connection, gss_code); + if (ret == 0) + goto end; + if (timeout->tv_sec < 0 ||(timeout->tv_sec == 0 && timeout->tv_usec <= 0)) + goto end; + i++; + } + free_hostent(ar.ent); + ar.ent = NULL; + } + + end: + if (ar.ent != NULL){ + free_hostent(ar.ent); + ar.ent = NULL; + } + return ret; +} + +/* try connection and authentication for the given addr*/ +static int try_conn_and_auth (edg_wll_GssCred cred, char const *hostname, char *addr, int addrtype, int port, struct timeval *timeout, edg_wll_GssConnection *connection, + edg_wll_GssStatus* gss_code) +{ + int sock; + int ret = 0; OM_uint32 maj_stat, min_stat, min_stat2, req_flags; int context_established = 0; gss_buffer_desc input_token = GSS_C_EMPTY_BUFFER; @@ -695,12 +725,11 @@ edg_wll_gss_connect(edg_wll_GssCred cred, char const *hostname, int port, int retry = _EXPIRED_ALERT_RETRY_COUNT; maj_stat = min_stat = min_stat2 = req_flags = 0; - memset(connection, 0, sizeof(*connection)); /* GSI specific */ req_flags = GSS_C_GLOBUS_SSL_COMPATIBLE; - ret = do_connect(&sock, hostname, port, timeout); + ret = do_connect(&sock, addr, addrtype, port, timeout); if (ret) return ret; @@ -722,6 +751,7 @@ edg_wll_gss_connect(edg_wll_GssCred cred, char const *hostname, int port, } free(servername); + servername = NULL; memset(&input_token, 0, sizeof(input_token)); /* XXX if cred == GSS_C_NO_CREDENTIAL set the ANONYMOUS flag */ @@ -795,7 +825,6 @@ edg_wll_gss_connect(edg_wll_GssCred cred, char const *hostname, int port, connection->sock = sock; connection->context = context; - servername = NULL; ret = 0; end: @@ -805,7 +834,7 @@ end: } if (server != GSS_C_NO_NAME) gss_release_name(&min_stat2, &server); - if (servername == NULL) + if (servername != NULL) free(servername); if (ret) close(sock); @@ -813,6 +842,7 @@ end: return ret; } +/** Accept a new secured connection on the listening socket. */ int edg_wll_gss_accept(edg_wll_GssCred cred, int sock, struct timeval *timeout, edg_wll_GssConnection *connection, edg_wll_GssStatus* gss_code) @@ -898,6 +928,7 @@ end: return ret; } +/** Send data over the opened connection. */ int edg_wll_gss_write(edg_wll_GssConnection *connection, const void *buf, size_t bufsize, struct timeval *timeout, edg_wll_GssStatus* gss_code) @@ -929,6 +960,7 @@ edg_wll_gss_write(edg_wll_GssConnection *connection, const void *buf, size_t buf } +/** Read a data chunk through the opened connection. */ int edg_wll_gss_read(edg_wll_GssConnection *connection, void *buf, size_t bufsize, struct timeval *timeout, edg_wll_GssStatus* gss_code) @@ -994,6 +1026,7 @@ end: return ret; } +/** Read data from the opened connection, repeat reading up to 'bufsize' or end of the stream. */ int edg_wll_gss_read_full(edg_wll_GssConnection *connection, void *buf, size_t bufsize, struct timeval *timeout, size_t *total, @@ -1028,6 +1061,7 @@ edg_wll_gss_read_full(edg_wll_GssConnection *connection, void *buf, return 0; } +/** Send data over the opened connection. */ int edg_wll_gss_write_full(edg_wll_GssConnection *connection, const void *buf, size_t bufsize, struct timeval *timeout, size_t *total, @@ -1036,7 +1070,7 @@ edg_wll_gss_write_full(edg_wll_GssConnection *connection, const void *buf, return edg_wll_gss_write(connection, buf, bufsize, timeout, gss_code); } -/* Request credential reload each 60 seconds in order to work around +/** Request credential reload each 60 seconds in order to work around * Globus bug (not reloading expired CRLs) */ #define GSS_CRED_WATCH_LIMIT 60 @@ -1064,12 +1098,13 @@ edg_wll_gss_watch_creds(const char *proxy_file, time_t *last_time) return 0; } +/** Close the connection. */ int edg_wll_gss_close(edg_wll_GssConnection *con, struct timeval *timeout) { OM_uint32 min_stat; gss_buffer_desc output_token = GSS_C_EMPTY_BUFFER; - struct timeval def_timeout = { 0, 100000}; + /*struct timeval def_timeout = { 0, 100000};*/ if (con->context != GSS_C_NO_CONTEXT) { gss_delete_sec_context(&min_stat, (gss_ctx_id_t *)&con->context, &output_token); @@ -1099,6 +1134,7 @@ edg_wll_gss_close(edg_wll_GssConnection *con, struct timeval *timeout) return 0; } +/** Get error details. */ int edg_wll_gss_get_error(edg_wll_GssStatus *gss_err, const char *prefix, char **msg) { @@ -1167,6 +1203,10 @@ edg_wll_gss_reject(int sock) } +/** + * Initialize routine of glite gss module. + * It activates globus modules, and it should be called before using other gss routines. + */ int edg_wll_gss_initialize(void) { @@ -1184,6 +1224,10 @@ edg_wll_gss_initialize(void) } +/** + * Clean up routine of gss module. + * It can be called after using gss routines to free initializeted resources. + */ void edg_wll_gss_finalize(void) { @@ -1195,6 +1239,9 @@ edg_wll_gss_finalize(void) } +/** + * Release the acquired credentials. + */ int edg_wll_gss_release_cred(edg_wll_GssCred *cred, edg_wll_GssStatus* gss_code) { @@ -1227,6 +1274,9 @@ edg_wll_gss_release_cred(edg_wll_GssCred *cred, edg_wll_GssStatus* gss_code) return ret; } +/** + * Get information about the the connection - principal (display name). + */ int edg_wll_gss_get_client_conn(edg_wll_GssConnection *connection, edg_wll_GssPrincipal *principal, @@ -1393,6 +1443,9 @@ end: return ret; } +/** + * Get information about the the connection - pem string. + */ int edg_wll_gss_get_client_pem(edg_wll_GssConnection *connection, const char *my_cert_file, const char *my_key_file, @@ -1460,6 +1513,9 @@ end: return ret; } +/** + * Free the principal. + */ void edg_wll_gss_free_princ(edg_wll_GssPrincipal principal) { @@ -1472,6 +1528,9 @@ edg_wll_gss_free_princ(edg_wll_GssPrincipal principal) free(principal); } +/** + * Get the hostname (using globus call if possible, or system's gethostbyname() if globus is not initialized). + */ int edg_wll_gss_gethostname(char *name, int len) { @@ -1485,6 +1544,9 @@ edg_wll_gss_gethostname(char *name, int len) return ret; } +/** + * Normalize subject name (stripping email address, /CN=proxy, ...). + */ char * edg_wll_gss_normalize_subj(char *in, int replace_in) { @@ -1511,6 +1573,9 @@ edg_wll_gss_normalize_subj(char *in, int replace_in) return new; } +/** + * Compare subject names. + */ int edg_wll_gss_equal_subj(const char *a, const char *b) { @@ -1523,12 +1588,15 @@ edg_wll_gss_equal_subj(const char *a, const char *b) if (!an || !bn) res = 0; else - res = !strcmp(an,bn); + res = !strcasecmp(an,bn); free(an); free(bn); return res; } +/** + * Return data to the reading buffer. + */ int edg_wll_gss_unread(edg_wll_GssConnection *con, void *data, size_t len) { @@ -1553,14 +1621,23 @@ edg_wll_gss_unread(edg_wll_GssConnection *con, void *data, size_t len) } +/** + * Signal handler compatible with globus. + * It is required to use this function instead of sigaction(), when using threaded globus flavour. + * + * As for many other gss routenes, edg_wll_initialize() must be called before using this routine. + * edg_wll_gss_set_signal_handler() will falback to sigaction() if gss is not initialized. + * + * @see edg_wll_initialize + */ int edg_wll_gss_set_signal_handler(int signum, void (*handler_func)(int)) { int ret; + intptr_t signum2; - ret = globus_module_activate(GLOBUS_COMMON_MODULE); - if (ret != GLOBUS_SUCCESS) { + if (!globus_common_activated) { struct sigaction sa,osa; memset(&sa, 0, sizeof(sa)); @@ -1569,13 +1646,23 @@ edg_wll_gss_set_signal_handler(int signum, ret = sigaction(signum, &sa, &osa); return ret; } + + signum2 = signum; ret = globus_callback_space_register_signal_handler(signum, GLOBUS_TRUE, (globus_callback_func_t)handler_func, - (void *)signum, + (void *)signum2, GLOBUS_CALLBACK_GLOBAL_SPACE); - globus_module_deactivate(GLOBUS_COMMON_MODULE); - return ret; } + + +/** + * Check posix signals and performs signal handlers eventually. + * Required when using non-threaded globus flavour. + */ +void +edg_wll_gss_poll_signal() { + globus_poll_nonblocking(); +} diff --git a/org.glite.lbjp-common.jp-interface/configure b/org.glite.lbjp-common.jp-interface/configure index 27f197c..e2b3330 100755 --- a/org.glite.lbjp-common.jp-interface/configure +++ b/org.glite.lbjp-common.jp-interface/configure @@ -248,6 +248,10 @@ $externs{'mysql-server'}{prefix}=$externs{mysql}{prefix} if $externs{'mysql-serv $externs{'mysql-devel'}{prefix}=$externs{mysql}{prefix} if $externs{'mysql-devel'}{prefix} eq ''; $externs{'gsoapxx'}{prefix}=$externs{gsoap}{prefix} if $externs{'gsoapxx'}{prefix} eq ''; +$externs{'mysql-server'}{withprefix}=$externs{mysql}{withprefix} if $externs{'mysql-server'}{withprefix} eq ''; +$externs{'mysql-devel'}{wihtprefix}=$externs{mysql}{withprefix} if $externs{'mysql-devel'}{withprefix} eq ''; +$externs{'gsoapxx'}{withprefix}=$externs{gsoap}{withprefix} if $externs{'gsoapxx'}{withprefix} eq ''; + %project = %{$projects{$project}}; for $_ (keys %{$project{etics_externs}}) { $etics_externs{$_} = $project{etics_externs}{$_}; @@ -423,7 +427,9 @@ sub mode_build { open MAK,">Makefile" or die "Makefile: $!\n"; - print MAK "all: @modules\n\nclean check:\n"; + print MAK "all: @modules\n\n"; + print MAK "stage: ".(join '-stage ', @modules)."-stage\n\n"; + print MAK "clean check install:\n"; for (@modules) { my $full = full($_); @@ -446,11 +452,13 @@ sub mode_build { @ldeps{@{$deps{$_}}} = 1; for my $x (split /,/,$staged) { delete $ldeps{$x}; } my @dnames = $module ? () : keys %ldeps; + my $snames = $#dnames == -1 ? '' : join('-stage ', @dnames).'-stage'; my $full = full($_); my $build = $buildroot{$_}; print MAK "$_: @dnames\n\tcd $full/$build && \${MAKE} && \${MAKE} install\n\n"; + print MAK "$_-stage: $snames\n\tcd $full/$build && \${MAKE} && \${MAKE} stage\n\n"; } close MAK; @@ -523,7 +531,7 @@ BEGIN{ 'lb.doc' => [ qw/tetex-latex:B/ ], 'lb.logger' => [ qw/cppunit:B libtool:B/ ], 'lb.logger-msg' => [ qw/cppunit:B activemq libtool:B/ ], - 'lb.server' => [ qw/globus_essentials:R globus:B expat cares mysql:R mysql-server:R mysql-devel:B cppunit:B gsoap:B classads voms lcas gridsite bison:B libtool:B libxml2/ ], + 'lb.server' => [ qw/globus_essentials:R globus:B expat cares mysql:R mysql-server:R mysql-devel:B cppunit:B gsoap:B classads voms lcas gridsite bison:B libtool:B libxml2 flex:B/ ], 'lb.state-machine' => [ qw/classads libtool:B libxslt:B expat:B/ ], 'lb.utils' => [ qw/cppunit:B libtool:B/ ], 'lb.ws-interface' => [ qw/libxslt:B/ ], @@ -539,7 +547,7 @@ BEGIN{ 'lbjp-common.gss' => [ qw/globus_essentials:R globus:B cares cppunit:B libtool:B/ ], 'lbjp-common.gsoap-plugin' => [ qw/cppunit:B globus_essentials:R globus:B cares:B gsoap gsoapxx libtool:B/ ], 'jobid.api-c' => [ qw/cppunit:B libtool:B openssl:B/ ], - 'jobid.api-cpp' => [ qw/cppunit:B/ ], + 'jobid.api-cpp' => [ qw/cppunit:B libtool:B/ ], 'jobid.api-java' => [ qw/ant:B jdk:B/ ], 'jp.client' => [ qw/gsoap libtar globus_essentials:R globus:B/ ], 'jp.doc' => [], @@ -556,7 +564,7 @@ BEGIN{ 'gridsite.services' => [ qw/curl:R gsoap:R/ ], 'gridsite.service-clients' => [ qw/curl:R gsoap:R gsoapxx:R/ ], 'gridsite.gsexec' => [ qw// ], - 'px.proxyrenewal' => [ qw/globus:B globus_essentials:R myproxy-devel:B myproxy-libs:R voms libtool:R/ ], + 'px.proxyrenewal' => [ qw/globus:B globus_essentials:R myproxy-devel:B myproxy-libs:R voms libtool:B/ ], 'px.myproxy-config' => [ qw/myproxy-admin:R/ ], # in myproxy-config.spec ); @@ -716,10 +724,11 @@ for my $ext (keys %deps_aux) { ); %conflicts = ( - 'lb.glite-LB' => [ qq/emi-lb/ ], - 'px.glite-PX' => [ qq/emi-px/ ], - 'lb.emi-lb' => [ qq/glite-LB/ ], - 'px.emi-px' => [ qq/glite-PX/ ], +); + +%provides = ( + 'lbjp-common.gss' => [ qq/glite-security-gss/ ], + 'lbjp-common.gsoap-plugin' => [ qq/glite-security-gsoap-plugin/ ], ); %cvs_prefix = ( @@ -815,7 +824,6 @@ for my $ext (keys %deps_aux) { gridsite=>'emi.gridsite.shared', yaim_core=>'emi.yaim.yaim-core', yaim_bdii=>'emi.bdii.yaim-bdii', - gip_release=>'emi.bdii.glite-info-provider-release', gip_service=>'emi.bdii.glite-info-provider-service', bdii=>'emi.bdii.core', glite_version=>'emi.misc.glite-version', @@ -845,11 +853,11 @@ for my $ext (keys %deps_aux) { jdk=>'java-devel', }, etics_projects => { - 'emi'=>[qw/voms voms-devel gridsite lcas gip_release gip_service bdii glite_version glue_schema yaim_core yaim_bdii trustmanager trustmanager_axis/], + 'emi'=>[qw/voms voms-devel gridsite lcas gip_service bdii glite_version glue_schema yaim_core yaim_bdii trustmanager trustmanager_axis/], }, need_externs_aux => { 'lb.client-java' => [ qw/ant:B jdk:B axis:B trustmanager trustmanager_axis libtool:B/ ], - 'lb.glite-LB' => [ qw/fetchcrl:R gip_release:R gip_service:R bdii:R glite_version:R glue_schema:R/ ], + 'lb.glite-LB' => [ qw/fetchcrl:R gip_service:R bdii:R glite_version:R glue_schema:R/ ], 'lb.yaim' => [ qw/yaim_core:R yaim_bdii:R perl-LDAP:R/ ], 'px.glite-PX' => [qw/myproxy-server:R myproxy-admin:R fetchcrl:R gip_service:R bdii:R glite_version:R glue_schema:R/], 'px.myproxy-yaim' => [ qw/yaim_core:R yaim_bdii:R/ ], @@ -1129,18 +1137,18 @@ sub mode_etics { if ($project ne 'glite') { $flags = 'RELEASE_VERSION=${age}.${platformFamily} libdir=${libdir} GSOAPDIR=`pkg-config gsoap --variable=prefix` OPENSSL_GLOBUS_FLAGS=`pkg-config globus-openssl --cflags` OPENSSL_GLOBUS_LIBS=`pkg-config globus-openssl --libs` FLAVOR_GLOBUS_EXT= HTTPD_FLAGS="-I/usr/include/httpd -I/usr/include/apache2 -I/usr/include/apr-${aprSuffix} -I/usr/include/pcre"'; - $prefix = "prefix=${prefix}/usr"; + $prefix = 'prefix=${prefix}/usr'; } else { $flags = 'RELEASE_VERSION=${age}.${platformFamily} libdir=${libdir} GSOAPDIR=${gsoap.location} OPENSSL_GLOBUS_FLAGS=-I${globus.location}/include/${globus.dbg.nothr.flavor} OPENSSL_GLOBUS_LIBS=-L${globus.location}/${libdir}/ FLAVOR_GLOBUS_EXT=_${globus.dbg.nothr.flavor} HTTPD_FLAGS="-I${httpd-devel.location}/include/httpd -I${httpd-devel.location}/include/apache2 -I${httpd-devel.location}/include/apr-${aprSuffix} -I${httpd-devel.location}/include/pcre"'; - $prefix = "prefix=${prefix}"; + $prefix = 'prefix=${prefix}'; } $cmd{compile} = "echo 'make $flags' > build.sh\n\tmake $flags build"; $cmd{clean} = "rm -rvf build.sh; $cmd{clean}"; $cmd{install} = "make $prefix $flags install"; - $cmd{packaging} = "mkdir ${moduleDir}/src/tgz + $cmd{packaging} = "mkdir \${moduleDir}/RPMTMP/SOURCES \${moduleDir}/src/tgz make $prefix $flags rpm && \ - cp ${moduleDir}/RPMTMP/SOURCES/gridsite-${version}.src.tar.gz ${moduleDir}/src/tgz"; + cp \${moduleDir}/RPMTMP/SOURCES/gridsite-\${version}.src.tar.gz \${moduleDir}/src/tgz"; } else { $cmd{clean} = 'None'; @@ -1218,6 +1226,9 @@ $package_description$package_summary$defprops}; for (@{$conflicts{"$subsys.$module"}}) { print C "package.conflicts = $_\n"; } + for (@{$provides{"$subsys.$module"}}) { + print C "package.provides = $_\n"; + } for my $pp (keys %{$platform_properties{"$subsys.$module"}}) { next if $pp eq 'default'; diff --git a/org.glite.lbjp-common.jp-interface/project/ChangeLog b/org.glite.lbjp-common.jp-interface/project/ChangeLog index 15a19cc..f4e1b71 100644 --- a/org.glite.lbjp-common.jp-interface/project/ChangeLog +++ b/org.glite.lbjp-common.jp-interface/project/ChangeLog @@ -41,6 +41,9 @@ 2.0.3-3 - Module rebuilt +2.0.3-4 +- Module rebuilt + 2.1.0-1 - Fixes for parallel release in EMI & gLite @@ -71,3 +74,6 @@ 2.1.2-6 - Module rebuilt +2.1.2-7 +- Module rebuilt + diff --git a/org.glite.lbjp-common.jp-interface/project/version.properties b/org.glite.lbjp-common.jp-interface/project/version.properties index 3ec1e5f..43d3922 100644 --- a/org.glite.lbjp-common.jp-interface/project/version.properties +++ b/org.glite.lbjp-common.jp-interface/project/version.properties @@ -1,3 +1,3 @@ #: /cvs/jra1mw/org.glite.lbjp-common.jp-interface/project/version.properties,v 1.1.1.1 2009/01/21 14:43:52 zsustr Exp $ module.version=2.1.2 -module.age=6 +module.age=7 diff --git a/org.glite.lbjp-common.maildir/configure b/org.glite.lbjp-common.maildir/configure index 27f197c..e2b3330 100755 --- a/org.glite.lbjp-common.maildir/configure +++ b/org.glite.lbjp-common.maildir/configure @@ -248,6 +248,10 @@ $externs{'mysql-server'}{prefix}=$externs{mysql}{prefix} if $externs{'mysql-serv $externs{'mysql-devel'}{prefix}=$externs{mysql}{prefix} if $externs{'mysql-devel'}{prefix} eq ''; $externs{'gsoapxx'}{prefix}=$externs{gsoap}{prefix} if $externs{'gsoapxx'}{prefix} eq ''; +$externs{'mysql-server'}{withprefix}=$externs{mysql}{withprefix} if $externs{'mysql-server'}{withprefix} eq ''; +$externs{'mysql-devel'}{wihtprefix}=$externs{mysql}{withprefix} if $externs{'mysql-devel'}{withprefix} eq ''; +$externs{'gsoapxx'}{withprefix}=$externs{gsoap}{withprefix} if $externs{'gsoapxx'}{withprefix} eq ''; + %project = %{$projects{$project}}; for $_ (keys %{$project{etics_externs}}) { $etics_externs{$_} = $project{etics_externs}{$_}; @@ -423,7 +427,9 @@ sub mode_build { open MAK,">Makefile" or die "Makefile: $!\n"; - print MAK "all: @modules\n\nclean check:\n"; + print MAK "all: @modules\n\n"; + print MAK "stage: ".(join '-stage ', @modules)."-stage\n\n"; + print MAK "clean check install:\n"; for (@modules) { my $full = full($_); @@ -446,11 +452,13 @@ sub mode_build { @ldeps{@{$deps{$_}}} = 1; for my $x (split /,/,$staged) { delete $ldeps{$x}; } my @dnames = $module ? () : keys %ldeps; + my $snames = $#dnames == -1 ? '' : join('-stage ', @dnames).'-stage'; my $full = full($_); my $build = $buildroot{$_}; print MAK "$_: @dnames\n\tcd $full/$build && \${MAKE} && \${MAKE} install\n\n"; + print MAK "$_-stage: $snames\n\tcd $full/$build && \${MAKE} && \${MAKE} stage\n\n"; } close MAK; @@ -523,7 +531,7 @@ BEGIN{ 'lb.doc' => [ qw/tetex-latex:B/ ], 'lb.logger' => [ qw/cppunit:B libtool:B/ ], 'lb.logger-msg' => [ qw/cppunit:B activemq libtool:B/ ], - 'lb.server' => [ qw/globus_essentials:R globus:B expat cares mysql:R mysql-server:R mysql-devel:B cppunit:B gsoap:B classads voms lcas gridsite bison:B libtool:B libxml2/ ], + 'lb.server' => [ qw/globus_essentials:R globus:B expat cares mysql:R mysql-server:R mysql-devel:B cppunit:B gsoap:B classads voms lcas gridsite bison:B libtool:B libxml2 flex:B/ ], 'lb.state-machine' => [ qw/classads libtool:B libxslt:B expat:B/ ], 'lb.utils' => [ qw/cppunit:B libtool:B/ ], 'lb.ws-interface' => [ qw/libxslt:B/ ], @@ -539,7 +547,7 @@ BEGIN{ 'lbjp-common.gss' => [ qw/globus_essentials:R globus:B cares cppunit:B libtool:B/ ], 'lbjp-common.gsoap-plugin' => [ qw/cppunit:B globus_essentials:R globus:B cares:B gsoap gsoapxx libtool:B/ ], 'jobid.api-c' => [ qw/cppunit:B libtool:B openssl:B/ ], - 'jobid.api-cpp' => [ qw/cppunit:B/ ], + 'jobid.api-cpp' => [ qw/cppunit:B libtool:B/ ], 'jobid.api-java' => [ qw/ant:B jdk:B/ ], 'jp.client' => [ qw/gsoap libtar globus_essentials:R globus:B/ ], 'jp.doc' => [], @@ -556,7 +564,7 @@ BEGIN{ 'gridsite.services' => [ qw/curl:R gsoap:R/ ], 'gridsite.service-clients' => [ qw/curl:R gsoap:R gsoapxx:R/ ], 'gridsite.gsexec' => [ qw// ], - 'px.proxyrenewal' => [ qw/globus:B globus_essentials:R myproxy-devel:B myproxy-libs:R voms libtool:R/ ], + 'px.proxyrenewal' => [ qw/globus:B globus_essentials:R myproxy-devel:B myproxy-libs:R voms libtool:B/ ], 'px.myproxy-config' => [ qw/myproxy-admin:R/ ], # in myproxy-config.spec ); @@ -716,10 +724,11 @@ for my $ext (keys %deps_aux) { ); %conflicts = ( - 'lb.glite-LB' => [ qq/emi-lb/ ], - 'px.glite-PX' => [ qq/emi-px/ ], - 'lb.emi-lb' => [ qq/glite-LB/ ], - 'px.emi-px' => [ qq/glite-PX/ ], +); + +%provides = ( + 'lbjp-common.gss' => [ qq/glite-security-gss/ ], + 'lbjp-common.gsoap-plugin' => [ qq/glite-security-gsoap-plugin/ ], ); %cvs_prefix = ( @@ -815,7 +824,6 @@ for my $ext (keys %deps_aux) { gridsite=>'emi.gridsite.shared', yaim_core=>'emi.yaim.yaim-core', yaim_bdii=>'emi.bdii.yaim-bdii', - gip_release=>'emi.bdii.glite-info-provider-release', gip_service=>'emi.bdii.glite-info-provider-service', bdii=>'emi.bdii.core', glite_version=>'emi.misc.glite-version', @@ -845,11 +853,11 @@ for my $ext (keys %deps_aux) { jdk=>'java-devel', }, etics_projects => { - 'emi'=>[qw/voms voms-devel gridsite lcas gip_release gip_service bdii glite_version glue_schema yaim_core yaim_bdii trustmanager trustmanager_axis/], + 'emi'=>[qw/voms voms-devel gridsite lcas gip_service bdii glite_version glue_schema yaim_core yaim_bdii trustmanager trustmanager_axis/], }, need_externs_aux => { 'lb.client-java' => [ qw/ant:B jdk:B axis:B trustmanager trustmanager_axis libtool:B/ ], - 'lb.glite-LB' => [ qw/fetchcrl:R gip_release:R gip_service:R bdii:R glite_version:R glue_schema:R/ ], + 'lb.glite-LB' => [ qw/fetchcrl:R gip_service:R bdii:R glite_version:R glue_schema:R/ ], 'lb.yaim' => [ qw/yaim_core:R yaim_bdii:R perl-LDAP:R/ ], 'px.glite-PX' => [qw/myproxy-server:R myproxy-admin:R fetchcrl:R gip_service:R bdii:R glite_version:R glue_schema:R/], 'px.myproxy-yaim' => [ qw/yaim_core:R yaim_bdii:R/ ], @@ -1129,18 +1137,18 @@ sub mode_etics { if ($project ne 'glite') { $flags = 'RELEASE_VERSION=${age}.${platformFamily} libdir=${libdir} GSOAPDIR=`pkg-config gsoap --variable=prefix` OPENSSL_GLOBUS_FLAGS=`pkg-config globus-openssl --cflags` OPENSSL_GLOBUS_LIBS=`pkg-config globus-openssl --libs` FLAVOR_GLOBUS_EXT= HTTPD_FLAGS="-I/usr/include/httpd -I/usr/include/apache2 -I/usr/include/apr-${aprSuffix} -I/usr/include/pcre"'; - $prefix = "prefix=${prefix}/usr"; + $prefix = 'prefix=${prefix}/usr'; } else { $flags = 'RELEASE_VERSION=${age}.${platformFamily} libdir=${libdir} GSOAPDIR=${gsoap.location} OPENSSL_GLOBUS_FLAGS=-I${globus.location}/include/${globus.dbg.nothr.flavor} OPENSSL_GLOBUS_LIBS=-L${globus.location}/${libdir}/ FLAVOR_GLOBUS_EXT=_${globus.dbg.nothr.flavor} HTTPD_FLAGS="-I${httpd-devel.location}/include/httpd -I${httpd-devel.location}/include/apache2 -I${httpd-devel.location}/include/apr-${aprSuffix} -I${httpd-devel.location}/include/pcre"'; - $prefix = "prefix=${prefix}"; + $prefix = 'prefix=${prefix}'; } $cmd{compile} = "echo 'make $flags' > build.sh\n\tmake $flags build"; $cmd{clean} = "rm -rvf build.sh; $cmd{clean}"; $cmd{install} = "make $prefix $flags install"; - $cmd{packaging} = "mkdir ${moduleDir}/src/tgz + $cmd{packaging} = "mkdir \${moduleDir}/RPMTMP/SOURCES \${moduleDir}/src/tgz make $prefix $flags rpm && \ - cp ${moduleDir}/RPMTMP/SOURCES/gridsite-${version}.src.tar.gz ${moduleDir}/src/tgz"; + cp \${moduleDir}/RPMTMP/SOURCES/gridsite-\${version}.src.tar.gz \${moduleDir}/src/tgz"; } else { $cmd{clean} = 'None'; @@ -1218,6 +1226,9 @@ $package_description$package_summary$defprops}; for (@{$conflicts{"$subsys.$module"}}) { print C "package.conflicts = $_\n"; } + for (@{$provides{"$subsys.$module"}}) { + print C "package.provides = $_\n"; + } for my $pp (keys %{$platform_properties{"$subsys.$module"}}) { next if $pp eq 'default'; diff --git a/org.glite.lbjp-common.maildir/project/ChangeLog b/org.glite.lbjp-common.maildir/project/ChangeLog index ca047f5..9f40510 100644 --- a/org.glite.lbjp-common.maildir/project/ChangeLog +++ b/org.glite.lbjp-common.maildir/project/ChangeLog @@ -32,6 +32,9 @@ 2.0.2-3 - Module rebuilt +2.0.2-4 +- Module rebuilt + 2.1.0-1 - Fixes for parallel release in EMI & gLite @@ -62,3 +65,6 @@ 2.1.2-6 - Module rebuilt +2.1.2-7 +- Module rebuilt + diff --git a/org.glite.lbjp-common.maildir/project/version.properties b/org.glite.lbjp-common.maildir/project/version.properties index f3bede9..3afee53 100644 --- a/org.glite.lbjp-common.maildir/project/version.properties +++ b/org.glite.lbjp-common.maildir/project/version.properties @@ -1,3 +1,3 @@ # : /cvs/jra1mw/org.glite.lbjp-common.maildir/project/version.properties,v 1.1 2007/11/01 20:17:45 valtri Exp $ module.version=2.1.2 -module.age=6 +module.age=7 diff --git a/org.glite.lbjp-common.server-bones/configure b/org.glite.lbjp-common.server-bones/configure index 27f197c..e2b3330 100755 --- a/org.glite.lbjp-common.server-bones/configure +++ b/org.glite.lbjp-common.server-bones/configure @@ -248,6 +248,10 @@ $externs{'mysql-server'}{prefix}=$externs{mysql}{prefix} if $externs{'mysql-serv $externs{'mysql-devel'}{prefix}=$externs{mysql}{prefix} if $externs{'mysql-devel'}{prefix} eq ''; $externs{'gsoapxx'}{prefix}=$externs{gsoap}{prefix} if $externs{'gsoapxx'}{prefix} eq ''; +$externs{'mysql-server'}{withprefix}=$externs{mysql}{withprefix} if $externs{'mysql-server'}{withprefix} eq ''; +$externs{'mysql-devel'}{wihtprefix}=$externs{mysql}{withprefix} if $externs{'mysql-devel'}{withprefix} eq ''; +$externs{'gsoapxx'}{withprefix}=$externs{gsoap}{withprefix} if $externs{'gsoapxx'}{withprefix} eq ''; + %project = %{$projects{$project}}; for $_ (keys %{$project{etics_externs}}) { $etics_externs{$_} = $project{etics_externs}{$_}; @@ -423,7 +427,9 @@ sub mode_build { open MAK,">Makefile" or die "Makefile: $!\n"; - print MAK "all: @modules\n\nclean check:\n"; + print MAK "all: @modules\n\n"; + print MAK "stage: ".(join '-stage ', @modules)."-stage\n\n"; + print MAK "clean check install:\n"; for (@modules) { my $full = full($_); @@ -446,11 +452,13 @@ sub mode_build { @ldeps{@{$deps{$_}}} = 1; for my $x (split /,/,$staged) { delete $ldeps{$x}; } my @dnames = $module ? () : keys %ldeps; + my $snames = $#dnames == -1 ? '' : join('-stage ', @dnames).'-stage'; my $full = full($_); my $build = $buildroot{$_}; print MAK "$_: @dnames\n\tcd $full/$build && \${MAKE} && \${MAKE} install\n\n"; + print MAK "$_-stage: $snames\n\tcd $full/$build && \${MAKE} && \${MAKE} stage\n\n"; } close MAK; @@ -523,7 +531,7 @@ BEGIN{ 'lb.doc' => [ qw/tetex-latex:B/ ], 'lb.logger' => [ qw/cppunit:B libtool:B/ ], 'lb.logger-msg' => [ qw/cppunit:B activemq libtool:B/ ], - 'lb.server' => [ qw/globus_essentials:R globus:B expat cares mysql:R mysql-server:R mysql-devel:B cppunit:B gsoap:B classads voms lcas gridsite bison:B libtool:B libxml2/ ], + 'lb.server' => [ qw/globus_essentials:R globus:B expat cares mysql:R mysql-server:R mysql-devel:B cppunit:B gsoap:B classads voms lcas gridsite bison:B libtool:B libxml2 flex:B/ ], 'lb.state-machine' => [ qw/classads libtool:B libxslt:B expat:B/ ], 'lb.utils' => [ qw/cppunit:B libtool:B/ ], 'lb.ws-interface' => [ qw/libxslt:B/ ], @@ -539,7 +547,7 @@ BEGIN{ 'lbjp-common.gss' => [ qw/globus_essentials:R globus:B cares cppunit:B libtool:B/ ], 'lbjp-common.gsoap-plugin' => [ qw/cppunit:B globus_essentials:R globus:B cares:B gsoap gsoapxx libtool:B/ ], 'jobid.api-c' => [ qw/cppunit:B libtool:B openssl:B/ ], - 'jobid.api-cpp' => [ qw/cppunit:B/ ], + 'jobid.api-cpp' => [ qw/cppunit:B libtool:B/ ], 'jobid.api-java' => [ qw/ant:B jdk:B/ ], 'jp.client' => [ qw/gsoap libtar globus_essentials:R globus:B/ ], 'jp.doc' => [], @@ -556,7 +564,7 @@ BEGIN{ 'gridsite.services' => [ qw/curl:R gsoap:R/ ], 'gridsite.service-clients' => [ qw/curl:R gsoap:R gsoapxx:R/ ], 'gridsite.gsexec' => [ qw// ], - 'px.proxyrenewal' => [ qw/globus:B globus_essentials:R myproxy-devel:B myproxy-libs:R voms libtool:R/ ], + 'px.proxyrenewal' => [ qw/globus:B globus_essentials:R myproxy-devel:B myproxy-libs:R voms libtool:B/ ], 'px.myproxy-config' => [ qw/myproxy-admin:R/ ], # in myproxy-config.spec ); @@ -716,10 +724,11 @@ for my $ext (keys %deps_aux) { ); %conflicts = ( - 'lb.glite-LB' => [ qq/emi-lb/ ], - 'px.glite-PX' => [ qq/emi-px/ ], - 'lb.emi-lb' => [ qq/glite-LB/ ], - 'px.emi-px' => [ qq/glite-PX/ ], +); + +%provides = ( + 'lbjp-common.gss' => [ qq/glite-security-gss/ ], + 'lbjp-common.gsoap-plugin' => [ qq/glite-security-gsoap-plugin/ ], ); %cvs_prefix = ( @@ -815,7 +824,6 @@ for my $ext (keys %deps_aux) { gridsite=>'emi.gridsite.shared', yaim_core=>'emi.yaim.yaim-core', yaim_bdii=>'emi.bdii.yaim-bdii', - gip_release=>'emi.bdii.glite-info-provider-release', gip_service=>'emi.bdii.glite-info-provider-service', bdii=>'emi.bdii.core', glite_version=>'emi.misc.glite-version', @@ -845,11 +853,11 @@ for my $ext (keys %deps_aux) { jdk=>'java-devel', }, etics_projects => { - 'emi'=>[qw/voms voms-devel gridsite lcas gip_release gip_service bdii glite_version glue_schema yaim_core yaim_bdii trustmanager trustmanager_axis/], + 'emi'=>[qw/voms voms-devel gridsite lcas gip_service bdii glite_version glue_schema yaim_core yaim_bdii trustmanager trustmanager_axis/], }, need_externs_aux => { 'lb.client-java' => [ qw/ant:B jdk:B axis:B trustmanager trustmanager_axis libtool:B/ ], - 'lb.glite-LB' => [ qw/fetchcrl:R gip_release:R gip_service:R bdii:R glite_version:R glue_schema:R/ ], + 'lb.glite-LB' => [ qw/fetchcrl:R gip_service:R bdii:R glite_version:R glue_schema:R/ ], 'lb.yaim' => [ qw/yaim_core:R yaim_bdii:R perl-LDAP:R/ ], 'px.glite-PX' => [qw/myproxy-server:R myproxy-admin:R fetchcrl:R gip_service:R bdii:R glite_version:R glue_schema:R/], 'px.myproxy-yaim' => [ qw/yaim_core:R yaim_bdii:R/ ], @@ -1129,18 +1137,18 @@ sub mode_etics { if ($project ne 'glite') { $flags = 'RELEASE_VERSION=${age}.${platformFamily} libdir=${libdir} GSOAPDIR=`pkg-config gsoap --variable=prefix` OPENSSL_GLOBUS_FLAGS=`pkg-config globus-openssl --cflags` OPENSSL_GLOBUS_LIBS=`pkg-config globus-openssl --libs` FLAVOR_GLOBUS_EXT= HTTPD_FLAGS="-I/usr/include/httpd -I/usr/include/apache2 -I/usr/include/apr-${aprSuffix} -I/usr/include/pcre"'; - $prefix = "prefix=${prefix}/usr"; + $prefix = 'prefix=${prefix}/usr'; } else { $flags = 'RELEASE_VERSION=${age}.${platformFamily} libdir=${libdir} GSOAPDIR=${gsoap.location} OPENSSL_GLOBUS_FLAGS=-I${globus.location}/include/${globus.dbg.nothr.flavor} OPENSSL_GLOBUS_LIBS=-L${globus.location}/${libdir}/ FLAVOR_GLOBUS_EXT=_${globus.dbg.nothr.flavor} HTTPD_FLAGS="-I${httpd-devel.location}/include/httpd -I${httpd-devel.location}/include/apache2 -I${httpd-devel.location}/include/apr-${aprSuffix} -I${httpd-devel.location}/include/pcre"'; - $prefix = "prefix=${prefix}"; + $prefix = 'prefix=${prefix}'; } $cmd{compile} = "echo 'make $flags' > build.sh\n\tmake $flags build"; $cmd{clean} = "rm -rvf build.sh; $cmd{clean}"; $cmd{install} = "make $prefix $flags install"; - $cmd{packaging} = "mkdir ${moduleDir}/src/tgz + $cmd{packaging} = "mkdir \${moduleDir}/RPMTMP/SOURCES \${moduleDir}/src/tgz make $prefix $flags rpm && \ - cp ${moduleDir}/RPMTMP/SOURCES/gridsite-${version}.src.tar.gz ${moduleDir}/src/tgz"; + cp \${moduleDir}/RPMTMP/SOURCES/gridsite-\${version}.src.tar.gz \${moduleDir}/src/tgz"; } else { $cmd{clean} = 'None'; @@ -1218,6 +1226,9 @@ $package_description$package_summary$defprops}; for (@{$conflicts{"$subsys.$module"}}) { print C "package.conflicts = $_\n"; } + for (@{$provides{"$subsys.$module"}}) { + print C "package.provides = $_\n"; + } for my $pp (keys %{$platform_properties{"$subsys.$module"}}) { next if $pp eq 'default'; diff --git a/org.glite.lbjp-common.server-bones/project/ChangeLog b/org.glite.lbjp-common.server-bones/project/ChangeLog index 6d2854a..57c1338 100644 --- a/org.glite.lbjp-common.server-bones/project/ChangeLog +++ b/org.glite.lbjp-common.server-bones/project/ChangeLog @@ -36,6 +36,9 @@ 2.0.3-2 - Module rebuilt +2.0.3-3 +- Module rebuilt + 2.1.0-1 - Documentation update and cleanup - Fixes for parallel release in EMI & gLite @@ -67,3 +70,6 @@ 2.1.2-6 - Module rebuilt +2.1.3-1 +- Change log priority for slave suicide messages + diff --git a/org.glite.lbjp-common.server-bones/project/version.properties b/org.glite.lbjp-common.server-bones/project/version.properties index 1f48803..15b5d0d 100644 --- a/org.glite.lbjp-common.server-bones/project/version.properties +++ b/org.glite.lbjp-common.server-bones/project/version.properties @@ -1,3 +1,3 @@ # : /cvs/jra1mw/org.glite.lbjp-common.server-bones/project/version.properties,v 1.2 2009/01/21 10:44:34 zsustr Exp $ -module.version=2.1.2 -module.age=6 +module.version=2.1.3 +module.age=1 diff --git a/org.glite.lbjp-common.server-bones/src/srvbones.c b/org.glite.lbjp-common.server-bones/src/srvbones.c index d872903..dd41c39 100644 --- a/org.glite.lbjp-common.server-bones/src/srvbones.c +++ b/org.glite.lbjp-common.server-bones/src/srvbones.c @@ -216,7 +216,7 @@ int glite_srvbones_run( if ( !die ) { int newpid = slave(slave_data_init, sock_slave[1]); - glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_ERROR, "[master] Servus mortuus [%d] miraculo resurrexit [%d]", pid, newpid); + glite_common_log(LOG_CATEGORY_CONTROL, LOG_PRIORITY_INFO, "[master] Servus mortuus [%d] miraculo resurrexit [%d]", pid, newpid); } } child_died = 0; @@ -538,8 +538,11 @@ static int slave(slave_data_init_hnd data_init_hnd, int sock) srv = -1; glite_common_log(set_log_category, LOG_PRIORITY_DEBUG, "[%d] %s, connection closed",getpid(),strerror(rv)); continue; - } - else if ( rv < 0 ) { + } else if (rv == -EINPROGRESS) { + /* background operation -> parent forked -> kill slave */ + glite_common_log(set_log_category, LOG_PRIORITY_DEBUG, "[%d] terminating parent",getpid()); + exit(0); + } else if ( rv < 0 ) { /* unknown error -> clasified as FATAL -> kill slave */ glite_common_log(set_log_category, LOG_PRIORITY_INFO, "[%d] %s, terminating",getpid(),strerror(-rv)); diff --git a/org.glite.lbjp-common.trio/configure b/org.glite.lbjp-common.trio/configure index 27f197c..e2b3330 100755 --- a/org.glite.lbjp-common.trio/configure +++ b/org.glite.lbjp-common.trio/configure @@ -248,6 +248,10 @@ $externs{'mysql-server'}{prefix}=$externs{mysql}{prefix} if $externs{'mysql-serv $externs{'mysql-devel'}{prefix}=$externs{mysql}{prefix} if $externs{'mysql-devel'}{prefix} eq ''; $externs{'gsoapxx'}{prefix}=$externs{gsoap}{prefix} if $externs{'gsoapxx'}{prefix} eq ''; +$externs{'mysql-server'}{withprefix}=$externs{mysql}{withprefix} if $externs{'mysql-server'}{withprefix} eq ''; +$externs{'mysql-devel'}{wihtprefix}=$externs{mysql}{withprefix} if $externs{'mysql-devel'}{withprefix} eq ''; +$externs{'gsoapxx'}{withprefix}=$externs{gsoap}{withprefix} if $externs{'gsoapxx'}{withprefix} eq ''; + %project = %{$projects{$project}}; for $_ (keys %{$project{etics_externs}}) { $etics_externs{$_} = $project{etics_externs}{$_}; @@ -423,7 +427,9 @@ sub mode_build { open MAK,">Makefile" or die "Makefile: $!\n"; - print MAK "all: @modules\n\nclean check:\n"; + print MAK "all: @modules\n\n"; + print MAK "stage: ".(join '-stage ', @modules)."-stage\n\n"; + print MAK "clean check install:\n"; for (@modules) { my $full = full($_); @@ -446,11 +452,13 @@ sub mode_build { @ldeps{@{$deps{$_}}} = 1; for my $x (split /,/,$staged) { delete $ldeps{$x}; } my @dnames = $module ? () : keys %ldeps; + my $snames = $#dnames == -1 ? '' : join('-stage ', @dnames).'-stage'; my $full = full($_); my $build = $buildroot{$_}; print MAK "$_: @dnames\n\tcd $full/$build && \${MAKE} && \${MAKE} install\n\n"; + print MAK "$_-stage: $snames\n\tcd $full/$build && \${MAKE} && \${MAKE} stage\n\n"; } close MAK; @@ -523,7 +531,7 @@ BEGIN{ 'lb.doc' => [ qw/tetex-latex:B/ ], 'lb.logger' => [ qw/cppunit:B libtool:B/ ], 'lb.logger-msg' => [ qw/cppunit:B activemq libtool:B/ ], - 'lb.server' => [ qw/globus_essentials:R globus:B expat cares mysql:R mysql-server:R mysql-devel:B cppunit:B gsoap:B classads voms lcas gridsite bison:B libtool:B libxml2/ ], + 'lb.server' => [ qw/globus_essentials:R globus:B expat cares mysql:R mysql-server:R mysql-devel:B cppunit:B gsoap:B classads voms lcas gridsite bison:B libtool:B libxml2 flex:B/ ], 'lb.state-machine' => [ qw/classads libtool:B libxslt:B expat:B/ ], 'lb.utils' => [ qw/cppunit:B libtool:B/ ], 'lb.ws-interface' => [ qw/libxslt:B/ ], @@ -539,7 +547,7 @@ BEGIN{ 'lbjp-common.gss' => [ qw/globus_essentials:R globus:B cares cppunit:B libtool:B/ ], 'lbjp-common.gsoap-plugin' => [ qw/cppunit:B globus_essentials:R globus:B cares:B gsoap gsoapxx libtool:B/ ], 'jobid.api-c' => [ qw/cppunit:B libtool:B openssl:B/ ], - 'jobid.api-cpp' => [ qw/cppunit:B/ ], + 'jobid.api-cpp' => [ qw/cppunit:B libtool:B/ ], 'jobid.api-java' => [ qw/ant:B jdk:B/ ], 'jp.client' => [ qw/gsoap libtar globus_essentials:R globus:B/ ], 'jp.doc' => [], @@ -556,7 +564,7 @@ BEGIN{ 'gridsite.services' => [ qw/curl:R gsoap:R/ ], 'gridsite.service-clients' => [ qw/curl:R gsoap:R gsoapxx:R/ ], 'gridsite.gsexec' => [ qw// ], - 'px.proxyrenewal' => [ qw/globus:B globus_essentials:R myproxy-devel:B myproxy-libs:R voms libtool:R/ ], + 'px.proxyrenewal' => [ qw/globus:B globus_essentials:R myproxy-devel:B myproxy-libs:R voms libtool:B/ ], 'px.myproxy-config' => [ qw/myproxy-admin:R/ ], # in myproxy-config.spec ); @@ -716,10 +724,11 @@ for my $ext (keys %deps_aux) { ); %conflicts = ( - 'lb.glite-LB' => [ qq/emi-lb/ ], - 'px.glite-PX' => [ qq/emi-px/ ], - 'lb.emi-lb' => [ qq/glite-LB/ ], - 'px.emi-px' => [ qq/glite-PX/ ], +); + +%provides = ( + 'lbjp-common.gss' => [ qq/glite-security-gss/ ], + 'lbjp-common.gsoap-plugin' => [ qq/glite-security-gsoap-plugin/ ], ); %cvs_prefix = ( @@ -815,7 +824,6 @@ for my $ext (keys %deps_aux) { gridsite=>'emi.gridsite.shared', yaim_core=>'emi.yaim.yaim-core', yaim_bdii=>'emi.bdii.yaim-bdii', - gip_release=>'emi.bdii.glite-info-provider-release', gip_service=>'emi.bdii.glite-info-provider-service', bdii=>'emi.bdii.core', glite_version=>'emi.misc.glite-version', @@ -845,11 +853,11 @@ for my $ext (keys %deps_aux) { jdk=>'java-devel', }, etics_projects => { - 'emi'=>[qw/voms voms-devel gridsite lcas gip_release gip_service bdii glite_version glue_schema yaim_core yaim_bdii trustmanager trustmanager_axis/], + 'emi'=>[qw/voms voms-devel gridsite lcas gip_service bdii glite_version glue_schema yaim_core yaim_bdii trustmanager trustmanager_axis/], }, need_externs_aux => { 'lb.client-java' => [ qw/ant:B jdk:B axis:B trustmanager trustmanager_axis libtool:B/ ], - 'lb.glite-LB' => [ qw/fetchcrl:R gip_release:R gip_service:R bdii:R glite_version:R glue_schema:R/ ], + 'lb.glite-LB' => [ qw/fetchcrl:R gip_service:R bdii:R glite_version:R glue_schema:R/ ], 'lb.yaim' => [ qw/yaim_core:R yaim_bdii:R perl-LDAP:R/ ], 'px.glite-PX' => [qw/myproxy-server:R myproxy-admin:R fetchcrl:R gip_service:R bdii:R glite_version:R glue_schema:R/], 'px.myproxy-yaim' => [ qw/yaim_core:R yaim_bdii:R/ ], @@ -1129,18 +1137,18 @@ sub mode_etics { if ($project ne 'glite') { $flags = 'RELEASE_VERSION=${age}.${platformFamily} libdir=${libdir} GSOAPDIR=`pkg-config gsoap --variable=prefix` OPENSSL_GLOBUS_FLAGS=`pkg-config globus-openssl --cflags` OPENSSL_GLOBUS_LIBS=`pkg-config globus-openssl --libs` FLAVOR_GLOBUS_EXT= HTTPD_FLAGS="-I/usr/include/httpd -I/usr/include/apache2 -I/usr/include/apr-${aprSuffix} -I/usr/include/pcre"'; - $prefix = "prefix=${prefix}/usr"; + $prefix = 'prefix=${prefix}/usr'; } else { $flags = 'RELEASE_VERSION=${age}.${platformFamily} libdir=${libdir} GSOAPDIR=${gsoap.location} OPENSSL_GLOBUS_FLAGS=-I${globus.location}/include/${globus.dbg.nothr.flavor} OPENSSL_GLOBUS_LIBS=-L${globus.location}/${libdir}/ FLAVOR_GLOBUS_EXT=_${globus.dbg.nothr.flavor} HTTPD_FLAGS="-I${httpd-devel.location}/include/httpd -I${httpd-devel.location}/include/apache2 -I${httpd-devel.location}/include/apr-${aprSuffix} -I${httpd-devel.location}/include/pcre"'; - $prefix = "prefix=${prefix}"; + $prefix = 'prefix=${prefix}'; } $cmd{compile} = "echo 'make $flags' > build.sh\n\tmake $flags build"; $cmd{clean} = "rm -rvf build.sh; $cmd{clean}"; $cmd{install} = "make $prefix $flags install"; - $cmd{packaging} = "mkdir ${moduleDir}/src/tgz + $cmd{packaging} = "mkdir \${moduleDir}/RPMTMP/SOURCES \${moduleDir}/src/tgz make $prefix $flags rpm && \ - cp ${moduleDir}/RPMTMP/SOURCES/gridsite-${version}.src.tar.gz ${moduleDir}/src/tgz"; + cp \${moduleDir}/RPMTMP/SOURCES/gridsite-\${version}.src.tar.gz \${moduleDir}/src/tgz"; } else { $cmd{clean} = 'None'; @@ -1218,6 +1226,9 @@ $package_description$package_summary$defprops}; for (@{$conflicts{"$subsys.$module"}}) { print C "package.conflicts = $_\n"; } + for (@{$provides{"$subsys.$module"}}) { + print C "package.provides = $_\n"; + } for my $pp (keys %{$platform_properties{"$subsys.$module"}}) { next if $pp eq 'default'; diff --git a/org.glite.lbjp-common.trio/project/ChangeLog b/org.glite.lbjp-common.trio/project/ChangeLog index 01e0fc4..4b7befe 100644 --- a/org.glite.lbjp-common.trio/project/ChangeLog +++ b/org.glite.lbjp-common.trio/project/ChangeLog @@ -41,6 +41,9 @@ 2.0.3-3 - Module rebuilt +2.0.3-4 +- Module rebuilt + 2.1.0-1 - Fixes for parallel release in EMI & gLite @@ -71,3 +74,6 @@ 2.1.2-6 - Module rebuilt +2.1.2-7 +- Module rebuilt + diff --git a/org.glite.lbjp-common.trio/project/version.properties b/org.glite.lbjp-common.trio/project/version.properties index cb1ab99..320e968 100644 --- a/org.glite.lbjp-common.trio/project/version.properties +++ b/org.glite.lbjp-common.trio/project/version.properties @@ -1,3 +1,3 @@ # : /cvs/jra1mw/org.glite.lbjp-common.trio/project/version.properties,v 1.2 2009/01/21 10:44:34 zsustr Exp $ module.version=2.1.2 -module.age=6 +module.age=7 diff --git a/org.glite.lbjp-common/project/version.properties b/org.glite.lbjp-common/project/version.properties index 68d32cf..8065827 100644 --- a/org.glite.lbjp-common/project/version.properties +++ b/org.glite.lbjp-common/project/version.properties @@ -1,3 +1,3 @@ # : /cvs/glite/org.glite.lbjp-common/project/version.properties,v 1.1 2009/01/21 12:57:26 akrenek Exp $ -module.version=3.0.4 -module.age=2 +module.version=3.0.6 +module.age=1 -- 1.8.2.3