From 6220ac2942e1808bfeaf65d76f9ceb0fa2155c4c Mon Sep 17 00:00:00 2001 From: cvs2svn Date: Wed, 27 Apr 2005 08:35:10 +0000 Subject: [PATCH] This commit was manufactured by cvs2svn to create tag 'GLITE_RELEASE_1_1'. MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Sprout from master 2004-12-10 13:01:20 UTC Aleš Křenek 'imported statistics counting' Cherrypick from master 2005-02-17 02:27:34 UTC Master Builder 'Incremented build number [GLBUILDER]': org.glite.deployment.lb/build.xml org.gridsite.core/CHANGES org.gridsite.core/VERSION org.gridsite.core/build.xml org.gridsite.core/interface/gridsite.h org.gridsite.core/project/build.number org.gridsite.core/project/configure.properties.xml org.gridsite.core/src/Makefile org.gridsite.core/src/gridsite.spec org.gridsite.core/src/grst-delegation.c org.gridsite.core/src/grst_x509.c org.gridsite.core/src/htcp org.gridsite.core/src/real-gridsite-admin.cgi Cherrypick from master 2005-03-21 16:22:25 UTC Alberto Di Meglio 'Implemented status method': org.glite.deployment.lb/CHANGELOG org.glite.deployment.lb/project/glite-lb.spec Cherrypick from master 2005-02-28 10:47:23 UTC Alberto Di Meglio 'Temporarily fix version age': org.gridsite.core/project/version.properties Cherrypick from glite-lb-client-interface_branch_1_0_0 2005-04-13 11:41:09 UTC Jiří Škrábal '- do not distribute fake library header files': org.glite.lb.client-interface/Makefile org.glite.lb.client-interface/build.xml org.glite.lb.client-interface/interface/CountRef.h org.glite.lb.client-interface/interface/Event.h.T org.glite.lb.client-interface/interface/Job.h org.glite.lb.client-interface/interface/JobStatus.h.T org.glite.lb.client-interface/interface/LoggingExceptions.h org.glite.lb.client-interface/interface/Notification.h org.glite.lb.client-interface/interface/ServerConnection.h org.glite.lb.client-interface/interface/consumer.h org.glite.lb.client-interface/interface/context.h org.glite.lb.client-interface/interface/events.h.T org.glite.lb.client-interface/interface/jobstat.h.T org.glite.lb.client-interface/interface/notification.h org.glite.lb.client-interface/interface/notifid.h org.glite.lb.client-interface/interface/producer.h.T org.glite.lb.client-interface/interface/statistics.h org.glite.lb.client-interface/project/build.number org.glite.lb.client-interface/project/configure.properties.xml org.glite.lb.client-interface/project/version.properties Cherrypick from glite-lb-client_branch_1_0_0 2005-04-03 04:49:46 UTC Master Builder 'Incremented build number [GLBUILDER]': org.glite.lb.client/Makefile org.glite.lb.client/build.xml org.glite.lb.client/doc/README-acl org.glite.lb.client/doc/README-fake org.glite.lb.client/doc/README-notify org.glite.lb.client/examples/abort_job.c org.glite.lb.client/examples/change_acl.c org.glite.lb.client/examples/job_log_fake.cpp org.glite.lb.client/examples/job_status.c org.glite.lb.client/examples/producer_fake.c org.glite.lb.client/project/build.number org.glite.lb.client/project/version.properties org.glite.lb.client/src/ServerConnection.cpp org.glite.lb.client/src/logevent.c.T org.glite.lb.client/src/producer.c org.glite.lb.client/src/uiwrap.c.T Cherrypick from glite-security-proxyrenewal_branch_1_0_0_RC1 2005-04-08 02:14:05 UTC Master Builder 'Incremented build number [GLBUILDER]': org.glite.security.proxyrenewal/Makefile org.glite.security.proxyrenewal/build.xml org.glite.security.proxyrenewal/config/startup org.glite.security.proxyrenewal/interface/renewal.h org.glite.security.proxyrenewal/project/build.number org.glite.security.proxyrenewal/project/version.properties org.glite.security.proxyrenewal/src/acstack.h org.glite.security.proxyrenewal/src/api.c org.glite.security.proxyrenewal/src/commands.c org.glite.security.proxyrenewal/src/common.c org.glite.security.proxyrenewal/src/newformat.h org.glite.security.proxyrenewal/src/renew.c org.glite.security.proxyrenewal/src/renewal_locl.h org.glite.security.proxyrenewal/src/renewd.c org.glite.security.proxyrenewal/src/renewd_locl.h org.glite.security.proxyrenewal/src/voms.c Cherrypick from glite-deployment-lb_branch_1_2_2 2005-04-27 08:35:09 UTC Master Builder 'Incremented build number [GLBUILDER]': org.glite.deployment.lb/config/scripts/glite-lb-config.py org.glite.deployment.lb/config/templates/glite-lb.cfg.xml org.glite.deployment.lb/doc/release_notes/release_notes.doc org.glite.deployment.lb/doc/release_notes/release_notes.html org.glite.deployment.lb/doc/release_notes/release_notes.pdf org.glite.deployment.lb/project/build.number org.glite.deployment.lb/project/glite-lb.sdf.xml.template org.glite.deployment.lb/project/lxscript-rpm.xsl org.glite.deployment.lb/project/version.properties Cherrypick from glite-lb-common_branch_1_1_0 2005-04-03 04:47:22 UTC Master Builder 'Incremented build number [GLBUILDER]': org.glite.lb.common/Makefile org.glite.lb.common/build.xml org.glite.lb.common/interface/lb_gss.h org.glite.lb.common/project/build.number org.glite.lb.common/project/version.properties org.glite.lb.common/src/events.c.T org.glite.lb.common/src/il_log.c org.glite.lb.common/src/lb_gss.c Cherrypick from glite-lb-logger_branch_1_0_0 2005-04-13 04:32:30 UTC Master Builder 'Incremented build number [GLBUILDER]': org.glite.lb.logger/build.xml org.glite.lb.logger/project/build.number org.glite.lb.logger/project/version.properties org.glite.lb.logger/src/event_queue.c org.glite.lb.logger/src/event_store.c org.glite.lb.logger/src/il_master.c org.glite.lb.logger/src/interlogd.h org.glite.lb.logger/src/queue_thread.c Cherrypick from glite-lb-ws-interface_branch_1_0_0 2005-04-03 16:29:31 UTC Alberto Di Meglio 'Increased revision number': org.glite.lb.ws-interface/Makefile org.glite.lb.ws-interface/build.xml org.glite.lb.ws-interface/project/build.number org.glite.lb.ws-interface/project/version.properties org.glite.lb.ws-interface/src/LB.xml.T org.glite.lb.ws-interface/src/puke-ug.xsl Cherrypick from glite-lb_branch_1_0_0_RC1 2005-04-14 16:03:37 UTC Elisabetta Ronchieri 'Increased version': org.glite.lb/build.xml org.glite.lb/project/build.number org.glite.lb/project/events.T org.glite.lb/project/types.T org.glite.lb/project/version.properties Cherrypick from glite-lb_branch_1_0_0_RC1 2005-04-16 14:02:08 UTC Alberto Di Meglio 'Set tag for gLite 1.1': org.glite.lb/project/dependencies.properties Cherrypick from glite-wms-utils-exception_branch_1_0_0 2005-04-04 00:48:20 UTC Alberto Di Meglio 'Increased revision number': org.glite.wms-utils.exception/build.xml org.glite.wms-utils.exception/configure.ac org.glite.wms-utils.exception/interface/glite/wmsutils/exception/Exception.h org.glite.wms-utils.exception/project/build.number org.glite.wms-utils.exception/project/version.properties org.glite.wms-utils.exception/src/Exception.cpp Cherrypick from glite-lb-server_branch_1_0_0 2005-04-03 04:57:12 UTC Master Builder 'Incremented build number [GLBUILDER]': org.glite.lb.server/Makefile org.glite.lb.server/build.xml org.glite.lb.server/project/build.number org.glite.lb.server/project/version.properties Cherrypick from glite-lb-server-bones_branch_1_0_0 2005-04-03 04:53:22 UTC Master Builder 'Incremented build number [GLBUILDER]': org.glite.lb.server-bones/build.xml org.glite.lb.server-bones/project/build.number org.glite.lb.server-bones/project/version.properties Cherrypick from glite-wms-utils-jobid_branch_1_0_0 2005-04-03 01:12:39 UTC Master Builder 'Incremented build number [GLBUILDER]': org.glite.wms-utils.jobid/build.xml org.glite.wms-utils.jobid/project/build.number org.glite.wms-utils.jobid/project/version.properties Delete: org.glite.jp.common/.cvsignore org.glite.jp.common/Makefile org.glite.jp.common/build.xml org.glite.jp.common/interface/context.h org.glite.jp.common/interface/strmd5.h org.glite.jp.common/interface/types.h org.glite.jp.common/project/build.properties org.glite.jp.common/project/configure.properties.xml org.glite.jp.common/project/properties.xml org.glite.jp.common/project/tar_exclude org.glite.jp.common/project/version.properties org.glite.jp.common/src/context.c org.glite.jp.common/src/strmd5.c org.glite.jp.index/.cvsignore org.glite.jp.index/Makefile org.glite.jp.index/build.xml org.glite.jp.index/project/JobProvenanceIS.wsdl org.glite.jp.index/project/build.properties org.glite.jp.index/project/configure.properties.xml org.glite.jp.index/project/properties.xml org.glite.jp.index/project/tar_exclude org.glite.jp.index/project/version.properties org.glite.jp.index/src/simple_server.c org.glite.jp.index/src/soap_ops.c org.glite.jp.index/src/typemap.dat org.glite.jp.primary/.cvsignore org.glite.jp.primary/Makefile org.glite.jp.primary/build.xml org.glite.jp.primary/examples/jpps-test.c org.glite.jp.primary/project/build.properties org.glite.jp.primary/project/configure.properties.xml org.glite.jp.primary/project/properties.xml org.glite.jp.primary/project/tar_exclude org.glite.jp.primary/project/version.properties org.glite.jp.primary/src/backend.h org.glite.jp.primary/src/feed.c org.glite.jp.primary/src/feed.h org.glite.jp.primary/src/ftp_backend.c org.glite.jp.primary/src/is_client.c org.glite.jp.primary/src/jptype_map.h org.glite.jp.primary/src/simple_server.c org.glite.jp.primary/src/soap_ops.c org.glite.jp.primary/src/tags.c org.glite.jp.primary/src/tags.h org.glite.jp.primary/src/typemap.dat org.glite.jp.ws-interface/.cvsignore org.glite.jp.ws-interface/LICENSE org.glite.jp.ws-interface/Makefile org.glite.jp.ws-interface/build.xml org.glite.jp.ws-interface/interface/JobProvenanceIS.wsdl org.glite.jp.ws-interface/interface/JobProvenancePS.wsdl org.glite.jp.ws-interface/interface/JobProvenanceTypes.wsdl org.glite.jp.ws-interface/project/build.properties org.glite.jp.ws-interface/project/configure.properties.xml org.glite.jp.ws-interface/project/glite-jp-ws-interface.spec org.glite.jp.ws-interface/project/properties.xml org.glite.jp.ws-interface/project/tar_exclude org.glite.jp.ws-interface/project/version.properties org.glite.jp/.cvsignore org.glite.jp/build.xml org.glite.jp/project/build.properties org.glite.jp/project/dependencies.properties org.glite.jp/project/glite.jp.csf.xml org.glite.jp/project/properties.xml org.glite.jp/project/run-workspace org.glite.jp/project/taskdefs.xml org.glite.jp/project/version.properties org.glite.lb.client/examples/log_usertag_proxy.c --- org.glite.deployment.lb/CHANGELOG | 20 + org.glite.deployment.lb/build.xml | 6 + .../config/scripts/glite-lb-config.py | 307 ++- .../config/templates/glite-lb.cfg.xml | 122 +- .../doc/release_notes/release_notes.doc | Bin 172032 -> 334848 bytes .../doc/release_notes/release_notes.html | 2392 +++++++++++++++++--- .../doc/release_notes/release_notes.pdf | Bin 34870 -> 277829 bytes org.glite.deployment.lb/project/build.number | 2 + .../project/glite-lb.sdf.xml.template | 85 +- org.glite.deployment.lb/project/glite-lb.spec | 2 +- org.glite.deployment.lb/project/lxscript-rpm.xsl | 94 +- org.glite.deployment.lb/project/version.properties | 8 +- org.glite.jp.common/.cvsignore | 1 - org.glite.jp.common/Makefile | 85 - org.glite.jp.common/build.xml | 93 - org.glite.jp.common/interface/context.h | 17 - org.glite.jp.common/interface/strmd5.h | 28 - org.glite.jp.common/interface/types.h | 83 - org.glite.jp.common/project/build.properties | 0 .../project/configure.properties.xml | 52 - org.glite.jp.common/project/properties.xml | 52 - org.glite.jp.common/project/tar_exclude | 10 - org.glite.jp.common/project/version.properties | 4 - org.glite.jp.common/src/context.c | 164 -- org.glite.jp.common/src/strmd5.c | 115 - org.glite.jp.index/.cvsignore | 1 - org.glite.jp.index/Makefile | 129 -- org.glite.jp.index/build.xml | 93 - org.glite.jp.index/project/JobProvenanceIS.wsdl | 531 ----- org.glite.jp.index/project/build.properties | 0 .../project/configure.properties.xml | 53 - org.glite.jp.index/project/properties.xml | 52 - org.glite.jp.index/project/tar_exclude | 10 - org.glite.jp.index/project/version.properties | 4 - org.glite.jp.index/src/simple_server.c | 39 - org.glite.jp.index/src/soap_ops.c | 81 - org.glite.jp.index/src/typemap.dat | 2 - org.glite.jp.primary/.cvsignore | 1 - org.glite.jp.primary/Makefile | 148 -- org.glite.jp.primary/build.xml | 97 - org.glite.jp.primary/examples/jpps-test.c | 194 -- org.glite.jp.primary/project/build.properties | 0 .../project/configure.properties.xml | 52 - org.glite.jp.primary/project/properties.xml | 51 - org.glite.jp.primary/project/tar_exclude | 10 - org.glite.jp.primary/project/version.properties | 4 - org.glite.jp.primary/src/backend.h | 105 - org.glite.jp.primary/src/feed.c | 264 --- org.glite.jp.primary/src/feed.h | 21 - org.glite.jp.primary/src/ftp_backend.c | 1701 -------------- org.glite.jp.primary/src/is_client.c | 33 - org.glite.jp.primary/src/jptype_map.h | 16 - org.glite.jp.primary/src/simple_server.c | 59 - org.glite.jp.primary/src/soap_ops.c | 374 --- org.glite.jp.primary/src/tags.c | 233 -- org.glite.jp.primary/src/tags.h | 1 - org.glite.jp.primary/src/typemap.dat | 2 - org.glite.jp.ws-interface/.cvsignore | 2 - org.glite.jp.ws-interface/LICENSE | 69 - org.glite.jp.ws-interface/Makefile | 48 - org.glite.jp.ws-interface/build.xml | 116 - .../interface/JobProvenanceIS.wsdl | 110 - .../interface/JobProvenancePS.wsdl | 307 --- .../interface/JobProvenanceTypes.wsdl | 162 -- org.glite.jp.ws-interface/project/build.properties | 0 .../project/configure.properties.xml | 54 - .../project/glite-jp-ws-interface.spec | 42 - org.glite.jp.ws-interface/project/properties.xml | 73 - org.glite.jp.ws-interface/project/tar_exclude | 0 .../project/version.properties | 3 - org.glite.jp/.cvsignore | 1 - org.glite.jp/build.xml | 262 --- org.glite.jp/project/build.properties | 0 org.glite.jp/project/dependencies.properties | 12 - org.glite.jp/project/glite.jp.csf.xml | 271 --- org.glite.jp/project/properties.xml | 47 - org.glite.jp/project/run-workspace | 10 - org.glite.jp/project/taskdefs.xml | 24 - org.glite.jp/project/version.properties | 4 - org.glite.lb.client-interface/Makefile | 12 +- org.glite.lb.client-interface/build.xml | 4 + org.glite.lb.client-interface/interface/CountRef.h | 42 +- org.glite.lb.client-interface/interface/Event.h.T | 153 +- org.glite.lb.client-interface/interface/Job.h | 198 +- .../interface/JobStatus.h.T | 216 +- .../interface/LoggingExceptions.h | 138 +- .../interface/Notification.h | 29 +- .../interface/ServerConnection.h | 677 +++++- org.glite.lb.client-interface/interface/consumer.h | 209 +- org.glite.lb.client-interface/interface/context.h | 66 +- org.glite.lb.client-interface/interface/events.h.T | 60 +- .../interface/jobstat.h.T | 14 +- .../interface/notification.h | 61 +- org.glite.lb.client-interface/interface/notifid.h | 74 +- .../interface/producer.h.T | 146 +- .../interface/statistics.h | 12 +- org.glite.lb.client-interface/project/build.number | 2 + .../project/configure.properties.xml | 56 +- .../project/version.properties | 8 +- org.glite.lb.client/Makefile | 11 +- org.glite.lb.client/build.xml | 4 + org.glite.lb.client/doc/README-acl | 66 + org.glite.lb.client/doc/README-fake | 4 - org.glite.lb.client/doc/README-notify | 72 + org.glite.lb.client/examples/abort_job.c | 128 ++ org.glite.lb.client/examples/change_acl.c | 78 + org.glite.lb.client/examples/job_log_fake.cpp | 71 + org.glite.lb.client/examples/job_status.c | 231 ++ org.glite.lb.client/examples/log_usertag_proxy.c | 103 - org.glite.lb.client/examples/producer_fake.c | 24 - org.glite.lb.client/project/build.number | 2 + org.glite.lb.client/project/version.properties | 8 +- org.glite.lb.client/src/ServerConnection.cpp | 61 +- org.glite.lb.client/src/logevent.c.T | 23 +- org.glite.lb.client/src/producer.c | 343 --- org.glite.lb.client/src/uiwrap.c.T | 28 +- org.glite.lb.common/Makefile | 2 +- org.glite.lb.common/build.xml | 4 + org.glite.lb.common/interface/lb_gss.h | 2 +- org.glite.lb.common/project/build.number | 2 + org.glite.lb.common/project/version.properties | 8 +- org.glite.lb.common/src/events.c.T | 22 +- org.glite.lb.common/src/il_log.c | 7 +- org.glite.lb.common/src/lb_gss.c | 39 +- org.glite.lb.logger/build.xml | 4 + org.glite.lb.logger/project/build.number | 2 + org.glite.lb.logger/project/version.properties | 8 +- org.glite.lb.logger/src/event_queue.c | 14 +- org.glite.lb.logger/src/event_store.c | 31 +- org.glite.lb.logger/src/il_master.c | 8 +- org.glite.lb.logger/src/interlogd.h | 2 +- org.glite.lb.logger/src/queue_thread.c | 17 +- org.glite.lb.server-bones/build.xml | 4 + org.glite.lb.server-bones/project/build.number | 2 + .../project/version.properties | 8 +- org.glite.lb.server/Makefile | 18 +- org.glite.lb.server/build.xml | 4 + org.glite.lb.server/project/build.number | 2 + org.glite.lb.server/project/version.properties | 8 +- org.glite.lb.ws-interface/Makefile | 20 +- org.glite.lb.ws-interface/build.xml | 26 +- org.glite.lb.ws-interface/project/build.number | 2 + .../project/version.properties | 8 +- org.glite.lb.ws-interface/src/LB.xml.T | 209 ++ org.glite.lb.ws-interface/src/puke-ug.xsl | 139 ++ org.glite.lb/build.xml | 4 + org.glite.lb/project/build.number | 2 + org.glite.lb/project/dependencies.properties | 22 +- org.glite.lb/project/events.T | 264 +-- org.glite.lb/project/types.T | 16 + org.glite.lb/project/version.properties | 8 +- org.glite.security.proxyrenewal/Makefile | 12 +- org.glite.security.proxyrenewal/build.xml | 5 + org.glite.security.proxyrenewal/config/startup | 52 +- .../interface/renewal.h | 2 + .../project/build.number | 2 + .../project/version.properties | 8 +- org.glite.security.proxyrenewal/src/acstack.h | 79 + org.glite.security.proxyrenewal/src/api.c | 71 +- org.glite.security.proxyrenewal/src/commands.c | 127 +- org.glite.security.proxyrenewal/src/common.c | 126 +- org.glite.security.proxyrenewal/src/newformat.h | 195 ++ org.glite.security.proxyrenewal/src/renew.c | 884 +------- org.glite.security.proxyrenewal/src/renewal_locl.h | 14 +- org.glite.security.proxyrenewal/src/renewd.c | 231 +- org.glite.security.proxyrenewal/src/renewd_locl.h | 20 +- org.glite.security.proxyrenewal/src/voms.c | 318 +++ org.glite.wms-utils.exception/build.xml | 5 + org.glite.wms-utils.exception/configure.ac | 5 +- .../interface/glite/wmsutils/exception/Exception.h | 13 +- org.glite.wms-utils.exception/project/build.number | 2 + .../project/version.properties | 8 +- org.glite.wms-utils.exception/src/Exception.cpp | 62 +- org.glite.wms-utils.jobid/build.xml | 5 + org.glite.wms-utils.jobid/project/build.number | 2 + .../project/version.properties | 8 +- org.gridsite.core/CHANGES | 16 + org.gridsite.core/VERSION | 2 +- org.gridsite.core/build.xml | 57 +- org.gridsite.core/interface/gridsite.h | 2 + org.gridsite.core/project/build.number | 2 + org.gridsite.core/project/configure.properties.xml | 2 +- org.gridsite.core/project/version.properties | 8 +- org.gridsite.core/src/Makefile | 100 +- org.gridsite.core/src/gridsite.spec | 13 +- org.gridsite.core/src/grst-delegation.c | 2 + org.gridsite.core/src/grst_x509.c | 213 +- org.gridsite.core/src/htcp | Bin 29747 -> 29747 bytes org.gridsite.core/src/real-gridsite-admin.cgi | Bin 96256 -> 99027 bytes 189 files changed, 7105 insertions(+), 9660 deletions(-) create mode 100644 org.glite.deployment.lb/CHANGELOG create mode 100644 org.glite.deployment.lb/project/build.number delete mode 100644 org.glite.jp.common/.cvsignore delete mode 100644 org.glite.jp.common/Makefile delete mode 100755 org.glite.jp.common/build.xml delete mode 100644 org.glite.jp.common/interface/context.h delete mode 100755 org.glite.jp.common/interface/strmd5.h delete mode 100644 org.glite.jp.common/interface/types.h delete mode 100644 org.glite.jp.common/project/build.properties delete mode 100644 org.glite.jp.common/project/configure.properties.xml delete mode 100755 org.glite.jp.common/project/properties.xml delete mode 100644 org.glite.jp.common/project/tar_exclude delete mode 100644 org.glite.jp.common/project/version.properties delete mode 100644 org.glite.jp.common/src/context.c delete mode 100755 org.glite.jp.common/src/strmd5.c delete mode 100644 org.glite.jp.index/.cvsignore delete mode 100644 org.glite.jp.index/Makefile delete mode 100755 org.glite.jp.index/build.xml delete mode 100644 org.glite.jp.index/project/JobProvenanceIS.wsdl delete mode 100644 org.glite.jp.index/project/build.properties delete mode 100644 org.glite.jp.index/project/configure.properties.xml delete mode 100755 org.glite.jp.index/project/properties.xml delete mode 100644 org.glite.jp.index/project/tar_exclude delete mode 100644 org.glite.jp.index/project/version.properties delete mode 100644 org.glite.jp.index/src/simple_server.c delete mode 100644 org.glite.jp.index/src/soap_ops.c delete mode 100644 org.glite.jp.index/src/typemap.dat delete mode 100644 org.glite.jp.primary/.cvsignore delete mode 100644 org.glite.jp.primary/Makefile delete mode 100755 org.glite.jp.primary/build.xml delete mode 100644 org.glite.jp.primary/examples/jpps-test.c delete mode 100644 org.glite.jp.primary/project/build.properties delete mode 100644 org.glite.jp.primary/project/configure.properties.xml delete mode 100755 org.glite.jp.primary/project/properties.xml delete mode 100644 org.glite.jp.primary/project/tar_exclude delete mode 100644 org.glite.jp.primary/project/version.properties delete mode 100644 org.glite.jp.primary/src/backend.h delete mode 100644 org.glite.jp.primary/src/feed.c delete mode 100644 org.glite.jp.primary/src/feed.h delete mode 100644 org.glite.jp.primary/src/ftp_backend.c delete mode 100644 org.glite.jp.primary/src/is_client.c delete mode 100644 org.glite.jp.primary/src/jptype_map.h delete mode 100644 org.glite.jp.primary/src/simple_server.c delete mode 100644 org.glite.jp.primary/src/soap_ops.c delete mode 100644 org.glite.jp.primary/src/tags.c delete mode 100644 org.glite.jp.primary/src/tags.h delete mode 100644 org.glite.jp.primary/src/typemap.dat delete mode 100755 org.glite.jp.ws-interface/.cvsignore delete mode 100755 org.glite.jp.ws-interface/LICENSE delete mode 100644 org.glite.jp.ws-interface/Makefile delete mode 100644 org.glite.jp.ws-interface/build.xml delete mode 100644 org.glite.jp.ws-interface/interface/JobProvenanceIS.wsdl delete mode 100644 org.glite.jp.ws-interface/interface/JobProvenancePS.wsdl delete mode 100644 org.glite.jp.ws-interface/interface/JobProvenanceTypes.wsdl delete mode 100755 org.glite.jp.ws-interface/project/build.properties delete mode 100644 org.glite.jp.ws-interface/project/configure.properties.xml delete mode 100644 org.glite.jp.ws-interface/project/glite-jp-ws-interface.spec delete mode 100644 org.glite.jp.ws-interface/project/properties.xml delete mode 100644 org.glite.jp.ws-interface/project/tar_exclude delete mode 100755 org.glite.jp.ws-interface/project/version.properties delete mode 100644 org.glite.jp/.cvsignore delete mode 100644 org.glite.jp/build.xml delete mode 100644 org.glite.jp/project/build.properties delete mode 100644 org.glite.jp/project/dependencies.properties delete mode 100644 org.glite.jp/project/glite.jp.csf.xml delete mode 100755 org.glite.jp/project/properties.xml delete mode 100644 org.glite.jp/project/run-workspace delete mode 100755 org.glite.jp/project/taskdefs.xml delete mode 100644 org.glite.jp/project/version.properties create mode 100644 org.glite.lb.client-interface/project/build.number create mode 100644 org.glite.lb.client/doc/README-acl create mode 100644 org.glite.lb.client/doc/README-notify create mode 100644 org.glite.lb.client/examples/abort_job.c create mode 100644 org.glite.lb.client/examples/change_acl.c create mode 100644 org.glite.lb.client/examples/job_log_fake.cpp create mode 100644 org.glite.lb.client/examples/job_status.c delete mode 100644 org.glite.lb.client/examples/log_usertag_proxy.c create mode 100644 org.glite.lb.client/project/build.number create mode 100644 org.glite.lb.common/project/build.number create mode 100644 org.glite.lb.logger/project/build.number create mode 100644 org.glite.lb.server-bones/project/build.number create mode 100644 org.glite.lb.server/project/build.number create mode 100644 org.glite.lb.ws-interface/project/build.number create mode 100644 org.glite.lb.ws-interface/src/LB.xml.T create mode 100644 org.glite.lb.ws-interface/src/puke-ug.xsl create mode 100644 org.glite.lb/project/build.number create mode 100644 org.glite.security.proxyrenewal/project/build.number create mode 100755 org.glite.security.proxyrenewal/src/acstack.h create mode 100755 org.glite.security.proxyrenewal/src/newformat.h create mode 100644 org.glite.security.proxyrenewal/src/voms.c create mode 100644 org.glite.wms-utils.exception/project/build.number create mode 100644 org.glite.wms-utils.jobid/project/build.number create mode 100644 org.gridsite.core/project/build.number diff --git a/org.glite.deployment.lb/CHANGELOG b/org.glite.deployment.lb/CHANGELOG new file mode 100644 index 0000000..e14ac8a --- /dev/null +++ b/org.glite.deployment.lb/CHANGELOG @@ -0,0 +1,20 @@ +DATE: 21-03-2005 17:21 +[dimeglio] Implemented status method + +DATE: 21-03-2005 00:32 +[dimeglio] Added PERL5LIB env var + +DATE: 17-03-2005 17:33 +[gdiez] Stopping and starting the database before the index creation (just after the database is created and the user granted) + +DATE: 09-03-2005 23:05 +[dimeglio] Moved creation of indices inside database creation (if database + exists indices are not recreated) + +DATE: 02-03-2005 11:05 +[dimeglio] Started CHANGELOG +[dimeglio] Fixed formatting, improved display of message using glib.printXxxMessage functions +[dimeglio] Fixed some problems when starting/stopping services +[dimeglio] GLITE_USER parameter not exposed anymore in config file, use same user parameters + as WMS to allow installation on same node +[dimeglio] Increased module version number to 1.2.0 \ No newline at end of file diff --git a/org.glite.deployment.lb/build.xml b/org.glite.deployment.lb/build.xml index 0ceaee9..874c661 100644 --- a/org.glite.deployment.lb/build.xml +++ b/org.glite.deployment.lb/build.xml @@ -13,6 +13,11 @@ Revision history: $Log$ + Revision 1.5 2004/10/17 22:34:39 dimeglio + Use new installer script format + Use global filters + Use RH standard expat rpm in sdf template + Revision 1.4 2004/10/14 16:07:53 dimeglio Removed wms.thirdparty-globus-ssl-utils @@ -84,6 +89,7 @@ Load version file ========================================= --> + - + + + + + + + + + + @@ -15,32 +30,105 @@ description="Enable check of host certificates" value="true"/> - - - - - - + + + + owner + location + destination + + - - - + - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/org.glite.deployment.lb/doc/release_notes/release_notes.doc b/org.glite.deployment.lb/doc/release_notes/release_notes.doc index 5fc59f7ed7fd784df377df43e569a4d21cefc8b3..dd0cc439dc9ee6f2b756b12a1960e980e7a0c9cb 100644 GIT binary patch literal 334848 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 MH}8pm{&5Zb3PZoRsQ>@~ literal 172032 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 z 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 diff --git a/org.glite.deployment.lb/doc/release_notes/release_notes.html b/org.glite.deployment.lb/doc/release_notes/release_notes.html index 1db7585..989792a 100644 --- a/org.glite.deployment.lb/doc/release_notes/release_notes.html +++ b/org.glite.deployment.lb/doc/release_notes/release_notes.html @@ -20,8 +20,7 @@ {font-family:Times; panose-1:2 2 6 3 5 4 5 2 3 4;} @font-face - {font-family:"Univers \(W1\)"; - panose-1:0 0 0 0 0 0 0 0 0 0;} + {font-family:"Univers \(W1\)";} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {margin-top:2.0pt; @@ -492,429 +491,528 @@ text-transform:uppercase'>gLite Logging & Bookkeeping Server

1. Release Description

This release contains the gLite Logging & Bookkeeping -Server module v. 0.2.0. The following sections provide additional information about +Server module v. 1.2.2. The following sections provide additional information about the release content, the module dependencies, the know bugs and issues and a list of bugs closed since the previous release. For information about installing and using the gLite Logging & Bookkeeping Server, please refer to the gLite Installation and User Guides.

-

2. Release contents

+

2. Changes in this Release

-

The gLite Logging & Bookkeeping Server v. 0.2.0 is +

This release introduces the following changes:

+ +

 

+ +
    +
  • Implemented status method
  • +
  • Added definition of PERL5LIB env var
  • +
  • Stopping and starting the database before the index + creation (just after the database is created and the user granted) to fix + access denied error
  • +
  • Moved creation of indices inside database creation (if + database exists indices must not be recreated)
  • +
  • GLITE_USER parameter is not exposed anymore in the + configuration file; instead the module uses the same user parameters as + WMS to allow installation on same node
  • +
  • LB admin tools are now installed in sbin, not in bin
  • +
  • Bug fixes (see below for the complete lists)
  • +
+ +

3. Release contents

+ +

The gLite Logging & Bookkeeping Server v. 1.2.2 is composed of the following gLite components:

 

- +
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + +
-

Component name

+

Component name

-

Version

+

Version

-

File

+

File

-

org.glite.deployment.lb

+

org.glite.deployment.lb

-

0.2.0

+

1.2.2

-

http://glite.web.cern.ch/glite/packages/I20041210/installers/glite-lb_installer.sh +

http://glite.web.cern.ch/glite/packages/R1.0/R20050331/installers/glite-lb_installer.sh

http://glite.web.cern.ch/glite/packages/I20041210/bin/rhel30/noarch/RPMS/glite-lb-config-0.2.0-1.noarch.rpm

+ style='font-size:8.0pt'>http://glite.web.cern.ch/glite/packages/R1.0/R20050331/bin/rhel30/noarch/RPMS/glite-lb-config-1.2.2-1.noarch.rpm

-

org.glite.deployment.config

+

org.glite.deployment.config

-

0.3.0

+

1.0.0

http://glite.web.cern.ch/glite/packages/I20041210/bin/rhel30/noarch/RPMS/glite- - config-0.3.0-1.noarch.rpm

+ style='font-size:8.0pt'>http://glite.web.cern.ch/glite/packages/R1.0/R20050331/bin/rhel30/noarch/RPMS/glite-config-1.0.0-1.noarch.rpm

-

glite-lb-client-interface

+

org.glite.lb.client-interface

-

0.3.1

+

1.0.2

http://glite.web.cern.ch/glite/packages/I20041210/bin/rhel30/i386/RPMS/glite-lb-client-interface-0.3.1-2.i386.rpm

+ style='font-size:8.0pt'>http://glite.web.cern.ch/glite/packages/R1.0/R20050331/bin/rhel30/i386/RPMS/glite-lb-client-interface-1.0.2-1.i386.rpm

-

glite-lb-common

+

org.glite.lb.common

-

0.4.1

+

1.1.4

-

http://glite.web.cern.ch/glite/packages/I20041210/bin/rhel30/i386/RPMS/glite-lb-common-0.4.1-2.i386.rpm

+

http://glite.web.cern.ch/glite/packages/R1.0/R20050331/bin/rhel30/i386/RPMS/glite-lb-common-1.1.4-1.i386.rpm

-

glite-lb-logger

+

org.glite.lb.logger

-

0.4.1

+

1.0.1

-

http://glite.web.cern.ch/glite/packages/I20041210/bin/rhel30/i386/RPMS/glite-lb-logger-0.4.1-3.i386.rpm

+

http://glite.web.cern.ch/glite/packages/R1.0/R20050331/bin/rhel30/i386/RPMS/glite-lb-logger-1.0.1-1.i386.rpm

-

glite-lb-server

+

org.glite.lb.server

-

0.6.2

+

1.0.1

http://glite.web.cern.ch/glite/packages/I20041210/bin/rhel30/i386/RPMS/glite-lb-server-0.6.2-4.i386.rpm

+ 8.0pt'>http://glite.web.cern.ch/glite/packages/R1.0/R20050331/bin/rhel30/i386/RPMS/glite-lb-server-1.0.1-1.i386.rpm

-

glite-lb-server-bones

+

org.glite.lb.server-bones

-

0.1.0

+

1.0.0

http://glite.web.cern.ch/glite/packages/I20041210/bin/rhel30/i386/RPMS/glite-lb-server-bones-0.1.0-1.i386.rpm

+ style='font-size:8.0pt'>http://glite.web.cern.ch/glite/packages/R1.0/R20050331/bin/rhel30/i386/RPMS/glite-lb-server-bones-1.0.0-1.i386.rpm

-

glite-lb-ws-interface

+

org.glite.lb.ws-interface

-

0.1.0

+

1.0.1

http://glite.web.cern.ch/glite/packages/I20041210/bin/rhel30/i386/RPMS/glite-lb-ws-interface-0.1.0-0.i386.rpm

+ style='font-size:8.0pt'>http://glite.web.cern.ch/glite/packages/R1.0/R20050331/bin/rhel30/i386/RPMS/glite-lb-ws-interface-1.0.1-1.i386.rpm

-

glite-security-proxyrenewal

+

org.glite.security.proxyrenewal

-

0.1.1

+

1.0.11

http://glite.web.cern.ch/glite/packages/I20041210/bin/rhel30/i386/RPMS/glite-security-proxyrenewal-0.1.1-1.i386.rpm

+ style='font-size:8.0pt'>http://glite.web.cern.ch/glite/packages/R1.0/R20050331/bin/rhel30/i386/RPMS/glite-security-proxyrenewal-1.0.11-1.i386.rpm

-

glite-wms-utils-exception

+

org.glite.wms-utils.exception

-

0.1.2

+

1.0.1

http://glite.web.cern.ch/glite/packages/I20041210/bin/rhel30/i386/RPMS/glite-wms-utils-exception-0.1.2-1.i386.rpm

+ style='font-size:8.0pt'>http://glite.web.cern.ch/glite/packages/R1.0/R20050331/bin/rhel30/i386/RPMS/glite-wms-utils-exception-1.0.1-1.i386.rpm

-

glite-wms-utils-jobid

+

org.glite.wms-utils.jobid

-

0.1.2

+

1.0.0

http://glite.web.cern.ch/glite/packages/I20041210/bin/rhel30/i386/RPMS/glite-wms-utils-jobid-0.1.2-1.i386.rpm

+ style='font-size:8.0pt'>http://glite.web.cern.ch/glite/packages/R1.0/R20050331/bin/rhel30/i386/RPMS/glite-wms-utils-jobid-1.0.0-1.i386.rpm

+
+

org.glite.security.voms

+
+

1.2.32

+
+

http://glite.web.cern.ch/glite/packages/R1.0/R20050331/bin/rhel30/i386/RPMS/glite-security-voms-1.2.32-1.i386.rpm

+
+

org.gridsite.core

+
+

1.1.5

+
+

http://glite.web.cern.ch/glite/packages/R1.0/R20050331/bin/rhel30/i386/RPMS/gridsite-1.1.5-1.i386.rpm

 

-

3. Dependencies

+

4. Dependencies

-

The gLite Logging & Bookkeeping Server module has the -following dependencies:

+

The gLite Logging & Bookkeeping Server v. 1.2.2 module +has the following dependencies:

 

- +
- - - - - - - + + + + + - - - - - - - - - - - - - - - - - - - - + + + + +

Component name

+ 8.0pt'>Component name

-

Version

+

Version

-

RPM file name

+

RPM file name

gLite Security Utilities

+ style='font-size:8.0pt'>gLite Security Utilities

-

0.2.0

+

1.0.0

http://glite.web.cern.ch/glite/packages/I20041210/installers/glite-security-utils_installer.sh

+ style='font-size:8.0pt'>http://glite.web.cern.ch/glite/packages/R1.0/R20050331/installers/glite-security-utils_installer.sh

+

gLite R-GMA Service Publisher

+
+

4.1.5

+
+

http://glite.web.cern.ch/glite/packages/R1.0/R20050331/installers/glite-rgma-servicetool_installer.sh

+

GPT

+ 8.0pt'>GPT

-

VDT 1.2.0

+

VDT 1.2.2

http://glite.web.cern.ch/glite/packages/externals/bin/rhel30/RPMS/gpt-VDT1.2.0rh9-1.i386.rpm

+ style='font-size:8.0pt'>http://glite.web.cern.ch/glite/packages/externals/bin/rhel30/RPMS/gpt-VDT1.2.2rh9-1.i386.rpm

VDT Globus Essentials

+ 8.0pt'>VDT Globus Essentials

-

VDT 1.2.0

+

VDT 1.2.2

http://glite.web.cern.ch/glite/packages/externals/bin/rhel30/RPMS/vdt_globus_essentials-VDT1.2.0rh9-1.i386.rpm

+ style='font-size:8.0pt'>http://glite.web.cern.ch/glite/packages/externals/bin/rhel30/RPMS/vdt_globus_essentials-VDT1.2.2rh9-1.i386.rpm

MySQL-server

+ 8.0pt'>MySQL-server

-

4.0.20

+

4.0.20

http://glite.web.cern.ch/glite/packages/externals/bin/rhel30/RPMS/MySQL-server-4.0.20-0.i386.rpm

MySQL-client

+ 8.0pt'>MySQL-client

-

4.0.20

+

4.0.20

http://glite.web.cern.ch/glite/packages/externals/bin/rhel30/RPMS/MySQL-client-4.0.20-0.i386.rpm

ares

+ 8.0pt'>ares

-

1.1.1

+

1.1.1

http://glite.web.cern.ch/glite/packages/externals/bin/rhel30/RPMS/ares-1.1.1-EGEE.i386.rpm

myproxy

+ 8.0pt'>myproxy

-

1.14

+

1.14

http://glite.web.cern.ch/glite/packages/externals/bin/rhel30/RPMS/myproxy-1.14-EGEE.i386.rpm

perl-Expect.pm

+ 8.0pt'>perl-Expect.pm

-

1.01

+

1.01

http://glite.web.cern.ch/glite/packages/externals/bin/rhel30/RPMS/per-Expect.pm-1.01-9.i386.rpm

+

Java SDK/JRE

+
+

1.4.2

+
+

http://java.sun.com/j2se/1.4.2/download.html

+

 

-

4. Known bugs and issues

+

5. Known bugs and issues

This release has the following bugs and issues. Bug numbers refer to the gLite Bug Tracking system @@ -924,175 +1022,436 @@ href="https://savannah.cern.ch/bugs/?group=jra1mdw">https://savannah.cern.ch/bug

 

+
    +
  • No removal procedure is provided + with this release apart from the removal of the RPMS. Any account, group + or other resource created during the module configuration must be manually + cleaned.
  • +
+ +

 

+ +

Known open bugs:

+ +

 

+ - - + - - + + - - + - + + + + + + + + + + +

Bug number

Description

+

 

+
+

 #5125

+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=6412"> #6412

glite-lb-bkserverd - start/stop/status displays usage options 

+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=6412">--start and --stop options not + documented in glite-ce-config.py, glite-lb-config.py 

+
+

 

 #5202

+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=7053"> #7053

no RPM provides the - lb-local-logger daemon -  

+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=7053">LB configuration fails if the + mysql root pwd is set 

+
+

 

+

 #5248

+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=7180"> #7180

When running - "glite-lb-bkserverd start", glite-lb-bkserverd doesn't start in - background 

+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=7180">Logging & Bookkeping UI  

+
+

 

 #5833

+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=7237"> #7237

-

all jobs in SUBMITTED after a - job storm 

+
+

Intermittent errors with job + submission 

+
+

 

 #5903

+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=7300"> #7300

glite-lb-bkserverd script gives - bash: /root/.bashrc: Permission denied error  

+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=7300">update of the lb instructions + at the end of the installer script  

+
+

 

 #5904

+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=7305"> #7305

glite-lb-bkserverd does not - check default location for credentials 

+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=7305">lb.database.username paramenter + in config file 

+
+

 

 #5926

+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=7307"> #7307

Default user should not be used - in the init.d scripts 

+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=7307">lb config script does _not_ + fail if mysql root password is set 

+
+

 

 #5932

+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=7321"> #7321

credential file created in - /var/tmp is unnecessary 

+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=7321">creation of indices fails + randomly 

+
+

 

 #5934

+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=7324"> #7324

service start and stop notifications - are inconsistent for glite-lb-bkserverd init,d script 

+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=7324">lb-bkserver is running with no + pid 

+
+

 

+
+

 #7389

+
+

LB server and WMS local logger + related issues 

+
+

 

-

 

+

 

-

No removal procedure is -provided with this release apart from the removal of the RPMS. Any account, -group or other resource created during the module configuration must be -manually cleaned.

+

Bugs fixed in this or previous releases, but not yet officially +tested:

+ +

 

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

Bug number

+
+

Description

+
+

 

+
+

 #5850

+
+

glite-lb-config.py has + glite.location and globus.location not set in params[] 

+
+

 

+
+

 #5908

+
+

Environment variables set via + the configuration script are not passed to daemon startup scripts 

+
+

 

+
+

 #6075

+
+

glite-lb-config.py crashes with + KeyError: GLITE_CERT_DIR 

+
+

 

+
+

 #6366

+
+

LB install script:: Fails but + no error reported 

+
+

 

+
+

 #6415

+
+

glite-lb-bkserver does not + start and blocks execution of glite-lb-config.py 

+
+

 

+
+

 #6689

+
+

glite-proxy-renewd starts the + daemon glite-proxy-renewd as GLITE_USER which is glite-lb i.e. wrong 

+
+

 

+
+

 #6722

+
+

glite-job-status -all doesn't + work 

+
+

 

+
+

 #7296

+
+

glite-lb-config.py crashes with + a TypeError exception 

+
+

 

+

 

-

5. Bugs closed since last release

+

6. Bugs closed since last release

@@ -1101,96 +1460,1190 @@ href="https://savannah.cern.ch/bugs/?group=jra1mdw">https://savannah.cern.ch/bug - - - + + + + - + + + + - - + + + + + + + + + + + + - + + + + + + +

Bug number

Description

+ +

 #5833

+
+

all jobs in SUBMITTED after a + job storm 

+

 #4627

+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=5897"> #5897

+

I20041203 LB installation + script has a missing dependency  

+

no licence found in lb packages 

+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=5910"> #5910

+
+

glite-lb configuration scripts + don't set GLITE_USER environment 

+

 #5236

+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=5925"> #5925

+

Running glite-lb script removes + mysql.sock file  

+
+

 #6416

+
+

the BKserver on the LB machine + needs a symlink and the script doesn't check for it 

+
+

 #7032

+
+

The LB installer fails with an + RPM not found message 

+

LB install/config documentation - has some errors 

+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=7152"> #7152

+
+

The LB installer tries to + install gridsite with a wrong rpm name 

 #5912

+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=7351"> #7351

glite-lb-bkserver daemon looks - hangs is /tmp/mysql.sock is not present 

+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=7351">Star/restart of LB services  

+

 #7401

+
+

The first time the LB config + script is run it fails creating the db indices 

+
+

 #7423

+
+

'/etc/rc.d/init.d/gLite status' + not working correctly in LB 

+
+ +

 

+ +
+
+ +

7. Previous Releases

+ +

7.1. Release 1.1.0

+ +

7.1.1. Release Description

+ +

This release contains the gLite Logging & Bookkeeping +Server module v. 1.1.0. The following sections provide additional information about +the release content, the module dependencies, the know bugs and issues and a +list of bugs closed since the previous release. For information about +installing and using the gLite Logging & Bookkeeping Server, please refer +to the gLite Installation and User Guides.

+ +

7.1.2. Changes in this Release

+ +

This release introduces the following changes:

+ +

 

+ +
    +
  • The gLite init.d script has been added to the deployment + module. The script is installed and activated by the configuration scripts + to start all LB services at boot-time
  • +
  • Bug fixes (see below for the complete lists)
  • +
+ +

7.1.3. Release contents

+ +

The gLite Logging & Bookkeeping Server v. 1.1.0 is +composed of the following gLite components:

+ +

 

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

Component name

+
+

Version

+
+

File

+
+

org.glite.deployment.lb

+
+

1.1.0

+
+

http://glite.web.cern.ch/glite/packages/I20050225/installers/glite-lb_installer.sh +

+

http://glite.web.cern.ch/glite/packages/I20050225/bin/rhel30/noarch/RPMS/glite-lb-config-1.1.0-1.noarch.rpm

+
+

org.glite.deployment.config

+
+

0.8.2

+
+

http://glite.web.cern.ch/glite/packages/I20050225/bin/rhel30/noarch/RPMS/glite- + config-0.8.2-1.noarch.rpm

+
+

org.glite.lb.client-interface

+
+

1.0.1

+
+

http://glite.web.cern.ch/glite/packages/I20050225/bin/rhel30/i386/RPMS/glite-lb-client-interface-1.0.1-1.i386.rpm

+
+

org.glite.lb.common

+
+

1.1.3

+
+

http://glite.web.cern.ch/glite/packages/I20050225/bin/rhel30/i386/RPMS/glite-lb-common-1.1.3-1.i386.rpm

+
+

org.glite.lb.logger

+
+

1.0.1

+
+

http://glite.web.cern.ch/glite/packages/I20050225/bin/rhel30/i386/RPMS/glite-lb-logger-1.0.1-1.i386.rpm

+
+

org.glite.lb.server

+
+

1.0.1

+
+

http://glite.web.cern.ch/glite/packages/I20050225/bin/rhel30/i386/RPMS/glite-lb-server-1.0.1-1.i386.rpm

+
+

org.glite.lb.server-bones

+
+

1.0.0

+
+

http://glite.web.cern.ch/glite/packages/I20050225/bin/rhel30/i386/RPMS/glite-lb-server-bones-1.0.0-1.i386.rpm

+
+

org.glite.lb.ws-interface

+
+

1.0.0

+
+

http://glite.web.cern.ch/glite/packages/I20050225/bin/rhel30/i386/RPMS/glite-lb-ws-interface-1.0.0-1.i386.rpm

+
+

org.glite.security.proxyrenewal

+
+

1.0.1

+
+

http://glite.web.cern.ch/glite/packages/I20050225/bin/rhel30/i386/RPMS/glite-security-proxyrenewal-1.0.1-1.i386.rpm

+
+

org.glite.wms-utils.exception

+
+

1.0.0

+
+

http://glite.web.cern.ch/glite/packages/I20050225/bin/rhel30/i386/RPMS/glite-wms-utils-exception-1.0.0-1.i386.rpm

+
+

org.glite.wms-utils.jobid

+
+

1.0.0

+
+

http://glite.web.cern.ch/glite/packages/I20050225/bin/rhel30/i386/RPMS/glite-wms-utils-jobid-1.0.0-1.i386.rpm

+
+

org.glite.security.voms

+
+

1.2.29

+
+

http://glite.web.cern.ch/glite/packages/I20050225/bin/rhel30/i386/RPMS/glite-security-voms-1.2.29-22.i386.rpm

+
+

org.gridsite.core

+
+

1.1.5

+
+

http://glite.web.cern.ch/glite/packages/I20050225/bin/rhel30/i386/RPMS/gridsite-1.1.5-1.i386.rpm

+
+ +

 

+ +

7.1.4. Dependencies

+ +

The gLite Logging & Bookkeeping Server module has the +following dependencies:

+ +

 

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

Component name

+
+

Version

+
+

RPM file name

+
+

gLite Security Utilities

+
+

0.6.1

+
+

http://glite.web.cern.ch/glite/packages/I20050225/installers/glite-security-utils_installer.sh

+
+

gLite R-GMA Service Publisher

+
+

4.1.2

+
+

http://glite.web.cern.ch/glite/packages/I20050225/installers/glite-rgma-servicetool_installer.sh

+
+

GPT

+
+

VDT 1.2.2

+
+

http://glite.web.cern.ch/glite/packages/externals/bin/rhel30/RPMS/gpt-VDT1.2.0rh9-1.i386.rpm

+
+

VDT Globus Essentials

+
+

VDT 1.2.2

+
+

http://glite.web.cern.ch/glite/packages/externals/bin/rhel30/RPMS/vdt_globus_essentials-VDT1.2.0rh9-1.i386.rpm

+
+

MySQL-server

+
+

4.0.20

+
+

http://glite.web.cern.ch/glite/packages/externals/bin/rhel30/RPMS/MySQL-server-4.0.20-0.i386.rpm

+
+

MySQL-client

+
+

4.0.20

+
+

http://glite.web.cern.ch/glite/packages/externals/bin/rhel30/RPMS/MySQL-client-4.0.20-0.i386.rpm

+
+

ares

+
+

1.1.1

+
+

http://glite.web.cern.ch/glite/packages/externals/bin/rhel30/RPMS/ares-1.1.1-EGEE.i386.rpm

+
+

myproxy

+
+

1.14

+
+

http://glite.web.cern.ch/glite/packages/externals/bin/rhel30/RPMS/myproxy-1.14-EGEE.i386.rpm

+
+

perl-Expect.pm

+
+

1.01

+
+

http://glite.web.cern.ch/glite/packages/externals/bin/rhel30/RPMS/per-Expect.pm-1.01-9.i386.rpm

+
+ +

 

+ +

7.1.5. Known bugs and issues

+ +

This release has the +following bugs and issues. Bug numbers refer to the gLite Bug Tracking system +database hosted on the CERN Savannah system at https://savannah.cern.ch/bugs/?group=jra1mdw +.

+ +

 

+ +
    +
  • No removal procedure is provided + with this release apart from the removal of the RPMS. Any account, group + or other resource created during the module configuration must be manually + cleaned.
  • +
  • No inet.d scripts are installed or + activated in this release. This will be fixed in the next release
  • +
+ +

 

+ +

Known open bugs:

+ +

 

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

Bug number

+
+

Description

+
+

 

+
+

 #6057

+
+

glite-lb configuration scripts + has missing dependency (CGI.pm) 

+
+

 

+
+

 #6415

+
+

glite-lb-bkserver does not + start and blocks execution of glite-lb-config.py 

+
+

 

+
+

 #6722

+
+

glite-job-status -all doesn't + work 

+
+

 

+
+

 #6838

+
+

There are no test reports + provided for the L&B Server in gLite v1.0.6 RC1 (Integration Build + I20050204) 

+
+

 

+
+

 #7032

+
+

The LB installer fails with an + RPM not found message 

+
+

 

+
+

 #7039

+
+

Problem if LD_LIBRARY_PATH is + unset 

+
+

 

+
+

 #7053

+
+

LB configuration fails if the + mysql root pwd is set 

+
+

 

+
+

 #7180

+
+

Logging & Bookkeping UI  

+
+

 

+
+ +

 

+ +

Bugs fixed in this or previous releases, but not yet tested:

+ +

 

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

Bug number

+
+

Description

+
+

 

+
+

 #5833

+
+

all jobs in SUBMITTED after a + job storm 

+
+

 

+
+

 #5850

+
+

glite-lb-config.py has + glite.location and globus.location not set in params[] 

+
+

 

+
+

 #5897

+
+

I20041203 LB installation + script has a missing dependency  

+
+

 

+
+

 #5901

+
+

mysqlaccess command fails with + Broken pipe if mysql socket file is in /tmp  

+
+

 

+
+

 #5908

+
+

Environment variables set via + the configuration script are not passed to daemon startup scripts 

+
+

 

+
+

 #5910

+
+

glite-lb configuration scripts + don't set GLITE_USER environment 

+
+

 

+
+

 #5925

+
+

Running glite-lb script removes + mysql.sock file  

+
+

 

+
+

 #6075

+
+

glite-lb-config.py crashes with + KeyError: GLITE_CERT_DIR 

+
+

 

+
+

 #6366

+
+

LB install script:: Fails but + no error reported 

+
+

 

+
+

 #6412

+
+

--start and --stop options not + documented in glite-ce-config.py, glite-lb-config.py 

+
+

 

+
+

 #6416

+
+

the BKserver on the LB machine + needs a symlink and the script doesn't check for it 

+
+

 

+
+ +

 

+ +

7.1.6. Bugs closed since last release

+ +

This release fixes the +following bugs and issues. Bug numbers refer to the gLite Bug Tracking system +database hosted on the CERN Savannah system at https://savannah.cern.ch/bugs/?group=jra1mdw

+ +

 

+ + + + -
-

 #5930

+

Bug number

-

running start on started - service is not an error.  

+
+

Description

 

-

6. Previous Releases

- -

6.1. Release 0.1.0

+

7.2. Release 1.0.0

-

6.1.1. Release Description

+

7.2.1. Release Description

This release contains the gLite Logging & Bookkeeping -Server module v. 0.1.0. The following sections provide additional information +Server module v. 1.0.0. The following sections provide additional information about the release content, the module dependencies, the know bugs and issues and a list of bugs closed since the previous release. For information about installing and using the gLite Logging & Bookkeeping Server, please refer to the gLite Installation and User Guides.

-

6.1.2. Release contents

+

7.2.2. Changes in this Release

-

The gLite Logging & Bookkeeping Server v. 0.1.0 is +

This release doesn’t contain any functional changes. It +contains a number of bug fixes in the components and the deployment module to +be submitted to testing.

+ +

However, the version number has been changed to match the +final release number 1.0.0.

+ +

7.2.3. Release contents

+ +

The gLite Logging & Bookkeeping Server v. 0.3.1 is composed of the following gLite components:

 

@@ -1219,17 +2672,17 @@ composed of the following gLite components:

-

0.1.0

+

1.0.0

http://glite.web.cern.ch/glite/packages/I20041126/installers/glite-lb_installer.sh + href="http://glite.web.cern.ch/glite/packages/I20041126/installers/glite-lb_installer.sh">http://glite.web.cern.ch/glite/packages/I20050114/installers/glite-lb_installer.sh

http://glite.web.cern.ch/glite/packages/I20041126/bin/rhel30/noarch/RPMS/glite-lb-config-0.1.0-1.noarch.rpm

+ href="http://glite.web.cern.ch/glite/packages/I20050114/bin/rhel30/noarch/RPMS/glite-lb-config-1.0.0-1.noarch.rpm">http://glite.web.cern.ch/glite/packages/I20050114/bin/rhel30/noarch/RPMS/glite-lb-config-1.0.0-1.noarch.rpm

@@ -1240,15 +2693,15 @@ composed of the following gLite components:

-

0.1.0

+

0.4.1

http://glite.web.cern.ch/glite/packages/I20041126/bin/rhel30/noarch/RPMS/glite- - config-0.1.0-1.noarch.rpm

+ href="http://glite.web.cern.ch/glite/packages/I20050107/bin/rhel30/noarch/RPMS/glite-%20config-0.4.1-1.noarch.rpm">http://glite.web.cern.ch/glite/packages/I20050114/bin/rhel30/noarch/RPMS/glite- + config-0.4.1-1.noarch.rpm

@@ -1259,14 +2712,32 @@ composed of the following gLite components:

-

0.3.0

+

1.0.0

+ + +

http://glite.web.cern.ch/glite/packages/I20050114/bin/rhel30/i386/RPMS/glite-lb-client-interface-1.0.0-1.i386.rpm

+ + + + +

glite-lb-common

+ + +

1.1.0

http://glite.web.cern.ch/glite/packages/I20041126/bin/rhel30/i386/RPMS/glite-lb-client-interface-0.3.0-2.i386.rpm

+ href="http://glite.web.cern.ch/glite/packages/I20050107/bin/rhel30/i386/RPMS/glite-lb-common-1.1.0-1.i386.rpm">http://glite.web.cern.ch/glite/packages/I20050114/bin/rhel30/i386/RPMS/glite-lb-common-1.1.0-1.i386.rpm

@@ -1277,86 +2748,86 @@ composed of the following gLite components:

-

0.3.0

+

1.0.0

http://glite.web.cern.ch/glite/packages/I20041126/bin/rhel30/i386/RPMS/glite-lb-logger-0.3.0-3.i386.rpm

+ href="http://glite.web.cern.ch/glite/packages/I20050107/bin/rhel30/i386/RPMS/glite-lb-logger-1.0.0-1.i386.rpm">http://glite.web.cern.ch/glite/packages/I20050114/bin/rhel30/i386/RPMS/glite-lb-logger-1.0.0-1.i386.rpm

-

glite-lb-common

+

glite-lb-server

-

0.3.0

+

1.0.0

-

http://glite.web.cern.ch/glite/packages/I20041126/bin/rhel30/i386/RPMS/glite-lb-common-0.3.0-2.i386.rpm

+

http://glite.web.cern.ch/glite/packages/I20050114/bin/rhel30/i386/RPMS/glite-lb-server-1.0.0-1.i386.rpm

-

glite-lb-server

+

glite-lb-server-bones

-

0.5.2

+

1.0.0

http://glite.web.cern.ch/glite/packages/I20041126/bin/rhel30/i386/RPMS/glite-lb-server-0.5.2-4.i386.rpm

+ href="http://glite.web.cern.ch/glite/packages/I20050107/bin/rhel30/i386/RPMS/glite-lb-server-bones-1.0.0-1.i386.rpm">http://glite.web.cern.ch/glite/packages/I20050114/bin/rhel30/i386/RPMS/glite-lb-server-bones-1.0.0-1.i386.rpm

-

glite-lb-server-bones

+

glite-lb-ws-interface

-

0.1.0

+

1.0.0

http://glite.web.cern.ch/glite/packages/I20041126/bin/rhel30/i386/RPMS/glite-lb-server-bones-0.1.0-1.i386.rpm

+ href="http://glite.web.cern.ch/glite/packages/I20050107/bin/rhel30/i386/RPMS/glite-lb-ws-interface-1.0.0-1.i386.rpm">http://glite.web.cern.ch/glite/packages/I20050114/bin/rhel30/i386/RPMS/glite-lb-ws-interface-1.0.0-1.i386.rpm

-

glite-wms-utils-jobid

+

glite-security-proxyrenewal

-

0.1.2

+

1.0.0

http://glite.web.cern.ch/glite/packages/I20041126/bin/rhel30/i386/RPMS/glite-wms-utils-jobid-0.1.2-1.i386.rpm

+ href="http://glite.web.cern.ch/glite/packages/I20050107/bin/rhel30/i386/RPMS/glite-security-proxyrenewal-1.0.0-1.i386.rpm">http://glite.web.cern.ch/glite/packages/I20050114/bin/rhel30/i386/RPMS/glite-security-proxyrenewal-1.0.0-1.i386.rpm

@@ -1367,39 +2838,39 @@ composed of the following gLite components:

-

0.1.2

+

1.0.0

http://glite.web.cern.ch/glite/packages/I20041126/bin/rhel30/i386/RPMS/glite-wms-utils-exception-0.1.2-1.i386.rpm

+ href="http://glite.web.cern.ch/glite/packages/I20050107/bin/rhel30/i386/RPMS/glite-wms-utils-exception-1.0.0-1.i386.rpm">http://glite.web.cern.ch/glite/packages/I20050114/bin/rhel30/i386/RPMS/glite-wms-utils-exception-1.0.0-1.i386.rpm

-

glite-security-proxyrenewal

+

glite-wms-utils-jobid

-

0.1.0

+

1.0.0

http://glite.web.cern.ch/glite/packages/I20041126/bin/rhel30/i386/RPMS/glite-security-proxyrenewal-0.1.0-1.i386.rpm

+ href="http://glite.web.cern.ch/glite/packages/I20050107/bin/rhel30/i386/RPMS/glite-wms-utils-jobid-1.0.0-1.i386.rpm">http://glite.web.cern.ch/glite/packages/I20050114/bin/rhel30/i386/RPMS/glite-wms-utils-jobid-1.0.0-1.i386.rpm

 

-

6.1.3. Dependencies

+

7.2.4. Dependencies

The gLite Logging & Bookkeeping Server module has the following dependencies:

@@ -1432,13 +2903,14 @@ following dependencies:

-

0.2.0

+

0.4.0

http://glite.web.cern.ch/glite/packages/I20041126/installers/glite-security-utils_installer.sh

+ style='font-size:10.0pt'>http://glite.web.cern.ch/glite/packages/I20050114/installers/glite-security-utils_installer.sh

@@ -1585,7 +3057,7 @@ following dependencies:

 

-

6.1.4. Known bugs and issues

+

7.2.5. Known bugs and issues

This release has the following bugs and issues. Bug numbers refer to the gLite Bug Tracking system @@ -1598,39 +3070,38 @@ href="https://savannah.cern.ch/bugs/?group=jra1mdw">https://savannah.cern.ch/bug - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Bug number

Description

+

 #5125

+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=5202"> #5202

+

glite-lb-bkserverd - start/stop/status displays usage options 

+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=5202">no RPM provides the + lb-local-logger daemon -  

 #5248

https://savannah.cern.ch/bug background 

+

 #5833

+
+

all jobs in SUBMITTED after a + job storm 

+
+

 #5850

+
+

glite-lb-config.py has + glite.location and globus.location not set in params[] 

+
+

 #5897

+
+

I20041203 LB installation + script has a missing dependency  

+
+

 #5900

+
+

location of mysql.sock file  

+
+

 #5901

+
+

mysqlaccess command fails with + Broken pipe if mysql socket file is in /tmp

+
+

 #5903

+
+

glite-lb-bkserverd script gives + bash: /root/.bashrc: Permission denied error  

+
+

 #5904

+
+

glite-lb-bkserverd does not + check default location for credentials 

+
+

#5910

+
+

glite-lb configuration scripts + don't set GLITE_USER environment 

+
+

 #5925

+
+

Running glite-lb script removes + mysql.sock file  

+
+

 #5926

+
+

Default user should not be used + in the init.d scripts 

+
+

 #5932

+
+

credential file created in + /var/tmp is unnecessary 

+
+

 #5934

+
+

service start and stop + notifications are inconsistent for glite-lb-bkserverd init,d script 

+
+

 #6057

+
+

glite-lb configuration scripts + has missing dependency (CGI.pm) 

+
+

#6075

+
+

glite-lb-config.py crashes with + KeyError: GLITE_CERT_DIR 

+

 

@@ -1653,12 +3333,11 @@ manually cleaned.

text-align:left;text-autospace:none'> 

-

6.1.5. Bugs closed since last release

+

7.2.6. Bugs closed since last release

This release fixes the -following bugs and issues. Since there are no previous public releases, this -list refers to the previous development release. Bug numbers refer to the gLite -Bug Tracking system database hosted on the CERN Savannah system at https://savannah.cern.ch/bugs/?group=jra1mdw  

@@ -1667,44 +3346,13 @@ href="https://savannah.cern.ch/bugs/?group=jra1mdw">https://savannah.cern.ch/bug - - - - - - - - - -
-

Bug number

+

Bug number

-

Description

-
-

 #4627

-
-

no licence found in lb packages 

-
-

 #5236

-
-

LB install/config documentation - has some errors 

+

Description

diff --git a/org.glite.deployment.lb/doc/release_notes/release_notes.pdf b/org.glite.deployment.lb/doc/release_notes/release_notes.pdf index 353c3a28a37959364d92fe9221a4253f160322af..4b071fabd9aae0a6c4eeada184a589162f22e6f2 100644 GIT binary patch literal 277829 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�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 S(*OJNFVsO8P2tE+$^QUoBQiYz diff --git a/org.glite.deployment.lb/project/build.number b/org.glite.deployment.lb/project/build.number new file mode 100644 index 0000000..0c3021e --- /dev/null +++ b/org.glite.deployment.lb/project/build.number @@ -0,0 +1,2 @@ +#Wed Apr 27 10:35:06 CEST 2005 +module.build=222 diff --git a/org.glite.deployment.lb/project/glite-lb.sdf.xml.template b/org.glite.deployment.lb/project/glite-lb.sdf.xml.template index 9fd493f..098c107 100644 --- a/org.glite.deployment.lb/project/glite-lb.sdf.xml.template +++ b/org.glite.deployment.lb/project/glite-lb.sdf.xml.template @@ -10,9 +10,9 @@ - + + + + + + + + + + + - diff --git a/org.glite.deployment.lb/project/glite-lb.spec b/org.glite.deployment.lb/project/glite-lb.spec index cf7c650..a4bc55e 100644 --- a/org.glite.deployment.lb/project/glite-lb.spec +++ b/org.glite.deployment.lb/project/glite-lb.spec @@ -8,7 +8,7 @@ Group:System/Application Prefix:/opt/glite BuildArch:noarch BuildRoot:%{_builddir}/%{name}-%{version} -Requires: glite-lb-common, glite-lb-logger, glite-lb-server, glite-security-proxyrenewal, glite-lb-client-interface, MySQL-server, MySQL-client, expat, ares,vdt_globus_essentials, glite-wms-utils-jobid, glite-wms-utils-exception, myproxy, perl-Expect.pm +Requires: glite-config, glite-rgma-servicetool-config, glite-lb-client-interface, glite-lb-ws-interface, glite-lb-logger, glite-lb-common, glite-lb-server, glite-lb-server-bones, glite-wms-utils-jobid, glite-wms-utils-exception, glite-security-proxyrenewal, glite-security-voms, gridsite, MySQL-server, MySQL-client, ares, vdt_globus_essentials, gpt, myproxy, perl-Expect.pm AutoReqProv:no Source:glite-lb.tar.gz diff --git a/org.glite.deployment.lb/project/lxscript-rpm.xsl b/org.glite.deployment.lb/project/lxscript-rpm.xsl index 79eb3dc..e20f297 100644 --- a/org.glite.deployment.lb/project/lxscript-rpm.xsl +++ b/org.glite.deployment.lb/project/lxscript-rpm.xsl @@ -9,6 +9,7 @@ omit-xml-declaration="yes"/> + @@ -52,10 +53,24 @@ function parseRPMList() RPMLIST=$newRPMLIST } +#Parse the SCRIPTLIST to execute all scripts +function parseScriptList() +{ + for i in $SCRIPTLIST + do + if [ "$INSTALL" = "true" ]; then + $i + else + $i -u + fi + done +} #Downloads and install the module RPMS function install() { + + INSTALL=true version echo echo xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx @@ -75,6 +90,14 @@ function install() + # Download scripts from repository + + + true + + + + # Download dependencies RPMS from repository @@ -90,6 +113,10 @@ function install() + + # Download and install subservices + parseScriptList + # Install all RPMS echo @@ -98,12 +125,35 @@ function install() echo xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx echo parseRPMList - rpm -Uvh $RPMLIST - echo - echo Done! + if [ ! -z "$RPMLIST" ]; then + rpm -Uvh $RPMLIST + rpm_return=$? + else + echo All required RPMS are already installed + rpm_return=0 + fi + if [ "$rpm_return" == "0" ]; then + echo + echo Done! + echo + echo Before using the gLite LB, please create or update the configuration + echo file /opt/glite/etc/config/glite-lb.cfg.xml + echo and run the configuration script + echo /opt/glite/etc/config/scripts/glite-lb-config.py. + echo A template is provided in + echo /opt/glite/etc/config/templates/glite-lb.cfg.xml + else + echo + echo An error occurred while installing the LB RPMS. + echo Most likely one or more of the RPMS to be installed require + echo additional dependencies or are older than already installed packages. + echo Please refer to the rpm error message above for more details. + fi echo - echo For more information refer to the gLite Installation and User Guides or to the gLite web site \(http:\/\/www.glite.org\) - echo Please report problems and comments to the gLite Team at project-eu-egee-middleware-integration-support@cern.ch + echo For more information refer to the gLite Installation and User Guides + echo or to the gLite web site \(http:\/\/www.glite.org\) + echo Please report problems and comments to the gLite Team at + echo project-eu-egee-glite-bugs@cern.ch cd .. } @@ -144,8 +194,16 @@ function uninstall() echo xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx echo rpm -ev $RPMLIST - echo - echo Done! + if [ "$?" == "0" ]; then + echo + echo Done! + else + echo + echo An error occurred while removing the LB RPMS. + echo Most likely one or more of the RPMS to be removed have + echo dependent packages. + echo Please refer to the rpm error message above for more details. + fi } ############################################################################### @@ -209,6 +267,28 @@ install exit 0 + + + _installer.sh + + +wget -N --non-verbose +if [ ! -f "" ] +then + echo + echo ERROR: could not be downloaded! + exit 1 +fi +chmod u+x +SCRIPTLIST="$SCRIPTLIST ./" + + +SCRIPTLISTUn="$SCRIPTLISTUn ./ -u " + + + + + --..rpm diff --git a/org.glite.deployment.lb/project/version.properties b/org.glite.deployment.lb/project/version.properties index 61f3e64..0fdc5e4 100644 --- a/org.glite.deployment.lb/project/version.properties +++ b/org.glite.deployment.lb/project/version.properties @@ -1,4 +1,4 @@ -#Thu Dec 09 08:14:11 CET 2004 -module.version=0.2.0 -module.build=68 -module.age=1 + +module.version = 1.2.3 +module.age = 1 + \ No newline at end of file diff --git a/org.glite.jp.common/.cvsignore b/org.glite.jp.common/.cvsignore deleted file mode 100644 index 3a4edf6..0000000 --- a/org.glite.jp.common/.cvsignore +++ /dev/null @@ -1 +0,0 @@ -.project diff --git a/org.glite.jp.common/Makefile b/org.glite.jp.common/Makefile deleted file mode 100644 index 8626261..0000000 --- a/org.glite.jp.common/Makefile +++ /dev/null @@ -1,85 +0,0 @@ -# defaults -top_srcdir=. -builddir=build -top_builddir=${top_srcdir}/${builddir} -stagedir=. -distdir=. -globalprefix=glite -lbprefix=lb -package=glite-jp-common -version=0.0.0 -PREFIX=/opt/glite - -glite_location=/opt/glite -globus_prefix=/opt/globus -nothrflavour=gcc32 -thrflavour=gcc32pthr -expat_prefix=/opt/expat -ares_prefix=/opt/ares -gsoap_prefix=/software/gsoap-2.6 - -CC=gcc - --include Makefile.inc - - -VPATH=${top_srcdir}/src:${top_srcdir}/test:${top_srcdir}/project:${jpproject} - -GLOBUSINC:= -I${globus_prefix}/include/${nothrflavour} - - -DEBUG:=-g -O0 -CFLAGS:=${DEBUG} -I. -I${top_srcdir}/interface -I${stagedir}/include \ - ${GLOBUSINC} - -LINK:=libtool --mode=link ${CC} ${LDFLAGS} -rpath ${stagedir}/lib -LINKXX:=libtool --mode=link ${CXX} ${LDFLAGS} -INSTALL:=libtool --mode=install install -COMPILE:=libtool --mode=compile ${CC} ${CFLAGS} - -HDRS:=types.h context.h strmd5.h - -SRCS:=context.c strmd5.c -OBJS:=${SRCS:.c=.lo} - -commonlib:= libglite_jp_common.la - -default all: compile - -compile: ${commonlib} - -${commonlib}: ${OBJS} - ${LINK} -o $@ ${OBJS} - -check: - -echo nothing yet - -doc: - -stage: compile - $(MAKE) install PREFIX=${stagedir} - -install: - -mkdir -p ${PREFIX}/include/${globalprefix}/${jpprefix} - cd ${top_srcdir}/interface && install -m 644 ${HDRS} ${PREFIX}/include/${globalprefix}/${jpprefix} - -mkdir -p ${PREFIX}/lib - ${INSTALL} -m 755 ${commonlib} ${PREFIX}/lib - -dist: distsrc distbin - -# FIXME: just copied from LB -distsrc: - mkdir -p ${top_srcdir}/${package}-${version} - cd ${top_srcdir} && GLOBIGNORE="${package}-${version}" && cp -Rf * ${package}-${version} - cd ${top_srcdir} && tar -czf ${distdir}/${package}-${version}_src.tar.gz --exclude-from=project/tar_exclude ${package}-${version} - rm -rf ${top_srcdir}/${package}-${version} - -distbin: - $(MAKE) install PREFIX=`pwd`/tmpbuilddir${stagedir} - save_dir=`pwd`; cd tmpbuilddir${stagedir} && tar -czf $$save_dir/${top_srcdir}/${distdir}/${package}-${version}_bin.tar.gz *; cd $$save_dir - rm -rf tmpbuilddir - -clean: - -%.lo: %.c - ${COMPILE} -o $@ -c $< diff --git a/org.glite.jp.common/build.xml b/org.glite.jp.common/build.xml deleted file mode 100755 index f20263f..0000000 --- a/org.glite.jp.common/build.xml +++ /dev/null @@ -1,93 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/org.glite.jp.common/interface/context.h b/org.glite.jp.common/interface/context.h deleted file mode 100644 index 20effb2..0000000 --- a/org.glite.jp.common/interface/context.h +++ /dev/null @@ -1,17 +0,0 @@ -#ifndef __GLITE_JP_CONTEXT -#define __GLITE_JP_CONTEXT - -int glite_jp_init_context(glite_jp_context_t *); -void glite_jp_free_query_rec(glite_jp_query_rec_t *); - -char *glite_jp_peer_name(glite_jp_context_t); -char *glite_jp_error_chain(glite_jp_context_t); - -int glite_jp_stack_error(glite_jp_context_t, const glite_jp_error_t *); -int glite_jp_clear_error(glite_jp_context_t); - -int glite_jp_add_deferred(glite_jp_context_t,int (*)(glite_jp_context_t,void *),void *); -int glite_jp_run_deferred(glite_jp_context_t); - - -#endif diff --git a/org.glite.jp.common/interface/strmd5.h b/org.glite.jp.common/interface/strmd5.h deleted file mode 100755 index c5d76b6..0000000 --- a/org.glite.jp.common/interface/strmd5.h +++ /dev/null @@ -1,28 +0,0 @@ -#ifndef _GLITE_STRMD5_H -#define _GLITE_STRMD5_H - -#ident "$Header$" - -/* Compute MD5 sum of the first argument. - * The sum is returned in the 16-byte array pointed to by 2nd argument - * (if not NULL) - * - * Return value: ASCII string of the sum, i.e. 32 characters [0-9a-f] - * (pointer to static area, changed by subsequent calls) - */ - -char *strmd5(const char *src, unsigned char *dst); - -/** - * Returns: allocated 32bytes long ASCII string with md5 sum - * of the first argument - */ -char *str2md5(const char *src); - -/** - * Returns: allocated 22bytes long ASCII string with md5 sum in base64 - * format of the source argument - */ -char *str2md5base64(const char *src); - -#endif /* _GLITE_STRMD5_H */ diff --git a/org.glite.jp.common/interface/types.h b/org.glite.jp.common/interface/types.h deleted file mode 100644 index 70e8482..0000000 --- a/org.glite.jp.common/interface/types.h +++ /dev/null @@ -1,83 +0,0 @@ -#ifndef __GLITE_JP_TYPES -#define __GLITE_JP_TYPES - -#include - -typedef struct _glite_jp_error_t { - int code; - char *desc; - char *source; - struct _glite_jp_error_t *reason; -} glite_jp_error_t; - -typedef struct _glite_jp_context { - glite_jp_error_t *error; - int (**deferred_func)(struct _glite_jp_context *,void *); - void **deferred_arg; - void *feeds; - struct soap *other_soap; -} *glite_jp_context_t; - -typedef enum { - GLITE_JP_FILECLASS_UNDEF, - GLITE_JP_FILECLASS_INPUT, - GLITE_JP_FILECLASS_OUTPUT, - GLITE_JP_FILECLASS_LBLOG, - GLITE_JP_FILECLASS_TAGS, - GLITE_JP_FILECLASS__LAST -} glite_jp_fileclass_t; - -typedef struct { - char *name; - int sequence; - time_t timestamp; - int binary; - size_t size; - char *value; -} glite_jp_tagval_t; - -typedef enum { - GLITE_JP_ATTR_UNDEF, - GLITE_JP_ATTR_OWNER, - GLITE_JP_ATTR_TIME, - GLITE_JP_ATTR_TAG, - GLITE_JP_ATTR__LAST -} glite_jp_attrtype_t; - -typedef struct { - glite_jp_attrtype_t type; - char *name; -} glite_jp_attr_t; - -typedef struct { - glite_jp_attr_t attr; - union { - char *s; - int i; - struct timeval time; - glite_jp_tagval_t tag; - } value; -} glite_jp_attrval_t; - - -typedef enum { - GLITE_JP_QUERYOP_UNDEF, - GLITE_JP_QUERYOP_EQUAL, - GLITE_JP_QUERYOP_UNEQUAL, - GLITE_JP_QUERYOP_LESS, - GLITE_JP_QUERYOP_GREATER, - GLITE_JP_QUERYOP_WITHIN, - GLITE_JP_QUERYOP__LAST, -} glite_jp_queryop_t; - -typedef struct { - glite_jp_attr_t attr; - glite_jp_queryop_t op; - union _glite_jp_query_rec_val { - char *s; - int i; - struct timeval time; - } value,value2; -} glite_jp_query_rec_t; - -#endif diff --git a/org.glite.jp.common/project/build.properties b/org.glite.jp.common/project/build.properties deleted file mode 100644 index e69de29..0000000 diff --git a/org.glite.jp.common/project/configure.properties.xml b/org.glite.jp.common/project/configure.properties.xml deleted file mode 100644 index 5f0ea37..0000000 --- a/org.glite.jp.common/project/configure.properties.xml +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - - - - -top_srcdir=.. -builddir=build -stagedir=${stage.abs.dir} -distdir=${dist.dir} -globalprefix=${global.prefix} -jpprefix=${subsystem.prefix} -package=${module.package.name} -PREFIX=${install.dir} -version=${module.version} -glite_location=${with.glite.location} -globus_prefix=${with.globus.prefix} -expat_prefix=${with.expat.prefix} -gsoap_prefix=${with.gsoap.prefix} -ares_prefix=${with.ares.prefix} -thrflavour=${with.globus.thr.flavor} -nothrflavour=${with.globus.nothr.flavor} -cppunit=${with.cppunit.prefix} -jpproject=${subsystem.project.dir} -project=${component.project.dir} - - - diff --git a/org.glite.jp.common/project/properties.xml b/org.glite.jp.common/project/properties.xml deleted file mode 100755 index b9d669d..0000000 --- a/org.glite.jp.common/project/properties.xml +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/org.glite.jp.common/project/tar_exclude b/org.glite.jp.common/project/tar_exclude deleted file mode 100644 index e1fcd1a..0000000 --- a/org.glite.jp.common/project/tar_exclude +++ /dev/null @@ -1,10 +0,0 @@ -tar_exclude -CVS -build.xml -build -build.properties -properties.xml -configure.properties.xml -.cvsignore -.project -.cdtproject diff --git a/org.glite.jp.common/project/version.properties b/org.glite.jp.common/project/version.properties deleted file mode 100644 index 999300f..0000000 --- a/org.glite.jp.common/project/version.properties +++ /dev/null @@ -1,4 +0,0 @@ -#Fri Dec 10 13:33:53 CET 2004 -module.version=0.1.0 -module.build=3 -module.age=1 diff --git a/org.glite.jp.common/src/context.c b/org.glite.jp.common/src/context.c deleted file mode 100644 index 016bc59..0000000 --- a/org.glite.jp.common/src/context.c +++ /dev/null @@ -1,164 +0,0 @@ -#include -#include - -#include "types.h" -#include "context.h" - -int glite_jp_init_context(glite_jp_context_t *ctx) -{ - *ctx = calloc(1,sizeof **ctx); -} - -char *glite_jp_peer_name(glite_jp_context_t ctx) -{ - return strdup("unknown"); -} - -char *glite_jp_error_chain(glite_jp_context_t ctx) -{ - char *ret = NULL,indent[300] = ""; - int len = 0,add; - char buf[2000]; - - glite_jp_error_t *ep = ctx->error; - - do { - add = snprintf(buf,sizeof buf,"%s%s: %s (%s)\n", - indent, - ep->source, - strerror(ep->code), - ep->desc ? ep->desc : ""); - ret = realloc(ret,len + add + 1); - strncpy(ret + len,buf,add); ret[len += add] = 0; - strcat(indent," "); - } while (ep = ep->reason); - - return ret; -} - -int glite_jp_stack_error(glite_jp_context_t ctx, const glite_jp_error_t *err) -{ - glite_jp_error_t *reason = ctx->error; - - ctx->error = calloc(1,sizeof *ctx->error); - ctx->error->code = err->code; - ctx->error->desc = err->desc ? strdup(err->desc) : NULL; - ctx->error->source = err->source ? strdup(err->source) : NULL; - ctx->error->reason = reason; - - return err->code; -} - -int glite_jp_clear_error(glite_jp_context_t ctx) -{ - glite_jp_error_t *e = ctx->error, *r; - - while (e) { - r = e->reason; - free(e->source); - free(e->desc); - free(e); - e = r; - } - ctx->error = NULL; - return 0; -} - - -void glite_jp_free_query_rec(glite_jp_query_rec_t *q) -{ - free(q->attr.name); q->attr.name = NULL; - switch (q->attr.type) { - case GLITE_JP_ATTR_OWNER: - case GLITE_JP_ATTR_TAG: - free(q->value.s); q->value.s = NULL; - if (q->op == GLITE_JP_QUERYOP_WITHIN) { - free(q->value2.s); - q->value2.s = NULL; - } - break; - default: break; - } -} - -int glite_jp_attr_copy(glite_jp_attr_t *dst,const glite_jp_attr_t *src) -{ - dst->name = src->name ? strdup(src->name) : NULL; - dst->type = src->type; - return 0; -} - -int glite_jp_queryrec_copy(glite_jp_query_rec_t *dst, const glite_jp_query_rec_t *src) -{ - glite_jp_attr_copy(&dst->attr,&src->attr); - dst->op = src->op; - switch (src->attr.type) { - case GLITE_JP_ATTR_OWNER: - case GLITE_JP_ATTR_TAG: - dst->value.s = strdup(src->value.s); - if (dst->op == GLITE_JP_QUERYOP_WITHIN) - dst->value2.s = strdup(src->value2.s); - break; - case GLITE_JP_ATTR_TIME: - memcpy(&dst->value.time,&src->value.time,sizeof dst->value.time); - if (dst->op == GLITE_JP_QUERYOP_WITHIN) - memcpy(&dst->value2.time,&src->value2.time,sizeof dst->value2.time); - break; - } - return 0; -} - -int glite_jp_run_deferred(glite_jp_context_t ctx) -{ - int i,cnt,ret; - - if (!ctx->deferred_func) return 0; - - glite_jp_clear_error(ctx); - for (cnt=0;ctx->deferred_func[cnt];cnt++); - for (i=0; ideferred_func)(ctx,*ctx->deferred_arg)) { - glite_jp_error_t err; - char desc[100]; - - sprintf(desc,"calling func #%d, %p",i,*ctx->deferred_func); - err.code = ret; - err.desc = desc; - err.source = "glite_jp_run_deferred()"; - - glite_jp_stack_error(ctx,&err); - return ret; - } - else { - memmove(ctx->deferred_func,ctx->deferred_func+1, - (cnt-i) * sizeof *ctx->deferred_func); - memmove(ctx->deferred_arg,ctx->deferred_arg+1, - (cnt-i) * sizeof *ctx->deferred_arg); - } - } - free(ctx->deferred_func); ctx->deferred_func = NULL; - free(ctx->deferred_arg); ctx->deferred_arg = NULL; - return 0; -} - -int glite_jp_add_deferred( - glite_jp_context_t ctx, - int (*func)(glite_jp_context_t, void *), - void *arg -) -{ - int (**v)(glite_jp_context_t, void *) = ctx->deferred_func; - int i; - - for (i=0; v && *v; i++); - - ctx->deferred_func = realloc(ctx->deferred_func, (i+1) * sizeof *ctx->deferred_func); - ctx->deferred_func[i] = func; - ctx->deferred_func[i+1] = NULL; - - ctx->deferred_arg = realloc(ctx->deferred_arg,(i+1) * sizeof *ctx->deferred_arg); - ctx->deferred_arg[i] = arg; - ctx->deferred_arg[i+1] = NULL; - - return 0; -} diff --git a/org.glite.jp.common/src/strmd5.c b/org.glite.jp.common/src/strmd5.c deleted file mode 100755 index 87fd400..0000000 --- a/org.glite.jp.common/src/strmd5.c +++ /dev/null @@ -1,115 +0,0 @@ -#include -#include -#include -#include - -#include "strmd5.h" - -static char mbuf[33]; - -static int base64_encode(const void *enc, int enc_size, char *out, int out_max_size) -{ - static const char* b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"; - - unsigned char* enc_buf = (unsigned char*)enc; - int out_size = 0; - unsigned int bits = 0; - unsigned int shift = 0; - - while ( out_size < out_max_size ) { - if ( enc_size>0 ) { - // Shift in byte - bits <<= 8; - bits |= *enc_buf; - shift += 8; - // Next byte - enc_buf++; - enc_size--; - } else if ( shift>0 ) { - // Pad last bits to 6 bits - will end next loop - bits <<= 6 - shift; - shift = 6; - } else { - // Terminate with Mime style '=' - *out = '='; - out_size++; - - return out_size; - } - - // Encode 6 bit segments - while ( shift>=6 ) { - shift -= 6; - *out = b64[ (bits >> shift) & 0x3F ]; - out++; - out_size++; - } - } - - // Output overflow - return -1; -} - -char *strmd5(const char *s, unsigned char *digest) -{ - MD5_CTX md5; - unsigned char d[16]; - int i; - - MD5_Init(&md5); - MD5_Update(&md5,s,strlen(s)); - MD5_Final(d,&md5); - - if (digest) memcpy(digest,d,sizeof(d)); - - for (i=0; i<16; i++) { - int dd = d[i] & 0x0f; - mbuf[2*i+1] = dd<10 ? dd+'0' : dd-10+'a'; - dd = d[i] >> 4; - mbuf[2*i] = dd<10 ? dd+'0' : dd-10+'a'; - } - mbuf[32] = 0; - return (char *) mbuf; -} - -char *str2md5(const char *s) -{ - MD5_CTX md5; - unsigned char d[16]; - char* ret = malloc(33); - int i; - - if (!ret) - return NULL; - - MD5_Init(&md5); - MD5_Update(&md5, s, strlen(s)); - MD5_Final(d, &md5); - - for (i=0; i<16; i++) { - int dd = d[i] & 0x0f; - ret[2*i+1] = dd<10 ? dd+'0' : dd-10+'a'; - dd = d[i] >> 4; - ret[2*i] = dd<10 ? dd+'0' : dd-10+'a'; - } - ret[32] = 0; - return ret; -} - -char *str2md5base64(const char *s) -{ - MD5_CTX md5; - unsigned char d[16]; - char buf[50]; - int l; - - MD5_Init(&md5); - MD5_Update(&md5, s, strlen(s)); - MD5_Final(d, &md5); - - l = base64_encode(d, 16, buf, sizeof(buf) - 1); - if (l < 1) - return NULL; - buf[l - 1] = 0; - return strdup(buf); -} diff --git a/org.glite.jp.index/.cvsignore b/org.glite.jp.index/.cvsignore deleted file mode 100644 index 3a4edf6..0000000 --- a/org.glite.jp.index/.cvsignore +++ /dev/null @@ -1 +0,0 @@ -.project diff --git a/org.glite.jp.index/Makefile b/org.glite.jp.index/Makefile deleted file mode 100644 index 3b893cd..0000000 --- a/org.glite.jp.index/Makefile +++ /dev/null @@ -1,129 +0,0 @@ -# defaults -top_srcdir=. -builddir=build -top_builddir=${top_srcdir}/${builddir} -stagedir=. -distdir=. -globalprefix=glite -lbprefix=lb -package=glite-lb-server -version=0.0.0 -PREFIX=/opt/glite - -glite_location=/opt/glite -globus_prefix=/opt/globus -nothrflavour=gcc32 -thrflavour=gcc32pthr -expat_prefix=/opt/expat -ares_prefix=/opt/ares -gsoap_prefix=/software/gsoap-2.6 - -CC=gcc - --include Makefile.inc - - -VPATH=${top_srcdir}/src:${top_srcdir}/examples:${top_srcdir}/test:${top_srcdir}/project:${jpproject} - -GLOBUS_LIBS:=-L${globus_prefix}/lib \ - -lglobus_common_${nothrflavour} \ - -lglobus_gssapi_gsi_${nothrflavour} - -DEBUG:=-g -O0 -DDEBUG - -CFLAGS:=${DEBUG} -I. -I${gsoap_prefix}/include -I${stagedir}/include -LDFLAGS:=-L${stagedir}/lib - -LINK:=libtool --mode=link ${CC} ${LDFLAGS} -LINKXX:=libtool --mode=link ${CXX} ${LDFLAGS} -INSTALL:=libtool --mode=install install - - -daemon:=glite-jp-indexd -example:=jpis-test -soap_prefix:=jpis_ - -SRCS:= simple_server.c soap_ops.c \ - ${soap_prefix}C.c \ - ${soap_prefix}Server.c - -EXA_SRCS:=jpis-test.c ${soap_prefix}C.c ${soap_prefix}Client.c - - -OBJS:=${SRCS:.c=.o} stdsoap2.o -EXA_OBJS:=${EXA_SRCS:.c=.o} stdsoap2.o - -COMMONLIB:=-lglite_jp_common - -default all: compile - -compile: ${daemon} ${example} - -${daemon}: ${OBJS} - ${LINK} -o $@ ${OBJS} ${COMMONLIB} ${GLOBUS_LIBS} - -${example}: ${EXA_OBJS} - ${LINK} -o $@ ${EXA_OBJS} - -JobProvenanceIS.xh: JobProvenanceIS.wsdl JobProvenanceTypes.wsdl typemap.dat - cp ${jpproject}/JobProvenanceTypes.wsdl . - ${gsoap_prefix}/bin/wsdl2h -t ${top_srcdir}/src/typemap.dat -c -o $@ $< - rm -f JobProvenanceTypes.wsdl - -${soap_prefix}C.c ${soap_prefix}H.h: JobProvenanceIS.xh - ${gsoap_prefix}/bin/soapcpp2 -w -c -p ${soap_prefix} JobProvenanceIS.xh - -#$(SOAP_PREFIX)H.h $(SOAP_PREFIX)C.c: LB.xh -# $(GSOAP_BIN_PATH)/soapcpp2 -w -c -p $(SOAP_PREFIX) LB.xh -# -#LB.xh: LB.wsdl typemap.dat -# $(GSOAP_BIN_PATH)/wsdl2h -c -o $@ LB.wsdl -# - - -check: - -echo nothing yet - -doc: - -stage: compile - ${INSTALL} -m 755 ${daemon} ${stagedir}/bin - -dist: distsrc distbin - -# FIXME: just copied from LB -distsrc: - mkdir -p ${top_srcdir}/${package}-${version} - cd ${top_srcdir} && GLOBIGNORE="${package}-${version}" && cp -Rf * ${package}-${version} - cd ${top_srcdir} && tar -czf ${distdir}/${package}-${version}_src.tar.gz --exclude-from=project/tar_exclude ${package}-${version} - rm -rf ${top_srcdir}/${package}-${version} - -distbin: - $(MAKE) install PREFIX=`pwd`/tmpbuilddir${stagedir} - save_dir=`pwd`; cd tmpbuilddir${stagedir} && tar -czf $$save_dir/${top_srcdir}/${distdir}/${package}-${version}_bin.tar.gz *; cd $$save_dir - rm -rf tmpbuilddir - -install: - -mkdir -p ${PREFIX}/bin ${PREFIX}/etc ${PREFIX}/etc/init.d - for p in bkserverd bkindex; do \ - ${INSTALL} -m 755 "glite_lb_$$p" "${PREFIX}/bin/glite-lb-$$p"; \ - done - - for f in dbsetup.sql index.conf.template; do \ - ${INSTALL} -m 644 ${top_srcdir}/config/"glite-lb-$$f" ${PREFIX}/etc; \ - done - - ${INSTALL} -m 755 ${top_srcdir}/config/startup ${PREFIX}/etc/init.d/glite-lb-bkserverd - -clean: - -soap_ops.o jpis-test.o simple_server.o: ${soap_prefix}H.h - -# we have no real config.h but have to force gSoap not to use -# linux ftime with broken (aka obsolete) DST information - -stdsoap2.o: ${gsoap_prefix}/devel/stdsoap2.c - test -f config.h || touch config.h - @echo 'The following warning "time_t (de)serialization is not MT safe on this platform" is harmless' - ${CC} -o $@ -c -DHAVE_CONFIG_H ${CFLAGS} ${gsoap_prefix}/devel/stdsoap2.c - diff --git a/org.glite.jp.index/build.xml b/org.glite.jp.index/build.xml deleted file mode 100755 index 547659a..0000000 --- a/org.glite.jp.index/build.xml +++ /dev/null @@ -1,93 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/org.glite.jp.index/project/JobProvenanceIS.wsdl b/org.glite.jp.index/project/JobProvenanceIS.wsdl deleted file mode 100644 index 26f97a4..0000000 --- a/org.glite.jp.index/project/JobProvenanceIS.wsdl +++ /dev/null @@ -1,531 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Register job with JP primary storage. -Job registration in LB is propagated to JP immediately so that JP is aware of the job, -despite no furhter information is available in it. - -Input: JobId - -Output: N/A - -Faults: GenericJPFault - - - - - - - Initiate upload of of sandbox/dump of job life log from LB. -WM component responsible for job sandbox management and LB server call JP to declare -intention to upload intput/output sandbox and job life log. - -Input: - -uclass: type of the upload - INPUT_SANDBOX, OUTPUT_SANDBOX, JOB_LOG - -commitTimeout: upper limit on time for which JP waits for committing this upload transaction - -contentType: MIME type of the uploaded file - -Output: - -destination: URL where the client should upload the file - -commitBefore: acutual time when the upload transaction times out - -Faults: GenericJPFault - - -Initiate upload of of sandbox/dump of job life log from LB. - - - - - - Confirm upload. -Should be called after a file upload initiaded with StartUpload is finished. - -Input: - -destination: Upload destination URL (to match with the original request) - -Output: - -Faults: GenericJPFault - - - - - - - Record a value of user tag. -JP tags are either standalone or override values of their LB counterparts. -However, JP tag values are still distinguishable those inherited from LB. -JP tags may be either strings or blobs. - -Input: - -jobid: - -tag: structure containing name, timestamp, optional sequence number to order tag values -without relying on timestamps, and string or blob value. - -Output: N/A - -Faults: GenericJPFault - - - - - - - Start feeding JP index server. -Called by the index server to start batch feed, and optionally also subscribe for incremental feed. - -JP index server subscribes with JP primary storage using a query -containing conditions on primary metadata and a list of queryable attributes -of the index server (i.e. data which should be sent to the index server). - -When a matching job record is created or modified within the primary storage -the job record data are sent to the subscribed index server. - -The subscription is soft-state, it expires after certain time unless refreshed by the client explicitely. - -In the batch mode the query has the same form -with additional flag asking for all matching records (i.e.\ not only -arriving afterwards). - -Input: - -destination: where to send the job record data - -attributes: which job record attributes should be sent to the requesting index server - -conditions: list of query conditions. Each conditions has the form Attribute Operator Value, -where Attribute is any of job record attributes and Operator is one of EQUAL, UNEQUAL, LESS, GREATER, WITHIN. - -continuous: flag determining that the query is incremental (not batch) - -Output: - -feedId: unique Id of the feed request, to be used in refresh, cancelation etc. - -expires: when the feed times out. Must be refreshed before this time. - -Faults: GenericJPFault - - - - - - - Extend batch feed subscription (used by index server) - -Input: feedId returned previously by FeedIndex - -Output: the same as for FeedIndex - -Faults: GenericJPFault - - - - - - - Retrieve job record URL's when jobid is known -Used either to bypass JP index server query for this specific case, or after the index server query to -retrieve actual job record. - -Input: jobid - -Output: - -jobLog, inputSandbox, outputSandbox, tags: URL's to components of the job record. - -Faults: GenericJPFault - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Job Provenance Primary Storage service - - - - - - - - - - - - - - - - - - - - - - Store or update information on jobs within the JP index server. -Called directly by the primary storage, used for both batch and incremental feed. - -Input: - -data: list of job record updates. Each contains jobid, list of JP attribute values and user tag values. - -feedDone: flag indicating end of batch feed. (In order to avoid potential problems with buffer allocation -the huge dataset of batch feed is split into reasonable chunks and delivered with more UpdateJobs calls.) - -Output: N/A - -Faults: GenericJPFault - - - - - - - - - Retrieve pointers to job records of jobs matching a query. -Input: conditions - list of lists of query conditions. - Elements of the inner lists refer to a single job attribute, the conditions are or-ed. - Elements of the outer list may refer to different job attributes, they are and-ed. - -Output: - -jobs: list of JobId, PSContact (URL of the primary storage which manges this job) pairs - -Faults: GenericJPFault - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Job Provenance Index service - - - - - - - diff --git a/org.glite.jp.index/project/build.properties b/org.glite.jp.index/project/build.properties deleted file mode 100644 index e69de29..0000000 diff --git a/org.glite.jp.index/project/configure.properties.xml b/org.glite.jp.index/project/configure.properties.xml deleted file mode 100644 index 72af8f4..0000000 --- a/org.glite.jp.index/project/configure.properties.xml +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - - - - - - -top_srcdir=.. -builddir=build -stagedir=${stage.abs.dir} -distdir=${dist.dir} -globalprefix=${global.prefix} -lbprefix=${subsystem.prefix} -package=${module.package.name} -PREFIX=${install.dir} -version=${module.version} -glite_location=${with.glite.location} -globus_prefix=${with.globus.prefix} -expat_prefix=${with.expat.prefix} -gsoap_prefix=${with.gsoap.prefix} -ares_prefix=${with.ares.prefix} -thrflavour=${with.globus.thr.flavor} -nothrflavour=${with.globus.nothr.flavor} -cppunit=${with.cppunit.prefix} -jpproject=${subsystem.project.dir} -project=${component.project.dir} - - - diff --git a/org.glite.jp.index/project/properties.xml b/org.glite.jp.index/project/properties.xml deleted file mode 100755 index 5f56392..0000000 --- a/org.glite.jp.index/project/properties.xml +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/org.glite.jp.index/project/tar_exclude b/org.glite.jp.index/project/tar_exclude deleted file mode 100644 index e1fcd1a..0000000 --- a/org.glite.jp.index/project/tar_exclude +++ /dev/null @@ -1,10 +0,0 @@ -tar_exclude -CVS -build.xml -build -build.properties -properties.xml -configure.properties.xml -.cvsignore -.project -.cdtproject diff --git a/org.glite.jp.index/project/version.properties b/org.glite.jp.index/project/version.properties deleted file mode 100644 index a0d1638..0000000 --- a/org.glite.jp.index/project/version.properties +++ /dev/null @@ -1,4 +0,0 @@ -#Fri Dec 10 13:35:33 CET 2004 -module.version=0.1.0 -module.build=2 -module.age=1 diff --git a/org.glite.jp.index/src/simple_server.c b/org.glite.jp.index/src/simple_server.c deleted file mode 100644 index ccaa5a7..0000000 --- a/org.glite.jp.index/src/simple_server.c +++ /dev/null @@ -1,39 +0,0 @@ -#include "glite/jp/types.h" -#include "glite/jp/context.h" - -#include "jpis_H.h" - -int main() { - struct soap soap; - int i, m, s; // master and slave sockets - - glite_jp_context_t ctx; - - soap_init(&soap); - glite_jp_init_context(&ctx); - soap.user = (void *) ctx; - - srand48(time(NULL)); /* feed id generation */ - - m = soap_bind(&soap, NULL, 8902, 100); - if (m < 0) - soap_print_fault(&soap, stderr); - else - { - fprintf(stderr, "Socket connection successful: master socket = %d\n", m); - for (i = 1; ; i++) { - s = soap_accept(&soap); - if (s < 0) { - soap_print_fault(&soap, stderr); - break; - } - soap_serve(&soap); // process RPC request - soap_destroy(&soap); // clean up class instances - soap_end(&soap); // clean up everything and close socket - glite_jp_run_deferred(ctx); - } - } - soap_done(&soap); // close master socket - - return 0; -} diff --git a/org.glite.jp.index/src/soap_ops.c b/org.glite.jp.index/src/soap_ops.c deleted file mode 100644 index 5af7352..0000000 --- a/org.glite.jp.index/src/soap_ops.c +++ /dev/null @@ -1,81 +0,0 @@ -#include -#include - -#include "glite/jp/types.h" -#include "glite/jp/context.h" - -#include "jpis_H.h" -#include "JobProvenanceIS.nsmap" - -static struct jptype__GenericJPFaultType *jp2s_error(struct soap *soap, - const glite_jp_error_t *err) -{ - struct jptype__GenericJPFaultType *ret = NULL; - if (err) { - ret = soap_malloc(soap,sizeof *ret); - memset(ret,0,sizeof *ret); - ret->code = err->code; - ret->source = soap_strdup(soap,err->source); - ret->text = soap_strdup(soap,strerror(err->code)); - ret->description = soap_strdup(soap,err->desc); - ret->reason = jp2s_error(soap,err->reason); - } - return ret; -} - -static void err2fault(const glite_jp_context_t ctx,struct soap *soap) -{ - char *et; - struct SOAP_ENV__Detail *detail = soap_malloc(soap,sizeof *detail); - struct _GenericJPFault *f = soap_malloc(soap,sizeof *f); - - - f->jptype__GenericJPFault = jp2s_error(soap,ctx->error); - - detail->__type = SOAP_TYPE__GenericJPFault; - detail->value = f; - detail->__any = NULL; - - soap_receiver_fault(soap,"Oh, shit!",NULL); - if (soap->version == 2) soap->fault->SOAP_ENV__Detail = detail; - else soap->fault->detail = detail; -} - -static void s2jp_tag(const struct jptype__TagValue *stag,glite_jp_tagval_t *jptag) -{ - memset(jptag,0,sizeof *jptag); - jptag->name = strdup(stag->name); - jptag->sequence = stag->sequence ? *stag->sequence : 0; - jptag->timestamp = stag->timestamp ? *stag->timestamp : 0; - if (stag->stringValue) jptag->value = strdup(stag->stringValue); - else if (stag->blobValue) { - jptag->binary = 1; - jptag->size = stag->blobValue->__size; - jptag->value = (char *) stag->blobValue->__ptr; - } -} - -#define CONTEXT_FROM_SOAP(soap,ctx) glite_jp_context_t ctx = (glite_jp_context_t) ((soap)->user) - -SOAP_FMAC5 int SOAP_FMAC6 jpsrv__UpdateJobs( - struct soap *soap, - char *feed_id, - struct jptype__UpdateJobsData *jobs, - enum xsd__boolean done -) -{ - printf("%s items %d jobid %s\n",__FUNCTION__,jobs->__sizejob, - jobs->job[0]->jobid); - return SOAP_OK; -} - -SOAP_FMAC5 int SOAP_FMAC6 jpsrv__QueryJobs( - struct soap *soap, - struct jptype__IndexQuery *query, - struct jpsrv__QueryJobsResponse *resp -) -{ - puts(__FUNCTION__); - return SOAP_OK; -} - diff --git a/org.glite.jp.index/src/typemap.dat b/org.glite.jp.index/src/typemap.dat deleted file mode 100644 index 7032cb2..0000000 --- a/org.glite.jp.index/src/typemap.dat +++ /dev/null @@ -1,2 +0,0 @@ -jpsrv = http://glite.org/wsdl/services/jp -jptype = http://glite.org/wsdl/types/jp diff --git a/org.glite.jp.primary/.cvsignore b/org.glite.jp.primary/.cvsignore deleted file mode 100644 index 3a4edf6..0000000 --- a/org.glite.jp.primary/.cvsignore +++ /dev/null @@ -1 +0,0 @@ -.project diff --git a/org.glite.jp.primary/Makefile b/org.glite.jp.primary/Makefile deleted file mode 100644 index 2e9b3c4..0000000 --- a/org.glite.jp.primary/Makefile +++ /dev/null @@ -1,148 +0,0 @@ -# defaults -top_srcdir=. -builddir=build -top_builddir=${top_srcdir}/${builddir} -stagedir=. -distdir=. -globalprefix=glite -jpprefix=jp -package=glite-jp-primary -version=0.0.0 -PREFIX=/opt/glite - -glite_location=/opt/glite -globus_prefix=/opt/globus -nothrflavour=gcc32 -thrflavour=gcc32pthr -expat_prefix=/opt/expat -ares_prefix=/opt/ares -gsoap_prefix=/software/gsoap-2.6 - -CC=gcc - --include Makefile.inc - - -VPATH=${top_srcdir}/src:${top_srcdir}/examples:${top_srcdir}/test:${top_srcdir}/project:${stagedir}/interface - -GLOBUS_LIBS:=-L${globus_prefix}/lib \ - -lglobus_common_${nothrflavour} \ - -lglobus_gssapi_gsi_${nothrflavour} - -DEBUG:=-g -O0 -DDEBUG - -CFLAGS:=${DEBUG} -I. -I${top_srcdir}/src -I${gsoap_prefix}/include -I${stagedir}/include -LDFLAGS:=-L${stagedir}/lib - -LINK:=libtool --mode=link ${CC} ${LDFLAGS} -LINKXX:=libtool --mode=link ${CXX} ${LDFLAGS} -INSTALL:=libtool --mode=install install - - -daemon:=glite-jp-primarystoraged -example:=jpps-test -ps_prefix:=jpps_ -is_prefix:=jpis_ - -gsoap_version=`${gsoap_prefix}/bin/soapcpp2 -version 2>&1 | cut -d' ' -f4 | perl -F\\\\. -nae '$$F[2] =~ s/\D*$$//; print $$F[2]+100*$$F[1]+10000*$$F[0]'` - -CFLAGS+=-DGSOAP_VERSION=${gsoap_version} - - -SRCS:= simple_server.c soap_ops.c \ - ftp_backend.c \ - feed.c tags.c\ - is_client.c \ - ${ps_prefix}ServerLib.c \ - ${is_prefix}ClientLib.c jpps_C.c -# env_C.c - -EXA_SRCS:=jpps-test.c ${ps_prefix}C.c ${ps_prefix}Client.c - - -OBJS:=${SRCS:.c=.o} -EXA_OBJS:=${EXA_SRCS:.c=.o} - -COMMONLIB:=-lglite_jp_common -GSOAPLIB:=-L${gsoap_prefix}/lib -lgsoap${GSOAP_DEBUG} - -default all: compile - -compile: ${daemon} ${example} - -${daemon}: ${OBJS} - ${LINK} -o $@ ${OBJS} ${COMMONLIB} ${GSOAPLIB} ${GLOBUS_LIBS} - -${example}: ${EXA_OBJS} - ${LINK} -o $@ ${EXA_OBJS} ${GSOAPLIB} - -JobProvenanceIS.xh JobProvenancePS.xh: %.xh: %.wsdl JobProvenanceTypes.wsdl typemap.dat - cp ${stagedir}/interface/JobProvenanceTypes.wsdl . - ${gsoap_prefix}/bin/wsdl2h -t ${top_srcdir}/src/typemap.dat -c -o $@ $< - rm -f JobProvenanceTypes.wsdl - -${ps_prefix}Client.c ${ps_prefix}ClientLib.c \ -${ps_prefix}Server.c ${ps_prefix}ServerLib.c \ -${ps_prefix}C.c ${ps_prefix}H.h: JobProvenancePS.xh - ${gsoap_prefix}/bin/soapcpp2 -n -w -c -p ${ps_prefix} JobProvenancePS.xh - -${is_prefix}ClientLib.c ${is_prefix}Client.c \ -${is_prefix}C.c ${is_prefix}H.h: JobProvenanceIS.xh - ${gsoap_prefix}/bin/soapcpp2 -n -w -c -p ${is_prefix} JobProvenanceIS.xh - -env_C.c env_Server.c: - touch env.xh - cp ${jpproject}/JobProvenanceTypes.wsdl . - ${gsoap_prefix}/bin/wsdl2h -t ${top_srcdir}/src/typemap.dat -c -o env.xh JobProvenanceTypes.wsdl - rm -f JobProvenanceTypes.wsdl - ${gsoap_prefix}/bin/soapcpp2 -w -c -p env_ env.xh - -#$(SOAP_PREFIX)H.h $(SOAP_PREFIX)C.c: LB.xh -# $(GSOAP_BIN_PATH)/soapcpp2 -w -c -p $(SOAP_PREFIX) LB.xh -# -#LB.xh: LB.wsdl typemap.dat -# $(GSOAP_BIN_PATH)/wsdl2h -c -o $@ LB.wsdl -# - - -simple_server.o: ${is_prefix}H.h ${ps_prefix}H.h - -check: - -echo nothing yet - -doc: - -stage: compile - ${MAKE} PREFIX=${stagedir} DOSTAGE=yes install - -dist: distsrc distbin - -distsrc: - mkdir -p ${top_srcdir}/${package}-${version} - cd ${top_srcdir} && GLOBIGNORE="${package}-${version}" && cp -Rf * ${package}-${version} - cd ${top_srcdir} && tar -czf ${distdir}/${package}-${version}_src.tar.gz --exclude-from=project/tar_exclude ${package}-${version} - rm -rf ${top_srcdir}/${package}-${version} - -distbin: - $(MAKE) install PREFIX=`pwd`/tmpbuilddir${stagedir} - save_dir=`pwd`; cd tmpbuilddir${stagedir} && tar -czf $$save_dir/${top_srcdir}/${distdir}/${package}-${version}_bin.tar.gz *; cd $$save_dir - rm -rf tmpbuilddir - -install: - -mkdir -p ${PREFIX}/bin ${PREFIX}/etc ${PREFIX}/examples ${PREFIX}/etc/init.d - ${INSTALL} -m 755 ${daemon} ${PREFIX}/bin - ${INSTALL} -m 755 jpps-test ${PREFIX}/examples/glite-jp-primary-test - - -clean: - -simple_server.o soap_ops.o jpps-test.o: ${ps_prefix}H.h - -# we have no real config.h but have to force gSoap not to use -# linux ftime with broken (aka obsolete) DST information - -stdsoap2.o: ${gsoap_prefix}/devel/stdsoap2.c - test -f config.h || touch config.h - @echo 'The following warning "time_t (de)serialization is not MT safe on this platform" is harmless' - ${CC} -o $@ -c -DWITH_NONAMESPACES -DHAVE_CONFIG_H ${CFLAGS} ${gsoap_prefix}/devel/stdsoap2.c - diff --git a/org.glite.jp.primary/build.xml b/org.glite.jp.primary/build.xml deleted file mode 100755 index 28c0d13..0000000 --- a/org.glite.jp.primary/build.xml +++ /dev/null @@ -1,97 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/org.glite.jp.primary/examples/jpps-test.c b/org.glite.jp.primary/examples/jpps-test.c deleted file mode 100644 index 8cf9c6f..0000000 --- a/org.glite.jp.primary/examples/jpps-test.c +++ /dev/null @@ -1,194 +0,0 @@ -#include -#include -#include -#include - -#include "jpps_H.h" -#include "jpps_.nsmap" - -#include "jptype_map.h" - -static void usage(const char *me) -{ - fprintf(stderr,"%s: [-s server-url] operation args \n\n" - " operations are:\n" - " RegisterJob jobid\n" - " StartUpload jobid class(0,1,2) commit_before mimetype\n" - " CommitUpload destination\n" - " RecordTag jobid tagname sequence stringvalue\n" - " GetJob jobid\n" - " FeedIndex destination query_number history continuous\n" - " FeedIndexRefresh feedid\n" - ,me); - - exit (EX_USAGE); -} - -static int check_fault(struct soap *soap,int err) { - struct SOAP_ENV__Detail *detail; - struct jptype__GenericJPFaultType *f; - char *reason,indent[200] = " "; - - switch(err) { - case SOAP_OK: puts("OK"); - break; - case SOAP_FAULT: - case SOAP_SVR_FAULT: - if (soap->version == 2) { - detail = soap->fault->SOAP_ENV__Detail; - reason = soap->fault->SOAP_ENV__Reason; - } - else { - detail = soap->fault->detail; - reason = soap->fault->faultstring; - } - fputs(reason,stderr); - putc('\n',stderr); - assert(detail->__type == SOAP_TYPE__GenericJPFault); -#if GSOAP_VERSION >=20700 - f = ((struct _GenericJPFault *) detail->fault) -#else - f = ((struct _GenericJPFault *) detail->value) -#endif - -> jptype__GenericJPFault; - - while (f) { - fprintf(stderr,"%s%s: %s (%s)\n",indent, - f->source,f->text,f->description); - f = f->reason; - strcat(indent," "); - } - return -1; - - default: soap_print_fault(soap,stderr); - return -1; - } - return 0; -} - -static struct jptype__Attribute sample_attr[] = { - { OWNER, NULL }, - { TIME, "submitted" }, - { TAG, "test" }, -}; - -static struct jptype__PrimaryQueryElement sample_query[][5] = { - { - { sample_attr+OWNER, EQUAL, "unknown", NULL }, - { NULL, 0, NULL, NULL } - }, -}; - -int main(int argc,char *argv[]) -{ - char *server = "http://localhost:8901"; - int opt; - struct soap *soap = soap_new(); - - if (argc < 2) usage(argv[0]); - - soap_init(soap); - soap_set_namespaces(soap, jpps__namespaces); - - while ((opt = getopt(argc,argv,"s:")) >= 0) switch (opt) { - case 's': server = optarg; - argv += 2; - break; - case '?': usage(argv[0]); - } - - if (!strcasecmp(argv[1],"RegisterJob")) { - struct jpsrv__RegisterJobResponse r; - - if (argc != 3) usage(argv[0]); - check_fault(soap, - soap_call_jpsrv__RegisterJob(soap,server,"",argv[2],&r)); - } else if (!strcasecmp(argv[1], "StartUpload")) { - struct jpsrv__StartUploadResponse r; - - if (argc != 6) usage(argv[0]); - if (!check_fault(soap, - soap_call_jpsrv__StartUpload(soap, server, "", - argv[2], atoi(argv[3]), atoi(argv[4]), argv[5], &r))) { - printf("Destination: %s\nCommit before: %s\n", r.destination, ctime(&r.commitBefore)); - } - } else if (!strcasecmp(argv[1], "CommitUpload")) { - struct jpsrv__CommitUploadResponse r; - - if (argc != 3) usage(argv[0]); - if (!check_fault(soap, - soap_call_jpsrv__CommitUpload(soap, server, "", - argv[2], &r))) { - /* OK */ - } - } else if (!strcasecmp(argv[1], "RecordTag")) { - struct jpsrv__RecordTagResponse r; - struct jptype__TagValue tagval; - - if (argc != 6) usage(argv[0]); - - tagval.name = argv[3]; - tagval.sequence = NULL; - tagval.timestamp = NULL; - tagval.stringValue = argv[5]; - tagval.blobValue = NULL; - - if (!check_fault(soap, - soap_call_jpsrv__RecordTag(soap, server, "", - argv[2], &tagval, &r))) { - /* OK */ - } - } else if (!strcasecmp(argv[1],"FeedIndex")) { - struct jpsrv__FeedIndexResponse r; - struct jptype__Attribute *ap[2]; - struct jptype__Attributes attr = { 2, ap }; - struct jptype__PrimaryQueryElement *qp[100]; - struct jptype__PrimaryQuery qry = { 0, qp }; - - int i,j,qi = atoi(argv[3])-1; - - if (argc != 6) usage(argv[0]); - - for (i=0; i - - - - - - - - - - -top_srcdir=.. -builddir=build -stagedir=${stage.abs.dir} -distdir=${dist.dir} -globalprefix=${global.prefix} -lbprefix=${subsystem.prefix} -package=${module.package.name} -PREFIX=${install.dir} -version=${module.version} -glite_location=${with.glite.location} -globus_prefix=${with.globus.prefix} -expat_prefix=${with.expat.prefix} -ares_prefix=${with.ares.prefix} -gsoap_prefix=${with.gsoap.prefix} -thrflavour=${with.globus.thr.flavor} -nothrflavour=${with.globus.nothr.flavor} -cppunit=${with.cppunit.prefix} -jpproject=${subsystem.project.dir} -project=${component.project.dir} - - - diff --git a/org.glite.jp.primary/project/properties.xml b/org.glite.jp.primary/project/properties.xml deleted file mode 100755 index 2149dd4..0000000 --- a/org.glite.jp.primary/project/properties.xml +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/org.glite.jp.primary/project/tar_exclude b/org.glite.jp.primary/project/tar_exclude deleted file mode 100644 index e1fcd1a..0000000 --- a/org.glite.jp.primary/project/tar_exclude +++ /dev/null @@ -1,10 +0,0 @@ -tar_exclude -CVS -build.xml -build -build.properties -properties.xml -configure.properties.xml -.cvsignore -.project -.cdtproject diff --git a/org.glite.jp.primary/project/version.properties b/org.glite.jp.primary/project/version.properties deleted file mode 100644 index 1343828..0000000 --- a/org.glite.jp.primary/project/version.properties +++ /dev/null @@ -1,4 +0,0 @@ -#Fri Dec 10 13:37:05 CET 2004 -module.version=0.1.0 -module.build=3 -module.age=1 diff --git a/org.glite.jp.primary/src/backend.h b/org.glite.jp.primary/src/backend.h deleted file mode 100644 index bb143e9..0000000 --- a/org.glite.jp.primary/src/backend.h +++ /dev/null @@ -1,105 +0,0 @@ -#ifndef __GLITE_JP_BACKEND -#define __GLITE_JP_BACKEND - -#include -#include - -int glite_jppsbe_init( - glite_jp_context_t ctx, - int *argc, - char *argv[] -); - -int glite_jppsbe_init_slave( - glite_jp_context_t ctx -); - -int glite_jppsbe_register_job( - glite_jp_context_t ctx, - const char *job, - const char *owner -); - -int glite_jppsbe_start_upload( - glite_jp_context_t ctx, - const char *job, - glite_jp_fileclass_t class, - const char *content_type, - char **destination_out, - time_t *commit_before_inout -); - -int glite_jppsbe_commit_upload( - glite_jp_context_t ctx, - const char *destination -); - -int glite_jppsbe_destination_info( - glite_jp_context_t ctx, - const char *destination, - char **job_out, - glite_jp_fileclass_t *class_out -); - -int glite_jppsbe_get_job_url( - glite_jp_context_t ctx, - const char *job, - glite_jp_fileclass_t class, - char **url_out -); - -int glite_jppsbe_open_file( - glite_jp_context_t ctx, - const char *job, - glite_jp_fileclass_t class, - int mode, - void **handle_out -); - -int glite_jppsbe_close_file( - glite_jp_context_t ctx, - void *handle -); - -int glite_jppsbe_pread( - glite_jp_context_t ctx, - void *handle, - void *buf, - size_t nbytes, - off_t offset, - ssize_t *nbytes_ret -); - -int glite_jppsbe_pwrite( - glite_jp_context_t ctx, - void *handle, - void *buf, - size_t nbytes, - off_t offset -); - -int glite_jppsbe_append( - glite_jp_context_t ctx, - void *handle, - void *buf, - size_t nbytes -); - -int glite_jppsbe_get_job_metadata( - glite_jp_context_t ctx, - const char *job, - glite_jp_attrval_t attrs_inout[] -); - -int glite_jppsbe_query( - glite_jp_context_t ctx, - const glite_jp_query_rec_t query[], - const glite_jp_attrval_t metadata[], - int (*callback)( - glite_jp_context_t ctx, - const char *job, - const glite_jp_attrval_t metadata[] - ) -); - -#endif diff --git a/org.glite.jp.primary/src/feed.c b/org.glite.jp.primary/src/feed.c deleted file mode 100644 index 297eb23..0000000 --- a/org.glite.jp.primary/src/feed.c +++ /dev/null @@ -1,264 +0,0 @@ -#include -#include -#include -#include -#include -#include - -#include "glite/jp/types.h" -#include "glite/jp/strmd5.h" -#include "feed.h" - - -/* - * seconds before feed expires: should be - * XXX: should be configurable, default for real deployment sort of 1 hour - */ -#define FEED_TTL 120 - -static int check_qry_item( - glite_jp_context_t ctx, - const glite_jp_query_rec_t *qry, - const glite_jp_attrval_t *attr -) -{ - int cmp,cmp2; - long scmp,ucmp; - - switch (qry->attr.type) { - case GLITE_JP_ATTR_OWNER: - case GLITE_JP_ATTR_TAG: - cmp = strcmp(attr->value.s,qry->value.s); - break; - case GLITE_JP_ATTR_TIME: - scmp = (ucmp = attr->value.time.tv_usec - qry->value.time.tv_usec) > 0 ? 0 : -1; - ucmp -= 1000000 * scmp; - scmp += attr->value.time.tv_sec - qry->value.time.tv_sec; - cmp = scmp ? scmp : ucmp; - break; - } - switch (qry->op) { - case GLITE_JP_QUERYOP_EQUAL: return !cmp; - case GLITE_JP_QUERYOP_UNEQUAL: return cmp; - case GLITE_JP_QUERYOP_LESS: return cmp < 0; - case GLITE_JP_QUERYOP_GREATER: return cmp > 0; - - case GLITE_JP_QUERYOP_WITHIN: - switch (qry->attr.type) { - case GLITE_JP_ATTR_OWNER: - case GLITE_JP_ATTR_TAG: - cmp2 = strcmp(attr->value.s,qry->value2.s); - break; - case GLITE_JP_ATTR_TIME: - scmp = (ucmp = attr->value.time.tv_usec - qry->value2.time.tv_usec) > 0 ? 0 : -1; - ucmp -= 1000000 * scmp; - scmp += attr->value.time.tv_sec - qry->value2.time.tv_sec; - cmp2 = scmp ? scmp : ucmp; - break; - } - return cmp >= 0 && cmp2 <= 0; - } -} - -/* XXX: limit on query size -- I'm lazy to malloc() */ -#define QUERY_MAX 100 - -static int match_feed( - glite_jp_context_t ctx, - const struct jpfeed *feed, - const char *job, - const glite_jp_attrval_t attrs[] /* XXX: not checked for correctness */ -) -{ - int i; - int attri[GLITE_JP_ATTR__LAST]; - int qi[QUERY_MAX]; - - glite_jp_attrval_t *newattr = NULL; - - glite_jp_clear_error(ctx); - - for (i=0; iqry) { - int j,complete = 1; - - memset(qi,0,sizeof qi); - for (i=0; feed->qry[i].attr.type; i++) { - assert(iqry[i].attr.type]) >=0) { - if (check_qry_item(ctx,feed->qry+i,attrs+j)) - qi[i] = 1; /* matched */ - else return 0; /* can't be satisfied */ - } - else complete = 0; - } - - /* not all attributes in query are known from input - * we have to retrieve job metadata from the backend - */ - if (!complete) { - glite_jp_attrval_t meta[GLITE_JP_ATTR__LAST+1]; - int qai[GLITE_JP_ATTR__LAST]; - - memset(meta,0,sizeof meta); - j=0; - for (i=0; feed->qry[i].attr.type; i++) if (!qi[i]) { - meta[j].attr.type = feed->qry[i].attr.type; - meta[j].attr.name = feed->qry[i].attr.name; - qai[feed->qry[i].attr.type] = i; - j++; - } - - if (glite_jppsbe_get_job_metadata(ctx,job,meta)) { - glite_jp_error_t err; - err.code = EIO; - err.source = __FUNCTION__; - err.desc = "complete query"; - return glite_jp_stack_error(ctx,&err); - } - - for (i=0; j=meta[i].attr.type; i++) - if (!check_qry_item(ctx,feed->qry+qai[j],meta+i)) - return 0; - } - } - - /* matched completely */ - return glite_jpps_single_feed(ctx,feed->destination,job,attrs); - return 0; -} - -int glite_jpps_match_attr( - glite_jp_context_t ctx, - const char *job, - const glite_jp_attrval_t attrs[] -) -{ - struct jpfeed *f = (struct jpfeed *) ctx->feeds; - int i,j; - int attri[GLITE_JP_ATTR__LAST]; - - glite_jp_clear_error(ctx); - - for (i=0; i= GLITE_JP_ATTR__LAST || - attrs[i].attr.type <= 0) - { - glite_jp_error_t err; - err.code = EINVAL; - err.source = __FUNCTION__; - err.desc = "unknown attribute"; - return glite_jp_stack_error(ctx,&err); - } - if (attri[attrs[i].attr.type] >= 0) { - glite_jp_error_t err; - err.code = EINVAL; - err.source = __FUNCTION__; - err.desc = "double attribute change"; - return glite_jp_stack_error(ctx,&err); - } - - attri[attrs[i].attr.type] = i; - } - - for (;f; f = f->next) { - for (i=0; f->attrs[i].type && attri[f->attrs[i].type] == -1; i++); - /* XXX: ignore any errors */ - if (f->attrs[i].type) match_feed(ctx,f,job,attrs); - } - - return glite_jp_clear_error(ctx); -} - -int glite_jpps_match_file( - glite_jp_context_t ctx, - const char *job, - glite_jp_fileclass_t class -) -{ - fprintf(stderr,"%s: \n",__FUNCTION__); - return 0; -} - -int glite_jpps_match_tag( - glite_jp_context_t ctx, - const char *job, - const glite_jp_tagval_t *tag -) -{ - fprintf(stderr,"%s: \n",__FUNCTION__); - return 0; -} - -static char *generate_feedid(void) -{ - char hname[200],buf[1000]; - - gethostname(hname,sizeof hname); - snprintf(buf,sizeof buf,"%s%d%ld",hname,getpid(),lrand48()); - buf[sizeof buf-1] = 0; - return str2md5base64(buf); -} - - -int glite_jpps_run_feed( - glite_jp_context_t ctx, - const char *destination, - const glite_jp_attr_t *attrs, - const glite_jp_query_rec_t *qry, - char **feed_id) -{ - fprintf(stderr,"%s: \n",__FUNCTION__); - return 0; -} - -static int register_feed_deferred(glite_jp_context_t ctx,void *feed) -{ - struct jpfeed *f = feed; - - f->next = ctx->feeds; - ctx->feeds = f; - return 0; -} - -/* FIXME: - * - volatile implementation: should store the registrations in a file - * and recover after restart - * - should communicate the data among all server slaves - */ -int glite_jpps_register_feed( - glite_jp_context_t ctx, - const char *destination, - const glite_jp_attr_t *attrs, - const glite_jp_query_rec_t *qry, - char **feed_id, - time_t *expires) -{ - int i; - struct jpfeed *f = calloc(1,sizeof *f); - - if (!*feed_id) *feed_id = generate_feedid(); - time(expires); *expires += FEED_TTL; - - f->id = strdup(*feed_id); - f->destination = strdup(destination); - f->expires = *expires; - for (i=0; attrs[i].type; i++) { - f->attrs = realloc(f->attrs,(i+2) * sizeof *f->attrs); - glite_jp_attr_copy(f->attrs+i,attrs+i); - memset(f->attrs+i+1,0,sizeof *f->attrs); - } - for (i=0; qry[i].attr.type; i++) { - f->qry = realloc(f->qry,(i+2) * sizeof *f->qry); - glite_jp_queryrec_copy(f->qry+i,qry+i); - memset(f->qry+i+1,0,sizeof *f->qry); - } - - glite_jp_add_deferred(ctx,register_feed_deferred,f); - - return 0; -} - diff --git a/org.glite.jp.primary/src/feed.h b/org.glite.jp.primary/src/feed.h deleted file mode 100644 index 1551a82..0000000 --- a/org.glite.jp.primary/src/feed.h +++ /dev/null @@ -1,21 +0,0 @@ -#ifndef __GLITE_JP_FEED -#define __GLITE_JP_FEED - - -struct jpfeed { - char *id,*destination; - time_t expires; - glite_jp_attr_t *attrs; - glite_jp_query_rec_t *qry; - struct jpfeed *next; -}; - - -int glite_jpps_match_attr(glite_jp_context_t,const char *,const glite_jp_attrval_t[]); -int glite_jpps_match_file(glite_jp_context_t,const char *,glite_jp_fileclass_t); -int glite_jpps_match_tag(glite_jp_context_t,const char *,const glite_jp_tagval_t *); -int glite_jpps_run_feed(glite_jp_context_t,const char *,const glite_jp_attr_t *,const glite_jp_query_rec_t *,char **); -int glite_jpps_register_feed(glite_jp_context_t,const char *,const glite_jp_attr_t *,const glite_jp_query_rec_t *,char **,time_t *); - -#endif - diff --git a/org.glite.jp.primary/src/ftp_backend.c b/org.glite.jp.primary/src/ftp_backend.c deleted file mode 100644 index b598f0a..0000000 --- a/org.glite.jp.primary/src/ftp_backend.c +++ /dev/null @@ -1,1701 +0,0 @@ -#ident "$Header$" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "glite/jp/types.h" -#include "glite/jp/context.h" -#include "glite/jp/strmd5.h" - -#include "tags.h" -#include "backend.h" - -#define UPLOAD_SUFFIX ".upload" -#define LOCK_SUFFIX ".lock" - -struct ftpbe_config { - char *internal_path; - char *external_path; - char *gridmap; - char *logname; -}; - -static struct ftpbe_config *config = NULL; - -struct fhandle_rec { - int fd; - int fd_append; -}; -typedef struct fhandle_rec *fhandle; - -static struct option ftpbe_opts[] = { - { "ftp-internal-path", 1, NULL, 'I' }, - { "ftp-external-path", 1, NULL, 'E' }, - { "ftp-gridmap", 1, NULL, 'G' }, - { NULL, 0, NULL, 0 } -}; - -static struct { - glite_jp_fileclass_t type; - char * fname; - } class_to_fname_tab[] = { - { GLITE_JP_FILECLASS_INPUT, "input" }, - { GLITE_JP_FILECLASS_OUTPUT, "output" }, - { GLITE_JP_FILECLASS_LBLOG, "lblog" }, - { GLITE_JP_FILECLASS_TAGS, "tags" }, - { GLITE_JP_FILECLASS_UNDEF, NULL } - }; - -static char *class_to_fname(glite_jp_fileclass_t type) -{ - int i; - - for (i = 0; class_to_fname_tab[i].type != GLITE_JP_FILECLASS_UNDEF; i++) - if (type == class_to_fname_tab[i].type) - return class_to_fname_tab[i].fname; - - return NULL; -} - -static glite_jp_fileclass_t fname_to_class(char* fname) -{ - int i; - - for (i = 0; class_to_fname_tab[i].type != GLITE_JP_FILECLASS_UNDEF; i++) - if (!strcmp(fname, class_to_fname_tab[i].fname)) - return class_to_fname_tab[i].type; - - return GLITE_JP_FILECLASS_UNDEF; -} - -static int config_check( - glite_jp_context_t ctx, - struct ftpbe_config *config) -{ - return config == NULL || - config->internal_path == NULL || - config->external_path == NULL || - config->gridmap == NULL || - config->logname == NULL; - - /* XXX check reality */ -} - -static int jobid_unique_pathname(glite_jp_context_t ctx, const char *job, - char **unique, char **ju_path, int get_path) -{ - char *p; - glite_jp_error_t err; - - glite_jp_clear_error(ctx); - memset(&err,0,sizeof err); - err.source = __FUNCTION__; - - p = strrchr(job, '/'); - if (!p) { - err.code = EINVAL; - err.desc = "Malformed jobid"; - return glite_jp_stack_error(ctx,&err); - } - /* XXX thorough checks */ - if (!(*unique = strdup(p+1))) { - err.code = ENOMEM; - return glite_jp_stack_error(ctx,&err); - } - if (get_path) { - if (!(*ju_path = strdup(p+1))) { - free(*unique); - err.code = ENOMEM; - return glite_jp_stack_error(ctx,&err); - } - *(*ju_path + 10) = '\0'; - } - return 0; -} - -static int mkdirpath(const char* path, int prefixlen) -{ - char *wpath, *p; - int goout, ret; - - wpath = strdup(path); - if (!wpath) { - errno = ENOMEM; - return -1; - } - - p = wpath + prefixlen; - goout = 0; - while (!goout) { - while (*p == '/') p++; - while (*p != '/' && *p != '\0') p++; - goout = (*p == '\0'); - *p = '\0'; - ret = mkdir(wpath, S_IRUSR | S_IWUSR | S_IXUSR); - if (ret < 0 && errno != EEXIST) break; - *p = '/'; - } - free(wpath); - return goout ? 0 : ret; -} - -static long regtime_trunc(long tv_sec) -{ - return tv_sec / (86400*7); -} - -static long regtime_ceil(long tv_sec) -{ - return (tv_sec % (86400*7)) ? tv_sec/(86400*7)+1 : tv_sec/(86400*7) ; -} - -/********************************************************************************/ -int glite_jppsbe_init( - glite_jp_context_t ctx, - int *argc, - char *argv[] -) -{ - glite_jp_error_t err; - int opt; - - glite_jp_clear_error(ctx); - memset(&err,0,sizeof err); - err.source = __FUNCTION__; - - config = (struct ftpbe_config *) calloc(1, sizeof *config); - if (!config) { - err.code = ENOMEM; - return glite_jp_stack_error(ctx,&err); - } - - config->logname = getlogin(); - - while ((opt = getopt_long(*argc, argv, "I:E:G:", ftpbe_opts, NULL)) != EOF) { - switch (opt) { - case 'I': config->internal_path = optarg; break; - case 'E': config->external_path = optarg; break; - case 'G': config->gridmap = optarg; break; - default: break; - } - } - - if (config_check(ctx, config)) { - err.code = EINVAL; - err.desc = "Invalid FTP backend configuration"; - return glite_jp_stack_error(ctx,&err); - } - - return 0; -} - -int glite_jppsbe_init_slave( - glite_jp_context_t ctx -) -{ - /* Nothing to do */ -} - -int glite_jppsbe_register_job( - glite_jp_context_t ctx, - const char *job, - const char *owner -) -{ - glite_jp_error_t err; - char *int_dir = NULL; - char *int_fname = NULL; - char *data_dir = NULL; - char *data_fname = NULL; - char *ju = NULL; - char *ju_path = NULL; - char *ownerhash = NULL; - FILE *regfile = NULL; - struct timeval reg_tv; - long reg_tv_trunc; - struct stat statbuf; - - glite_jp_clear_error(ctx); - memset(&err,0,sizeof err); - err.source = __FUNCTION__; - - assert(job != NULL); - assert(owner != NULL); - - gettimeofday(®_tv, NULL); - reg_tv_trunc = regtime_trunc(reg_tv.tv_sec); - - if (jobid_unique_pathname(ctx, job, &ju, &ju_path, 1) != 0) { - err.code = ctx->error->code; - err.desc = "Cannot obtain jobid unique path/name"; - return glite_jp_stack_error(ctx,&err); - } - - if (asprintf(&int_dir, "%s/regs/%s", - config->internal_path, ju_path) == -1) { - err.code = ENOMEM; - return glite_jp_stack_error(ctx,&err); - } - - if (mkdirpath(int_dir, strlen(config->internal_path)) < 0 && - errno != EEXIST) { - free(int_dir); - err.code = errno; - err.desc = "Cannot mkdir jobs's reg directory"; - return glite_jp_stack_error(ctx,&err); - } - free(int_dir); - - if (asprintf(&int_fname, "%s/regs/%s/%s.info", - config->internal_path, ju_path, ju) == -1) { - err.code = ENOMEM; - return glite_jp_stack_error(ctx,&err); - } - - if (stat(int_fname, &statbuf) < 0) { - if (errno != ENOENT) { - err.code = errno; - err.desc = "Cannot stat jobs's reg info file"; - goto error_out; - } - } else { - err.code = EEXIST; - err.desc = "Job already registered"; - goto error_out; - } - - regfile = fopen(int_fname, "w"); - if (regfile == NULL) { - err.code = errno; - err.desc = "Cannot open jobs's reg info file"; - goto error_out; - } - - ownerhash = str2md5(owner); /* static buffer */ - - if (fprintf(regfile, "%d %ld.%06ld %s %s %d %s\n", 1, - (long)reg_tv.tv_sec, (long)reg_tv.tv_usec, job, - ownerhash, strlen(owner), owner) < 1 || ferror(regfile)) { - fclose(regfile); - err.code = errno; - err.desc = "Cannot write jobs's reg info file"; - goto error_out; - } - if (fclose(regfile) != 0 ) { - err.code = errno; - err.desc = "Cannot close(write) jobs's reg info file"; - goto error_out; - } - - if (asprintf(&data_dir, "%s/data/%s/%d/%s", - config->internal_path, ownerhash, regtime_trunc(reg_tv.tv_sec), ju) == -1) { - err.code = ENOMEM; - goto error_out; - } - if (asprintf(&data_fname, "%s/_info", data_dir) == -1) { - err.code = ENOMEM; - goto error_out; - } - if (mkdirpath(data_dir, strlen(config->internal_path)) < 0 && - errno != EEXIST) { - err.code = errno; - err.desc = "Cannot mkdir jobs's data directory"; - goto error_out; - } - - if (link(int_fname, data_fname) < 0) { - err.code = errno; - err.desc = "Cannot link job's reg and data info files"; - goto error_out; - } - -error_out: - free(int_fname); - free(data_fname); - if (err.code && data_dir) rmdir(data_dir); - free(data_dir); - if (err.code) { - return glite_jp_stack_error(ctx,&err); - } else { - return 0; - } -} - -static int add_to_gridmap(glite_jp_context_t ctx, const char *dn) -{ - FILE *gridmap = NULL; - glite_jp_error_t err; - - glite_jp_clear_error(ctx); - memset(&err,0,sizeof err); - err.source = __FUNCTION__; - - gridmap = fopen(config->gridmap, "a"); - if (!gridmap) { - err.code = errno; - err.desc = "Cannot open gridmap file"; - return glite_jp_stack_error(ctx,&err); - } - if (fprintf(gridmap, "\"%s\" %s\n", dn, config->logname) < 6 || - ferror(gridmap)) { - err.code = EIO; - err.desc = "Cannot write to gridmap file"; - fclose(gridmap); - return glite_jp_stack_error(ctx,&err); - } - fclose(gridmap); - return 0; -} - -static int remove_from_gridmap(glite_jp_context_t ctx, const char *dn) -{ - FILE *gridmap = NULL; - char *temp_name = NULL; - FILE *temp_file = NULL; - glite_jp_error_t err; - - glite_jp_clear_error(ctx); - memset(&err,0,sizeof err); - err.source = __FUNCTION__; - - /* XXX */ - return 0; -} - -int glite_jppsbe_start_upload( - glite_jp_context_t ctx, - const char *job, - glite_jp_fileclass_t class, - const char *content_type, - char **destination_out, - time_t *commit_before_inout -) -{ - char *int_fname = NULL; - char *lock_fname = NULL; - FILE *lockfile = NULL; - FILE *regfile = NULL; - char *fname = NULL; - char *data_dir = NULL; - char *data_lock = NULL; - char *ju = NULL; - char *ju_path = NULL; - char *peername = NULL; - int info_version; - long reg_time; - char ownerhash[33]; - glite_jp_error_t err; - - glite_jp_clear_error(ctx); - memset(&err,0,sizeof err); - err.source = __FUNCTION__; - - assert(job!=NULL); - assert(destination_out!=NULL); - - fname = class_to_fname(class); - assert(fname!=NULL); - - if (jobid_unique_pathname(ctx, job, &ju, &ju_path, 1) != 0) { - err.code = ctx->error->code; - err.desc = "Cannot obtain jobid unique path/name"; - return glite_jp_stack_error(ctx,&err); - } - - peername = glite_jp_peer_name(ctx); - - if (asprintf(&int_fname, "%s/regs/%s/%s.info", - config->internal_path, ju_path, ju) == -1) { - err.code = ENOMEM; - goto error_out; - } - regfile = fopen(int_fname, "r"); - if (regfile == NULL) { - err.code = errno; - if (errno == ENOENT) - err.desc = "Job not registered"; - else - err.desc = "Cannot open jobs's reg info file"; - goto error_out; - } - if (fscanf(regfile, "%d %ld.%*ld %*s %s ", &info_version, - ®_time, ownerhash) < 3 || ferror(regfile)) { - fclose(regfile); - err.code = errno; - err.desc = "Cannot read jobs's reg info file"; - goto error_out; - } - fclose(regfile); - - /* XXX authorization */ - - if (asprintf(&data_dir, "%s/data/%s/%d/%s", - config->internal_path, ownerhash, regtime_trunc(reg_time), ju) == -1) { - err.code = ENOMEM; - goto error_out; - } - - if (asprintf(&lock_fname, "%s/%s" LOCK_SUFFIX, - data_dir, fname) == -1) { - err.code = ENOMEM; - goto error_out; - } - - if (commit_before_inout != NULL) - *commit_before_inout = (time_t) LONG_MAX; /* XXX no timeout enforced */ - - lockfile = fopen(lock_fname, "w"); - if (lockfile == NULL) { - err.code = errno; - err.desc = "Cannot open uploads's lock file"; - goto error_out; - } - - if (fprintf(lockfile, "%ld %d %s\n", (long)*commit_before_inout, - peername ? peername : 0, - peername ? peername : "") < 1 || ferror(regfile)) { - fclose(lockfile); - err.code = errno; - err.desc = "Cannot write upload's lock file"; - goto error_out; - } - if (fclose(lockfile) != 0 ) { - err.code = errno; - err.desc = "Cannot close(write) upload's lock file"; - goto error_out; - } - - if (asprintf(destination_out, "%s/data/%s/%d/%s/%s" UPLOAD_SUFFIX, - config->external_path, ownerhash, regtime_trunc(reg_time), ju, fname) == -1) { - err.code = ENOMEM; - goto error_out; - } - - if (add_to_gridmap(ctx, peername)) { - err.code = EIO; - err.desc = "Cannot add peer DN to ftp server authorization file"; - goto error_out; - } - -error_out: - free(int_fname); - free(data_dir); - if (err.code && data_lock) unlink(data_lock); - free(data_lock); - free(ju); free(ju_path); - if (err.code) { - return glite_jp_stack_error(ctx,&err); - } else { - return 0; - } -} - -int glite_jppsbe_commit_upload( - glite_jp_context_t ctx, - const char *destination -) -{ - size_t dest_len; - size_t suff_len; - size_t extp_len; - long commit_before; - int lockpeerlen; - char *lockpeername = NULL; - char *peername = NULL; - char *dest_rw = NULL; - char *dest_rw_suff = NULL; - char *dest_rw_lock = NULL; - FILE *lockfile = NULL; - glite_jp_error_t err; - - glite_jp_clear_error(ctx); - memset(&err,0,sizeof err); - err.source = __FUNCTION__; - - assert(destination != NULL); - - suff_len = strlen(UPLOAD_SUFFIX); - dest_len = strlen(destination); - extp_len = strlen(config->external_path); - - if (dest_len < suff_len || - strcmp(UPLOAD_SUFFIX, destination + (dest_len - suff_len)) || - strncmp(destination, config->external_path, extp_len)) { - err.code = EINVAL; - err.desc = "Forged destination path"; - return glite_jp_stack_error(ctx,&err); - } - - if (asprintf(&dest_rw_suff, "%s%s", config->internal_path, - destination + extp_len) == -1) { - err.code = ENOMEM; - return glite_jp_stack_error(ctx,&err); - } - dest_rw = strdup(dest_rw_suff); - if (!dest_rw) { - err.code = ENOMEM; - goto error_out; - } - *(dest_rw + (strlen(dest_rw_suff) - suff_len)) = '\0'; - - if (asprintf(&dest_rw_lock, "%s" LOCK_SUFFIX, dest_rw) == -1) { - err.code = ENOMEM; - goto error_out; - } - - lockfile = fopen(dest_rw_lock, "r"); - if (lockfile == NULL) { - err.code = errno; - err.desc = "Cannot open upload's lock file"; - goto error_out; - } - if (fscanf(lockfile, "%ld %d ", &commit_before, &lockpeerlen) < 2 || ferror(lockfile)) { - fclose(lockfile); - err.code = errno; - err.desc = "Cannot read upload's lock file"; - goto error_out; - } - if (lockpeerlen) { - lockpeername = (char*) calloc(1, lockpeerlen+1); - if (!lockpeername) { - err.code = ENOMEM; - goto error_out; - } - if (fgets(lockpeername, lockpeerlen+1, lockfile) == NULL) { - fclose(lockfile); - err.code = errno; - err.desc = "Cannot read upload's lock file"; - goto error_out; - } - } - fclose(lockfile); - - peername = glite_jp_peer_name(ctx); - if (lockpeername && (!peername || strcmp(lockpeername, peername))) { - err.code = EPERM; - err.desc = "Upload started by client of different identity"; - goto error_out; - } - - if (rename(dest_rw_suff, dest_rw) < 0) { - err.code = errno; - err.desc = "Cannot move upload file to the final place"; - goto error_out; - } - - if (unlink(dest_rw_lock) < 0) { - err.code = errno; - err.desc = "Cannot unlink upload's lock file"; - goto error_out; - } - -error_out: - free(dest_rw); - free(dest_rw_suff); - free(dest_rw_lock); - free(peername); - free(lockpeername); - if (err.code) { - return glite_jp_stack_error(ctx,&err); - } else { - return 0; - } -} - -int glite_jppsbe_destination_info( - glite_jp_context_t ctx, - const char *destination, - char **job, - glite_jp_fileclass_t *class -) -{ - size_t dest_len; - size_t suff_len; - size_t extp_len; - char *dest_rw = NULL; - char *dest_rw_suff = NULL; - char *dest_rw_info = NULL; - FILE *infofile = NULL; - char *classname = NULL; - char jobstr[256+1]; - glite_jp_error_t err; - - assert(destination != NULL); - assert(job != NULL); - assert(class != NULL); - - glite_jp_clear_error(ctx); - memset(&err,0,sizeof err); - err.source = __FUNCTION__; - - suff_len = strlen(UPLOAD_SUFFIX); - dest_len = strlen(destination); - extp_len = strlen(config->external_path); - - if (dest_len < suff_len || - strcmp(UPLOAD_SUFFIX, destination + (dest_len - suff_len)) || - strncmp(destination, config->external_path, extp_len)) { - err.code = EINVAL; - err.desc = "Forged destination path"; - return glite_jp_stack_error(ctx,&err); - } - - if (asprintf(&dest_rw_suff, "%s%s", config->internal_path, - destination + extp_len) == -1) { - err.code = ENOMEM; - return glite_jp_stack_error(ctx,&err); - } - dest_rw = strdup(dest_rw_suff); - if (!dest_rw) { - err.code = ENOMEM; - goto error_out; - } - *(dest_rw + (strlen(dest_rw_suff) - suff_len)) = '\0'; - - classname = strrchr(dest_rw,'/'); - if (classname == NULL) { - err.code = EINVAL; - err.desc = "Forged destination path"; - goto error_out; - } - *classname++ ='\0'; - *class = fname_to_class(classname); - if (!class == GLITE_JP_FILECLASS_UNDEF) { - err.code = EINVAL; - err.desc = "Forged destination path"; - goto error_out; - } - - if (asprintf(&dest_rw_info, "%s/_info", dest_rw) == -1) { - err.code = ENOMEM; - goto error_out; - } - - infofile = fopen(dest_rw_info, "r"); - if (infofile == NULL) { - err.code = errno; - err.desc = "Cannot open _info file"; - goto error_out; - } - if (fscanf(infofile, "%*d %*ld.%*ld %256s ", jobstr) < 1 || ferror(infofile)) { - fclose(infofile); - err.code = errno; - err.desc = "Cannot read _info file"; - goto error_out; - } - *job = strdup(jobstr); - fclose(infofile); - -error_out: - free(dest_rw); - free(dest_rw_suff); - free(dest_rw_info); - if (err.code) { - return glite_jp_stack_error(ctx,&err); - } else { - return 0; - } -} - - -int glite_jppsbe_get_job_url( - glite_jp_context_t ctx, - const char *job, - glite_jp_fileclass_t class, - char **url_out -) -{ - FILE *regfile = NULL; - char *int_fname = NULL; - char *fname = NULL; - char *ju = NULL; - char *ju_path = NULL; - int info_version; - long reg_time; - char ownerhash[33]; - glite_jp_error_t err; - - glite_jp_clear_error(ctx); - memset(&err,0,sizeof err); - err.source = __FUNCTION__; - - assert(job!=NULL); - assert(class != GLITE_JP_FILECLASS_UNDEF); - assert(url_out != NULL); - - fname = class_to_fname(class); - assert(fname!=NULL); - - if (jobid_unique_pathname(ctx, job, &ju, &ju_path, 1) != 0) { - err.code = ctx->error->code; - err.desc = "Cannot obtain jobid unique path/name"; - return glite_jp_stack_error(ctx,&err); - } - - if (asprintf(&int_fname, "%s/regs/%s/%s.info", - config->internal_path, ju_path, ju) == -1) { - err.code = ENOMEM; - goto error_out; - } - regfile = fopen(int_fname, "r"); - if (regfile == NULL) { - err.code = errno; - if (errno == ENOENT) - err.desc = "Job not registered"; - else - err.desc = "Cannot open jobs's reg info file"; - goto error_out; - } - if (fscanf(regfile, "%d %ld.%*ld %*s %s", &info_version, - ®_time, ownerhash) < 3 || ferror(regfile)) { - fclose(regfile); - err.code = errno; - err.desc = "Cannot read jobs's reg info file"; - goto error_out; - } - fclose(regfile); - - if (asprintf(url_out, "%s/data/%s/%d/%s/%s", - config->external_path, ownerhash, regtime_trunc(reg_time), ju, fname) == -1) { - err.code = ENOMEM; - goto error_out; - } - -error_out: - free(int_fname); - free(ju); free(ju_path); - if (err.code) { - return glite_jp_stack_error(ctx,&err); - } else { - return 0; - } -} - -static int get_job_fname( - glite_jp_context_t ctx, - const char *job, - glite_jp_fileclass_t class, - char **fname_out -) -{ - FILE *regfile = NULL; - char *fname = NULL; - char *int_fname = NULL; - char *ju = NULL; - char *ju_path = NULL; - int info_version; - long reg_time; - char ownerhash[33]; - glite_jp_error_t err; - - glite_jp_clear_error(ctx); - memset(&err,0,sizeof err); - err.source = __FUNCTION__; - - assert(job!=NULL); - assert(class != GLITE_JP_FILECLASS_UNDEF); - assert(fname_out != NULL); - - fname = class_to_fname(class); - assert(fname!=NULL); - - if (jobid_unique_pathname(ctx, job, &ju, &ju_path, 1) != 0) { - err.code = ctx->error->code; - err.desc = "Cannot obtain jobid unique path/name"; - return glite_jp_stack_error(ctx,&err); - } - - if (asprintf(&int_fname, "%s/regs/%s/%s.info", - config->internal_path, ju_path, ju) == -1) { - err.code = ENOMEM; - goto error_out; - } - regfile = fopen(int_fname, "r"); - if (regfile == NULL) { - err.code = errno; - if (errno == ENOENT) - err.desc = "Job not registered"; - else - err.desc = "Cannot open jobs's reg info file"; - goto error_out; - } - if (fscanf(regfile, "%d %ld.%*ld %*s %s", &info_version, - ®_time, ownerhash) < 3 || ferror(regfile)) { - fclose(regfile); - err.code = errno; - err.desc = "Cannot read jobs's reg info file"; - goto error_out; - } - fclose(regfile); - - if (asprintf(fname_out, "%s/data/%s/%d/%s/%s", - config->internal_path, ownerhash, regtime_trunc(reg_time), ju, fname) == -1) { - err.code = ENOMEM; - goto error_out; - } - -error_out: - free(int_fname); - free(ju); free(ju_path); - if (err.code) { - return glite_jp_stack_error(ctx,&err); - } else { - return 0; - } -} - -int glite_jppsbe_open_file( - glite_jp_context_t ctx, - const char *job, - glite_jp_fileclass_t class, - int mode, - void **handle_out -) -{ - fhandle handle = NULL; - char* fname = NULL; - glite_jp_error_t err; - - assert(handle_out != NULL); - - glite_jp_clear_error(ctx); - memset(&err,0,sizeof err); - err.source = __FUNCTION__; - - if (get_job_fname(ctx, job, class, &fname)) { - err.code = ctx->error->code; - err.desc = "Cannot construct internal filename"; - return glite_jp_stack_error(ctx,&err); - } - - handle = (fhandle) calloc(1,sizeof(*handle)); - if (handle == NULL) { - err.code = ENOMEM; - goto error_out; - } - - handle->fd = open(fname, mode, S_IRUSR | S_IWUSR); - if (handle->fd < 0) { - err.code = errno; - err.desc = "Cannot open requested file"; - free(handle); - goto error_out; - } - handle->fd_append = open(fname, mode | O_APPEND, S_IRUSR | S_IWUSR); - if (handle->fd_append < 0) { - err.code = errno; - err.desc = "Cannot open requested file for append"; - close(handle->fd); - free(handle); - goto error_out; - } - *handle_out = (void*) handle; - -error_out: - free(fname); - if (err.code) { - return glite_jp_stack_error(ctx,&err); - } else { - return 0; - } -} - -int glite_jppsbe_close_file( - glite_jp_context_t ctx, - void *handle -) -{ - glite_jp_error_t err; - - assert(handle != NULL); - - glite_jp_clear_error(ctx); - memset(&err,0,sizeof err); - err.source = __FUNCTION__; - - if (close(((fhandle)handle)->fd_append) < 0) { - err.code = errno; - err.desc = "Error closing file descriptor (fd_append)"; - goto error_out; - } - if (close(((fhandle)handle)->fd) < 0) { - err.code = errno; - err.desc = "Error closing file descriptor"; - goto error_out; - } - -error_out: - free(handle); - if (err.code) { - return glite_jp_stack_error(ctx,&err); - } else { - return 0; - } -} - -int glite_jppsbe_pread( - glite_jp_context_t ctx, - void *handle, - void *buf, - size_t nbytes, - off_t offset, - ssize_t *nbytes_ret -) -{ - ssize_t ret; - glite_jp_error_t err; - - assert(handle != NULL); - assert(buf != NULL); - - glite_jp_clear_error(ctx); - memset(&err,0,sizeof err); - err.source = __FUNCTION__; - - if ((ret = pread(((fhandle)handle)->fd, buf, nbytes, offset)) < 0) { - err.code = errno; - err.desc = "Error in pread()"; - return glite_jp_stack_error(ctx,&err); - } - *nbytes_ret = ret; - - return 0; -} - -int glite_jppsbe_pwrite( - glite_jp_context_t ctx, - void *handle, - void *buf, - size_t nbytes, - off_t offset -) -{ - glite_jp_error_t err; - - assert(handle != NULL); - assert(buf != NULL); - - glite_jp_clear_error(ctx); - memset(&err,0,sizeof err); - err.source = __FUNCTION__; - - if (pwrite(((fhandle)handle)->fd, buf, nbytes, offset) < 0) { - err.code = errno; - err.desc = "Error in pwrite()"; - return glite_jp_stack_error(ctx,&err); - } - - return 0; -} - -int glite_jppsbe_append( - glite_jp_context_t ctx, - void *handle, - void *buf, - size_t nbytes -) -{ - glite_jp_error_t err; - - assert(handle != NULL); - assert(buf != NULL); - - glite_jp_clear_error(ctx); - memset(&err,0,sizeof err); - err.source = __FUNCTION__; - - if (write(((fhandle)handle)->fd_append, buf, nbytes) < 0) { - err.code = errno; - err.desc = "Error in write()"; - return glite_jp_stack_error(ctx,&err); - } - - return 0; -} - -static int get_job_info( - glite_jp_context_t ctx, - const char *job, - char **owner, - struct timeval *tv_reg -) -{ - char *ju = NULL; - char *ju_path = NULL; - FILE *regfile = NULL; - long reg_time_sec; - long reg_time_usec; - int ownerlen = 0; - int info_version; - char *int_fname = NULL; - glite_jp_error_t err; - - glite_jp_clear_error(ctx); - memset(&err,0,sizeof err); - err.source = __FUNCTION__; - - if (jobid_unique_pathname(ctx, job, &ju, &ju_path, 1) != 0) { - err.code = ctx->error->code; - err.desc = "Cannot obtain jobid unique path/name"; - return glite_jp_stack_error(ctx,&err); - } - - if (asprintf(&int_fname, "%s/regs/%s/%s.info", - config->internal_path, ju_path, ju) == -1) { - err.code = ENOMEM; - goto error_out; - } - regfile = fopen(int_fname, "r"); - if (regfile == NULL) { - err.code = errno; - if (errno == ENOENT) - err.desc = "Job not registered"; - else - err.desc = "Cannot open jobs's reg info file"; - goto error_out; - } - if (fscanf(regfile, "%d %ld.%ld %*s %*s %d ", &info_version, - ®_time_sec, ®_time_usec, &ownerlen) < 4 || ferror(regfile)) { - fclose(regfile); - err.code = errno; - err.desc = "Cannot read jobs's reg info file"; - goto error_out; - } - if (ownerlen) { - *owner = (char *) calloc(1, ownerlen+1); - if (!*owner) { - err.code = ENOMEM; - goto error_out; - } - if (fgets(*owner, ownerlen+1, regfile) == NULL) { - fclose(regfile); - free(*owner); - err.code = errno; - err.desc = "Cannot read jobs's reg info file"; - goto error_out; - } - } - fclose(regfile); - - tv_reg->tv_sec = reg_time_sec; - tv_reg->tv_usec = reg_time_usec; - -error_out: - free(int_fname); - free(ju); - free(ju_path); - if (err.code) { - return glite_jp_stack_error(ctx,&err); - } else { - return 0; - } -} - -static int get_job_info_int( - glite_jp_context_t ctx, - const char *int_fname, - char **jobid, - char **owner, - struct timeval *tv_reg -) -{ - FILE *regfile = NULL; - long reg_time_sec; - long reg_time_usec; - int ownerlen = 0; - int info_version; - char jobid_buf[256]; - glite_jp_error_t err; - - glite_jp_clear_error(ctx); - memset(&err,0,sizeof err); - err.source = __FUNCTION__; - - regfile = fopen(int_fname, "r"); - if (regfile == NULL) { - err.code = errno; - err.desc = "Cannot open jobs's reg info file"; - goto error_out; - } - if (fscanf(regfile, "%d %ld.%ld %s %*s %d ", &info_version, - ®_time_sec, ®_time_usec, jobid_buf, &ownerlen) < 5 || ferror(regfile)) { - fclose(regfile); - err.code = errno; - err.desc = "Cannot read jobs's reg info file"; - goto error_out; - } - *jobid = strdup(jobid_buf); - if (ownerlen) { - *owner = (char *) calloc(1, ownerlen+1); - if (!*owner) { - err.code = ENOMEM; - goto error_out; - } - if (fgets(*owner, ownerlen+1, regfile) == NULL) { - fclose(regfile); - free(*owner); - err.code = errno; - err.desc = "Cannot read jobs's reg info file"; - goto error_out; - } - } - fclose(regfile); - - tv_reg->tv_sec = reg_time_sec; - tv_reg->tv_usec = reg_time_usec; - -error_out: - if (err.code) { - return glite_jp_stack_error(ctx,&err); - } else { - return 0; - } -} - -int glite_jppsbe_get_job_metadata( - glite_jp_context_t ctx, - const char *job, - glite_jp_attrval_t attrs_inout[] -) -{ - int got_info = 0; - struct timeval tv_reg; - char *owner = NULL; - int got_tags = 0; - void *tags_handle = NULL; - glite_jp_tagval_t* tags = NULL; - int i,j; - glite_jp_error_t err; - - assert(job != NULL); - assert(attrs_inout != NULL); - - glite_jp_clear_error(ctx); - memset(&err,0,sizeof err); - err.source = __FUNCTION__; - - for (i = 0; attrs_inout[i].attr.type != GLITE_JP_ATTR_UNDEF; i++) { - switch (attrs_inout[i].attr.type) { - case GLITE_JP_ATTR_OWNER: - case GLITE_JP_ATTR_TIME: - if (!got_info) { - if (get_job_info(ctx, job, &owner, &tv_reg)) { - err.code = ctx->error->code; - err.desc = "Cannot retrieve job info"; - goto error_out; - } - got_info = 1; - } - break; - case GLITE_JP_ATTR_TAG: - if (!got_tags) { - if (glite_jppsbe_open_file(ctx, job, GLITE_JP_FILECLASS_TAGS, - O_RDONLY, &tags_handle)) { - err.code = ctx->error->code; - err.desc = "Cannot open tag file"; - goto error_out; - } - if (glite_jpps_tag_readall(ctx, tags_handle, &tags)) { - err.code = ctx->error->code; - err.desc = "Cannot read tags"; - glite_jppsbe_close_file(ctx, tags_handle); - goto error_out; - } - glite_jppsbe_close_file(ctx, tags_handle); - got_tags = 1; - } - break; - default: - err.code = EINVAL; - err.desc = "Invalid attribute type"; - goto error_out; - break; - } - - switch (attrs_inout[i].attr.type) { - case GLITE_JP_ATTR_OWNER: - attrs_inout[i].value.s = strdup(owner); - if (!attrs_inout[i].value.s) { - err.code = ENOMEM; - err.desc = "Cannot copy owner string"; - goto error_out; - } - break; - case GLITE_JP_ATTR_TIME: - attrs_inout[i].value.time = tv_reg; - break; - case GLITE_JP_ATTR_TAG: - for (j = 0; tags[j].name != NULL; j++) { - if (!strcmp(tags[j].name, attrs_inout[i].attr.name)) { - if (glite_jpps_tagval_copy(ctx, &tags[j], - &attrs_inout[i].value.tag)) { - err.code = ENOMEM; - err.desc = "Cannot copy tag value"; - goto error_out; - } - break; - } - } - if (!tags[j].name) attrs_inout[i].value.tag.name = NULL; - break; - default: - break; - } - } - -error_out: - free(owner); - if (tags) for (j = 0; tags[j].name != NULL; j++) { - free(tags[j].name); - free(tags[j].value); - } - free(tags); - - if (err.code) { - while (i > 0) { - i--; - switch (attrs_inout[i].attr.type) { - case GLITE_JP_ATTR_OWNER: - free(attrs_inout[i].value.s); - break; - case GLITE_JP_ATTR_TAG: - free(attrs_inout[i].value.tag.name); - free(attrs_inout[i].value.tag.value); - default: - break; - } - } - return glite_jp_stack_error(ctx,&err); - } else { - return 0; - } -} -static int compare_timeval(struct timeval a, struct timeval b) -{ - if (a.tv_sec < b.tv_sec) return -1; - if (a.tv_sec > b.tv_sec) return 1; - if (a.tv_usec < b.tv_usec) return -1; - if (a.tv_usec > b.tv_usec) return 1; - return 0; -} - -static int query_phase2( - glite_jp_context_t ctx, - const char *ownerhash, - long regtime_tr, - int q_tags, - int md_tags, - const glite_jp_query_rec_t query[], - glite_jp_attrval_t metadata[], - int (*callback)( - glite_jp_context_t ctx, - const char *job, - const glite_jp_attrval_t metadata[] - ) -); - -static int query_phase2( - glite_jp_context_t ctx, - const char *ownerhash, - long regtime_tr, - int q_tags, - int md_tags, - const glite_jp_query_rec_t query[], - glite_jp_attrval_t metadata[], - int (*callback)( - glite_jp_context_t ctx, - const char *job, - const glite_jp_attrval_t metadata[] - ) -) -{ - char *time_dirname = NULL; - DIR *time_dirp = NULL; - struct dirent *jobent; - char *info_fname = NULL; - char *jobid = NULL; - char *owner = NULL; - struct timeval tv_reg; - void *tags_handle = NULL; - int matching; - int i, j; - glite_jp_tagval_t* tags = NULL; - glite_jp_error_t err; - - glite_jp_clear_error(ctx); - memset(&err,0,sizeof err); - err.source = __FUNCTION__; - - if (asprintf(&time_dirname, "%s/data/%s/%d", config->internal_path, - ownerhash, regtime_tr) == -1) { - err.code = ENOMEM; - return glite_jp_stack_error(ctx,&err); - } - time_dirp = opendir(time_dirname); - if (!time_dirp) { - free(time_dirname); - return 0; /* found nothing */ - } - while ((jobent = readdir(time_dirp)) != NULL) { - if (!strcmp(jobent->d_name, ".")) continue; - if (!strcmp(jobent->d_name, "..")) continue; - if (asprintf(&info_fname, "%s/%s/_info", time_dirname, - jobent->d_name) == -1) { - err.code = ENOMEM; - goto error_out; - } - if (get_job_info_int(ctx, info_fname, &jobid, &owner, &tv_reg)) { - err.code = EIO; - err.desc = "Cannot retrieve job info"; - goto error_out; - } - if (q_tags || md_tags) { - if (glite_jppsbe_open_file(ctx, jobid, GLITE_JP_FILECLASS_TAGS, - O_RDONLY, &tags_handle)) { - err.code = ctx->error->code; - err.desc = "Cannot open tag file"; - goto error_out; - } - if (glite_jpps_tag_readall(ctx, tags_handle, &tags)) { - err.code = ctx->error->code; - err.desc = "Cannot read tags"; - glite_jppsbe_close_file(ctx, tags_handle); - goto error_out; - } - glite_jppsbe_close_file(ctx, tags_handle); - tags_handle = NULL; - } - - matching = 1; - for (i = 0; matching && query[i].attr.type != GLITE_JP_ATTR_UNDEF; i++) { - switch (query[i].attr.type) { - case GLITE_JP_ATTR_OWNER: - if (query[i].value.s == NULL || - strcmp(query[i].value.s, owner)) matching = 0; - break; - case GLITE_JP_ATTR_TIME: - switch (query[i].op) { - case GLITE_JP_QUERYOP_EQUAL: - matching = !compare_timeval(tv_reg, query[i].value.time); - break; - case GLITE_JP_QUERYOP_UNEQUAL: - matching = compare_timeval(tv_reg, query[i].value.time); - break; - case GLITE_JP_QUERYOP_LESS: - matching = compare_timeval(tv_reg, query[i].value.time) < 0; - break; - case GLITE_JP_QUERYOP_GREATER: - matching = compare_timeval(tv_reg, query[i].value.time) > 0; - break; - case GLITE_JP_QUERYOP_WITHIN: - matching = compare_timeval(tv_reg, query[i].value.time) >= 0 - && compare_timeval(tv_reg, query[i].value2.time) <= 0; - break; - } - break; - case GLITE_JP_ATTR_TAG: - if (!tags) { - matching = 0; - break; - } - for (j = 0; tags[j].name != NULL; j++) { - if (!strcmp(tags[j].name, query[i].attr.name)) { - switch (query[i].op) { - case GLITE_JP_QUERYOP_EQUAL: - matching = !strcmp(tags[j].value, query[i].value.s); - break; - case GLITE_JP_QUERYOP_UNEQUAL: - matching = strcmp(tags[j].value, query[i].value.s); - break; - case GLITE_JP_QUERYOP_LESS: - matching = strcmp(tags[j].value, query[i].value.s) < 0; - break; - case GLITE_JP_QUERYOP_GREATER: - matching = strcmp(tags[j].value, query[i].value.s) > 0; - break; - case GLITE_JP_QUERYOP_WITHIN: - matching = strcmp(tags[j].value, query[i].value.s) >= 0 \ - && strcmp(tags[j].value, query[i].value2.s) <= 0 ; - break; - default: - break; - } - } - } - break; - default: - break; - } - } - if (!matching) { - free(info_fname); info_fname = NULL; - free(jobid); jobid = NULL; - if (tags) for (j = 0; tags[j].name != NULL; j++) { - free(tags[j].name); - free(tags[j].value); - } - free(tags); tags = NULL; - continue; - } - - for (i = 0; metadata[i].attr.type != GLITE_JP_ATTR_UNDEF; i++) { - switch (metadata[i].attr.type) { - case GLITE_JP_ATTR_OWNER: - metadata[i].value.s = owner; - break; - case GLITE_JP_ATTR_TIME: - metadata[i].value.time = tv_reg; - break; - case GLITE_JP_ATTR_TAG: - for (j = 0; tags[j].name != NULL; j++) { - if (!strcmp(tags[j].name, metadata[i].attr.name)) { - if (glite_jpps_tagval_copy(ctx, &tags[j], - &metadata[i].value.tag)) { - err.code = ENOMEM; - err.desc = "Cannot copy tag value"; - goto error_out; - } - break; - } - } - if (!tags[j].name) { - metadata[i].value.tag.name = NULL; - metadata[i].value.tag.value = NULL; - } - break; - default: - break; - } - } - (*callback)(ctx, jobid, metadata); - free(jobid); jobid = NULL; - while (i > 0) { - i--; - switch (metadata[i].attr.type) { - case GLITE_JP_ATTR_TAG: - free(metadata[i].value.tag.name); - free(metadata[i].value.tag.value); - default: - break; - } - } - } - -error_out: - if (tags) for (j = 0; tags[j].name != NULL; j++) { - free(tags[j].name); - free(tags[j].value); - } - if (tags_handle) glite_jppsbe_close_file(ctx, tags_handle); - free(info_fname); - free(owner); - free(jobid); - closedir(time_dirp); - free(time_dirname); - if (err.code) { - while (i > 0) { - i--; - switch (metadata[i].attr.type) { - case GLITE_JP_ATTR_TAG: - free(metadata[i].value.tag.name); - free(metadata[i].value.tag.value); - default: - break; - } - } - return glite_jp_stack_error(ctx,&err); - } else - return 0; -} - -int glite_jppsbe_query( - glite_jp_context_t ctx, - const glite_jp_query_rec_t query[], - const glite_jp_attrval_t metadata[], - int (*callback)( - glite_jp_context_t ctx, - const char *job, - const glite_jp_attrval_t metadata[] - ) -) -{ - /* XXX clone metadata */ - int i; - char *q_exact_owner = NULL; - char *ownerhash = NULL; - long q_min_time = 0; - long q_max_time = LONG_MAX; - long q_min_time_tr; - long q_max_time_tr; - int q_with_tags = 0; - int md_info = 0; - int md_tags = 0; - char *owner_dirname = NULL; - DIR *owner_dirp = NULL; - struct dirent *ttimeent; - char *data_dirname = NULL; - DIR *data_dirp = NULL; - struct dirent *ownerent; - long ttime = 0; - glite_jp_attrval_t *metadata_templ = NULL; - glite_jp_error_t err; - - glite_jp_clear_error(ctx); - memset(&err,0,sizeof err); - err.source = __FUNCTION__; - - for (i = 0; query[i].attr.type != GLITE_JP_ATTR_UNDEF; i++) { - if (query[i].attr.type == GLITE_JP_ATTR_OWNER && query[i].op == GLITE_JP_QUERYOP_EQUAL) { - q_exact_owner = query[i].value.s; - } - if (query[i].attr.type == GLITE_JP_ATTR_TIME) { - switch (query[i].op) { - case GLITE_JP_QUERYOP_EQUAL: - q_min_time = query[i].value.time.tv_sec; - q_max_time = query[i].value.time.tv_sec + 1; - break; - case GLITE_JP_QUERYOP_LESS: - if (q_max_time > query[i].value.time.tv_sec + 1) - q_max_time = query[i].value.time.tv_sec + 1; - break; - case GLITE_JP_QUERYOP_WITHIN: - if (q_max_time > query[i].value2.time.tv_sec + 1) - q_max_time = query[i].value2.time.tv_sec + 1; - /* fallthrough */ - case GLITE_JP_QUERYOP_GREATER: - if (q_min_time < query[i].value.time.tv_sec) - q_min_time = query[i].value.time.tv_sec; - break; - default: - err.code = EINVAL; - err.desc = "Invalid query op"; - return glite_jp_stack_error(ctx,&err); - break; - } - } - if (query[i].attr.type == GLITE_JP_ATTR_TAG) - q_with_tags = 1; - - } - - for (i = 0; metadata[i].attr.type != GLITE_JP_ATTR_UNDEF; i++) { - switch (metadata[i].attr.type) { - case GLITE_JP_ATTR_OWNER: - case GLITE_JP_ATTR_TIME: - md_info = 1; - break; - case GLITE_JP_ATTR_TAG: - md_tags = 1; - break; - default: - err.code = EINVAL; - err.desc = "Invalid attribute type in metadata parameter"; - return glite_jp_stack_error(ctx,&err); - break; - } - } - metadata_templ = (glite_jp_attrval_t *) calloc(i + 1, sizeof(glite_jp_attrval_t)); - if (!metadata_templ) { - err.code = ENOMEM; - return glite_jp_stack_error(ctx,&err); - } - memcpy(metadata_templ, metadata, (i + 1) * sizeof(glite_jp_attrval_t)); - - q_min_time_tr = regtime_trunc(q_min_time); - q_max_time_tr = regtime_ceil(q_max_time); - - if (q_exact_owner) { - ownerhash = str2md5(q_exact_owner); /* static buffer */ - if (asprintf(&owner_dirname, "%s/data/%s", config->internal_path, ownerhash) == -1) { - err.code = ENOMEM; - return glite_jp_stack_error(ctx,&err); - } - owner_dirp = opendir(owner_dirname); - free(owner_dirname); - if (!owner_dirp) { - free(metadata_templ); - return 0; /* found nothing */ - } - while ((ttimeent = readdir(owner_dirp)) != NULL) { - if (!strcmp(ttimeent->d_name, ".")) continue; - if (!strcmp(ttimeent->d_name, "..")) continue; - ttime = atol(ttimeent->d_name); - if (ttime >= q_min_time_tr && ttime < q_max_time_tr) { - if (query_phase2(ctx, ownerhash, ttime, q_with_tags, md_tags, - query, metadata_templ, callback)) { - err.code = EIO; - err.desc = "query_phase2() error"; - goto error_out; - } - } - } - } else { /* !q_exact_owner */ - if (asprintf(&data_dirname, "%s/data", config->internal_path) == -1) { - err.code = ENOMEM; - goto error_out; - } - data_dirp = opendir(data_dirname); - if (!data_dirp) { - err.code = EIO; - err.desc = "Cannot open data directory"; - goto error_out; - } - while ((ownerent = readdir(data_dirp)) != NULL) { - if (!strcmp(ownerent->d_name, ".")) continue; - if (!strcmp(ownerent->d_name, "..")) continue; - if (asprintf(&owner_dirname, "%s/data/%s", config->internal_path, - ownerent->d_name) == -1) { - err.code = ENOMEM; - goto error_out; - } - owner_dirp = opendir(owner_dirname); - free(owner_dirname); - if (!owner_dirp) { - err.code = EIO; - err.desc = "Cannot open owner data directory"; - goto error_out; - } - while ((ttimeent = readdir(owner_dirp)) != NULL) { - if (!strcmp(ttimeent->d_name, ".")) continue; - if (!strcmp(ttimeent->d_name, "..")) continue; - ttime = atol(ttimeent->d_name); - if (ttime >= q_min_time_tr && ttime < q_max_time_tr) { - if (query_phase2(ctx, ownerent->d_name, ttime, q_with_tags, md_tags, - query, metadata_templ, callback)) { - err.code = EIO; - err.desc = "query_phase2() error"; - goto error_out; - } - } - } - closedir(owner_dirp); owner_dirp = NULL; - } - closedir(data_dirp); data_dirp = NULL; - } - return 0; - -error_out: - if (owner_dirp) closedir(owner_dirp); - if (data_dirp) closedir(data_dirp); - free(data_dirname); - free(metadata_templ); - return glite_jp_stack_error(ctx,&err); -} - -/* XXX: -- no primary authorization yet -- no concurrency control yet -- partial success in pwrite,append -- "unique" part of jobid is assumed to be unique across bookkeeping servers -- repository versioning not fully implemented yet -*/ diff --git a/org.glite.jp.primary/src/is_client.c b/org.glite.jp.primary/src/is_client.c deleted file mode 100644 index 1d0446a..0000000 --- a/org.glite.jp.primary/src/is_client.c +++ /dev/null @@ -1,33 +0,0 @@ -#include -#include -#include -#include -#include -#include - -#include "glite/jp/types.h" - -#include "feed.h" -#include "jpis_H.h" -#include "jpis_.nsmap" - -int glite_jpps_single_feed( - glite_jp_context_t ctx, - const char *destination, - const char *job, - const glite_jp_attrval_t attrs[] -) -{ - /* TODO: really call JP Index server (via interlogger) */ - printf("feed to %s, job %s\n",destination,job); - - if (soap_call_jpsrv__UpdateJobs(ctx->other_soap,destination,"", - /* FIXME: feedId */ "", - /* FIXME: UpdateJobsData */ NULL, - 0, - NULL - )) fprintf(stderr,"UpdateJobs: %s %s\n",ctx->other_soap->fault->faultcode, - ctx->other_soap->fault->faultstring); - - return 0; -} diff --git a/org.glite.jp.primary/src/jptype_map.h b/org.glite.jp.primary/src/jptype_map.h deleted file mode 100644 index 6df0828..0000000 --- a/org.glite.jp.primary/src/jptype_map.h +++ /dev/null @@ -1,16 +0,0 @@ -#if GSOAP_VERSION >= 20700 -#define INPUT_SANDBOX jptype__UploadClass__INPUT_SANDBOX -#define OUTPUT_SANDBOX jptype__UploadClass__OUTPUT_SANDBOX -#define JOB_LOG jptype__UploadClass__JOB_LOG - -#define OWNER jptype__AttributeType__OWNER -#define TIME jptype__AttributeType__TIME -#define TAG jptype__AttributeType__TAG - -#define EQUAL jptype__QueryOp__EQUAL -#define UNEQUAL jptype__QueryOp__UNEQUAL -#define LESS jptype__QueryOp__LESS -#define GREATER jptype__QueryOp__GREATER -#define WITHIN jptype__QueryOp__WITHIN -#endif - diff --git a/org.glite.jp.primary/src/simple_server.c b/org.glite.jp.primary/src/simple_server.c deleted file mode 100644 index 3bbb743..0000000 --- a/org.glite.jp.primary/src/simple_server.c +++ /dev/null @@ -1,59 +0,0 @@ -#include - -#include "glite/jp/types.h" -#include "glite/jp/context.h" - -#include "jpps_H.h" - -extern SOAP_NMAC struct Namespace jpis__namespaces[],jpps__namespaces[]; - -int main(int argc, char *argv[]) { - struct soap soap; - int i, m, s; // master and slave sockets - - glite_jp_context_t ctx; - - soap_init(&soap); - soap_set_namespaces(&soap, jpps__namespaces); - - glite_jp_init_context(&ctx); - - if (glite_jppsbe_init(ctx, &argc, argv)) { - /* XXX log */ - fputs(glite_jp_error_chain(ctx), stderr); - exit(1); - } - - soap.user = (void *) ctx; - - ctx->other_soap = soap_new(); - soap_init(ctx->other_soap); - soap_set_namespaces(ctx->other_soap,jpis__namespaces); - - srand48(time(NULL)); /* feed id generation */ - - m = soap_bind(&soap, NULL, 8901, 100); - if (m < 0) - soap_print_fault(&soap, stderr); - else - { - fprintf(stderr, "Socket connection successful: master socket = %d\n", m); - for (i = 1; ; i++) { - s = soap_accept(&soap); - if (s < 0) { - soap_print_fault(&soap, stderr); - break; - } - jpps__serve(&soap); // process RPC request - soap_destroy(&soap); // clean up class instances - soap_end(&soap); // clean up everything and close socket - glite_jp_run_deferred(ctx); - } - } - soap_done(&soap); // close master socket - - return 0; -} - -/* XXX: we don't use it */ -SOAP_NMAC struct Namespace namespaces[] = { {NULL,NULL} }; diff --git a/org.glite.jp.primary/src/soap_ops.c b/org.glite.jp.primary/src/soap_ops.c deleted file mode 100644 index 1e5534b..0000000 --- a/org.glite.jp.primary/src/soap_ops.c +++ /dev/null @@ -1,374 +0,0 @@ -#include -#include - -#include "glite/jp/types.h" -#include "glite/jp/context.h" - -#include "feed.h" - -#include "jpps_H.h" -/* #include "JobProvenancePS.nsmap" */ -#include "jpps_.nsmap" - -#include "jptype_map.h" - -static struct jptype__GenericJPFaultType *jp2s_error(struct soap *soap, - const glite_jp_error_t *err) -{ - struct jptype__GenericJPFaultType *ret = NULL; - if (err) { - ret = soap_malloc(soap,sizeof *ret); - memset(ret,0,sizeof *ret); - ret->code = err->code; - ret->source = soap_strdup(soap,err->source); - ret->text = soap_strdup(soap,strerror(err->code)); - ret->description = soap_strdup(soap,err->desc); - ret->reason = jp2s_error(soap,err->reason); - } - return ret; -} - -static void err2fault(const glite_jp_context_t ctx,struct soap *soap) -{ - char *et; - struct SOAP_ENV__Detail *detail = soap_malloc(soap,sizeof *detail); - struct _GenericJPFault *f = soap_malloc(soap,sizeof *f); - - - f->jptype__GenericJPFault = jp2s_error(soap,ctx->error); - - detail->__type = SOAP_TYPE__GenericJPFault; -#if GSOAP_VERSION >= 20700 - detail->fault = f; -#else - detail->value = f; -#endif - detail->__any = NULL; - - soap_receiver_fault(soap,"Oh, shit!",NULL); - if (soap->version == 2) soap->fault->SOAP_ENV__Detail = detail; - else soap->fault->detail = detail; -} - -static glite_jp_fileclass_t s2jp_fileclass(enum jptype__UploadClass class) -{ - switch (class) { - case INPUT_SANDBOX: return GLITE_JP_FILECLASS_INPUT; - case OUTPUT_SANDBOX: return GLITE_JP_FILECLASS_OUTPUT; - case JOB_LOG: return GLITE_JP_FILECLASS_LBLOG; - default: return GLITE_JP_FILECLASS_UNDEF; - } -} - -static void s2jp_tag(const struct jptype__TagValue *stag,glite_jp_tagval_t *jptag) -{ - memset(jptag,0,sizeof *jptag); - jptag->name = strdup(stag->name); - jptag->sequence = stag->sequence ? *stag->sequence : 0; - jptag->timestamp = stag->timestamp ? *stag->timestamp : 0; - if (stag->stringValue) jptag->value = strdup(stag->stringValue); - else if (stag->blobValue) { - jptag->binary = 1; - jptag->size = stag->blobValue->__size; - jptag->value = (char *) stag->blobValue->__ptr; - } -} - -#define CONTEXT_FROM_SOAP(soap,ctx) glite_jp_context_t ctx = (glite_jp_context_t) ((soap)->user) - -SOAP_FMAC5 int SOAP_FMAC6 jpsrv__RegisterJob( - struct soap *soap, - char *job, - struct jpsrv__RegisterJobResponse *response) -{ - CONTEXT_FROM_SOAP(soap,ctx); - char *owner = glite_jp_peer_name(ctx); - glite_jp_attrval_t owner_val[2]; - - if (glite_jppsbe_register_job(ctx,job,owner)) { - err2fault(ctx,soap); - free(owner); - return SOAP_FAULT; - } - - owner_val[0].attr.type = GLITE_JP_ATTR_OWNER; - owner_val[0].value.s = owner; - owner_val[1].attr.type = GLITE_JP_ATTR_UNDEF; - -/* XXX: errrors should be ingored but not silently */ - glite_jpps_match_attr(ctx,job,owner_val); - free(owner); - - return SOAP_OK; -} - - -SOAP_FMAC5 int SOAP_FMAC6 jpsrv__StartUpload( - struct soap *soap, - char *job, - enum jptype__UploadClass class, - time_t commit_before, - char *content_type, - struct jpsrv__StartUploadResponse *response) -{ - CONTEXT_FROM_SOAP(soap,ctx); - glite_jp_fileclass_t jclass = s2jp_fileclass(class); - char *destination; - - if (glite_jppsbe_start_upload(ctx,job,jclass,content_type,&destination,&commit_before)) { - err2fault(ctx,soap); - return SOAP_FAULT; - } - - response->destination = soap_strdup(soap,destination); - free(destination); - response->commitBefore = commit_before; - - return SOAP_OK; -} - -SOAP_FMAC5 int SOAP_FMAC6 jpsrv__CommitUpload( - struct soap *soap, - char *destination, - struct jpsrv__CommitUploadResponse *response) -{ - CONTEXT_FROM_SOAP(soap,ctx); - char *job = NULL; - glite_jp_fileclass_t class; - - if (glite_jppsbe_commit_upload(ctx,destination)) { - err2fault(ctx,soap); - return SOAP_FAULT; - } - - /* XXX: should not fail when commit_upload was OK */ - glite_jppsbe_destination_info(ctx,destination,&job,&class); - - /* XXX: ignore errors but don't fail silenty */ - glite_jpps_match_file(ctx,job,class); - - return SOAP_OK; -} - -SOAP_FMAC5 int SOAP_FMAC6 jpsrv__RecordTag( - struct soap *soap, - char *job, - struct jptype__TagValue *tag, - struct jpsrv__RecordTagResponse *response) -{ - CONTEXT_FROM_SOAP(soap,ctx); - void *tagfile; - - glite_jp_tagval_t mytag; - - if (glite_jppsbe_open_file(ctx,job,GLITE_JP_FILECLASS_TAGS, - O_WRONLY|O_CREAT,&tagfile)) - { - err2fault(ctx,soap); - return SOAP_FAULT; - } - - if (glite_jpps_tag_append(ctx,tagfile,&mytag)) { - err2fault(ctx,soap); - glite_jppsbe_close_file(ctx,tagfile); - return SOAP_FAULT; - } - - if (glite_jppsbe_close_file(ctx,tagfile)) { - err2fault(ctx,soap); - return SOAP_FAULT; - } - - /* XXX: ignore errors but don't fail silenty */ - - s2jp_tag(tag,&mytag); - glite_jpps_match_tag(ctx,job,&mytag); - - return SOAP_OK; -} - -static void s2jp_attr(const struct jptype__Attribute *in,glite_jp_attr_t *out) -{ - switch (in->type) { - case OWNER: out->type = GLITE_JP_ATTR_OWNER; break; - case TIME: out->type = GLITE_JP_ATTR_TIME; - out->name = strdup(in->name); - break; - case TAG: out->type = GLITE_JP_ATTR_TAG; - out->name = strdup(in->name); - break; - default: break; - } -} - -static void s2jp_queryval( - const char *in, - glite_jp_attrtype_t type, - union _glite_jp_query_rec_val *out) -{ - switch (type) { - case GLITE_JP_ATTR_OWNER: - case GLITE_JP_ATTR_TAG: - out->s = strdup(in); - break; - case GLITE_JP_ATTR_TIME: - out->time.tv_sec = atoi(in); - break; - } -} - -static void s2jp_query(const struct jptype__PrimaryQueryElement *in, glite_jp_query_rec_t *out) -{ - s2jp_attr(in->attr,&out->attr); - - switch (in->op) { - case EQUAL: out->op = GLITE_JP_QUERYOP_EQUAL; break; - case UNEQUAL: out->op = GLITE_JP_QUERYOP_UNEQUAL; break; - case LESS: out->op = GLITE_JP_QUERYOP_LESS; break; - case GREATER: out->op = GLITE_JP_QUERYOP_GREATER; break; - case WITHIN: - out->op = GLITE_JP_QUERYOP_WITHIN; - s2jp_queryval(in->value2,out->attr.type,&out->value2); - break; - } - - s2jp_queryval(in->value,out->attr.type,&out->value); -} - -SOAP_FMAC5 int SOAP_FMAC6 jpsrv__FeedIndex( - struct soap *soap, - char *destination, - struct jptype__Attributes *attributes, - struct jptype__PrimaryQuery *query, - enum xsd__boolean history, - enum xsd__boolean continuous, - struct jpsrv__FeedIndexResponse *response) -{ - -/* deferred processing: return feed_id to the index server first, - * start feeding it afterwards -- not before the index server actually - * knows feed_id and is ready to accept the feed. - * - * Has to be done within the same server slave, - * passed through the context */ - - CONTEXT_FROM_SOAP(soap,ctx); - char *feed_id = NULL; - time_t expires = 0; - int ret = SOAP_OK; - - glite_jp_attr_t *attrs = calloc(attributes->__sizeitem+1,sizeof *attrs); - glite_jp_query_rec_t *qry = calloc(query->__sizeitem+1,sizeof *qry); - int i; - - glite_jp_clear_error(ctx); - - for (i = 0; i__sizeitem; i++) s2jp_attr(attributes->item[i],attrs+i); - for (i = 0; i__sizeitem; i++) s2jp_query(query->item[i],qry+i); - - if (history) { - if (glite_jpps_run_feed(ctx,destination,attrs,qry,&feed_id)) { - err2fault(ctx,soap); - ret = SOAP_FAULT; - goto cleanup; - } - } - - if (continuous) { - if (glite_jpps_register_feed(ctx,destination,attrs,qry,&feed_id,&expires)) { - err2fault(ctx,soap); - ret = SOAP_FAULT; - goto cleanup; - } - } - - if (!history && !continuous) { - glite_jp_error_t err; - err.code = EINVAL; - err.source = __FUNCTION__; - err.desc = "at least one of and must be true"; - glite_jp_stack_error(ctx,&err); - err2fault(ctx,soap); - ret = SOAP_FAULT; - goto cleanup; - } - - response->expires = expires; - response->feedId = soap_strdup(soap,feed_id); - -cleanup: - free(feed_id); - for (i=0; attrs[i].type; i++) free(attrs[i].name); - free(attrs); - for (i=0; qry[i].attr.type; i++) glite_jp_free_query_rec(qry+i); - free(qry); - - return ret; -} - -SOAP_FMAC5 int SOAP_FMAC6 jpsrv__FeedIndexRefresh( - struct soap *soap, - char *feed_id, - struct jpsrv__FeedIndexRefreshResponse *response) -{ - fprintf(stderr,"%s: not implemented\n",__FUNCTION__); - abort(); -} - -SOAP_FMAC5 int SOAP_FMAC6 jpsrv__GetJob( - struct soap *soap, - char *job, - struct jpsrv__GetJobResponse *response) -{ - CONTEXT_FROM_SOAP(soap,ctx); - char *url; - - struct { - glite_jp_fileclass_t type; - char **url; - char *name; - } tab[] = { - { GLITE_JP_FILECLASS_INPUT, &response->inputSandbox, "input sandbox" }, - { GLITE_JP_FILECLASS_OUTPUT, &response->outputSandbox, "output sandbox" }, - { GLITE_JP_FILECLASS_LBLOG, &response->jobLog, "L&B log" }, - { GLITE_JP_FILECLASS_TAGS, &response->tags, "JP tags" }, - { GLITE_JP_FILECLASS_UNDEF, NULL, NULL } - }; - - int i,gotone = 0; - glite_jp_error_t err; - - for (i=0; tab[i].type; i++) { - glite_jp_clear_error(ctx); - switch (glite_jppsbe_get_job_url(ctx,job,tab[i].type,&url)) { - case 0: *tab[i].url = soap_strdup(soap,url); - free(url); - gotone = 1; - break; - case ENOENT: - *tab[i].url = NULL; - break; - default: - err.code = ctx->error->code; - err.source = "jpsrv__GetJob()"; - err.desc = tab[i].name; - glite_jp_stack_error(ctx,&err); - err2fault(ctx,soap); - glite_jp_clear_error(ctx); - return SOAP_FAULT; - } - } - - if (!gotone) { - glite_jp_clear_error(ctx); - err.code = ENOENT; - err.source = __FUNCTION__; - err.desc = "No file found for this job"; - glite_jp_stack_error(ctx,&err); - err2fault(ctx,soap); - glite_jp_clear_error(ctx); - return SOAP_FAULT; - } - return SOAP_OK; -} - diff --git a/org.glite.jp.primary/src/tags.c b/org.glite.jp.primary/src/tags.c deleted file mode 100644 index 1f11b4d..0000000 --- a/org.glite.jp.primary/src/tags.c +++ /dev/null @@ -1,233 +0,0 @@ -#include -#include -#include -#include -#include - -#include -#include "tags.h" -#include "backend.h" - -/* magic name_len value_len binary sequence timestamp */ -#define HEADER "JP#TAG# %05u %012lu %c %05u %012lu#" -#define HEADER_SIZE 48 - -int glite_jpps_tag_append( - glite_jp_context_t ctx, - void *handle, - const glite_jp_tagval_t *tag -) -{ - char hdr[HEADER_SIZE+1]; - glite_jp_error_t err; - - unsigned long vlen = tag->binary ? tag->size : - (tag->value ? strlen(tag->value) : 0); - int nlen; - - memset(&err,0,sizeof err); - err.source = "glite_jpps_tag_append()"; - - if (!tag->name) { - err.code = EINVAL; - err.desc = "tag name"; - return glite_jp_stack_error(ctx,&err); - } - - nlen = strlen(tag->name); - - assert(sprintf(hdr,HEADER,nlen,vlen, - tag->binary ? "B" : "S", - tag->sequence, tag->timestamp) == HEADER_SIZE); - - if (glite_jppsbe_append(ctx,handle,hdr,HEADER_SIZE)) { - err.code = EIO; - err.desc = "write tag header"; - return glite_jp_stack_error(ctx,&err); - } - - if (glite_jppsbe_append(ctx,handle,tag->name,nlen)) { - err.code = EIO; - err.desc = "write tag name"; - return glite_jp_stack_error(ctx,&err); - } - - if (glite_jppsbe_append(ctx,handle,tag->value,vlen)) { - err.code = EIO; - err.desc = "write tag value"; - return glite_jp_stack_error(ctx,&err); - } - - return 0; -} - -int glite_jpps_tagval_copy( - glite_jp_context_t ctx, - glite_jp_tagval_t *from, - glite_jp_tagval_t *to -) -{ - glite_jp_error_t err; - - glite_jp_clear_error(ctx); - memset(&err,0,sizeof err); - err.source = __FUNCTION__; - - to->name = strdup(from->name); - if (!to->name) { - err.code = ENOMEM; - return glite_jp_stack_error(ctx,&err); - } - to->sequence = from->sequence; - to->timestamp = from->timestamp; - to->binary = from->binary; - to->size = from->size; - to->value = (char *) malloc(to->size); - if (!to->value) { - free(to->name); - err.code = ENOMEM; - return glite_jp_stack_error(ctx,&err); - } - memcpy(from->value, to->value, to->size); - - return 0; -} - -int glite_jpps_tag_read( - glite_jp_context_t ctx, - void *handle, - off_t offset, - glite_jp_tagval_t *tagvalue, - size_t *shift -) -{ - char hdr[HEADER_SIZE+1]; - unsigned int nlen; - unsigned long vlen; - char binary; - unsigned sequence; - unsigned timestamp; - char * name = NULL; - char * value = NULL; - ssize_t ret; - glite_jp_error_t err; - - glite_jp_clear_error(ctx); - memset(&err,0,sizeof err); - err.source = __FUNCTION__; - - hdr[HEADER_SIZE] = '\0'; - if (glite_jppsbe_pread(ctx, handle, hdr, HEADER_SIZE, offset, &ret)) { - err.code = EIO; - err.desc = "Cannot read tag header"; - goto error_out; - } - if (ret == 0) { - err.code = ENOENT; - err.desc = "No more tags in the file"; - goto error_out; - } - /* #define HEADER "JP#TAG# %05u %012lu %c %05u %012lu#" */ - if (sscanf(hdr, HEADER, &nlen, &vlen, &binary, &sequence, ×tamp) < 5) { - err.code = EILSEQ; - err.desc = "Incorrect tag header format"; - goto error_out; - } - name = (char*) malloc(nlen + 1); - if (!name) { - err.code = ENOMEM; - goto error_out; - } - name[nlen] = '\0'; - value = (char*) malloc(vlen + 1); - if (!value) { - err.code = ENOMEM; - goto error_out; - } - value[vlen] = '\0'; - if (glite_jppsbe_pread(ctx, handle, name, nlen, offset + HEADER_SIZE, &ret)) { - err.code = EIO; - err.desc = "Cannot read tag name"; - goto error_out; - } - if (glite_jppsbe_pread(ctx, handle, value, vlen, offset + HEADER_SIZE + nlen, &ret)) { - err.code = EIO; - err.desc = "Cannot read tag value"; - goto error_out; - } - - tagvalue->name = name; - tagvalue->sequence = sequence; - tagvalue->timestamp = timestamp; - tagvalue->binary = (binary == 'B') ? 1 : 0; - tagvalue->size = vlen; - tagvalue->value = value; - - *shift = HEADER_SIZE + nlen + vlen; - - return 0; -error_out: - free(name); - free(value); - return glite_jp_stack_error(ctx,&err); -} - -/* -int glite_jpps_tag_read(glite_jp_context_t, void *, off_t, glite_jp_tagval_t *, size_t); -int glite_jpps_tag_readall(glite_jp_context_t, void *, glite_jp_tagval_t **); -*/ - -int glite_jpps_tag_readall( - glite_jp_context_t ctx, - void *handle, - glite_jp_tagval_t **tags_out -) -{ - glite_jp_tagval_t * tags = NULL; - void * newspace; - int ntags = 0; - int ntagspace = 0; - off_t offset = 0; - int ret; - size_t shift; - glite_jp_error_t err; - - glite_jp_clear_error(ctx); - memset(&err,0,sizeof err); - err.source = __FUNCTION__; - - ntagspace = 1; - tags = (glite_jp_tagval_t *) calloc(ntagspace + 1, sizeof(*tags)); - if (!tags) { - err.code = ENOMEM; - return glite_jp_stack_error(ctx,&err); - } - while (!(ret = glite_jpps_tag_read(ctx, handle, offset, &tags[ntags], &shift))) { - offset += shift; - ntags++; - if (ntagspace <= ntags) { - ntagspace += 1; - newspace = realloc(tags, (ntagspace + 1) * sizeof(*tags)); - if (!newspace) { - err.code = ENOMEM; - goto error_out; - } - tags = (glite_jp_tagval_t *) newspace; - } - } - if (ret == ENOENT) { - *tags_out = tags; - return 0; - } else { - err.code = EIO; - err.desc = "Error reading tag value"; - } - -error_out: - for (; ntags-- ;) { - free(tags[ntags].name); - free(tags[ntags].value); - } - free(tags); - return glite_jp_stack_error(ctx,&err); -} diff --git a/org.glite.jp.primary/src/tags.h b/org.glite.jp.primary/src/tags.h deleted file mode 100644 index 0d8afa8..0000000 --- a/org.glite.jp.primary/src/tags.h +++ /dev/null @@ -1 +0,0 @@ -int glite_jpps_tag_append(glite_jp_context_t,void *,const glite_jp_tagval_t *); diff --git a/org.glite.jp.primary/src/typemap.dat b/org.glite.jp.primary/src/typemap.dat deleted file mode 100644 index 7032cb2..0000000 --- a/org.glite.jp.primary/src/typemap.dat +++ /dev/null @@ -1,2 +0,0 @@ -jpsrv = http://glite.org/wsdl/services/jp -jptype = http://glite.org/wsdl/types/jp diff --git a/org.glite.jp.ws-interface/.cvsignore b/org.glite.jp.ws-interface/.cvsignore deleted file mode 100755 index 1df717b..0000000 --- a/org.glite.jp.ws-interface/.cvsignore +++ /dev/null @@ -1,2 +0,0 @@ -.project -.cdtproject \ No newline at end of file diff --git a/org.glite.jp.ws-interface/LICENSE b/org.glite.jp.ws-interface/LICENSE deleted file mode 100755 index 01b973b..0000000 --- a/org.glite.jp.ws-interface/LICENSE +++ /dev/null @@ -1,69 +0,0 @@ -LICENSE file for EGEE Middleware -================================ - -Copyright (c) 2004 on behalf of the EU EGEE Project: -The European Organization for Nuclear Research (CERN), -Istituto Nazionale di Fisica Nucleare (INFN), Italy -Datamat Spa, Italy -Centre National de la Recherche Scientifique (CNRS), France -CS Systeme d'Information (CSSI), France -Royal Institute of Technology, Center for Parallel Computers (KTH-PDC), Sweden -Universiteit van Amsterdam (UvA), Netherlands -University of Helsinki (UH.HIP), Finlan -University of Bergen (UiB), Norway -Council for the Central Laboratory of the Research Councils (CCLRC), United Kingdom - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -1. Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. - -3. The end-user documentation included with the redistribution, if -any, must include the following acknowledgment: "This product includes -software developed by The EU EGEE Project (http://cern.ch/eu-egee/)." -Alternatively, this acknowledgment may appear in the software itself, if -and wherever such third-party acknowledgments normally appear. - -4. The names EGEE and the EU EGEE Project must not be -used to endorse or promote products derived from this software without -prior written permission. For written permission, please contact -. - -5. You are under no obligation whatsoever to provide anyone with any -bug fixes, patches, or upgrades to the features, functionality or -performance of the Software ("Enhancements") that you may develop over -time; however, if you choose to provide your Enhancements to The EU -EGEE Project, or if you choose to otherwise publish or distribute your -Enhancements, in source code form without contemporaneously requiring -end users of The EU EGEE Proejct to enter into a separate written license -agreement for such Enhancements, then you hereby grant The EU EGEE Project -a non-exclusive, royalty-free perpetual license to install, use, copy, -modify, prepare derivative works, incorporate into the EGEE Middleware -or any other computer software, distribute, and sublicense your -Enhancements or derivative works thereof, in binary and source code -form (if any), whether developed by The EU EGEE Project or third parties. - -THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED -WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL PROJECT OR ITS CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN -IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -This software consists of voluntary contributions made by many -individuals on behalf of the EU EGEE Prject. For more information on The -EU EGEE Project, please see http://cern.ch/eu-egee/. For more information on -EGEE Middleware, please see http://egee-jra1.web.cern.ch/egee-jra1/ - - diff --git a/org.glite.jp.ws-interface/Makefile b/org.glite.jp.ws-interface/Makefile deleted file mode 100644 index 73cd9ad..0000000 --- a/org.glite.jp.ws-interface/Makefile +++ /dev/null @@ -1,48 +0,0 @@ -# Default values -top_srcdir=. -builddir=build -top_builddir=${top_srcdir}/${builddir} -stagedir=. -distdir=. -globalprefix=glite -package=glite-jp-ws-interface -version=0.0.0 -PREFIX=/opt/glite - --include Makefile.inc - -VPATH=${top_srcdir}/interface -STAGETO=interface - -WSDL=JobProvenancePS.wsdl JobProvenanceTypes.wsdl - -all compile: - -check: - @echo No unit test required for interface-only module. - -stage: - $(MAKE) install PREFIX=${stagedir} - -dist: distsrc distbin - -distsrc: - mkdir -p ${top_srcdir}/${package}-${version} - cd ${top_srcdir} && GLOBIGNORE="${package}-${version}" && cp -Rf * ${package}-${version} - cd ${top_srcdir} && tar -czf ${distdir}/${package}-${version}_src.tar.gz --exclude-from=project/tar_exclude ${package}-${version} - rm -rf ${top_srcdir}/${package}-${version} - -distbin: - $(MAKE) install PREFIX=${top_srcdir}/tmpbuilddir - cd ${top_srcdir}/tmpbuilddir && tar -czf ${top_srcdir}/${distdir}/${package}-${version}_bin.tar.gz * - rm -rf ${top_srcdir}/tmpbuilddir - -install: - -mkdir -p ${PREFIX}/${STAGETO} - -mkdir -p ${PREFIX}/share/doc/${package}-${version} - install -m 644 ${top_srcdir}/LICENSE ${PREFIX}/share/doc/${package}-${version} - cd ${top_srcdir}/interface && install -m 644 ${WSDL} ${PREFIX}/${STAGETO} - -clean: - rm -f *.h - diff --git a/org.glite.jp.ws-interface/build.xml b/org.glite.jp.ws-interface/build.xml deleted file mode 100644 index 44d86eb..0000000 --- a/org.glite.jp.ws-interface/build.xml +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/org.glite.jp.ws-interface/interface/JobProvenanceIS.wsdl b/org.glite.jp.ws-interface/interface/JobProvenanceIS.wsdl deleted file mode 100644 index 84c8844..0000000 --- a/org.glite.jp.ws-interface/interface/JobProvenanceIS.wsdl +++ /dev/null @@ -1,110 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - Store or update information on jobs within the JP index server. -Called directly by the primary storage, used for both batch and incremental feed. - -Input: - -data: list of job record updates. Each contains jobid, list of JP attribute values and user tag values. - -feedDone: flag indicating end of batch feed. (In order to avoid potential problems with buffer allocation -the huge dataset of batch feed is split into reasonable chunks and delivered with more UpdateJobs calls.) - -Output: N/A - -Faults: GenericJPFault - - - - - - - - - Retrieve pointers to job records of jobs matching a query. -Input: conditions - list of lists of query conditions. - Elements of the inner lists refer to a single job attribute, the conditions are or-ed. - Elements of the outer list may refer to different job attributes, they are and-ed. - -Output: - -jobs: list of JobId, PSContact (URL of the primary storage which manges this job) pairs - -Faults: GenericJPFault - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Job Provenance Index service - - - - - - - diff --git a/org.glite.jp.ws-interface/interface/JobProvenancePS.wsdl b/org.glite.jp.ws-interface/interface/JobProvenancePS.wsdl deleted file mode 100644 index 7c777dd..0000000 --- a/org.glite.jp.ws-interface/interface/JobProvenancePS.wsdl +++ /dev/null @@ -1,307 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Register job with JP primary storage. -Job registration in LB is propagated to JP immediately so that JP is aware of the job, -despite no furhter information is available in it. - -Input: JobId - -Output: N/A - -Faults: GenericJPFault - - - - - - - Initiate upload of of sandbox/dump of job life log from LB. -WM component responsible for job sandbox management and LB server call JP to declare -intention to upload intput/output sandbox and job life log. - -Input: - -uclass: type of the upload - INPUT_SANDBOX, OUTPUT_SANDBOX, JOB_LOG - -commitTimeout: upper limit on time for which JP waits for committing this upload transaction - -contentType: MIME type of the uploaded file - -Output: - -destination: URL where the client should upload the file - -commitBefore: acutual time when the upload transaction times out - -Faults: GenericJPFault - - -Initiate upload of of sandbox/dump of job life log from LB. - - - - - - Confirm upload. -Should be called after a file upload initiaded with StartUpload is finished. - -Input: - -destination: Upload destination URL (to match with the original request) - -Output: - -Faults: GenericJPFault - - - - - - - Record a value of user tag. -JP tags are either standalone or override values of their LB counterparts. -However, JP tag values are still distinguishable those inherited from LB. -JP tags may be either strings or blobs. - -Input: - -jobid: - -tag: structure containing name, timestamp, optional sequence number to order tag values -without relying on timestamps, and string or blob value. - -Output: N/A - -Faults: GenericJPFault - - - - - - - Start feeding JP index server. -Called by the index server to start batch feed, and optionally also subscribe for incremental feed. - -JP index server subscribes with JP primary storage using a query -containing conditions on primary metadata and a list of queryable attributes -of the index server (i.e. data which should be sent to the index server). - -When a matching job record is created or modified within the primary storage -the job record data are sent to the subscribed index server. - -The subscription is soft-state, it expires after certain time unless refreshed by the client explicitely. - -In the batch mode the query has the same form -with additional flag asking for all matching records (i.e.\ not only -arriving afterwards). - -Input: - -destination: where to send the job record data - -attributes: which job record attributes should be sent to the requesting index server - -conditions: list of query conditions. Each conditions has the form Attribute Operator Value, -where Attribute is any of job record attributes and Operator is one of EQUAL, UNEQUAL, LESS, GREATER, WITHIN. - -continuous: flag determining that the query is incremental (not batch) - -Output: - -feedId: unique Id of the feed request, to be used in refresh, cancelation etc. - -expires: when the feed times out. Must be refreshed before this time. - -Faults: GenericJPFault - - - - - - - Extend batch feed subscription (used by index server) - -Input: feedId returned previously by FeedIndex - -Output: the same as for FeedIndex - -Faults: GenericJPFault - - - - - - - Retrieve job record URL's when jobid is known -Used either to bypass JP index server query for this specific case, or after the index server query to -retrieve actual job record. - -Input: jobid - -Output: - -jobLog, inputSandbox, outputSandbox, tags: URL's to components of the job record. - -Faults: GenericJPFault - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Job Provenance Primary Storage service - - - - - diff --git a/org.glite.jp.ws-interface/interface/JobProvenanceTypes.wsdl b/org.glite.jp.ws-interface/interface/JobProvenanceTypes.wsdl deleted file mode 100644 index e1a6db4..0000000 --- a/org.glite.jp.ws-interface/interface/JobProvenanceTypes.wsdl +++ /dev/null @@ -1,162 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/org.glite.jp.ws-interface/project/build.properties b/org.glite.jp.ws-interface/project/build.properties deleted file mode 100755 index e69de29..0000000 diff --git a/org.glite.jp.ws-interface/project/configure.properties.xml b/org.glite.jp.ws-interface/project/configure.properties.xml deleted file mode 100644 index 4b08208..0000000 --- a/org.glite.jp.ws-interface/project/configure.properties.xml +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - - - - -top_srcdir=.. -builddir=build -stagedir=${stage.abs.dir} -distdir=${dist.dir} -globalprefix=${global.prefix} -jpprefix=${subsystem.prefix} -package=${module.package.name} -PREFIX=${install.dir} -version=${module.version} -glite_location=${with.glite.location} - - - diff --git a/org.glite.jp.ws-interface/project/glite-jp-ws-interface.spec b/org.glite.jp.ws-interface/project/glite-jp-ws-interface.spec deleted file mode 100644 index dba6d55..0000000 --- a/org.glite.jp.ws-interface/project/glite-jp-ws-interface.spec +++ /dev/null @@ -1,42 +0,0 @@ -Summary:Change me !!! -Name:glite-jp-ws-interface -Version:0.0.0 -Release:0 -Copyright:Open Source EGEE License -Vendor:EU EGEE project -Group:System/Application -Prefix:/opt/glite -BuildArch:x86_64 -BuildRoot:%{_builddir}/%{name}-%{version} -Source:glite-jp-ws-interface-0.0.0_bin.tar.gz - -%define debug_package %{nil} - -%description -Change me !!! - -%prep - - -%setup -c - -%build - - -%install - - -%clean - -%pre -%post -%preun -%postun -%files -%defattr(-,root,root) -%{prefix}/interface/JobProvenancePS.wsdl -%{prefix}/interface/JobProvenanceTypes.wsdl -%{prefix}/share/doc/glite-jp-ws-interface-0.0.0/LICENSE - -%changelog - diff --git a/org.glite.jp.ws-interface/project/properties.xml b/org.glite.jp.ws-interface/project/properties.xml deleted file mode 100644 index 4ec8018..0000000 --- a/org.glite.jp.ws-interface/project/properties.xml +++ /dev/null @@ -1,73 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/org.glite.jp.ws-interface/project/tar_exclude b/org.glite.jp.ws-interface/project/tar_exclude deleted file mode 100644 index e69de29..0000000 diff --git a/org.glite.jp.ws-interface/project/version.properties b/org.glite.jp.ws-interface/project/version.properties deleted file mode 100755 index e78612b..0000000 --- a/org.glite.jp.ws-interface/project/version.properties +++ /dev/null @@ -1,3 +0,0 @@ -module.version = 0.0.0 -module.build = 0 -module.age = 0 \ No newline at end of file diff --git a/org.glite.jp/.cvsignore b/org.glite.jp/.cvsignore deleted file mode 100644 index 3a4edf6..0000000 --- a/org.glite.jp/.cvsignore +++ /dev/null @@ -1 +0,0 @@ -.project diff --git a/org.glite.jp/build.xml b/org.glite.jp/build.xml deleted file mode 100644 index 7871c14..0000000 --- a/org.glite.jp/build.xml +++ /dev/null @@ -1,262 +0,0 @@ - - - - - - - Ant build file to build the GLite Job Provenance Subsystem - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Preparing directories ... - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - <project name="${subsystem.name}" type="post-subsystem" packageName="${global.prefix}-${subsystem.prefix}"/> - - - - diff --git a/org.glite.jp/project/build.properties b/org.glite.jp/project/build.properties deleted file mode 100644 index e69de29..0000000 diff --git a/org.glite.jp/project/dependencies.properties b/org.glite.jp/project/dependencies.properties deleted file mode 100644 index ab3b83f..0000000 --- a/org.glite.jp/project/dependencies.properties +++ /dev/null @@ -1,12 +0,0 @@ -################################################################### -# System dependencies -################################################################### - -org.glite.version = HEAD -org.glite.jp.version = HEAD - -# Component dependencies tag = do not remove this line = -org.glite.jp.ws-interface.version = HEAD -org.glite.jp.common.version = HEAD -org.glite.jp.index.version = HEAD -org.glite.jp.primary.version = HEAD diff --git a/org.glite.jp/project/glite.jp.csf.xml b/org.glite.jp/project/glite.jp.csf.xml deleted file mode 100644 index fd68f71..0000000 --- a/org.glite.jp/project/glite.jp.csf.xml +++ /dev/null @@ -1,271 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - The org.glite and org.glite.jp modules have been updated, please rerun the configuration file - - - - - The org.glite and org.glite.jp modules have been updated, please rerun the configuration file - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/org.glite.jp/project/properties.xml b/org.glite.jp/project/properties.xml deleted file mode 100755 index 276cf76..0000000 --- a/org.glite.jp/project/properties.xml +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/org.glite.jp/project/run-workspace b/org.glite.jp/project/run-workspace deleted file mode 100644 index a5d1f54..0000000 --- a/org.glite.jp/project/run-workspace +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/sh - -cd ../.. - -cvs co org.glite -cvs co org.glite.jp - -cd org.glite.jp/project -ant -f glite.jp.csf.xml - diff --git a/org.glite.jp/project/taskdefs.xml b/org.glite.jp/project/taskdefs.xml deleted file mode 100755 index c4cc889..0000000 --- a/org.glite.jp/project/taskdefs.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/org.glite.jp/project/version.properties b/org.glite.jp/project/version.properties deleted file mode 100644 index 75e32e6..0000000 --- a/org.glite.jp/project/version.properties +++ /dev/null @@ -1,4 +0,0 @@ -#Fri Dec 10 13:38:38 CET 2004 -module.version=0.1.0 -module.build=3 -module.age=1 diff --git a/org.glite.lb.client-interface/Makefile b/org.glite.lb.client-interface/Makefile index 39d467d..5a0d350 100644 --- a/org.glite.lb.client-interface/Makefile +++ b/org.glite.lb.client-interface/Makefile @@ -20,7 +20,8 @@ AT3=perl -I${top_srcdir}/project ${top_srcdir}/project/at3 STAGETO=include/${globalprefix}/${lbprefix} STATIC_H=consumer.h context.h dump.h load.h notification.h notifid.h purge.h \ Notification.h CountRef.h Job.h LoggingExceptions.h ServerConnection.h \ - consumer_fake.h producer_fake.h statistics.h + statistics.h +FAKE_H=consumer_fake.h producer_fake.h GEN_H=events.h jobstat.h producer.h Event.h JobStatus.h interface_version.h @@ -39,7 +40,7 @@ check: interface_version.h: ${top_srcdir}/project/version.properties echo "#define GLITE_LB_CLIENT_INTERFACE \"${version}\"" >$@ stage: generate - $(MAKE) install PREFIX=${top_srcdir}/${stagedir} + $(MAKE) install PREFIX=${top_srcdir}/${stagedir} DOSTAGE=yes dist: distsrc distbin @@ -58,12 +59,17 @@ doc: generate doxygen C.dox doxygen CPP.dox -install: +install: generate doc -mkdir -p ${PREFIX}/${STAGETO} -mkdir -p ${PREFIX}/share/doc/${package}-${version} install -m 644 ${GEN_H} ${PREFIX}/${STAGETO} install -m 644 ${top_srcdir}/LICENSE ${PREFIX}/share/doc/${package}-${version} cd ${top_srcdir}/interface && install -m 644 ${STATIC_H} ${PREFIX}/${STAGETO} + cd ${top_srcdir}/doc && cp -r C CPP ${PREFIX}/share/doc/${package}-${version} + if [ x${DOSTAGE} = xyes ]; then \ + cd ${top_srcdir}/interface && install -m 644 ${FAKE_H} ${PREFIX}/${STAGETO} ; \ + fi + clean: rm -f *.h diff --git a/org.glite.lb.client-interface/build.xml b/org.glite.lb.client-interface/build.xml index f0f6a1a..22ebc3a 100755 --- a/org.glite.lb.client-interface/build.xml +++ b/org.glite.lb.client-interface/build.xml @@ -20,6 +20,9 @@ Revision history: $Log$ + Revision 1.6 2004/10/18 19:16:09 zsalvet + RPM descriptions + Revision 1.5 2004/08/05 15:22:34 dimeglio Changed default target from compile to dist @@ -90,6 +93,7 @@ Load version file ========================================= --> + + + + + + @@ -95,6 +85,7 @@ Load version file ========================================= --> + + + + +LB web service interface currently reflects the functionality of legacy +LB query API. + + + + + Flags determining which fields of job status should be retrieved. + Include also long job descriptions (JDL). + Return list of subjobs of a DAG. + Return state of the subjobs, i.e. apply other flags recursively + + + + Classification of job states. +@@@{ + for my $stat ($status->getTypesOrdered) { + my $u = uc $stat; + my $c = getTypeComment $status $stat; + gen qq{ +! $c +}; + } +@@@} + + +@@@{ + for my $n ($status->getAllFieldsOrdered) { + my $f = selectField $status $n; + if ($f->{codes}) { + my $n = getName $f; + $n = $1.ucfirst $2 while $n =~ /([[:alpha:]]*)_([[:alpha:]]*)/; + gen qq{ +! +! Auxiliary type; values of the jobStatus.$n field. +}; + for (@{$f->{codes}}) { + my $uc = uc $_->{name}; + gen qq{ +! $_->{comment} +}; + } + gen qq{ +! +}; + } + } +@@@} + + + + + Status of a job, possibly including subjobs. + Status name. +@@@{ + for my $n (getAllFieldsOrdered $status) { + selectField $status $n; + my $f = getField $status; + my $name = getName $f; + $name = $1.ucfirst $2 while $name =~ /([[:alpha:]]*)_([[:alpha:]]*)/; + my $type = $f->{type}; + my $list = 'no'; + + if ($main::baseTypes{$type}) { + $type = eval $main::types{wsdl}->{$main::baseTypes{$type}}; + $list = 'yes' + } + elsif ($f->{codes}) { + $type = $name; + } + else { + $type = getType $f; + } + + my $comment = getComment $f; +# XXX: currently nothing is "optional" as we don't know from status.T + gen qq{ +! $comment +}; + } +@@@} + + + + Value of a single user tag. + Tag name + Tag value + + + + UNIX time representation. + Seconds since Jan 1 1970 + Microseconds + + + + + Generic SOAP fault, used to deliver any LB errors. + May be returned by any of the operations. + Source component (module) of the error. + Numeric error code. + Error text corresponding to the code. + Additional description of the error (e.g. filename) + Reason of the error, coming from lower levels. + + + + + + + An element of outer list of query conditions in job queries. + It expresses possibly several conditions (records) on a single job attribute. + These conditions are logically OR-ed. + The job attribute to which the query conditions apply. + Name of the queried user tag if attr is USERTAG. + Name of the job state to which "attr = TIME" condition refers. + The conditions. + + + + Specification of a job attribute in query. + A concrete JobId + Owner of the job (X509 certificate subject). + Status of the job (see statName type). + Where the job is currently handled (hostname). + Where the job is or was scheduled to be executed. + How the job terminated (see doneCode type) + Value of particular user tag. The tag name has to be specified in queryConditions.tagName. + When the job entered a particular state. The state has to be specified in queryCondition.statName. + The job was resubmitted. + JobId of the job parend (DAG). + UNIX exit code of the job. + + + + A single query condition. + Relational operator of the condition. + Value to compare the attribute with. + Another value to compare the attribute with (op = WITHIN only). + + + + Relational operator of query conditions. + Attribute is equal to the specified value + Attribute is less than the specified value or equal + Attribute is greater than the specified value or equal + Attribute is withing a range (queryRecord.value2 must be specified) + Attribute is not equal to the specified value. + + + + A value to compare an attribute with in queries. + Exactly one of the elements must be specified. + Integer. + String. + Timestamp. + + + + + + + + Query state of a single job. + Id of the queried job. + Which data fields to retrieve. + Current state of the job. + Any error. + + + + Retrieve a list of jobs, including their states, based on + query conditions. + The conditions take the form of a list of lists. + Elements of the inner lists refer to a single job attribute, the conditions are or-ed. + Elements of the outer list may refer to different job attributes, they are and-ed. + + The query conditions. + Which data fields to retrieve. + JobId's of jobs matching the query. + States of jobs matching the query. + Any error. + + + + Return version of the service. + Returned version. + Any error. + + + + Simplified query, return all jobs of the authenticated user. + JobId's of jobs matching the query. + States of jobs matching the query. + Any error. + + + diff --git a/org.glite.lb.ws-interface/src/puke-ug.xsl b/org.glite.lb.ws-interface/src/puke-ug.xsl new file mode 100644 index 0000000..2536d40 --- /dev/null +++ b/org.glite.lb.ws-interface/src/puke-ug.xsl @@ -0,0 +1,139 @@ + + + + + + + + + + + <xsl:value-of select="@name"/> + + Operations + + + + + + + Types + + + + + + + + + + + + + + + + + + xsd: + + + + + + + + + + + + + <xsl:value-of select="@name"/> + + + Inputs: + + + + + + + N/A + + + + Outputs: + + + + + + + + + + + + <xsl:value-of select="@name"/> + + + + Structure (sequence complex type in WSDL) + Fields: ( type name description ) + + + Enumeration (restriction of xsd:string in WSDL), + exactly one of the values must be specified. + + Values: + + + Flags (sequence of restricted xsd:string in WSDL), + any number of values can be specified together. + + Values: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + (optional) + (multiple occurence) + + + + + + + + + + + + diff --git a/org.glite.lb/build.xml b/org.glite.lb/build.xml index 2ded065..3647e56 100755 --- a/org.glite.lb/build.xml +++ b/org.glite.lb/build.xml @@ -20,6 +20,9 @@ Revision history: $Log$ + Revision 1.28 2004/11/29 15:16:26 zsalvet + Add ws-interface to checkout/build machinery. + Revision 1.27 2004/11/29 13:55:02 akrenek added dependence on ws-interface @@ -152,6 +155,7 @@ Load version file ========================================= --> + + + @@ -80,6 +83,8 @@ Load version file ========================================= --> + + >Create HEADER ?? @@ -79,6 +80,7 @@ void Exception::log(const std::string& logfile) pthread_mutex_unlock( &METHOD_MUTEX); // UNLOCK } }; + string Exception::printStackTrace(){ string stack = "" ; for (unsigned int i = 0 ; i < stack_strings.size() ; i++ ){ @@ -86,25 +88,27 @@ string Exception::printStackTrace(){ } return stack +dbgMessage(); }; + vector Exception::getStackTrace(){ // make a copy of the stack vector stack = stack_strings ; - stack.push_back(dbgMessage() ) ; + stack.push_back(dbgMessage()) ; return stack; }; string Exception::dbgMessage(){ string result ; //Adding exception Name - if ( exception_name!="") - result = exception_name ; + result = exception_name; + //Adding error msg - if (error_message!="") - result +=": " + string(what()); - if (result != "") - result+="\n"; + if (error_message!="") result +=": " + string(what()); + + if (result != "") result+="\n"; + //Adding Source result +="\tat " + method_name +"[" +source_file; + //Adding line number if (line!=0){ char buffer [1024] ; diff --git a/org.glite.wms-utils.jobid/build.xml b/org.glite.wms-utils.jobid/build.xml index 220b2a6..009513f 100755 --- a/org.glite.wms-utils.jobid/build.xml +++ b/org.glite.wms-utils.jobid/build.xml @@ -21,6 +21,9 @@ Revision history: $Log$ + Revision 1.4 2004/07/21 17:53:36 eronchie + Moved out org.glite.wms.jobid from org.glite.wms and put in org.glite.wms-utils + --> @@ -80,6 +83,8 @@ Load version file ========================================= --> + + - - - @@ -154,7 +163,7 @@ - + @@ -209,7 +218,45 @@ Private targets =============================================== --> - + + + + + + + + + New tag is ${cvs.label} + + + + + + + + + + + + + + + + + + New tag is ${cvs.label} + + + + + + + + + diff --git a/org.gridsite.core/interface/gridsite.h b/org.gridsite.core/interface/gridsite.h index febda2c..c2d7729 100644 --- a/org.gridsite.core/interface/gridsite.h +++ b/org.gridsite.core/interface/gridsite.h @@ -252,6 +252,8 @@ char *GRSTx509FindProxyFileName(void); int GRSTx509MakeProxyCert(char **, FILE *, char *, char *, char *, int); char *GRSTx509CachedProxyKeyFind(char *, char *, char *); int GRSTx509MakeProxyRequest(char **, char *, char *, char *); +int GRSTx509StringToChain(STACK_OF(X509) **, char *); +char *GRSTx509MakeProxyFileName(char *, STACK_OF(X509) *); int GRSTx509CacheProxy(char *, char *, char *, char *); #define GRST_HEADFILE "gridsitehead.txt" diff --git a/org.gridsite.core/project/build.number b/org.gridsite.core/project/build.number new file mode 100644 index 0000000..91d607e --- /dev/null +++ b/org.gridsite.core/project/build.number @@ -0,0 +1,2 @@ +#Thu Feb 17 03:27:29 CET 2005 +module.build=135 diff --git a/org.gridsite.core/project/configure.properties.xml b/org.gridsite.core/project/configure.properties.xml index 6ee8706..0d134dc 100644 --- a/org.gridsite.core/project/configure.properties.xml +++ b/org.gridsite.core/project/configure.properties.xml @@ -4,6 +4,6 @@ + value="prefix=${stage.abs.dir} GSOAPDIR=${with.gsoap.prefix} OPENSSL_GLOBUS_FLAGS=-I${with.globus.prefix}/include/gcc32 OPENSSL_GLOBUS_LIBS=-L${with.globus.prefix}/lib/ FLAVOR_GLOBUS_EXT=_gcc32" /> diff --git a/org.gridsite.core/project/version.properties b/org.gridsite.core/project/version.properties index 271daff..ac05103 100644 --- a/org.gridsite.core/project/version.properties +++ b/org.gridsite.core/project/version.properties @@ -1,4 +1,4 @@ -#Fri Dec 10 12:31:28 CET 2004 -module.version=1.1.3 -module.build=71 -module.age=2 +#Thu Jan 13 03:09:57 CET 2005 +module.version=1.1.5 +module.build=134 +module.age=1 diff --git a/org.gridsite.core/src/Makefile b/org.gridsite.core/src/Makefile index bd66586..680a1f3 100644 --- a/org.gridsite.core/src/Makefile +++ b/org.gridsite.core/src/Makefile @@ -1,6 +1,6 @@ # # Andrew McNab and Shiv Kaushal, University of Manchester. -# Copyright (c) 2002-4. All rights reserved. +# Copyright (c) 2002-5. All rights reserved. # # Redistribution and use in source and binary forms, with or # without modification, are permitted provided that the following @@ -48,17 +48,8 @@ ifndef MYCFLAGS export MYCFLAGS=-I. -I../interface -I/usr/include/httpd -I/usr/include/apr-0 -I/opt/glite/include endif -ifndef OPENSSL_FLAGS -export OPENSSL_FLAGS=-I/usr/include/openssl -endif - ifndef MYLDFLAGS export MYLDFLAGS=-L. -# export MYLDFLAGS=-L. -L/opt/glite/lib -lvomsc -endif - -ifndef OPENSSL_LIBS -export OPENSSL_LIBS=-L/usr/lib/openssl endif # @@ -69,6 +60,10 @@ build: libgridsite.so.$(VERSION) libgridsite.a htcp mod_gridsite.so \ urlencode findproxyfile real-gridsite-admin.cgi \ # gridsite-delegation.cgi # htproxyput +build: libgridsite_globus.so.$(VERSION) libgridsite_globus.a + +# First, normal versions using system OpenSSL rather than Globus OpenSSL + libgridsite.so.$(VERSION): grst_x509.o grst_gacl.o grst_http.o gcc -shared -Wl,-soname,libgridsite.so.$(MINOR_VERSION) \ -o libgridsite.so.$(PATCH_VERSION) grst_x509.o grst_gacl.o grst_http.o @@ -77,21 +72,60 @@ libgridsite.a: grst_x509.o grst_gacl.o grst_http.o ar src libgridsite.a grst_x509.o grst_gacl.o grst_http.o grst_x509.o: grst_x509.c ../interface/gridsite.h - gcc $(MYCFLAGS) $(OPENSSL_FLAGS) \ + gcc $(MYCFLAGS) $(OPENSSL_GLOBUS_FLAGS) \ -I/usr/kerberos/include -c grst_x509.c grst_gacl.o: grst_gacl.c ../interface/gridsite.h - gcc $(MYCFLAGS) $(OPENSSL_FLAGS) \ + gcc $(MYCFLAGS) $(OPENSSL_GLOBUS_FLAGS) \ -I/usr/kerberos/include `xml2-config --cflags` -c grst_gacl.c grst_http.o: grst_http.c ../interface/gridsite.h - gcc $(MYCFLAGS) $(OPENSSL_FLAGS) \ + gcc $(MYCFLAGS) $(OPENSSL_GLOBUS_FLAGS) \ -I/usr/kerberos/include -c grst_http.c +# Then build versions using Globus OpenSSL if configured + +ifdef OPENSSL_GLOBUS_LIBS + +libgridsite_globus.so.$(VERSION): \ + grst_x509_globus.o grst_gacl_globus.o grst_http_globus.o + gcc -shared -Wl,-soname,libgridsite_globus.so.$(MINOR_VERSION) \ + -o libgridsite_globus.so.$(PATCH_VERSION) \ + grst_x509_globus.o grst_gacl_globus.o grst_http_globus.o + +libgridsite_globus.a: grst_x509_globus.o grst_gacl_globus.o grst_http_globus.o + ar src libgridsite_globus.a \ + grst_x509_globus.o grst_gacl_globus.o grst_http_globus.o + +grst_x509_globus.o: grst_x509.c ../interface/gridsite.h + gcc $(MYCFLAGS) $(OPENSSL_GLOBUS_FLAGS) \ + -I/usr/kerberos/include -c grst_x509.c \ + -o grst_x509_globus.o + +grst_gacl_globus.o: grst_gacl.c ../interface/gridsite.h + gcc $(MYCFLAGS) $(OPENSSL_GLOBUS_FLAGS) \ + -I/usr/kerberos/include `xml2-config --cflags` -c grst_gacl.c \ + -o grst_gacl_globus.o + +grst_http_globus.o: grst_http.c ../interface/gridsite.h + gcc $(MYCFLAGS) $(OPENSSL_GLOBUS_FLAGS) \ + -I/usr/kerberos/include -c grst_http.c \ + -o grst_http_globus.o + +else + +libgridsite_globus.so.$(VERSION): libgridsite.so.$(VERSION) + cp -f libgridsite.so.$(VERSION) libgridsite_globus.so.$(VERSION) + +libgridsite_globus.a: libgridsite.a + cp -f libgridsite.a libgridsite_globus.a + +endif + urlencode: urlencode.c libgridsite.a gcc -DVERSION=\"$(PATCH_VERSION)\" $(MYCFLAGS) \ -o urlencode urlencode.c -L. \ - $(OPENSSL_FLAGS) -I/usr/kerberos/include -lgridsite + $(OPENSSL_GLOBUS_FLAGS) -I/usr/kerberos/include -lgridsite htcp: htcp.c gcc -DVERSION=\"$(PATCH_VERSION)\" -I. -o htcp htcp.c \ @@ -99,7 +133,7 @@ htcp: htcp.c mod_gridsite.so: mod_gridsite.c mod_ssl-private.h libgridsite.a gcc $(MYCFLAGS) -shared -Wl,-soname=gridsite_module \ - $(OPENSSL_FLAGS) -I/usr/kerberos/include \ + $(OPENSSL_GLOBUS_FLAGS) -I/usr/kerberos/include \ -I/usr/include/libxml2 \ -DVERSION=\"$(VERSION)\" -o mod_gridsite.so \ mod_gridsite.c $(MYLDFLAGS) -lxml2 -lm -lz -lgridsite @@ -110,22 +144,22 @@ real-gridsite-admin.cgi: grst_admin_main.c grst_admin_gacl.c \ grst_admin_main.c \ grst_admin_gacl.c \ grst_admin_file.c \ - $(OPENSSL_FLAGS) -I/usr/kerberos/include \ - -DVERSION=\"$(VERSION)\" $(OPENSSL_LIBS) -lgridsite -lssl -lcrypto -lxml2 -lz -lm + $(OPENSSL_GLOBUS_FLAGS) -I/usr/kerberos/include \ + -DVERSION=\"$(VERSION)\" $(OPENSSL_GLOBUS_LIBS) -lgridsite -lssl$(FLAVOR_GLOBUS_EXT) -lcrypto$(FLAVOR_GLOBUS_EXT) -lxml2 -lz -lm findproxyfile: findproxyfile.c libgridsite.a gcc -DVERSION=\"$(PATCH_VERSION)\" $(MYCFLAGS) $(MYLDFLAGS) \ -o findproxyfile findproxyfile.c -L. \ - $(OPENSSL_FLAGS) -I/usr/kerberos/include -lgridsite \ - $(OPENSSL_LIBS) -lssl -lcrypto -lxml2 -lz -lm + $(OPENSSL_GLOBUS_FLAGS) -I/usr/kerberos/include -lgridsite \ + $(OPENSSL_GLOBUS_LIBS) -lssl$(FLAVOR_GLOBUS_EXT) -lcrypto$(FLAVOR_GLOBUS_EXT) -lxml2 -lz -lm apidoc: doxygen Doxyfile gaclexample: gaclexample.c libgridsite.a gcc -o gaclexample gaclexample.c -I. -L. \ - $(OPENSSL_FLAGS) -I/usr/kerberos/include -lgridsite \ - -lssl -lcrypto -lxml2 -lz -lm + $(OPENSSL_GLOBUS_FLAGS) -I/usr/kerberos/include -lgridsite \ + -lssl$(FLAVOR_GLOBUS_EXT) -lcrypto$(FLAVOR_GLOBUS_EXT) -lxml2 -lz -lm # # Delegation machinery, including SOAP delegation portType. To build this @@ -149,30 +183,30 @@ gridsite-delegation.cgi: grst-delegation.c delegation.h delegation.wsdl \ soapC.c soapServer.c gcc $(MYCFLAGS) $(MYLDFLAGS) -o gridsite-delegation.cgi \ grst-delegation.c \ - $(OPENSSL_FLAGS) -I/usr/kerberos/include -I$(GSOAPDIR)/include \ + $(OPENSSL_GLOBUS_FLAGS) -I/usr/kerberos/include -I$(GSOAPDIR)/include \ -DVERSION=\"$(VERSION)\" -L$(GSOAPDIR)/lib \ soapC.c soapServer.c -lgsoap \ - -lgridsite -lcurl -lz -lssl -lcrypto -lxml2 -lm + -lgridsite -lcurl -lz -lssl$(FLAVOR_GLOBUS_EXT) -lcrypto$(FLAVOR_GLOBUS_EXT) -lxml2 -lm htproxyput: htproxyput.c delegation.h delegation.wsdl \ soapC.c soapServer.c gcc $(MYCFLAGS) $(MYLDFLAGS) -o htproxyput \ htproxyput.c \ - $(OPENSSL_FLAGS) -I/usr/kerberos/include \ + $(OPENSSL_GLOBUS_FLAGS) -I/usr/kerberos/include \ -g -DVERSION=\"$(VERSION)\" \ -I$(GSOAPDIR)/include -DWITH_OPENSSL -L$(GSOAPDIR)/lib \ soapC.c soapClient.c -lgsoap \ - -lgridsite -lcurl -lz -lssl -lcrypto -lxml2 -lm + -lgridsite -lcurl -lz -lssl$(FLAVOR_GLOBUS_EXT) -lcrypto$(FLAVOR_GLOBUS_EXT) -lxml2 -lm proxyput-example: proxyput-example.c delegation.h delegation.wsdl \ soapC.c soapServer.c libstdsoap2.a gcc $(MYCFLAGS) $(MYLDFLAGS) -o proxyput-example \ proxyput-example.c \ - $(OPENSSL_FLAGS) -I/usr/kerberos/include \ + $(OPENSSL_GLOBUS_FLAGS) -I/usr/kerberos/include \ -g -DVERSION=\"$(VERSION)\" \ -I$(GSOAPDIR) -DWITH_OPENSSL \ soapC.c soapClient.c libstdsoap2.a \ - -lgridsite -lcurl -lz -lssl -lcrypto -lxml2 -lm + -lgridsite -lcurl -lz -lssl$(FLAVOR_GLOBUS_EXT) -lcrypto$(FLAVOR_GLOBUS_EXT) -lxml2 -lm clean: @@ -192,8 +226,8 @@ install: apidoc cp -f ../interface/gridsite-gacl.h $(prefix)/include cp -f urlencode $(prefix)/bin cp -f findproxyfile $(prefix)/bin - cp -f libgridsite.a $(prefix)/lib cp -f real-gridsite-admin.cgi $(prefix)/sbin + cp -f libgridsite.a $(prefix)/lib cp -f libgridsite.so.$(PATCH_VERSION) $(prefix)/lib ln -sf libgridsite.so.$(PATCH_VERSION) \ $(prefix)/lib/libgridsite.so @@ -201,6 +235,14 @@ install: apidoc $(prefix)/lib/libgridsite.so.$(MAJOR_VERSION) ln -sf libgridsite.so.$(PATCH_VERSION) \ $(prefix)/lib/libgridsite.so.$(MINOR_VERSION) + cp -f libgridsite_globus.a $(prefix)/lib + cp -f libgridsite_globus.so.$(PATCH_VERSION) $(prefix)/lib + ln -sf libgridsite_globus.so.$(PATCH_VERSION) \ + $(prefix)/lib/libgridsite_globus.so + ln -sf libgridsite_globus.so.$(PATCH_VERSION) \ + $(prefix)/lib/libgridsite_globus.so.$(MAJOR_VERSION) + ln -sf libgridsite_globus.so.$(PATCH_VERSION) \ + $(prefix)/lib/libgridsite_globus.so.$(MINOR_VERSION) cp -f doxygen/index.html \ $(prefix)/share/doc/gridsite-$(PATCH_VERSION)/doxygen-index.html cp -f doxygen/* $(prefix)/share/doc/gridsite-$(PATCH_VERSION) @@ -267,6 +309,8 @@ rpm: dist gridsite.spec $(MYRPMDIR)/SRPMS $(MYRPMDIR)/RPMS/i386 $(MYRPMDIR)/BUILDROOT cp -f ../gridsite-$(PATCH_VERSION).src.tar.gz $(MYRPMDIR)/SOURCES cp -f gridsite.spec $(MYRPMDIR)/SPECS + export OPENSSL_GLOBUS_FLAGS=$(OPENSSL_GLOBUS_FLAGS) ; export OPENSSL_GLOBUS_LIBS=$(OPENSSL_GLOBUS_LIBS) ; export FLAVOR_GLOBUS_EXT=$(FLAVOR_GLOBUS_EXT) ; \ + export GSOAPDIR=$(GSOAPDIR) ; \ export MYPREFIX=/usr ; export MYVERSION=$(PATCH_VERSION) ; \ $(RPMCMD) --define "_topdir $(MYRPMDIR)" \ -ba --buildroot $(MYRPMDIR)/BUILDROOT gridsite.spec diff --git a/org.gridsite.core/src/gridsite.spec b/org.gridsite.core/src/gridsite.spec index 877f25d..5bf3b16 100644 --- a/org.gridsite.core/src/gridsite.spec +++ b/org.gridsite.core/src/gridsite.spec @@ -1,6 +1,6 @@ Name: gridsite Version: %(echo ${MYVERSION:-1.1.x}) -Release: 2 +Release: 1 Summary: GridSite Copyright: Modified BSD Group: System Environment/Daemons @@ -37,11 +37,15 @@ HTTP/HTTPS rather than ssh as its transfer protocol. %build cd src -make prefix=$RPM_BUILD_ROOT/%(echo ${MYPREFIX:-/usr}) +make prefix=$RPM_BUILD_ROOT/%(echo ${MYPREFIX:-/usr}) \ +GSOAPDIR=$GSOAPDIR OPENSSL_FLAGS=$OPENSSL_FLAGS \ +OPENSSL_LIBS=$OPENSSL_LIBS FLAVOR_EXT=$FLAVOR_EXT %install cd src -make install prefix=$RPM_BUILD_ROOT/%(echo ${MYPREFIX:-/usr}) +make install prefix=$RPM_BUILD_ROOT/%(echo ${MYPREFIX:-/usr}) \ +GSOAPDIR=$GSOAPDIR OPENSSL_FLAGS=$OPENSSL_FLAGS \ +OPENSSL_LIBS=$OPENSSL_LIBS FLAVOR_EXT=$FLAVOR_EXT %post /sbin/ldconfig @@ -54,6 +58,8 @@ rm -f %(echo ${MYPREFIX:-/usr})/share/doc/gridsite %files %attr(-, root, root) %(echo ${MYPREFIX:-/usr})/lib/libgridsite.so.%{version} %attr(-, root, root) %(echo ${MYPREFIX:-/usr})/lib/libgridsite.so +%attr(-, root, root) %(echo ${MYPREFIX:-/usr})/lib/libgridsite_globus.so.%{version} +%attr(-, root, root) %(echo ${MYPREFIX:-/usr})/lib/libgridsite_globus.so %attr(-, root, root) %(echo ${MYPREFIX:-/usr})/bin/urlencode %attr(-, root, root) %(echo ${MYPREFIX:-/usr})/bin/findproxyfile %attr(-, root, root) %(echo ${MYPREFIX:-/usr})/share/doc/gridsite-%{version} @@ -62,6 +68,7 @@ rm -f %(echo ${MYPREFIX:-/usr})/share/doc/gridsite %attr(-, root, root) %(echo ${MYPREFIX:-/usr})/include/gridsite.h %attr(-, root, root) %(echo ${MYPREFIX:-/usr})/include/gridsite-gacl.h %attr(-, root, root) %(echo ${MYPREFIX:-/usr})/lib/libgridsite.a +%attr(-, root, root) %(echo ${MYPREFIX:-/usr})/lib/libgridsite_globus.a %attr(-, root, root) %(echo ${MYPREFIX:-/usr})/lib/httpd/modules/mod_gridsite.so %attr(-, root, root) %(echo ${MYPREFIX:-/usr})/sbin/real-gridsite-admin.cgi diff --git a/org.gridsite.core/src/grst-delegation.c b/org.gridsite.core/src/grst-delegation.c index 2a8a9b2..c8f8185 100644 --- a/org.gridsite.core/src/grst-delegation.c +++ b/org.gridsite.core/src/grst-delegation.c @@ -141,6 +141,8 @@ int main(int argn, char *argv[]) char *docroot, *method, *request, *p, *client_dn, *user_dn, *delegation_id, *reqtxt, *proxydir; struct soap soap; + +chdir("/var/tmp"); method = getenv("REQUEST_METHOD"); if (strcmp(method, "POST") == 0) diff --git a/org.gridsite.core/src/grst_x509.c b/org.gridsite.core/src/grst_x509.c index 37b60e6..75376dc 100644 --- a/org.gridsite.core/src/grst_x509.c +++ b/org.gridsite.core/src/grst_x509.c @@ -875,7 +875,7 @@ int GRSTx509MakeProxyCert(char **proxychain, FILE *debugfp, { char *ptr, *certchain; int i, subjAltName_pos, ncerts; - long serial = 1, ptrlen; + long serial = 2796, ptrlen; EVP_PKEY *pkey, *CApkey; const EVP_MD *digest; X509 *certs[GRST_MAX_CHAIN_LEN]; @@ -1278,7 +1278,7 @@ int GRSTx509MakeProxyRequest(char **reqtxt, char *proxydir, const EVP_MD *digest; struct stat statbuf; - if ((keypair = RSA_generate_key(GRST_KEYSIZE, 3, NULL, NULL)) == NULL) + if ((keypair = RSA_generate_key(GRST_KEYSIZE, 65537, NULL, NULL)) == NULL) return 1; asprintf(&prvkeyfile, "%s/.XXXXXX", proxydir); @@ -1329,6 +1329,143 @@ int GRSTx509MakeProxyRequest(char **reqtxt, char *proxydir, return 0; } +/// Create a stack of X509 certificate from a PEM-encoded string +/** + * Creates a dynamically allocated stack of X509 certificate objects + * by walking through the PEM-encoded X509 certificates. + * + * Returns GRST_RET_OK on success, non-zero otherwise. + * + */ + +int GRSTx509StringToChain(STACK_OF(X509) **certstack, char *certstring) +{ + STACK_OF(X509_INFO) *sk=NULL; + BIO *certbio; + X509_INFO *xi; + + *certstack = sk_X509_new_null(); + if (*certstack == NULL) return GRST_RET_FAILED; + + certbio = BIO_new_mem_buf(certstring, -1); + + if (!(sk=PEM_X509_INFO_read_bio(certbio, NULL, NULL, NULL))) + { + BIO_free(certbio); + sk_X509_INFO_free(sk); + sk_X509_free(*certstack); + return GRST_RET_FAILED; + } + + while (sk_X509_INFO_num(sk)) + { + xi=sk_X509_INFO_shift(sk); + if (xi->x509 != NULL) + { + sk_X509_push(*certstack, xi->x509); + xi->x509=NULL; + } + X509_INFO_free(xi); + } + + if (!sk_X509_num(*certstack)) + { + BIO_free(certbio); + sk_X509_INFO_free(sk); + sk_X509_free(*certstack); + return GRST_RET_FAILED; + } + + BIO_free(certbio); + sk_X509_INFO_free(sk); + + return GRST_RET_OK; +} + +/// Return the short file name for the given delegation_id and user_dn +/** + * Returns a malloc'd string with the short file name (no paths) that + * derived from the hashed delegation_id and user_dn + * + * File name is SHA1_HASH(DelegationID)+"-"+SHA1_HASH(DN) where DN + * is DER encoded version of user_dn with any trailing CN=proxy removed + * Hashes are the most significant 8 bytes, in lowercase hexadecimal. + */ + +char *GRSTx509MakeProxyFileName(char *delegation_id, + STACK_OF(X509) *certstack) +{ + int i, depth, prevIsCA = 1, IsCA, hash_name_len, delegation_id_len, + der_name_len; + unsigned char *der_name, hash_name[EVP_MAX_MD_SIZE], + hash_delegation_id[EVP_MAX_MD_SIZE], + filename[34]; + X509_NAME *subject_name; + X509 *cert; + const EVP_MD *m; + EVP_MD_CTX ctx; + + depth = sk_X509_num(certstack); + + for (i=depth-1; i >= 0; --i) + /* loop through the proxy chain starting at CA end */ + { + if (cert = sk_X509_value(certstack, i)) + { + IsCA = (GRSTx509IsCA(cert) == GRST_RET_OK); + + if (prevIsCA && !IsCA) /* the full certificate of the user */ + { + break; + } + } + } + + if (i < 0) return NULL; /* not found: something wrong with the chain */ + + if ((subject_name = X509_get_subject_name(cert)) == NULL) return NULL; + + der_name_len = i2d_X509_NAME(X509_get_subject_name(cert), NULL); + if (der_name_len == 0) return NULL; + + der_name = malloc(der_name_len); + if (!i2d_X509_NAME(X509_get_subject_name(cert), &der_name)) + { + free(der_name); + return NULL; + } + + OpenSSL_add_all_digests(); + + m = EVP_sha1(); + if (m == NULL) + { + free(der_name); + return NULL; + } + + EVP_DigestInit(&ctx, m); + EVP_DigestUpdate(&ctx, delegation_id, strlen(delegation_id)); + EVP_DigestFinal(&ctx, hash_delegation_id, &delegation_id_len); + + /* lots of nasty hard coded numbers: + "8bytes/16chars delegation ID" + "-" + "8bytes/16chars DN" */ + + for (i=0; i <=7; ++i) + sprintf(&filename[i*2], "%02x", hash_delegation_id[i]); + + filename[16] = '-'; + + EVP_DigestInit(&ctx, m); + EVP_DigestUpdate(&ctx, der_name, der_name_len); + EVP_DigestFinal(&ctx, hash_name, &hash_name_len); + + for (i=0; i <=7; ++i) + sprintf(&filename[17 + i*2], "%02x", hash_name[i]); + + return strdup(filename); +} + /// Store a GSI proxy chain in the proxy cache, along with the private key /** * Returns GRST_RET_OK on success, non-zero otherwise. The existing @@ -1339,39 +1476,46 @@ int GRSTx509MakeProxyRequest(char **reqtxt, char *proxydir, int GRSTx509CacheProxy(char *proxydir, char *delegation_id, char *user_dn, char *proxychain) { - int fd, c, len = 0, i; - char *cert, *upcertfile, *prvkeyfile, *p; + int c, len = 0, i; + char *upcertfile, *upcertpath, *prvkeyfile, *p, *ptr; FILE *ifp, *ofp; + STACK_OF(X509) *certstack; + BIO *certmem; + X509 *cert; + long ptrlen; prvkeyfile = GRSTx509CachedProxyKeyFind(proxydir, delegation_id, user_dn); if (prvkeyfile == NULL) { - free(proxydir); return GRST_RET_FAILED; } if ((ifp = fopen(prvkeyfile, "r")) == NULL) { free(prvkeyfile); - free(proxydir); return GRST_RET_FAILED; } - if (asprintf(&upcertfile, "%s/XXXXXX", proxydir) == -1) + if (GRSTx509StringToChain(&certstack, proxychain) != GRST_RET_OK) return GRST_RET_FAILED; - if ((fd = mkstemp(upcertfile)) == -1) + upcertfile = GRSTx509MakeProxyFileName(delegation_id, certstack); + + if (upcertfile == NULL) { - fclose(ifp); free(prvkeyfile); - free(upcertfile); + sk_X509_free(certstack); return GRST_RET_FAILED; } - if ((ofp = fdopen(fd, "w")) == NULL) + asprintf(&upcertpath, "%s/%s", proxydir, upcertfile); + ofp = fopen(upcertpath, "w"); + chmod(upcertpath, S_IRUSR | S_IWUSR); + free(upcertpath); + + if (ofp == NULL) { - close(fd); fclose(ifp); free(prvkeyfile); free(upcertfile); @@ -1380,18 +1524,51 @@ int GRSTx509CacheProxy(char *proxydir, char *delegation_id, fprintf(ofp, "%s\n%s\n", delegation_id, user_dn); - fputs(proxychain, ofp); /* write out certificates */ + /* write out the most recent proxy by itself */ + + if (cert = sk_X509_value(certstack, 0)) + { + certmem = BIO_new(BIO_s_mem()); + if (PEM_write_bio_X509(certmem, cert) == 1) + { + ptrlen = BIO_get_mem_data(certmem, &ptr); + fwrite(ptr, 1, ptrlen, ofp); + } + + BIO_free(certmem); + } - while ((c = fgetc(ifp)) != EOF) fputc(c, ofp); /* append proxy private key */ - - if (fclose(ifp) != 0) return GRST_RET_FAILED; - if (fclose(ofp) != 0) return GRST_RET_FAILED; + /* insert proxy private key */ + while ((c = fgetc(ifp)) != EOF) fputc(c, ofp); unlink(prvkeyfile); - free(prvkeyfile); + + for (i=1; i <= sk_X509_num(certstack) - 1; ++i) + /* loop through the proxy chain starting at 2nd most recent proxy */ + { + if (cert = sk_X509_value(certstack, i)) + { + certmem = BIO_new(BIO_s_mem()); + if (PEM_write_bio_X509(certmem, cert) == 1) + { + ptrlen = BIO_get_mem_data(certmem, &ptr); + fwrite(ptr, 1, ptrlen, ofp); + } + + BIO_free(certmem); + } + } + + fputs(proxychain, ofp); /* write out certificates */ + + + sk_X509_free(certstack); free(upcertfile); + if (fclose(ifp) != 0) return GRST_RET_FAILED; + if (fclose(ofp) != 0) return GRST_RET_FAILED; + /* should also check validity of proxy cert to avoid suprises? */ return GRST_RET_OK; diff --git a/org.gridsite.core/src/htcp b/org.gridsite.core/src/htcp index ac0153b23a52348015c9bedbcc3153157cb93075..5140cf5a575d8eace96923231cda4d2091671e0b 100644 GIT binary patch delta 20 ccmdn|f^qW;#tm$CjHZ(pT1jqJuoE@|09rE#L;wH) delta 20 ccmdn|f^qW;#tm$CjK-4}T1jqJuoE@|09qdhLI3~& diff --git a/org.gridsite.core/src/real-gridsite-admin.cgi b/org.gridsite.core/src/real-gridsite-admin.cgi index 74a00102428cd5c64342d721f34b0f96e422672f..aa3f9e19ca75480470c47b1a945eab94fd9fdf39 100644 GIT binary patch delta 40063 zcma%k3tW^%_y4mC=%TBlBBCO$cvn=!Yif#@RW#J~nkfn@>Y}KqP^RLdNQsD{W1*&r zW~Jt>i)m)Bcq=U`GAb)7D(ig+dZV(kqWFK$nHgB?eSe=nAIEvVXU?2CbLPyMdFFX` zH@(vDz05kf!S%wQ@wN3a3}fT?ZDDhV6!)?il>9(30t~}~jAeF78LV7fJuk)fdRqkwzg6K_dIc zAW8mJi| zzjnCljjN^|#^Gu_(nzG1NZx-D0Mn2L5NGQkRn!W(3&|JhE=B7~9AgrJIw}ffQ;-6Y zIwMU-(tr2p3*^JSu7hzs0m(tq67R-Unkr3Fd3}}ZtS2t)8X)h3)E6lmX(Li5QV7ym zqz91bZ=TGI_Q=DL9!G1J z4mAOP1#nYX!b27A0ig@4hE(fPx2oCjsdP#mhOj7XtsF%KroTtFHLjJiZ__ zHiC@((5M6qi94 z0Q{5cz(=6(0dA+tPl5j^u%0Dv0iOfjt;#8&c?v<8p$JbyUD}|m_G>q5a2&l`D3tXIPeCAN7Tjq9}I#v*1I|$mOhW^Oz}kxsq6a0wZ!7+VD6asXr|>G^DquaNJ0Z{hl&@`pDmS4} z2(X^Ee|kU&2jP}#&=+_x@E}#85_t^pNQHle0K2Q%0IWE<%h9gkF z1pF^6{`bMZ(aUF^LwNI-UX|s`f1OXs(pqdXHg7TMD55Gh~ zIIv!P9H0*d)@K=n8pbp7YRMPKkAC4O9!1uN0eIp9@<(Z1o2F)RdOq+)1CP6nK)@P0H< z0j$ToAIhtMr>gQ6Xuyt}vK|V@{!M{@gFgi2dX^YTiE~%3OzN?6S&u$qPs2v_S1yiQ zI{$&VrKw3t;z+|@0l>+rE8T{3nk#OldrmL$al_7aKwPk5{`N-wx+g{^#7*xTaaY{< zVdI?4G%|7F{FNzFlN08o%s1i|BrZ)fz`oL*xFAIgYP6v*36eZxmL{ec!^ceE2A9lV z5;r$>f#GtFlLE(#A2lIv#r!!5adQ)wiF1u6Hma>TDskzYBw-J@+I&Lt{H2p8$HdJ^ zNQj%0loXf1t*?CHy#SZRpG82?`7g9?Qs3$~&%I<>!V8@OpR=@}jUHA}{?k`h12Iti zyV)Sxd8iT#XoMt1UojFxgIb7bK@Qwd$Wp38vZTcougD2%Yca&Jpb4H&VR{PJ^w%^o z5kBc>e2n2D+RB!R{&Y8SQ{l#3?qgIc9KhIW{0>ZiDVPLx_R87k7bPc!-)1;JW?x+> z5J5Rq=tDWWHQZ(f~Tr`8GL- z%NEL88b&VV*zfP49Jen!DTl51P>%b~e9GGx#zD#*hH;4UwwPU%hvA%o@^%P{l($Ey z_s~TLOgG9q8b$%-oebkL<(&=VD&+_qg_L(Sj3UYr7>X&!&g=%|-7y;}$Mh3OgR<V2PjAUh@jjFAE0~`R@VV^F&aKVc{F^0 z@-grM%E!V7D8C0jKsoM!T$GQ44^TcHK0rBkFtL=o-~*ITgbz?Y2|hsiWcUE(Q{V%X zBQT{|l&8Q4C{KkCP<}srfbs|61IRsf5#(<1|Oh&9ejXtST2zAboc<}>)`{GZ-5U_o(UhI{9*V2<(uFGlxM*Q zD9?ruT%q~D1%ZGFIq(6>x55V~e*`{2`8N0f<=f!{lneL(1Gi z0Oh;j1C;NE4^aL%e1P&j@Bzx7z;RTT=j)6Ln>oiHRys%jJ$}V7u3a*!`?kk?sP51i z|HB?eb%$_VVT=r;th5?`9U=%*Sy>U|K7_+=WSpX9fhyZso$_&PC!m9{Z{slsZB*N*0OBp8<-bA>FaSGvF!Uc?15#CAoB;&P& z^9koOPABX+M1))>Y$U=-!s(1R5k5mWnei6F1%%@n=Muh3*u{7U;UdCOjCT^gK{$f( z9>S%B9gOpVJ#Lc-0ZceZ43&fp#)k;sCS3U^S>PyPT1m@F8J{F>!-axPaC_cV{BxGT|~YL=aAAe3kG3!pV#a2}co*XIw;>c5`Je#>IqP zgrgYWAUvIL1mhCI@q`_WOKJUcyNM9Mgqy^WOxR#-5?)2PvWhHFK{%aoDdS4Qn+O*% zzC}2fZ~^1ngm)4?$+(JeKH+@Eh6f?XeTWFTOz8{spAlNs9y7Z8qT96Ww60>-Nd?<9PZ@mj+9g!6w#`_&!NiExMrxy-PU@JYhy zj5iTJLpYi77QzLD;~D1?zDn4|cn9Gk!cmNO623t=g7F^0rGy>7qy6d*`9v^@5Woxv z30D#}7#|{hn{efC#DA19_TaDpOiQR|&fq)7HdYL^z5uZBg7e z2uCoct%|$U2kUQ{g9)@}aht>tz?k+f?n=T2W7@;GZxgQkl`KGe88Z}5sYcCKl-bAm$H6=H0nvoRR|+J4U+jG z#ts@~7Nmxg;a(uxr5YOPC=FJs>W|a)ZSFP;q#gs0izXf2mKkDA$FK%nK!hOb?5NY? zNXI_bfYYM1gKy>ZYdR{!P&FQigFy}Z;m-)p}X&N;6FbfW3a;mbJ;%YA8 zwM#tuP|xmWVfF76w&SQc(rIMtonC^z(~8UH9yu=RckVy*FljRD7TX}pSxWK>h%{D{ zOd@?mr2d*zL8M9|wHNC~XeFIT6YGjBbq#twvY?jMLdin)DV=C-HA zvaT&W_1qvf*CI+X(n^e!$s{|73evXTp>B!0C8(s}4Ox(pc2257wCT8$gUiB7QfB6wSpbx7gfm$nZES?=8JF%Xyo0pGPEzCRGy2O{4~zR7CZcfmEG(+Z-g;hC4*p z@Bsh&6~#)FmhG_Z%DC((`wb^y#Gj^0uYE7l!h8BZtYEJAA-tWqf$BMmG6j_0{*NjY z%;m1`0TKC%Qt}_}4CeMKlKT{si_BBfRS_%Ue>V3EZjswP&i|~cG)^SBv zat{d`mL$II*S1YOc(?=oWQ?Jrd`%16E4ub?H`2S?TV;&Z-HwnjdsdZN#5$wIeVZCi z%hv{SnNz zRE;tZWP2_Ll*2P@?spXb`hW1hr})njKiInwdx>J7RKsp9Z$c(8mcj&EzLoQ2tr@-% zZ>BjB)?u!S>eNcJ(FT^nhN(2a2oI=*!RC!EgfLfD;;2*23#wUJoqEgsbEB9&&^ed~ ztfGt?U@5`o99^wyv#Q4HNDoq_hxRbL%d8_lAK15k6v#Qw8!of^F41OCx;1^N*gxpu zrtCiN;lvZ|Laxhv_A_#yyScp~rgwWUa5GSIJgm)XmQvTby>u@L(?1hi2M@CrEEVq# z?$*Irrkvi1V^`G5c9vwrHaA{((%A_Q^YCS&?cHtb$7{~&$Hch1zmzJ(f8(vf`Dq}#E!$aI9bwM-l%-(->kC45lr76y!v0a| z-o9-6&=%Hz?-Z?u#w}p0tl!CPu)zC1;fh&K%mdZsxn9Ksb#ZC7Ga#dsHpM)x*otr6 z^zOoN)*M~($5=1M$f&;zMsM6tQ)1M$R2o+Mw4JQ(r_Tf^qUn#;?6h`SUOuw0tYZWa5TVXfrK z6iAd7a{XrI+MDNc#b?e|)7jS_`^?+d>$A2{`)L_Ovz&6l=T(E1Tp;<&-cWwSJ$ki9 zyvuyFSWFznO70ldIV^s;3MQF&2E>ldvHdwsUYa958+D}FWnj55E~Wb^3K(PF6MIL8 zwW*0Q8#s7klH!iJruG)`+33NtBdI0c9r<>h5|f#x?Em+UI3<7CR2=@nE;1_askvox znJL%Bis)gTxYs2zT$IuKo5ajR)7y)=zW6wLI7QIVG4tw2tx%mV*ete;N$c{Y#sg&B zr#>78P4@UBwhVgwVv&d(8`iI;$KT1Q&Ec-pU7&@0pvhi_xR?b)v=N8Lrh7_pj$)+x zl~u48`DQzBRrkpxqWcGyaMfj+A1YJX+`nsDzFwO?DdIu|#Fo%gRVrwV&SfW$ROT!#1 zF>~e?*E)pFjFIaP8xsc!V4x0-tf9KInG`_OH?u_OxR#!L#Z-@(99$KXOi^z=#I|5+ zu-lO$1%4)}YQJZrk&ahImvjZ2`-&o+{3my*Dth#xZc09mo>Hao4R^3(5bScvacmY} zj%z=MceK0Sre4FFzV!+`Hh07ONko;|l8dq2$s0miwutPb$*FZ;chc)%2JiFvrm?lE z`uSU8;rP&cy2|Od#3SQd+i8=CB^1ls*0;o&@ohZa!ETOT#L8!3ZN(u^FOc}Z>eK); zUlySbujYYdq9|^nv)P{)GM?jciqyWAl&(mPYf1Tv^cS{o6kXCPJw}Q=RZ}Hjs}i*0 zcz``-wwWLx-I$BH8#uJ5lYH$;dRZ`xDTF!B+@YIdkSSD%Z)0BVAQoQ#n z-ZY1i62|v9IOjwBj;c-_iT~Z{imxa0kE~WlB+LVxJ5=< z1)mk+u1xWq)!TNP`%Oi9Mv}bG5qYELl(R|Q>`1q+Fju~zY$+$m2P~w*jMd~+@#Dm1 z4ml?(%)Xi|xuv62n4zN6q|kaA{d!GInAC38O%@ew7RiZOMvuX$dp|1r8A;Db!&z<^ zyA76Z?C&C~Q~Th5w_`O8W3ZXad~gi}21QC+FW#Bd&hwOlE-C4CXBEcF$aYp`4CWPp zmW6kSG8Lm&mF=5JalPGeUzjqH=6gy00W%q8dnMdAX^JF=5d6ODw{>nbX=U=(zw-V^{uTNeR z<V#7`-|*w>ou;>ElJ%LgDz@Vs4g2Z!&jW;kKB66Z7k_k&l#kW8CvC z#e@wj4%I^3`K0ExYfR-Modz`zCKg%EUSh|+Jw27&W4r0Wt5sN!%J3o+&A;>kL+Iee z=Kfig$I0^Y2e`1KEc{&+4p)UUxUiEfG}e(V?Pdp6csCb@$-=s-usyw|OB*ytw)1xO z)T+%*Hqio%6KQut#q!M>v0!?egrVGHwr+?SDS@_bJ82%;`;$enK;1Ii$T&}ZkXFBC z#>z>}JXpbQnfGV{g4QjwI7yUEpV=Uty#*)um1gP%G4Z}Jmeu0%`<7WYi~2LV)^$KD z^XvsNc*d;eZRz?KXMX{|s zzZLM1V#6Cs-8)K#Iu(dk%%SI1Nu$g^&^9SmKuSFakh39kyJaSG>smQC@?^x$!w=r4)O%)1Fa^btTnW-nPcE!1AA0v>{tEOU>C6CO|lzF=@-& z-S=#OksMMYoqORyntVt%iwf$BC*p&~21p;pILm{867y~CwaiO9h9G?pTvU!HzqUm^ ziTG=crhFcX$?#Wv3(qkg5{?T+X1)YEE^O19(CIKnpN>LuO$tt?x_U30rH zoXuXwx|Ny}CD6JJmqyKU;&@T&W|~7TXs=YdndTbpao{PX6YoV{1e5f7@QiqCZu36u zv@>O4*+)G>)A+3$rK5+lJiCUywH}~PEXWM8qx)} z6g%g2^gMk=X|2~CRwY?7m;Fc0pLFtoSEMpLlc$qm&0%tR<)9tnE&x+brYz|zOYR6l zvg8cjD@F`bb%q-mwUsP2l~C%A@+$fFGF6F}Mj3ykxVM%GPeP}5H4{lvBV{9As=m8i zTuTV`aMVAfJ;d&IY(&Qnol!QB5Ab`*#-KZ?F&Z5FWTbNqxhAgC1C!&tzme-+usdCI z|Gv~);{rwYm|sb{5^iKF;e~gQqcr){9prpXenOM6JZjqJT3X|Wl+^nrP3%FstJFYsoT&wb04fzi1 z#oXaR`I>vDHLaF+cS|sIf^&{whf%E^OagJ0lr#y!IMt$jYVS$ih}0UiA?bA9zvCZ}~WYz4HYb z_u#uSBEKMc=+Oe+#PEv9yYDDSnZPmQrun2E4;7+snscOoV{O0zH1rPknCbux&snma zH_`|6NF74$ar=E_`(Cko#VMs_ii+KsGYu72oor_?q*SNkA1%;iiAtC0Ijfz*JrmY3 z?~!KUO`dOc{Zt%PVRqdzZ@(nocDD+W^U|ZDf&(AQ#J%AzDkKG_63=^Z_^aIdz!#uvnK6B+eu@ z>RU6mkWk|wQmdDe*z?QYK+vpCEnZ|%eSG7Ts7ef860gSvBT#8R|GY8~mWE1N8ro`C zkT(T96yvltXwb}Mau_mh*S&w397i)&l6;)O8Kxig#D6m_V^^LN>lZckH~`FNU*d+! z<@;J3KRLt;Nmu6-1OBl$u$dQhyvIldy5~R`5A8tdO>*a2Gv*a8vu#Zn1;6>mEYWmv zFaKmzqk$eE#w~6!yx+ZSBAfus<{sQMtF&*W#_&>FLB=_KLOEP&f3{(*)_cXF#oavV z)Um?nw2S39ui~+`n?)Cjr?+m0M&(K~59|5dN6i*}#s+s@uYC4JqM9sf_+E3KZ>GPAy7+#LC zM)SZi0?obbOS}odd5r{m6R=*^)(@Mpi>fr!JaX*GVdVCp(meZuvL;3gv#QcOTtmp= z%@Vdzm1dG$S22F9uiqAoL!}mGcQ+**BYVv6yy=~4sk!>N?gj2lqh%wd=6p@{ihuiS zHEn@to!n`#Ufym$s|MX`c>C0Z za*AmWNe=nk9Is)RPLZA*bZ-x7L?7qP=-0?NJQZ%5{k0{%rowyLPkAc*%;r;5!IVI| z%ST7Wcgd~QXjhs|#**Ce6gf95Z#g*mKEt8GKHj}N0o=j z$$oXN_b3=!Il#3@iW55yaL6);9Bdy4Lv(cuu0IqrpEt+<*Yek5s zk)9Q5yHRAmrAG<3qP1b|G|xQj`>|^(bYIXaM`)vC_^z54wE;;O2IZ=mu7x$)c(=YU zx@zv0e9;*d-D^1S)tsrFdE#9)Qzci<^lByqn+amh%BG%DQoft)5Bu(!Dw+Y$#Vc>- zZNDRzCWkC}s-~o71yLoP=cyq>r-I$_UUio1I(S&%MV=9lZ*}6^AFp{PTZxLt;01Xk z_>0YQ$7-UL(e8i%A$dniO4&^xD1*W2z774$lbU5Y`DNP_oHgNn;9D+tZxrGb)civY z+ii;;rG8ZHme`-t%3>3*rnGn5142&bfIrDNqrJkCq*&$&OKQK-E~<4|YLJ!L2h7UW zPsk-xztk6K&SQ)7)GRiqNua0ZXt6Few6BcAC1$z|3OqB5De^AU1fJs-SvRAgfy?~) z8S!pvYyT_dQR*@=?*vkDbex%-htiZBqnjE=+kS9>R~ssJS5(_KiJbek%t?RoHoLw*{4sj2v8zeT`U1N%mD{A@$XS1 zRC--m6Y0us-rOcWt<5p}}rIho
  • whI!ssV?(7>?B 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 -- 1.8.2.3
  • This release fixes the -following bugs and issues. Since there are no previous public releases, this -list refers to the previous development release. Bug numbers refer to the gLite -Bug Tracking system database hosted on the CERN Savannah system at https://savannah.cern.ch/bugs/?group=jra1mdw