Sprout from master 2004-12-10 13:01:20 UTC Aleš Křenek <ljocha@ics.muni.cz> 'imported statistics counting'
Cherrypick from master 2005-02-17 02:27:34 UTC Master Builder <glbuilder@cern.ch> '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 <alberto.di.meglio@cern.ch> '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 <alberto.di.meglio@cern.ch> '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 <nykolas@ics.muni.cz> '- 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 <glbuilder@cern.ch> '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 <glbuilder@cern.ch> '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 <glbuilder@cern.ch> '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 <glbuilder@cern.ch> '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 <glbuilder@cern.ch> '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 <alberto.di.meglio@cern.ch> '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 <elisabetta.ronchieri@cnaf.infn.it> '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 <alberto.di.meglio@cern.ch> '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 <alberto.di.meglio@cern.ch> '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 <glbuilder@cern.ch> '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 <glbuilder@cern.ch> '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 <glbuilder@cern.ch> '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
--- /dev/null
+DATE: 21-03-2005 17:21\r
+[dimeglio] Implemented status method\r
+\r
+DATE: 21-03-2005 00:32\r
+[dimeglio] Added PERL5LIB env var\r
+\r
+DATE: 17-03-2005 17:33\r
+[gdiez] Stopping and starting the database before the index creation (just after the database is created and the user granted)\r
+\r
+DATE: 09-03-2005 23:05\r
+[dimeglio] Moved creation of indices inside database creation (if database\r
+ exists indices are not recreated)\r
+\r
+DATE: 02-03-2005 11:05\r
+[dimeglio] Started CHANGELOG\r
+[dimeglio] Fixed formatting, improved display of message using glib.printXxxMessage functions\r
+[dimeglio] Fixed some problems when starting/stopping services\r
+[dimeglio] GLITE_USER parameter not exposed anymore in config file, use same user parameters\r
+ as WMS to allow installation on same node\r
+[dimeglio] Increased module version number to 1.2.0
\ No newline at end of file
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
Load version file
========================================= -->
<property file="${module.version.file}"/>
+ <property file="${module.build.file}"/>
<!-- ==============================================
Local private targets
# For license conditions see the license file or http://eu-egee.org/license.html
#
################################################################################
-# glite-lb-config v. 0.2.0
+# glite-lb-config v. 1.2.3
#
# Post-installation script for configuring the gLite Logging and Bookkeping Server
# Robert Harakaly < robert.harakaly@cern.ch >
#
################################################################################
-import os,string
+import os,string,pwd
import sys, posix, getopt,time
sys.path.append(".")
from gLiteInstallerLib import gLib
+from gliteRgmaServicetool import gliteRgmaServicetool
import mysql as MySQL
# Set global variables here
global params # all config values from the XML file
+global rgmaServicetool
class glite_lb:
def __init__(self):
self.mysql = MySQL.Mysql()
self.verbose = 0
- self.version = "0.2.0"
+ self.version = "1.2.3"
self.name = "glite-lb"
self.friendly_name = "gLite Logging and Bookkeeping"
+ params['module.version'] = self.version
#-------------------------------------------------------------------------------
# Banner
print ' -c, --checkconf print the service configuration'
print ' -v, --version print the version of the configuration script'
print ' -h, --help print this usage information'
+ print ' --start start the service'
+ print ' --stop stop the service'
+ print ' --status check service status'
print '\n'
#-------------------------------------------------------------------------------
#-------------------------------------------------------------------------------
def start(self):
+
self.mysql.start()
+ time.sleep(5)
+
+ if not os.path.exists('/tmp/mysql.sock'):
+ os.symlink('/var/lib/mysql/mysql.sock', '/tmp/mysql.sock')
+
+ pid = glib.getPID('bkserverd')
+ if pid != 0:
+ print 'The gLite LB Server service is already running. Restarting...'
+ os.system('%s/etc/init.d/glite-lb-bkserverd stop' % os.environ['GLITE_LOCATION'])
+ else:
+ print 'Starting the gLite LB Server service...'
+
os.system('%s/etc/init.d/glite-lb-bkserverd start' % os.environ['GLITE_LOCATION'])
+
+ pid = glib.getPID('bkserverd')
+
+ if (pid != 0):
+ print "The gLite LB Server service has been started ",
+ glib.printOkMessage()
+ else:
+ glib.printErrorMessage("Could not start the gLite LB Server service")
+ glib.printErrorMessage("Please verify and re-run the script "),
+ glib.printFailedMessage()
+ return 1
+
+ #-------------------------------------------------------------------
+ # Start Servicetool
+ #-------------------------------------------------------------------
+
+ pid = glib.getPID('rgma-servicetool')
+ if (pid != 0):
+ print 'The gLite R-GMA Servicetool service is already running. Restarting...'
+ rgmaServicetool.stop()
+ else:
+ print "Starting the gLite R-GMA Servicetool service"
+
+ rgmaServicetool.start()
+
+
+ # Check that the daemon is running
+
+ pid = glib.getPID('rgma-servicetool')
+
+ if (pid != 0):
+ print "The gLite R-GMA Servicetool service has been started ",
+ glib.printOkMessage()
+ else:
+ glib.printErrorMessage("Could not start the gLite R-GMA Servicetool service")
+ glib.printErrorMessage("Please verify and re-run the script "),
+ glib.printFailedMessage()
+ return 1
return 0
def stop(self):
- os.system('%s/etc/init.d/glite-lb-bkserverd stop' % os.environ['GLITE_LOCATION'])
+
+ pid = glib.getPID('bkserverd')
+ if (pid != 0):
+ os.system('%s/etc/init.d/glite-lb-bkserverd stop' % os.environ['GLITE_LOCATION'])
+
+ pid = glib.getPID('bkserverd')
+ if (pid != 0):
+ print 'Could not stop the LB Server service ',
+ glib.printFailedMessage()
+ else:
+ print 'The LB Server service has been stopped ',
+ glib.printOkMessage()
+
self.mysql.stop()
+
+ #-------------------------------------------------------------------
+ # Stop the servicetool
+ #-------------------------------------------------------------------
+
+ pid = glib.getPID('rgma-servicetool')
+ if (pid != 0):
+ rgmaServicetool.stop()
+
+ pid = glib.getPID('rgma-servicetool')
+ if (pid != 0):
+ print 'Could not stop the R-GMA Servicetool service ',
+ glib.printFailedMessage()
+ else:
+ print 'The R-GMA Servicetool service has been stopped ',
+ glib.printOkMessage()
return 0
+ def status(self):
+
+ error_level = 0
+
+ retval = os.system('%s/etc/init.d/glite-lb-bkserverd status' % os.environ['GLITE_LOCATION'])
+ if retval != 0:
+ error_level = 1
+
+ return error_level
+
def configure(self):
- # Create all directories needed
- if params.has_key('dirlist'):
- dirlist = string.split(params['dirlist'],',')
- for d in dirlist:
- glib.check_dir(d,0777)
- glib.check_dir(params['GLITE_CERT_DIR'])
-
+
+ #--------------------------------------------------------
+ # Installs the Security Utilities
+ #--------------------------------------------------------
+
+ if os.system("python %s/glite-security-utils-config.py --subservice" % glib.getScriptPath()):
+ print "\nInstalling gLite Security Utilities ",
+ glib.printFailedMessage()
+ return 1
+
+ print "\nInstalling gLite Security Utilities ",
+ glib.printOkMessage()
+
# Create the GLITE_USER if it doesn't exists
- print "Creating/Verifying the GLITE_USER account %s" % params['GLITE_USER']
- glib.add_user(params['GLITE_USER'],params['GLITE_USER'])
- (uid,gid) = glib.get_user_info(params['GLITE_USER'])
+ print "\nCreating/Verifying the GLITE_USER account %s" % os.environ['GLITE_USER']
+ (uid,gid) = glib.get_user_info(os.environ['GLITE_USER'])
glib.check_dir(os.environ['GLITE_LOCATION_VAR'],0755, uid, gid)
- glib.check_dir("/home/%s/.certs" % params['GLITE_USER'],0755, uid, gid)
- lb_cert_path = pwd.getpwnam(params['GLITE_USER'])[5] + "/" + params['user.certificate.path']
+ lb_cert_path = pwd.getpwnam(os.environ['GLITE_USER'])[5] + "/" + params['user.certificate.path']
+ glib.check_dir(lb_cert_path ,0755, uid, gid)
+ glib.printOkMessage()
+ # Create all directories needed
+ print "\nVerify CA certificates directory ",
+ glib.check_dir(os.environ['GLITE_CERT_DIR'])
+ glib.printOkMessage()
+
# Copy certificates
- glib.check_dir( lb_cert_path, 0755, uid, gid)
+ print "\nCopy host certificates to GLITE_USER home directory as service certificates",
os.system("cp %s %s %s/" % (params['host.certificate.file'], params['host.key.file'], lb_cert_path))
os.chown("%s/hostcert.pem" % lb_cert_path, uid,gid)
+ os.chmod("%s/hostcert.pem" % lb_cert_path, 0644)
os.chown("%s/hostkey.pem" % lb_cert_path, uid,gid)
- glib.export('GLITE_HOST_CERT',"%s/hostcert.pem" % lb_cert_path)
- glib.export('GLITE_HOST_KEY',"%s/hostkey.pem" % lb_cert_path)
-
+ os.chmod("%s/hostkey.pem" % lb_cert_path, 0400)
+ glib.printOkMessage()
+
# Create the MySQL database
+ print "\nCreate/Verify the %s database" % params['lb.database.name']
self.mysql.stop()
time.sleep(5)
self.mysql.start()
- print '#-------------------------------------------------------------------'
- print ('Creating MySQL %s database.' % params['lb.database.name'])
- print '#-------------------------------------------------------------------'
-
- os.system('/usr/bin/mysqlaccess %s %s' % (params['lb.database.username'], params['lb.database.name']))
- file = open('/tmp/mysql_ct', 'w')
- text = ['CREATE DATABASE %s;\n' % params['lb.database.name'],
- 'GRANT ALL PRIVILEGES ON %s.* TO %s@localhost IDENTIFIED BY "";\n' % (params['lb.database.name'],params['lb.database.username']),
- 'USE %s;\n' % params['lb.database.name'],
- '\. %s/etc/glite-lb-dbsetup.sql\n' % os.environ['GLITE_LOCATION']]
-
- file.writelines(text)
- file.close()
- os.system('/usr/bin/mysql < /tmp/mysql_ct')
- os.system('/bin/rm /tmp/mysql_ct')
if not os.path.exists('/tmp/mysql.sock'):
os.symlink('/var/lib/mysql/mysql.sock', '/tmp/mysql.sock')
+
+ # Check if database exists
+ if self.mysql.existsDB(params['lb.database.name']) != 0:
+ # Create database
+ print ('\n==> Creating MySQL %s database\n' % params['lb.database.name'])
+
+ if os.path.exists('/bin/rm /tmp/mysql_ct'):
+ os.remove('/tmp/mysql_ct')
+
+ file = open('/tmp/mysql_ct', 'w')
+ text = ['CREATE DATABASE %s;\n' % params['lb.database.name'],
+ 'GRANT ALL PRIVILEGES ON %s.* TO %s@localhost IDENTIFIED BY "";\n' \
+ % (params['lb.database.name'],params['lb.database.username']),
+ 'USE %s;\n' % params['lb.database.name'],
+ '\. %s/etc/glite-lb-dbsetup.sql\n' % os.environ['GLITE_LOCATION']]
+
+ file.writelines(text)
+ file.close()
+ os.system('/usr/bin/mysql < /tmp/mysql_ct')
+ os.system('/bin/rm /tmp/mysql_ct')
+
+ #Starting and stopping the database before the index creation
+ self.mysql.stop()
+ time.sleep(5)
+ self.mysql.start()
+
+ #Creating the indexes
+ print 'Creating the index configuration file %s/etc/glite-lb-index.conf ' % os.environ['GLITE_LOCATION'],
+ path = "%s/etc/glite-lb-index.conf" % os.environ['GLITE_LOCATION']
+ pathBak = "%s/etc/glite-lb-index.conf.bak" % os.environ['GLITE_LOCATION']
+
+ if os.path.exists(pathBak):
+ os.remove(pathBak)
+ if os.path.exists(path):
+ os.rename(path,pathBak)
+ file = open(path, 'w')
+ file.write("[\n")
+ file.write(" JobIndices = {\n")
+ for index in params['lb.index.list']:
+ file.write(" [ type = \"system\"; name = \"%s\" ],\n" % index)
+ file.write(" }\n")
+ file.write("]\n")
+ file.close()
+ glib.printOkMessage()
+
+ print "Running glite-lb-bkindex ",
+ if os.system('%s/bin/glite-lb-bkindex -r %s/etc/glite-lb-index.conf' % (os.environ['GLITE_LOCATION'],os.environ['GLITE_LOCATION'])):
+ glib.printFailedMessage()
+ return 1
+ else:
+ glib.printOkMessage()
+
+ else:
+ print "\n==> MySQL database %s already exist\n" % params['lb.database.name']
+
self.mysql.stop()
-
+
+ #-------------------------------------------------------------------
+ # RGMA servicetool: configure servicetool
+ #-------------------------------------------------------------------
+
+ print "Configuring the R-GMA Servicetool..."
+
+ if rgmaServicetool.configure(glib):
+ # error in configuring services
+ print "Configuring the R-GMA Servicetool... ",
+ glib.printFailedMessage()
+ return 1
+
+ print "Configuring the R-GMA Servicetool... ",
+ glib.printOkMessage()
+
return 0
#-------------------------------------------------------------------------------
if not os.path.exists(os.environ['GLITE_LOCATION_TMP']):
os.mkdir(os.environ['GLITE_LOCATION_TMP'],0755)
- (uid,gid) = glib.add_user(params['GLITE_USER'])
- lb_cert_path = pwd.getpwnam(params['GLITE_USER'])[5] + "/" + params['user.certificate.path']
+ if not params.has_key('glite.user.group'):
+ params['glite.user.group'] = ''
+ (uid,gid) = glib.add_user(params['glite.user.name'],params['glite.user.group'])
+ glib.export('GLITE_USER',params['glite.user.name'])
+ lb_cert_path = pwd.getpwnam(os.environ['GLITE_USER'])[5] + "/" + params['user.certificate.path']
glib.export('GLITE_HOST_CERT',"%s/hostcert.pem" % lb_cert_path)
glib.export('GLITE_HOST_KEY',"%s/hostkey.pem" % lb_cert_path)
- glib.export('GLOBUS_LOCATION',params['GLOBUS_LOCATION'])
glib.export('GLITE_CERT_DIR',params['ca.certificates.dir'])
+ glib.export('GLOBUS_LOCATION',params['GLOBUS_LOCATION'])
+ glib.export('GPT_LOCATION',params['GPT_LOCATION'])
+
+ glib.export('JAVA_HOME')
+
# bin and lib paths
- glib.addEnvPath("PATH","/usr/bin/:%s/bin:%s/externals/bin:%s/bin" % (os.environ['GLOBUS_LOCATION'],os.environ['GLITE_LOCATION'],os.environ['GLITE_LOCATION']))
+ glib.addEnvPath("PATH","/usr/bin/:%s/bin:%s/bin:%s/externals/bin:%s/bin" \
+ % (os.environ['JAVA_HOME'],os.environ['GLOBUS_LOCATION'],os.environ['GLITE_LOCATION'],os.environ['GLITE_LOCATION']))
glib.addEnvPath("LD_LIBRARY_PATH","/usr/lib:%s/lib:%s/externals/lib:%s/lib" % (os.environ['GLOBUS_LOCATION'], os.environ['GLITE_LOCATION'],os.environ['GLITE_LOCATION']))
+ # Perl
+ glib.addEnvPath("PERL5LIB", "%s/lib/perl:%s/lib/perl5" % (os.environ['GPT_LOCATION'],os.environ['GLITE_LOCATION']))
+
# Set environment
glib.setUserEnv()
if __name__ == '__main__':
- # Command line opts if any
- try:
- opts, args = getopt.getopt(sys.argv[1:], 'chv', ['checkconf', 'help', 'version','stop','start'])
- except getopt.GetoptError:
- usage(msg = "Unknown options(s)")
- sys.exit(1)
-
# The script must be run as root
if not os.geteuid()==0:
print '"\nThis script must be run as root\n'
# Load parameters
params = {}
+ try:
+ opts, args = getopt.getopt(sys.argv[1:], '', ['siteconfig='])
+ for o, a in opts:
+ if o == "--siteconfig":
+ params['site.config.url'] = a
+ break
+ except getopt.GetoptError:
+ pass
if glib.loadConfiguration("%s/../glite-lb.cfg.xml" % glib.getScriptPath(),params):
- print "Configuration files not found.\nPlease verify if the configuration files are copied from the templates directory\n"
+ print "An error occurred while configuring the service"
sys.exit(1)
verbose = 0
# Instantiate the service classes
service = glite_lb()
service.verbose = verbose
+ # Instantiate the rgma servicetool class
+ rgmaServicetool = gliteRgmaServicetool()
+ rgmaServicetool.verbose = verbose
+ # Command line opts if any
+ try:
+ opts, args = getopt.getopt(sys.argv[1:], 'chv', ['checkconf', 'help', 'version','stop','start','status','siteconfig='])
+ except getopt.GetoptError:
+ service.usage(msg = "Unknown options(s)")
+ sys.exit(1)
+
# Check cli options
for o, a in opts:
if o in ("-h", "--help"):
service.showVersion()
glib.print_params(params)
sys.exit(0)
- if o == "--stop":
+ if o in ("stop", "--stop"):
service.stop()
sys.exit(0)
- if o == "--start":
+ if o in ("start", "--start"):
service.start()
sys.exit(0)
+ if o == "--status":
+ sys.exit(service.status())
+
# Check certificates
if params.has_key('glite.installer.checkcerts'):
if params['glite.installer.checkcerts'] == "true":
if glib.check_certs(params) != 0:
- print "Certificate files are not found\n"
+ print "An error occurred while configuring the %s service" \
+ % service.friendly_name
sys.exit(1)
# Print configuration parameters
# Configure the service
if service.configure() == 0:
- print "%s configuration successfully completed\n" % service.friendly_name
+ print "\n%s configuration successfully completed " % service.friendly_name,
+ glib.printOkMessage()
+ glib.registerService()
else:
- print "An error occurred while configuring the %s" % service.friendly_name
+ print "\nAn error occurred while configuring the %s " % service.friendly_name,
+ glib.printFailedMessage()
sys.exit(1)
# Start the service
- # service.stop()
- if service.start() != 0:
- print "An error occurred while starting the %s" % service.friendly_name
+ if service.start() == 0:
+ print "\nThe %s was successfully started " % service.friendly_name,
+ glib.printOkMessage()
+ else:
+ print "\nAn error occurred while starting the %s " % service.friendly_name,
+ glib.printFailedMessage()
sys.exit(1)
<!-- User-defined parameters - Please change them -->
<!-- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx -->
- <!-- gLite configuration -->
+ <!-- gLite services user accounts -->
+ <glite.user.name
+ description="Name of the user account used to run the gLite services
+ on this LB node"
+ value="changeme"/>
+
+ <glite.user.group
+ description="Group of the user specified in the 'glite.user.name'
+ parameter. Leave it empty of comment it out to use the same as 'glite.user.name'"
+ value="changeme"/>
+
+ <!-- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx -->
+ <!-- Advanced parameters - Change them if you know what you're doing -->
+ <!-- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx -->
+
+ <!-- Installer configuration -->
<glite.installer.verbose
description="Enable verbose output"
value="true"/>
description="Enable check of host certificates"
value="true"/>
- <GLITE_USER
- description="The account used to run the LB daemons"
- value="changeme"/>
-
- <!-- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx -->
- <!-- Optimization parameters - Change them if you know what you're doing -->
- <!-- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx -->
-
<!-- MySQL DB -->
<lb.database.name
description="The mySQL database name to create for storing LB data
- Now it must be set to the default value"
+ In this version it must be set to the given value"
value="lbserver20"/>
+
+ <lb.index.list
+ description="Definitions of indices on all the currently supported indexed system attributes">
+
+ <value>owner</value>
+ <value>location</value>
+ <value>destination</value>
+
+ </lb.index.list>
<lb.database.username
description="The username to be used to access the local mySQL server
- Now it must be set to the default value"
+ In this version it must be set to the given value"
value="lbserver"/>
- <GLOBUS_LOCATION
- description="The location of the Globus Toolkit"
- value="/opt/globus"/>
-
<!-- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx -->
<!-- System parameters - You should leave these alone -->
<!-- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx -->
- <dirlist value='/opt/glite/var'/>
+
</parameters>
-</config>
\ No newline at end of file
+
+ <!--RGMA service publishing: log server -->
+ <instance name="lb.rgma" service="rgma-servicetool">
+ <parameters>
+
+ <rgma.servicetool.enable
+ description="Publish log server via RGMA servicetool. If this variable is set to 'false': the other
+ values of this instance are not taken into account.[Example: 'true'] [Type: 'boolean']"
+
+ value="true"/>
+
+ <rgma.servicetool.name
+ description="Name of the service. This should be globally unique.
+ Example: your.host.name_Logging_Bookkeeping_Server
+ [Type: 'String']"
+ value="${HOSTNAME}_Logging_Bookkeeping_Server"/>
+
+ <rgma.servicetool.url_endpoint
+ description="URL to contact the service at.
+ This should be unique for each service. Use example and adapt host.
+ Example: http://your.host.name/LB/LBServer
+ [Type: 'string']"
+ value="http://${HOSTNAME}/LB/LBServer"/>
+
+ <rgma.servicetool.service_type
+ description="The service type. This should be uniquely defined for
+ each service type. Currently two methods of type naming are recommended:
+ (1) The targetNamespace from the WSDL document,
+ followed by a space and then the service name.
+ (2) A URL owned by the body or individual who defines the service type.
+ Example: Logging and Bookkeeping Server
+ [Type: 'string']"
+ value="Logging and Bookkeeping Server"/>
+
+ <rgma.servicetool.service_version
+ description="Service version in the form 'major.minor.patch'
+ Example: 1.2.3
+ [Type: 'string']"
+ value="${module.version}"/>
+
+ <rgma.servicetool.publish_interval
+ description="How often to check and publish service information.
+ Example: 3600 [Type: 'string'] [Unit: 'seconds']"
+ value="3600"/>
+
+ <rgma.servicetool.status_script
+ description="Script to run when determining the service status.
+ This script should return an exit code of 0 to indicate the service is OK, other values
+ should indicate an error. The first line of the standard output should be a brief message
+ describing the service status (e.g. 'Accepting connections')
+ Example: ${GLITE_LOCATION}/etc/init.d/glite-lb-bkserverd status
+ [Type: 'string']"
+ value="${GLITE_LOCATION}/etc/init.d/glite-lb-bkserverd status"/>
+
+ <rgma.servicetool.status_interval
+ description="How often to check and publish service status.
+ Example: 60 [Type: 'string'] [Unit: 'seconds']"
+ value="60"/>
+
+ <rgma.servicetool.url_wsdl
+ description="URL of a WSDL document for the service (leave blank if the
+ service has no WSDL).
+ Example: http://example.rl.ac.uk/service?WSDL
+ [Type: 'string']"
+ value="n/a"/>
+
+ <rgma.servicetool.url_semantics
+ description="URL of a document containing a detailed description of the service
+ and how it should be used.
+ Example: http://example.rl.ac.uk/service/semantics.html
+ [Type: 'string']"
+ value="n/a"/>
+
+ </parameters>
+ </instance>
+
+</config>
{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;
<h1><span lang=FR>1. </span><span lang=FR>Release Description</span></h1>
<p class=MsoNormal>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. </p>
-<h1>2. Release contents</h1>
+<h1><span lang=FR>2. </span><span lang=FR>Changes in this Release</span></h1>
-<p class=MsoNormal>The gLite Logging & Bookkeeping Server v. 0.2.0 is
+<p class=MsoNormal>This release introduces the following changes:</p>
+
+<p class=MsoNormal> </p>
+
+<ul style='margin-top:0mm' type=disc>
+ <li class=MsoNormal>Implemented status method</li>
+ <li class=MsoNormal>Added definition of PERL5LIB env var</li>
+ <li class=MsoNormal>Stopping and starting the database before the index
+ creation (just after the database is created and the user granted) to fix
+ access denied error</li>
+ <li class=MsoNormal>Moved creation of indices inside database creation (if
+ database exists indices must not be recreated)</li>
+ <li class=MsoNormal>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</li>
+ <li class=MsoNormal>LB admin tools are now installed in sbin, not in bin</li>
+ <li class=MsoNormal>Bug fixes (see below for the complete lists)</li>
+</ul>
+
+<h1>3. Release contents</h1>
+
+<p class=MsoNormal>The gLite Logging & Bookkeeping Server v. 1.2.2 is
composed of the following gLite components:</p>
<p class=MsoNormal> </p>
-<table class=MsoTableGrid border=1 cellspacing=0 cellpadding=0 width=634
- style='width:475.4pt;border-collapse:collapse;border:none'>
+<table class=MsoTableGrid border=1 cellspacing=0 cellpadding=0 width=621
+ style='width:466.1pt;border-collapse:collapse;border:none'>
<tr>
- <td width=177 valign=top style='width:133.0pt;border:solid windowtext 1.0pt;
+ <td width=153 valign=top style='width:115.0pt;border:solid windowtext 1.0pt;
padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span style='font-size:10.0pt'>Component name</span></p>
+ <p class=MsoNormal><span style='font-size:8.0pt'>Component name</span></p>
</td>
- <td width=63 valign=top style='width:47.5pt;border:solid windowtext 1.0pt;
+ <td width=54 valign=top style='width:40.15pt;border:solid windowtext 1.0pt;
border-left:none;padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span style='font-size:10.0pt'>Version</span></p>
+ <p class=MsoNormal><span style='font-size:8.0pt'>Version</span></p>
</td>
- <td width=393 valign=top style='width:294.9pt;border:solid windowtext 1.0pt;
+ <td width=415 valign=top style='width:310.95pt;border:solid windowtext 1.0pt;
border-left:none;padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span style='font-size:10.0pt'>File</span></p>
+ <p class=MsoNormal><span style='font-size:8.0pt'>File</span></p>
</td>
</tr>
<tr>
- <td width=177 valign=top style='width:133.0pt;border:solid windowtext 1.0pt;
+ <td width=153 valign=top style='width:115.0pt;border:solid windowtext 1.0pt;
border-top:none;padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span lang=EN-US style='font-size:10.0pt'>org.glite.deployment.lb</span></p>
+ <p class=MsoNormal><span lang=EN-US style='font-size:8.0pt'>org.glite.deployment.lb</span></p>
</td>
- <td width=63 valign=top style='width:47.5pt;border-top:none;border-left:none;
- border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ <td width=54 valign=top style='width:40.15pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span lang=EN-US style='font-size:10.0pt'>0.2.0</span></p>
+ <p class=MsoNormal><span lang=EN-US style='font-size:8.0pt'>1.2.2</span></p>
</td>
- <td width=393 valign=top style='width:294.9pt;border-top:none;border-left:
+ <td width=415 valign=top style='width:310.95pt;border-top:none;border-left:
none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span lang=EN-US style='font-size:10.0pt'><a
- href="http://glite.web.cern.ch/glite/packages/I20041126/installers/glite-lb_installer.sh">http://glite.web.cern.ch/glite/packages/I20041210/installers/glite-lb_installer.sh</a>
+ <p class=MsoNormal><span lang=EN-US style='font-size:8.0pt'><a
+ href="http://glite.web.cern.ch/glite/packages/R1.0/R20050331/installers/glite-lb_installer.sh">http://glite.web.cern.ch/glite/packages/R1.0/R20050331/installers/glite-lb_installer.sh</a>
</span></p>
<p class=MsoNormal><span class=MsoHyperlink><span lang=EN-US
- style='font-size:10.0pt'><a
- href="http://glite.web.cern.ch/glite/packages/I20041210/bin/rhel30/noarch/RPMS/glite-lb-config-0.2.0-1.noarch.rpm">http://glite.web.cern.ch/glite/packages/I20041210/bin/rhel30/noarch/RPMS/glite-lb-config-0.2.0-1.noarch.rpm</a></span></span></p>
+ style='font-size:8.0pt'><a
+ href="http://glite.web.cern.ch/glite/packages/R1.0/R20050331/bin/rhel30/noarch/RPMS/glite-lb-config-1.2.2-1.noarch.rpm">http://glite.web.cern.ch/glite/packages/R1.0/R20050331/bin/rhel30/noarch/RPMS/glite-lb-config-1.2.2-1.noarch.rpm</a></span></span></p>
</td>
</tr>
<tr>
- <td width=177 valign=top style='width:133.0pt;border:solid windowtext 1.0pt;
+ <td width=153 valign=top style='width:115.0pt;border:solid windowtext 1.0pt;
border-top:none;padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span lang=EN-US style='font-size:10.0pt'>org.glite.deployment.config</span></p>
+ <p class=MsoNormal><span lang=EN-US style='font-size:8.0pt'>org.glite.deployment.config</span></p>
</td>
- <td width=63 valign=top style='width:47.5pt;border-top:none;border-left:none;
- border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ <td width=54 valign=top style='width:40.15pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span lang=EN-US style='font-size:10.0pt'>0.3.0</span></p>
+ <p class=MsoNormal><span lang=EN-US style='font-size:8.0pt'>1.0.0</span></p>
</td>
- <td width=393 valign=top style='width:294.9pt;border-top:none;border-left:
+ <td width=415 valign=top style='width:310.95pt;border-top:none;border-left:
none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
padding:0mm 5.4pt 0mm 5.4pt'>
<p class=MsoNormal><span class=MsoHyperlink><span lang=EN-US
- style='font-size:10.0pt'><a
- href="http://glite.web.cern.ch/glite/packages/I20041210/bin/rhel30/noarch/RPMS/glite-%20config-0.3.0-1.noarch.rpm">http://glite.web.cern.ch/glite/packages/I20041210/bin/rhel30/noarch/RPMS/glite-
- config-0.3.0-1.noarch.rpm</a></span></span></p>
+ style='font-size:8.0pt'><a
+ href="http://glite.web.cern.ch/glite/packages/R1.0/R20050331/bin/rhel30/noarch/RPMS/glite-config-1.0.0-1.noarch.rpm">http://glite.web.cern.ch/glite/packages/R1.0/R20050331/bin/rhel30/noarch/RPMS/glite-config-1.0.0-1.noarch.rpm</a></span></span></p>
</td>
</tr>
<tr>
- <td width=177 valign=top style='width:133.0pt;border:solid windowtext 1.0pt;
+ <td width=153 valign=top style='width:115.0pt;border:solid windowtext 1.0pt;
border-top:none;padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span lang=FR style='font-size:10.0pt'>glite-lb-client-interface</span></p>
+ <p class=MsoNormal><span lang=EN-US style='font-size:8.0pt'>org.glite.lb.client-interface</span></p>
</td>
- <td width=63 valign=top style='width:47.5pt;border-top:none;border-left:none;
- border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ <td width=54 valign=top style='width:40.15pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span lang=FR style='font-size:10.0pt'>0.3.1</span></p>
+ <p class=MsoNormal><span lang=EN-US style='font-size:8.0pt'>1.0.2</span></p>
</td>
- <td width=393 valign=top style='width:294.9pt;border-top:none;border-left:
+ <td width=415 valign=top style='width:310.95pt;border-top:none;border-left:
none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
padding:0mm 5.4pt 0mm 5.4pt'>
<p class=MsoNormal><span class=MsoHyperlink><span lang=EN-US
- style='font-size:10.0pt'><a
- href="http://glite.web.cern.ch/glite/packages/I20041210/bin/rhel30/i386/RPMS/glite-lb-client-interface-0.3.1-2.i386.rpm">http://glite.web.cern.ch/glite/packages/I20041210/bin/rhel30/i386/RPMS/glite-lb-client-interface-0.3.1-2.i386.rpm</a></span></span></p>
+ style='font-size:8.0pt'><a
+ href="http://glite.web.cern.ch/glite/packages/R1.0/R20050331/bin/rhel30/i386/RPMS/glite-lb-client-interface-1.0.2-1.i386.rpm">http://glite.web.cern.ch/glite/packages/R1.0/R20050331/bin/rhel30/i386/RPMS/glite-lb-client-interface-1.0.2-1.i386.rpm</a></span></span></p>
</td>
</tr>
<tr>
- <td width=177 valign=top style='width:133.0pt;border:solid windowtext 1.0pt;
+ <td width=153 valign=top style='width:115.0pt;border:solid windowtext 1.0pt;
border-top:none;padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span lang=FR style='font-size:10.0pt'>glite-lb-common</span></p>
+ <p class=MsoNormal><span lang=FR style='font-size:8.0pt'>org.glite.lb.</span><span
+ lang=EN-US style='font-size:8.0pt'>common</span></p>
</td>
- <td width=63 valign=top style='width:47.5pt;border-top:none;border-left:none;
- border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ <td width=54 valign=top style='width:40.15pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span lang=FR style='font-size:10.0pt'>0.4.1</span></p>
+ <p class=MsoNormal><span lang=EN-US style='font-size:8.0pt'>1.1.4</span></p>
</td>
- <td width=393 valign=top style='width:294.9pt;border-top:none;border-left:
+ <td width=415 valign=top style='width:310.95pt;border-top:none;border-left:
none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span class=MsoHyperlink><span lang=FR style='font-size:
- 10.0pt'><a
- href="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/I20041210/bin/rhel30/i386/RPMS/glite-lb-common-0.4.1-2.i386.rpm</a></span></span></p>
+ <p class=MsoNormal><span class=MsoHyperlink><span lang=EN-US
+ style='font-size:8.0pt'><a
+ href="http://glite.web.cern.ch/glite/packages/R1.0/R20050331/bin/rhel30/i386/RPMS/glite-lb-common-1.1.4-1.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</a></span></span></p>
</td>
</tr>
<tr>
- <td width=177 valign=top style='width:133.0pt;border:solid windowtext 1.0pt;
+ <td width=153 valign=top style='width:115.0pt;border:solid windowtext 1.0pt;
border-top:none;padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span lang=EN-US style='font-size:10.0pt'>glite-lb-logger</span></p>
+ <p class=MsoNormal><span lang=FR style='font-size:8.0pt'>org.glite.lb.</span><span
+ lang=EN-US style='font-size:8.0pt'>logger</span></p>
</td>
- <td width=63 valign=top style='width:47.5pt;border-top:none;border-left:none;
- border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ <td width=54 valign=top style='width:40.15pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span lang=EN-US style='font-size:10.0pt'>0.4.1</span></p>
+ <p class=MsoNormal><span lang=EN-US style='font-size:8.0pt'>1.0.1</span></p>
</td>
- <td width=393 valign=top style='width:294.9pt;border-top:none;border-left:
+ <td width=415 valign=top style='width:310.95pt;border-top:none;border-left:
none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span class=MsoHyperlink><span lang=FR style='font-size:
- 10.0pt'><a
- href="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/I20041210/bin/rhel30/i386/RPMS/glite-lb-logger-0.4.1-3.i386.rpm</a></span></span></p>
+ <p class=MsoNormal><span class=MsoHyperlink><span lang=IT style='font-size:
+ 8.0pt'><a
+ href="http://glite.web.cern.ch/glite/packages/R1.0/R20050331/bin/rhel30/i386/RPMS/glite-lb-logger-1.0.1-1.i386.rpm"><span
+ lang=FR>http://glite.web.cern.ch/glite/packages/R1.0/R20050331/bin/rhel30/i386/RPMS/glite-lb-logger-1.0.1-1.i386.rpm</span></a></span></span></p>
</td>
</tr>
<tr>
- <td width=177 valign=top style='width:133.0pt;border:solid windowtext 1.0pt;
+ <td width=153 valign=top style='width:115.0pt;border:solid windowtext 1.0pt;
border-top:none;padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span lang=FR style='font-size:10.0pt'>glite-lb-server</span></p>
+ <p class=MsoNormal><span lang=FR style='font-size:8.0pt'>org.glite.lb.server</span></p>
</td>
- <td width=63 valign=top style='width:47.5pt;border-top:none;border-left:none;
- border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ <td width=54 valign=top style='width:40.15pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span lang=FR style='font-size:10.0pt'>0.6.2</span></p>
+ <p class=MsoNormal><span lang=FR style='font-size:8.0pt'>1.0.1</span></p>
</td>
- <td width=393 valign=top style='width:294.9pt;border-top:none;border-left:
+ <td width=415 valign=top style='width:310.95pt;border-top:none;border-left:
none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
padding:0mm 5.4pt 0mm 5.4pt'>
<p class=MsoNormal><span class=MsoHyperlink><span lang=FR style='font-size:
- 10.0pt'><a
- href="http://glite.web.cern.ch/glite/packages/I20041210/bin/rhel30/i386/RPMS/glite-lb-server-0.6.2-4.i386.rpm">http://glite.web.cern.ch/glite/packages/I20041210/bin/rhel30/i386/RPMS/glite-lb-server-0.6.2-4.i386.rpm</a></span></span></p>
+ 8.0pt'><a
+ href="http://glite.web.cern.ch/glite/packages/R1.0/R20050331/bin/rhel30/i386/RPMS/glite-lb-server-1.0.1-1.i386.rpm">http://glite.web.cern.ch/glite/packages/R1.0/R20050331/bin/rhel30/i386/RPMS/glite-lb-server-1.0.1-1.i386.rpm</a></span></span></p>
</td>
</tr>
<tr>
- <td width=177 valign=top style='width:133.0pt;border:solid windowtext 1.0pt;
+ <td width=153 valign=top style='width:115.0pt;border:solid windowtext 1.0pt;
border-top:none;padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span lang=EN-US style='font-size:10.0pt'>glite-lb-server-bones</span></p>
+ <p class=MsoNormal><span lang=FR style='font-size:8.0pt'>org.glite.lb.</span><span
+ lang=EN-US style='font-size:8.0pt'>server-bones</span></p>
</td>
- <td width=63 valign=top style='width:47.5pt;border-top:none;border-left:none;
- border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ <td width=54 valign=top style='width:40.15pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span lang=EN-US style='font-size:10.0pt'>0.1.0</span></p>
+ <p class=MsoNormal><span lang=EN-US style='font-size:8.0pt'>1.0.0</span></p>
</td>
- <td width=393 valign=top style='width:294.9pt;border-top:none;border-left:
+ <td width=415 valign=top style='width:310.95pt;border-top:none;border-left:
none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
padding:0mm 5.4pt 0mm 5.4pt'>
<p class=MsoNormal><span class=MsoHyperlink><span lang=EN-US
- style='font-size:10.0pt'><a
- href="http://glite.web.cern.ch/glite/packages/I20041126/bin/rhel30/i386/RPMS/glite-lb-server-bones-0.1.0-1.i386.rpm">http://glite.web.cern.ch/glite/packages/I20041210/bin/rhel30/i386/RPMS/glite-lb-server-bones-0.1.0-1.i386.rpm</a></span></span></p>
+ style='font-size:8.0pt'><a
+ href="http://glite.web.cern.ch/glite/packages/R1.0/R20050331/bin/rhel30/i386/RPMS/glite-lb-server-bones-1.0.0-1.i386.rpm">http://glite.web.cern.ch/glite/packages/R1.0/R20050331/bin/rhel30/i386/RPMS/glite-lb-server-bones-1.0.0-1.i386.rpm</a></span></span></p>
</td>
</tr>
<tr>
- <td width=177 valign=top style='width:133.0pt;border:solid windowtext 1.0pt;
+ <td width=153 valign=top style='width:115.0pt;border:solid windowtext 1.0pt;
border-top:none;padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span lang=EN-US style='font-size:10.0pt'>glite-lb-ws-interface</span></p>
+ <p class=MsoNormal><span lang=FR style='font-size:8.0pt'>org.glite.lb.</span><span
+ lang=EN-US style='font-size:8.0pt'>ws-interface</span></p>
</td>
- <td width=63 valign=top style='width:47.5pt;border-top:none;border-left:none;
- border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ <td width=54 valign=top style='width:40.15pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span lang=EN-US style='font-size:10.0pt'>0.1.0</span></p>
+ <p class=MsoNormal><span lang=EN-US style='font-size:8.0pt'>1.0.1</span></p>
</td>
- <td width=393 valign=top style='width:294.9pt;border-top:none;border-left:
+ <td width=415 valign=top style='width:310.95pt;border-top:none;border-left:
none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
padding:0mm 5.4pt 0mm 5.4pt'>
<p class=MsoNormal><span class=MsoHyperlink><span lang=EN-US
- style='font-size:10.0pt'><a
- href="http://glite.web.cern.ch/glite/packages/I20041210/bin/rhel30/i386/RPMS/glite-lb-ws-interface-0.1.0-0.i386.rpm">http://glite.web.cern.ch/glite/packages/I20041210/bin/rhel30/i386/RPMS/glite-lb-ws-interface-0.1.0-0.i386.rpm</a></span></span></p>
+ style='font-size:8.0pt'><a
+ href="http://glite.web.cern.ch/glite/packages/R1.0/R20050331/bin/rhel30/i386/RPMS/glite-lb-ws-interface-1.0.1-1.i386.rpm">http://glite.web.cern.ch/glite/packages/R1.0/R20050331/bin/rhel30/i386/RPMS/glite-lb-ws-interface-1.0.1-1.i386.rpm</a></span></span></p>
</td>
</tr>
<tr>
- <td width=177 valign=top style='width:133.0pt;border:solid windowtext 1.0pt;
+ <td width=153 valign=top style='width:115.0pt;border:solid windowtext 1.0pt;
border-top:none;padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span lang=EN-US style='font-size:10.0pt'>glite-security-proxyrenewal</span></p>
+ <p class=MsoNormal><span lang=EN-US style='font-size:8.0pt'>org.glite.security.proxyrenewal</span></p>
</td>
- <td width=63 valign=top style='width:47.5pt;border-top:none;border-left:none;
- border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ <td width=54 valign=top style='width:40.15pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span lang=EN-US style='font-size:10.0pt'>0.1.1</span></p>
+ <p class=MsoNormal><span lang=EN-US style='font-size:8.0pt'>1.0.11</span></p>
</td>
- <td width=393 valign=top style='width:294.9pt;border-top:none;border-left:
+ <td width=415 valign=top style='width:310.95pt;border-top:none;border-left:
none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
padding:0mm 5.4pt 0mm 5.4pt'>
<p class=MsoNormal><span class=MsoHyperlink><span lang=EN-US
- style='font-size:10.0pt'><a
- href="http://glite.web.cern.ch/glite/packages/I20041210/bin/rhel30/i386/RPMS/glite-security-proxyrenewal-0.1.1-1.i386.rpm">http://glite.web.cern.ch/glite/packages/I20041210/bin/rhel30/i386/RPMS/glite-security-proxyrenewal-0.1.1-1.i386.rpm</a></span></span></p>
+ style='font-size:8.0pt'><a
+ href="http://glite.web.cern.ch/glite/packages/R1.0/R20050331/bin/rhel30/i386/RPMS/glite-security-proxyrenewal-1.0.11-1.i386.rpm">http://glite.web.cern.ch/glite/packages/R1.0/R20050331/bin/rhel30/i386/RPMS/glite-security-proxyrenewal-1.0.11-1.i386.rpm</a></span></span></p>
</td>
</tr>
<tr>
- <td width=177 valign=top style='width:133.0pt;border:solid windowtext 1.0pt;
+ <td width=153 valign=top style='width:115.0pt;border:solid windowtext 1.0pt;
border-top:none;padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span lang=EN-US style='font-size:10.0pt'>glite-wms-utils-exception</span></p>
+ <p class=MsoNormal><span lang=FR style='font-size:8.0pt'>org.glite.wms-utils.exception</span></p>
</td>
- <td width=63 valign=top style='width:47.5pt;border-top:none;border-left:none;
- border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ <td width=54 valign=top style='width:40.15pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span lang=EN-US style='font-size:10.0pt'>0.1.2</span></p>
+ <p class=MsoNormal><span lang=EN-US style='font-size:8.0pt'>1.0.1</span></p>
</td>
- <td width=393 valign=top style='width:294.9pt;border-top:none;border-left:
+ <td width=415 valign=top style='width:310.95pt;border-top:none;border-left:
none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
padding:0mm 5.4pt 0mm 5.4pt'>
<p class=MsoNormal><span class=MsoHyperlink><span lang=EN-US
- style='font-size:10.0pt'><a
- href="http://glite.web.cern.ch/glite/packages/I20041126/bin/rhel30/i386/RPMS/glite-wms-utils-exception-0.1.2-1.i386.rpm">http://glite.web.cern.ch/glite/packages/I20041210/bin/rhel30/i386/RPMS/glite-wms-utils-exception-0.1.2-1.i386.rpm</a></span></span></p>
+ style='font-size:8.0pt'><a
+ href="http://glite.web.cern.ch/glite/packages/R1.0/R20050331/bin/rhel30/i386/RPMS/glite-wms-utils-exception-1.0.1-1.i386.rpm">http://glite.web.cern.ch/glite/packages/R1.0/R20050331/bin/rhel30/i386/RPMS/glite-wms-utils-exception-1.0.1-1.i386.rpm</a></span></span></p>
</td>
</tr>
<tr>
- <td width=177 valign=top style='width:133.0pt;border:solid windowtext 1.0pt;
+ <td width=153 valign=top style='width:115.0pt;border:solid windowtext 1.0pt;
border-top:none;padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span lang=EN-US style='font-size:10.0pt'>glite-wms-utils-jobid</span></p>
+ <p class=MsoNormal><span lang=EN-US style='font-size:8.0pt'>org.glite.wms-utils.jobid</span></p>
</td>
- <td width=63 valign=top style='width:47.5pt;border-top:none;border-left:none;
- border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ <td width=54 valign=top style='width:40.15pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span lang=EN-US style='font-size:10.0pt'>0.1.2</span></p>
+ <p class=MsoNormal><span lang=EN-US style='font-size:8.0pt'>1.0.0</span></p>
</td>
- <td width=393 valign=top style='width:294.9pt;border-top:none;border-left:
+ <td width=415 valign=top style='width:310.95pt;border-top:none;border-left:
none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
padding:0mm 5.4pt 0mm 5.4pt'>
<p class=MsoNormal><span class=MsoHyperlink><span lang=EN-US
- style='font-size:10.0pt'><a
- href="http://glite.web.cern.ch/glite/packages/I20041126/bin/rhel30/i386/RPMS/glite-wms-utils-jobid-0.1.2-1.i386.rpm">http://glite.web.cern.ch/glite/packages/I20041210/bin/rhel30/i386/RPMS/glite-wms-utils-jobid-0.1.2-1.i386.rpm</a></span></span></p>
+ style='font-size:8.0pt'><a
+ href="http://glite.web.cern.ch/glite/packages/R1.0/R20050331/bin/rhel30/i386/RPMS/glite-wms-utils-jobid-1.0.0-1.i386.rpm">http://glite.web.cern.ch/glite/packages/R1.0/R20050331/bin/rhel30/i386/RPMS/glite-wms-utils-jobid-1.0.0-1.i386.rpm</a></span></span></p>
+ </td>
+ </tr>
+ <tr>
+ <td width=153 valign=top style='width:115.0pt;border:solid windowtext 1.0pt;
+ border-top:none;padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span lang=FR style='font-size:8.0pt'>org.glite.security.voms</span></p>
+ </td>
+ <td width=54 valign=top style='width:40.15pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span lang=EN-US style='font-size:8.0pt'>1.2.32</span></p>
+ </td>
+ <td width=415 valign=top style='width:310.95pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span class=MsoHyperlink><span lang=EN-US
+ style='font-size:8.0pt'><a
+ href="http://glite.web.cern.ch/glite/packages/R1.0/R20050331/bin/rhel30/i386/RPMS/glite-security-voms-1.2.32-1.i386.rpm">http://glite.web.cern.ch/glite/packages/R1.0/R20050331/bin/rhel30/i386/RPMS/glite-security-voms-1.2.32-1.i386.rpm</a></span></span></p>
+ </td>
+ </tr>
+ <tr>
+ <td width=153 valign=top style='width:115.0pt;border:solid windowtext 1.0pt;
+ border-top:none;padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span lang=EN-US style='font-size:8.0pt'>org.gridsite.core</span></p>
+ </td>
+ <td width=54 valign=top style='width:40.15pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span lang=EN-US style='font-size:8.0pt'>1.1.5</span></p>
+ </td>
+ <td width=415 valign=top style='width:310.95pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span class=MsoHyperlink><span lang=EN-US
+ style='font-size:8.0pt'><a
+ href="http://glite.web.cern.ch/glite/packages/R1.0/R20050331/bin/rhel30/i386/RPMS/gridsite-1.1.5-1.i386.rpm">http://glite.web.cern.ch/glite/packages/R1.0/R20050331/bin/rhel30/i386/RPMS/gridsite-1.1.5-1.i386.rpm</a></span></span></p>
</td>
</tr>
</table>
<p class=MsoNormal><span lang=EN-US> </span></p>
-<h1>3. Dependencies</h1>
+<h1>4. Dependencies</h1>
-<p class=MsoNormal>The gLite Logging & Bookkeeping Server module has the
-following dependencies:</p>
+<p class=MsoNormal>The gLite Logging & Bookkeeping Server v. 1.2.2 module
+has the following dependencies:</p>
<p class=MsoNormal> </p>
-<table class=MsoTableGrid border=1 cellspacing=0 cellpadding=0 width=640
- style='width:480.3pt;border-collapse:collapse;border:none'>
+<table class=MsoTableGrid border=1 cellspacing=0 cellpadding=0 width=621
+ style='width:466.1pt;border-collapse:collapse;border:none'>
<tr>
- <td width=187 valign=top style='width:140.1pt;border:solid windowtext 1.0pt;
+ <td width=158 valign=top style='width:118.6pt;border:solid windowtext 1.0pt;
padding:0mm 5.4pt 0mm 5.4pt'>
<p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 10.0pt'>Component name</span></p>
+ 8.0pt'>Component name</span></p>
</td>
- <td width=66 valign=top style='width:49.6pt;border:solid windowtext 1.0pt;
+ <td width=66 valign=top style='width:49.25pt;border:solid windowtext 1.0pt;
border-left:none;padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span style='font-size:10.0pt'>Version</span></p>
+ <p class=MsoNormal><span style='font-size:8.0pt'>Version</span></p>
</td>
- <td width=387 valign=top style='width:290.6pt;border:solid windowtext 1.0pt;
+ <td width=398 valign=top style='width:298.25pt;border:solid windowtext 1.0pt;
border-left:none;padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span style='font-size:10.0pt'>RPM file name</span></p>
+ <p class=MsoNormal><span style='font-size:8.0pt'>RPM file name</span></p>
</td>
</tr>
<tr>
- <td width=187 valign=top style='width:140.1pt;border:solid windowtext 1.0pt;
+ <td width=158 valign=top style='width:118.6pt;border:solid windowtext 1.0pt;
border-top:none;padding:0mm 5.4pt 0mm 5.4pt'>
<p class=MsoNormal align=left style='text-align:left'><span lang=EN-US
- style='font-size:10.0pt'>gLite Security Utilities</span></p>
+ style='font-size:8.0pt'>gLite Security Utilities</span></p>
</td>
- <td width=66 valign=top style='width:49.6pt;border-top:none;border-left:none;
- border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ <td width=66 valign=top style='width:49.25pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span lang=EN-US style='font-size:10.0pt'>0.2.0</span></p>
+ <p class=MsoNormal><span lang=EN-US style='font-size:8.0pt'>1.0.0</span></p>
</td>
- <td width=387 valign=top style='width:290.6pt;border-top:none;border-left:
+ <td width=398 valign=top style='width:298.25pt;border-top:none;border-left:
none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
padding:0mm 5.4pt 0mm 5.4pt'>
<p class=MsoNormal><span class=MsoHyperlink><span lang=EN-US
- style='font-size:10.0pt'><a
- href="http://glite.web.cern.ch/glite/packages/I20041210/installers/glite-security-utils_installer.sh">http://glite.web.cern.ch/glite/packages/I20041210/installers/glite-security-utils_installer.sh</a></span></span></p>
+ style='font-size:8.0pt'><a
+ href="http://glite.web.cern.ch/glite/packages/R1.0/R20050331/installers/glite-security-utils_installer.sh">http://glite.web.cern.ch/glite/packages/R1.0/R20050331/installers/glite-security-utils_installer.sh</a></span></span></p>
</td>
</tr>
<tr>
- <td width=187 valign=top style='width:140.1pt;border:solid windowtext 1.0pt;
+ <td width=158 valign=top style='width:118.6pt;border:solid windowtext 1.0pt;
+ border-top:none;padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal align=left style='text-align:left'><span lang=EN-US
+ style='font-size:8.0pt'>gLite </span><span style='font-size:8.0pt'>R-GMA </span><span
+ lang=EN-US style='font-size:8.0pt'>Service Publisher</span></p>
+ </td>
+ <td width=66 valign=top style='width:49.25pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span lang=EN-US style='font-size:8.0pt'>4.1.5</span></p>
+ </td>
+ <td width=398 valign=top style='width:298.25pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span class=MsoHyperlink><span lang=EN-US
+ style='font-size:8.0pt'><a
+ href="http://glite.web.cern.ch/glite/packages/R1.0/R20050331/installers/glite-rgma-servicetool_installer.sh">http://glite.web.cern.ch/glite/packages/R1.0/R20050331/installers/glite-rgma-servicetool_installer.sh</a></span></span></p>
+ </td>
+ </tr>
+ <tr>
+ <td width=158 valign=top style='width:118.6pt;border:solid windowtext 1.0pt;
border-top:none;padding:0mm 5.4pt 0mm 5.4pt'>
<p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 10.0pt'>GPT</span></p>
+ 8.0pt'>GPT</span></p>
</td>
- <td width=66 valign=top style='width:49.6pt;border-top:none;border-left:none;
- border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ <td width=66 valign=top style='width:49.25pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span style='font-size:10.0pt'>VDT 1.2.0</span></p>
+ <p class=MsoNormal><span style='font-size:8.0pt'>VDT 1.2.2</span></p>
</td>
- <td width=387 valign=top style='width:290.6pt;border-top:none;border-left:
+ <td width=398 valign=top style='width:298.25pt;border-top:none;border-left:
none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
padding:0mm 5.4pt 0mm 5.4pt'>
<p class=MsoNormal><span class=MsoHyperlink><span lang=EN-US
- style='font-size:10.0pt'><a
- href="http://glite.web.cern.ch/glite/packages/externals/bin/rhel30/RPMS/gpt-VDT1.2.0rh9-1.i386.rpm">http://glite.web.cern.ch/glite/packages/externals/bin/rhel30/RPMS/gpt-<span
- lang=EN-GB>VDT1.2.0rh9</span>-1.i386.rpm</a></span></span></p>
+ style='font-size:8.0pt'><a
+ href="http://glite.web.cern.ch/glite/packages/externals/bin/rhel30/RPMS/gpt-VDT1.2.2rh9-1.i386.rpm">http://glite.web.cern.ch/glite/packages/externals/bin/rhel30/RPMS/gpt-<span
+ lang=EN-GB>VDT1.2.2rh9</span>-1.i386.rpm</a></span></span></p>
</td>
</tr>
<tr>
- <td width=187 valign=top style='width:140.1pt;border:solid windowtext 1.0pt;
+ <td width=158 valign=top style='width:118.6pt;border:solid windowtext 1.0pt;
border-top:none;padding:0mm 5.4pt 0mm 5.4pt'>
<p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 10.0pt'>VDT Globus Essentials</span></p>
+ 8.0pt'>VDT Globus Essentials</span></p>
</td>
- <td width=66 valign=top style='width:49.6pt;border-top:none;border-left:none;
- border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ <td width=66 valign=top style='width:49.25pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span style='font-size:10.0pt'>VDT 1.2.0</span></p>
+ <p class=MsoNormal><span style='font-size:8.0pt'>VDT 1.2.2</span></p>
</td>
- <td width=387 valign=top style='width:290.6pt;border-top:none;border-left:
+ <td width=398 valign=top style='width:298.25pt;border-top:none;border-left:
none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
padding:0mm 5.4pt 0mm 5.4pt'>
<p class=MsoNormal><span class=MsoHyperlink><span lang=EN-US
- style='font-size:10.0pt'><a
- href="http://glite.web.cern.ch/glite/packages/externals/bin/rhel30/RPMS/vdt_globus_essentials-VDT1.2.0rh9-1.i386.rpm">http://glite.web.cern.ch/glite/packages/externals/bin/rhel30/RPMS/vdt_globus_essentials-<span
- lang=EN-GB>VDT1.2.0rh9</span>-1.i386.rpm</a></span></span></p>
+ style='font-size:8.0pt'><a
+ href="http://glite.web.cern.ch/glite/packages/externals/bin/rhel30/RPMS/vdt_globus_essentials-VDT1.2.2rh9-1.i386.rpm">http://glite.web.cern.ch/glite/packages/externals/bin/rhel30/RPMS/vdt_globus_essentials-<span
+ lang=EN-GB>VDT1.2.2rh9</span>-1.i386.rpm</a></span></span></p>
</td>
</tr>
<tr>
- <td width=187 valign=top style='width:140.1pt;border:solid windowtext 1.0pt;
+ <td width=158 valign=top style='width:118.6pt;border:solid windowtext 1.0pt;
border-top:none;padding:0mm 5.4pt 0mm 5.4pt'>
<p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 10.0pt'>MySQL-server</span></p>
+ 8.0pt'>MySQL-server</span></p>
</td>
- <td width=66 valign=top style='width:49.6pt;border-top:none;border-left:none;
- border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ <td width=66 valign=top style='width:49.25pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span style='font-size:10.0pt'>4.0.20</span></p>
+ <p class=MsoNormal><span style='font-size:8.0pt'>4.0.20</span></p>
</td>
- <td width=387 valign=top style='width:290.6pt;border-top:none;border-left:
+ <td width=398 valign=top style='width:298.25pt;border-top:none;border-left:
none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
padding:0mm 5.4pt 0mm 5.4pt'>
<p class=MsoNormal><span class=MsoHyperlink><span lang=EN-US
- style='font-size:10.0pt'><a
+ style='font-size:8.0pt'><a
href="http://glite.web.cern.ch/glite/packages/externals/bin/rhel30/RPMS/MySQL-server-4.0.20-0.i386.rpm">http://glite.web.cern.ch/glite/packages/externals/bin/rhel30/RPMS/MySQL-server-<span
lang=EN-GB>4.0.20</span>-0.i386.rpm</a></span></span></p>
</td>
</tr>
<tr>
- <td width=187 valign=top style='width:140.1pt;border:solid windowtext 1.0pt;
+ <td width=158 valign=top style='width:118.6pt;border:solid windowtext 1.0pt;
border-top:none;padding:0mm 5.4pt 0mm 5.4pt'>
<p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 10.0pt'>MySQL-client</span></p>
+ 8.0pt'>MySQL-client</span></p>
</td>
- <td width=66 valign=top style='width:49.6pt;border-top:none;border-left:none;
- border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ <td width=66 valign=top style='width:49.25pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span style='font-size:10.0pt'>4.0.20</span></p>
+ <p class=MsoNormal><span style='font-size:8.0pt'>4.0.20</span></p>
</td>
- <td width=387 valign=top style='width:290.6pt;border-top:none;border-left:
+ <td width=398 valign=top style='width:298.25pt;border-top:none;border-left:
none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
padding:0mm 5.4pt 0mm 5.4pt'>
<p class=MsoNormal><span class=MsoHyperlink><span lang=EN-US
- style='font-size:10.0pt'><a
+ style='font-size:8.0pt'><a
href="http://glite.web.cern.ch/glite/packages/externals/bin/rhel30/RPMS/MySQL-client-4.0.20-0.i386.rpm">http://glite.web.cern.ch/glite/packages/externals/bin/rhel30/RPMS/MySQL-client-<span
lang=EN-GB>4.0.20</span>-0.i386.rpm</a></span></span></p>
</td>
</tr>
<tr>
- <td width=187 valign=top style='width:140.1pt;border:solid windowtext 1.0pt;
+ <td width=158 valign=top style='width:118.6pt;border:solid windowtext 1.0pt;
border-top:none;padding:0mm 5.4pt 0mm 5.4pt'>
<p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 10.0pt'>ares</span></p>
+ 8.0pt'>ares</span></p>
</td>
- <td width=66 valign=top style='width:49.6pt;border-top:none;border-left:none;
- border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ <td width=66 valign=top style='width:49.25pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span style='font-size:10.0pt'>1.1.1</span></p>
+ <p class=MsoNormal><span style='font-size:8.0pt'>1.1.1</span></p>
</td>
- <td width=387 valign=top style='width:290.6pt;border-top:none;border-left:
+ <td width=398 valign=top style='width:298.25pt;border-top:none;border-left:
none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
padding:0mm 5.4pt 0mm 5.4pt'>
<p class=MsoNormal><span class=MsoHyperlink><span lang=EN-US
- style='font-size:10.0pt'><a
+ style='font-size:8.0pt'><a
href="http://glite.web.cern.ch/glite/packages/externals/bin/rhel30/RPMS/ares-1.1.1-EGEE.i386.rpm">http://glite.web.cern.ch/glite/packages/externals/bin/rhel30/RPMS/ares-<span
lang=EN-GB>1.1.1</span>-EGEE.i386.rpm</a></span></span></p>
</td>
</tr>
<tr>
- <td width=187 valign=top style='width:140.1pt;border:solid windowtext 1.0pt;
+ <td width=158 valign=top style='width:118.6pt;border:solid windowtext 1.0pt;
border-top:none;padding:0mm 5.4pt 0mm 5.4pt'>
<p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 10.0pt'>myproxy</span></p>
+ 8.0pt'>myproxy</span></p>
</td>
- <td width=66 valign=top style='width:49.6pt;border-top:none;border-left:none;
- border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ <td width=66 valign=top style='width:49.25pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span style='font-size:10.0pt'>1.14</span></p>
+ <p class=MsoNormal><span style='font-size:8.0pt'>1.14</span></p>
</td>
- <td width=387 valign=top style='width:290.6pt;border-top:none;border-left:
+ <td width=398 valign=top style='width:298.25pt;border-top:none;border-left:
none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
padding:0mm 5.4pt 0mm 5.4pt'>
<p class=MsoNormal><span class=MsoHyperlink><span lang=EN-US
- style='font-size:10.0pt'><a
+ style='font-size:8.0pt'><a
href="http://glite.web.cern.ch/glite/packages/externals/bin/rhel30/RPMS/myproxy-1.14-EGEE.i386.rpm">http://glite.web.cern.ch/glite/packages/externals/bin/rhel30/RPMS/myproxy-<span
lang=EN-GB>1.14</span>-EGEE.i386.rpm</a></span></span></p>
</td>
</tr>
<tr>
- <td width=187 valign=top style='width:140.1pt;border:solid windowtext 1.0pt;
+ <td width=158 valign=top style='width:118.6pt;border:solid windowtext 1.0pt;
border-top:none;padding:0mm 5.4pt 0mm 5.4pt'>
<p class=MsoNormal align=left style='text-align:left'><span style='font-size:
- 10.0pt'>perl-Expect.pm</span></p>
+ 8.0pt'>perl-Expect.pm</span></p>
</td>
- <td width=66 valign=top style='width:49.6pt;border-top:none;border-left:none;
- border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ <td width=66 valign=top style='width:49.25pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span style='font-size:10.0pt'>1.01</span></p>
+ <p class=MsoNormal><span style='font-size:8.0pt'>1.01</span></p>
</td>
- <td width=387 valign=top style='width:290.6pt;border-top:none;border-left:
+ <td width=398 valign=top style='width:298.25pt;border-top:none;border-left:
none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
padding:0mm 5.4pt 0mm 5.4pt'>
<p class=MsoNormal><span class=MsoHyperlink><span lang=EN-US
- style='font-size:10.0pt'><a
+ style='font-size:8.0pt'><a
href="http://glite.web.cern.ch/glite/packages/externals/bin/rhel30/RPMS/per-Expect.pm-1.01-9.i386.rpm">http://glite.web.cern.ch/glite/packages/externals/bin/rhel30/RPMS/per-Expect.pm-<span
lang=EN-GB>1.01</span>-9.i386.rpm</a></span></span></p>
</td>
</tr>
+ <tr>
+ <td width=158 valign=top style='width:118.6pt;border:solid windowtext 1.0pt;
+ border-top:none;padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
+ 8.0pt'>Java SDK/JRE</span></p>
+ </td>
+ <td width=66 valign=top style='width:49.25pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:8.0pt'>1.4.2</span></p>
+ </td>
+ <td width=398 valign=top style='width:298.25pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span class=MsoHyperlink><span lang=EN-US
+ style='font-size:8.0pt'>http://java.sun.com/j2se/1.4.2/download.html</span></span></p>
+ </td>
+ </tr>
</table>
<p class=MsoNormal> </p>
-<h1>4. Known bugs and issues</h1>
+<h1>5. Known bugs and issues</h1>
<p class=MsoNormal align=left style='text-align:left'>This release has the
following bugs and issues. Bug numbers refer to the gLite Bug Tracking system
<p class=MsoNormal align=left style='text-align:left'> </p>
+<ul style='margin-top:0mm' type=disc>
+ <li class=MsoNormal style='text-align:left'>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.</li>
+</ul>
+
+<p class=MsoNormal align=left style='text-align:left'> </p>
+
+<p class=MsoNormal align=left style='text-align:left'>Known open bugs:</p>
+
+<p class=MsoNormal align=left style='text-align:left'> </p>
+
<table class=MsoTableGrid border=1 cellspacing=0 cellpadding=0
style='border-collapse:collapse;border:none'>
<tr>
- <td width=106 valign=top style='width:79.3pt;border:solid windowtext 1.0pt;
+ <td width=59 valign=top style='width:44.05pt;border:solid windowtext 1.0pt;
padding:0mm 5.4pt 0mm 5.4pt'>
<p class=MsoNormal><span style='font-size:10.0pt'>Bug number</span></p>
</td>
- <td width=513 valign=top style='width:385.1pt;border:solid windowtext 1.0pt;
+ <td width=534 valign=top style='width:400.8pt;border:solid windowtext 1.0pt;
border-left:none;padding:0mm 5.4pt 0mm 5.4pt'>
<p class=MsoNormal><span style='font-size:10.0pt'>Description</span></p>
</td>
+ <td width=26 valign=top style='width:19.55pt;border:solid windowtext 1.0pt;
+ border-left:none;padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'> </span></p>
+ </td>
</tr>
<tr>
- <td width=106 valign=top style='width:79.3pt;border:solid windowtext 1.0pt;
- border-top:none;padding:0mm 5.4pt 0mm 5.4pt'>
+ <td valign=top style='border:solid windowtext 1.0pt;border-top:none;
+ padding:0mm 5.4pt 0mm 5.4pt'>
<p class=MsoNormal><span style='font-size:10.0pt'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=5125"><span
- style='color:windowtext;text-decoration:none'> #5125</span></a></span></p>
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=6412"><span
+ style='color:windowtext;text-decoration:none'> #6412</span></a></span></p>
</td>
- <td width=513 valign=top style='width:385.1pt;border-top:none;border-left:
+ <td width=534 valign=top style='width:400.8pt;border-top:none;border-left:
none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
padding:0mm 5.4pt 0mm 5.4pt'>
<p class=MsoNormal><span style='font-size:10.0pt'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=5125"><span
- style='color:windowtext;text-decoration:none'>glite-lb-bkserverd
- start/stop/status displays usage options</span></a> </span></p>
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=6412"><span
+ style='color:windowtext;text-decoration:none'>--start and --stop options not
+ documented in glite-ce-config.py, glite-lb-config.py</span></a> </span></p>
+ </td>
+ <td width=26 valign=top style='width:19.55pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'> </span></p>
</td>
</tr>
<tr>
<td valign=top style='border:solid windowtext 1.0pt;border-top:none;
padding:0mm 5.4pt 0mm 5.4pt'>
<p class=MsoNormal><span style='font-size:10.0pt'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=5202"><span
- style='color:windowtext;text-decoration:none'> #5202</span></a></span></p>
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=7053"><span
+ style='color:windowtext;text-decoration:none'> #7053</span></a></span></p>
</td>
<td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;
border-right:solid windowtext 1.0pt;padding:0mm 5.4pt 0mm 5.4pt'>
<p class=MsoNormal><span style='font-size:10.0pt'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=5202"><span
- style='color:windowtext;text-decoration:none'>no RPM provides the
- lb-local-logger daemon - </span></a> </span></p>
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=7053"><span
+ style='color:windowtext;text-decoration:none'>LB configuration fails if the
+ mysql root pwd is set</span></a> </span></p>
+ </td>
+ <td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;
+ border-right:solid windowtext 1.0pt;padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'> </span></p>
</td>
</tr>
<tr>
- <td width=106 valign=top style='width:79.3pt;border:solid windowtext 1.0pt;
- border-top:none;padding:0mm 5.4pt 0mm 5.4pt'>
+ <td valign=top style='border:solid windowtext 1.0pt;border-top:none;
+ padding:0mm 5.4pt 0mm 5.4pt'>
<p class=MsoNormal><span style='font-size:10.0pt'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=5248"><span
- style='color:windowtext;text-decoration:none'> #5248</span></a></span></p>
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=7180"><span
+ style='color:windowtext;text-decoration:none'> #7180</span></a></span></p>
</td>
- <td width=513 valign=top style='width:385.1pt;border-top:none;border-left:
+ <td width=534 valign=top style='width:400.8pt;border-top:none;border-left:
none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
padding:0mm 5.4pt 0mm 5.4pt'>
<p class=MsoNormal><span style='font-size:10.0pt'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=5248"><span
- style='color:windowtext;text-decoration:none'>When running
- "glite-lb-bkserverd start", glite-lb-bkserverd doesn't start in
- background</span></a> </span></p>
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=7180"><span
+ style='color:windowtext;text-decoration:none'>Logging & Bookkeping UI </span></a> </span></p>
+ </td>
+ <td width=26 valign=top style='width:19.55pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'> </span></p>
</td>
</tr>
<tr>
<td valign=top style='border:solid windowtext 1.0pt;border-top:none;
padding:0mm 5.4pt 0mm 5.4pt'>
<p class=MsoNormal><span style='font-size:10.0pt'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=5833"><span
- style='color:windowtext;text-decoration:none'> #5833</span></a></span></p>
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=7237"><span
+ style='color:windowtext;text-decoration:none'> #7237</span></a></span></p>
</td>
- <td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;
- border-right:solid windowtext 1.0pt;padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span style='font-size:10.0pt'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=5833"><span
- style='color:windowtext;text-decoration:none'>all jobs in SUBMITTED after a
- job storm</span></a> </span></p>
+ <td width=534 valign=top style='width:400.8pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=7237"><span
+ style='color:windowtext;text-decoration:none'>Intermittent errors with job
+ submission</span></a> </span></p>
+ </td>
+ <td width=26 valign=top style='width:19.55pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'> </span></p>
</td>
</tr>
<tr>
<td valign=top style='border:solid windowtext 1.0pt;border-top:none;
padding:0mm 5.4pt 0mm 5.4pt'>
<p class=MsoNormal><span style='font-size:10.0pt'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=5903"><span
- style='color:windowtext;text-decoration:none'> #5903</span></a></span></p>
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=7300"><span
+ style='color:windowtext;text-decoration:none'> #7300</span></a></span></p>
</td>
<td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;
border-right:solid windowtext 1.0pt;padding:0mm 5.4pt 0mm 5.4pt'>
<p class=MsoNormal><span style='font-size:10.0pt'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=5903"><span
- style='color:windowtext;text-decoration:none'>glite-lb-bkserverd script gives
- bash: /root/.bashrc: Permission denied error </span></a> </span></p>
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=7300"><span
+ style='color:windowtext;text-decoration:none'>update of the lb instructions
+ at the end of the installer script </span></a> </span></p>
+ </td>
+ <td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;
+ border-right:solid windowtext 1.0pt;padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'> </span></p>
</td>
</tr>
<tr>
<td valign=top style='border:solid windowtext 1.0pt;border-top:none;
padding:0mm 5.4pt 0mm 5.4pt'>
<p class=MsoNormal><span style='font-size:10.0pt'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=5904"><span
- style='color:windowtext;text-decoration:none'> #5904</span></a></span></p>
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=7305"><span
+ style='color:windowtext;text-decoration:none'> #7305</span></a></span></p>
</td>
<td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;
border-right:solid windowtext 1.0pt;padding:0mm 5.4pt 0mm 5.4pt'>
<p class=MsoNormal><span style='font-size:10.0pt'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=5904"><span
- style='color:windowtext;text-decoration:none'>glite-lb-bkserverd does not
- check default location for credentials</span></a> </span></p>
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=7305"><span
+ style='color:windowtext;text-decoration:none'>lb.database.username paramenter
+ in config file</span></a> </span></p>
+ </td>
+ <td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;
+ border-right:solid windowtext 1.0pt;padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'> </span></p>
</td>
</tr>
<tr>
<td valign=top style='border:solid windowtext 1.0pt;border-top:none;
padding:0mm 5.4pt 0mm 5.4pt'>
<p class=MsoNormal><span style='font-size:10.0pt'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=5926"><span
- style='color:windowtext;text-decoration:none'> #5926</span></a></span></p>
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=7307"><span
+ style='color:windowtext;text-decoration:none'> #7307</span></a></span></p>
</td>
<td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;
border-right:solid windowtext 1.0pt;padding:0mm 5.4pt 0mm 5.4pt'>
<p class=MsoNormal><span style='font-size:10.0pt'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=5926"><span
- style='color:windowtext;text-decoration:none'>Default user should not be used
- in the init.d scripts</span></a> </span></p>
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=7307"><span
+ style='color:windowtext;text-decoration:none'>lb config script does _not_
+ fail if mysql root password is set</span></a> </span></p>
+ </td>
+ <td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;
+ border-right:solid windowtext 1.0pt;padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'> </span></p>
</td>
</tr>
<tr>
<td valign=top style='border:solid windowtext 1.0pt;border-top:none;
padding:0mm 5.4pt 0mm 5.4pt'>
<p class=MsoNormal><span style='font-size:10.0pt'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=5932"><span
- style='color:windowtext;text-decoration:none'> #5932</span></a></span></p>
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=7321"><span
+ style='color:windowtext;text-decoration:none'> #7321</span></a></span></p>
</td>
<td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;
border-right:solid windowtext 1.0pt;padding:0mm 5.4pt 0mm 5.4pt'>
<p class=MsoNormal><span style='font-size:10.0pt'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=5932"><span
- style='color:windowtext;text-decoration:none'>credential file created in
- /var/tmp is unnecessary</span></a> </span></p>
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=7321"><span
+ style='color:windowtext;text-decoration:none'>creation of indices fails
+ randomly</span></a> </span></p>
+ </td>
+ <td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;
+ border-right:solid windowtext 1.0pt;padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'> </span></p>
</td>
</tr>
<tr>
<td valign=top style='border:solid windowtext 1.0pt;border-top:none;
padding:0mm 5.4pt 0mm 5.4pt'>
<p class=MsoNormal><span style='font-size:10.0pt'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=5934"><span
- style='color:windowtext;text-decoration:none'> #5934</span></a></span></p>
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=7324"><span
+ style='color:windowtext;text-decoration:none'> #7324</span></a></span></p>
</td>
<td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;
border-right:solid windowtext 1.0pt;padding:0mm 5.4pt 0mm 5.4pt'>
<p class=MsoNormal><span style='font-size:10.0pt'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=5934"><span
- style='color:windowtext;text-decoration:none'>service start and stop notifications
- are inconsistent for glite-lb-bkserverd init,d script</span></a> </span></p>
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=7324"><span
+ style='color:windowtext;text-decoration:none'>lb-bkserver is running with no
+ pid</span></a> </span></p>
+ </td>
+ <td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;
+ border-right:solid windowtext 1.0pt;padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'> </span></p>
+ </td>
+ </tr>
+ <tr>
+ <td valign=top style='border:solid windowtext 1.0pt;border-top:none;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=7389"><span
+ style='color:windowtext;text-decoration:none'> #7389</span></a></span></p>
+ </td>
+ <td width=534 valign=top style='width:400.8pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=7389"><span
+ style='color:windowtext;text-decoration:none'>LB server and WMS local logger
+ related issues</span></a> </span></p>
+ </td>
+ <td width=26 valign=top style='width:19.55pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'> </span></p>
</td>
</tr>
</table>
-<p class=MsoNormal align=left style='text-align:left'> </p>
+<p class=MsoNormal> </p>
-<p class=MsoNormal align=left style='text-align:left'>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.</p>
+<p class=MsoNormal>Bugs fixed in this or previous releases, but not yet officially
+tested:</p>
+
+<p class=MsoNormal> </p>
+
+<table class=MsoTableGrid border=1 cellspacing=0 cellpadding=0
+ style='border-collapse:collapse;border:none'>
+ <tr>
+ <td width=58 valign=top style='width:43.3pt;border:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'>Bug number</span></p>
+ </td>
+ <td width=535 valign=top style='width:401.55pt;border:solid windowtext 1.0pt;
+ border-left:none;padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'>Description</span></p>
+ </td>
+ <td width=26 valign=top style='width:19.55pt;border:solid windowtext 1.0pt;
+ border-left:none;padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'> </span></p>
+ </td>
+ </tr>
+ <tr>
+ <td valign=top style='border:solid windowtext 1.0pt;border-top:none;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=5850"><span
+ style='color:windowtext;text-decoration:none'> #5850</span></a></span></p>
+ </td>
+ <td width=535 valign=top style='width:401.55pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=5850"><span
+ style='color:windowtext;text-decoration:none'>glite-lb-config.py has
+ glite.location and globus.location not set in params[]</span></a> </span></p>
+ </td>
+ <td width=26 valign=top style='width:19.55pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'> </span></p>
+ </td>
+ </tr>
+ <tr>
+ <td valign=top style='border:solid windowtext 1.0pt;border-top:none;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=5908"><span
+ style='color:windowtext;text-decoration:none'> #5908</span></a></span></p>
+ </td>
+ <td width=535 valign=top style='width:401.55pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=5908"><span
+ style='color:windowtext;text-decoration:none'>Environment variables set via
+ the configuration script are not passed to daemon startup scripts</span></a> </span></p>
+ </td>
+ <td width=26 valign=top style='width:19.55pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'> </span></p>
+ </td>
+ </tr>
+ <tr>
+ <td valign=top style='border:solid windowtext 1.0pt;border-top:none;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=6075"><span
+ style='color:windowtext;text-decoration:none'> #6075</span></a></span></p>
+ </td>
+ <td width=535 valign=top style='width:401.55pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=6075"><span
+ style='color:windowtext;text-decoration:none'>glite-lb-config.py crashes with
+ KeyError: GLITE_CERT_DIR</span></a> </span></p>
+ </td>
+ <td width=26 valign=top style='width:19.55pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'> </span></p>
+ </td>
+ </tr>
+ <tr>
+ <td valign=top style='border:solid windowtext 1.0pt;border-top:none;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=6366"><span
+ style='color:windowtext;text-decoration:none'> #6366</span></a></span></p>
+ </td>
+ <td width=535 valign=top style='width:401.55pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=6366"><span
+ style='color:windowtext;text-decoration:none'>LB install script:: Fails but
+ no error reported</span></a> </span></p>
+ </td>
+ <td width=26 valign=top style='width:19.55pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'> </span></p>
+ </td>
+ </tr>
+ <tr>
+ <td valign=top style='border:solid windowtext 1.0pt;border-top:none;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=6415"><span
+ style='color:windowtext;text-decoration:none'> #6415</span></a></span></p>
+ </td>
+ <td width=535 valign=top style='width:401.55pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=6415"><span
+ style='color:windowtext;text-decoration:none'>glite-lb-bkserver does not
+ start and blocks execution of glite-lb-config.py</span></a> </span></p>
+ </td>
+ <td width=26 valign=top style='width:19.55pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'> </span></p>
+ </td>
+ </tr>
+ <tr>
+ <td valign=top style='border:solid windowtext 1.0pt;border-top:none;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=6689"><span
+ style='color:windowtext;text-decoration:none'> #6689</span></a></span></p>
+ </td>
+ <td width=535 valign=top style='width:401.55pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=6689"><span
+ style='color:windowtext;text-decoration:none'>glite-proxy-renewd starts the
+ daemon glite-proxy-renewd as GLITE_USER which is glite-lb i.e. wrong</span></a> </span></p>
+ </td>
+ <td width=26 valign=top style='width:19.55pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'> </span></p>
+ </td>
+ </tr>
+ <tr>
+ <td valign=top style='border:solid windowtext 1.0pt;border-top:none;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=6722"><span
+ style='color:windowtext;text-decoration:none'> #6722</span></a></span></p>
+ </td>
+ <td width=535 valign=top style='width:401.55pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=6722"><span
+ style='color:windowtext;text-decoration:none'>glite-job-status -all doesn't
+ work</span></a> </span></p>
+ </td>
+ <td width=26 valign=top style='width:19.55pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'> </span></p>
+ </td>
+ </tr>
+ <tr>
+ <td valign=top style='border:solid windowtext 1.0pt;border-top:none;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=7296"><span
+ style='color:windowtext;text-decoration:none'> #7296</span></a></span></p>
+ </td>
+ <td width=535 valign=top style='width:401.55pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=7296"><span
+ style='color:windowtext;text-decoration:none'>glite-lb-config.py crashes with
+ a TypeError exception</span></a> </span></p>
+ </td>
+ <td width=26 valign=top style='width:19.55pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'> </span></p>
+ </td>
+ </tr>
+</table>
<p class=MsoNormal align=left style='margin:0mm;margin-bottom:.0001pt;
text-align:left;text-autospace:none'><span lang=EN-US style='font-size:10.0pt;
font-family:"Courier New"'> </span></p>
-<h1>5. Bugs closed since last release</h1>
+<h1>6. Bugs closed since last release</h1>
<p class=MsoNormal align=left style='text-align:left'>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 <a
+following bugs and issues. Bug numbers refer to the gLite Bug Tracking system
+database hosted on the CERN Savannah system at <a
href="https://savannah.cern.ch/bugs/?group=jra1mdw">https://savannah.cern.ch/bugs/?group=jra1mdw</a>
</p>
<table class=MsoTableGrid border=1 cellspacing=0 cellpadding=0
style='border-collapse:collapse;border:none'>
<tr>
- <td width=121 valign=top style='width:90.45pt;border:solid windowtext 1.0pt;
+ <td width=103 valign=top style='width:77.45pt;border:solid windowtext 1.0pt;
padding:0mm 5.4pt 0mm 5.4pt'>
<p class=MsoNormal><span style='font-size:10.0pt'>Bug number</span></p>
</td>
- <td width=499 valign=top style='width:373.95pt;border:solid windowtext 1.0pt;
+ <td width=516 valign=top style='width:386.95pt;border:solid windowtext 1.0pt;
border-left:none;padding:0mm 5.4pt 0mm 5.4pt'>
<p class=MsoNormal><span style='font-size:10.0pt'>Description</span></p>
</td>
</tr>
<tr>
- <td width=121 valign=top style='width:90.45pt;border:solid windowtext 1.0pt;
- border-top:none;padding:0mm 5.4pt 0mm 5.4pt'>
+ <td valign=top style='border:solid windowtext 1.0pt;border-top:none;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=5833"><span
+ style='color:windowtext;text-decoration:none'> #5833</span></a></span></p>
+ </td>
+ <td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;
+ border-right:solid windowtext 1.0pt;padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=5833"><span
+ style='color:windowtext;text-decoration:none'>all jobs in SUBMITTED after a
+ job storm</span></a> </span></p>
+ </td>
+ </tr>
+ <tr>
+ <td valign=top style='border:solid windowtext 1.0pt;border-top:none;
+ padding:0mm 5.4pt 0mm 5.4pt'>
<p class=MsoNormal><span style='font-size:10.0pt'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=4627"><span
- style='color:windowtext;text-decoration:none'> #4627</span></a></span></p>
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=5897"><span
+ style='color:windowtext;text-decoration:none'> #5897</span></a></span></p>
</td>
- <td width=499 valign=top style='width:373.95pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ <td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;
+ border-right:solid windowtext 1.0pt;padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=5897"><span
+ style='color:windowtext;text-decoration:none'>I20041203 LB installation
+ script has a missing dependency </span></a> </span></p>
+ </td>
+ </tr>
+ <tr>
+ <td valign=top style='border:solid windowtext 1.0pt;border-top:none;
padding:0mm 5.4pt 0mm 5.4pt'>
<p class=MsoNormal><span style='font-size:10.0pt'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=4627"><span
- style='color:windowtext;text-decoration:none'>no licence found in lb packages</span></a> </span></p>
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=5910"><span
+ style='color:windowtext;text-decoration:none'> #5910</span></a></span></p>
+ </td>
+ <td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;
+ border-right:solid windowtext 1.0pt;padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=5910"><span
+ style='color:windowtext;text-decoration:none'>glite-lb configuration scripts
+ don't set GLITE_USER environment</span></a> </span></p>
</td>
</tr>
<tr>
- <td width=121 valign=top style='width:90.45pt;border:solid windowtext 1.0pt;
- border-top:none;padding:0mm 5.4pt 0mm 5.4pt'>
+ <td valign=top style='border:solid windowtext 1.0pt;border-top:none;
+ padding:0mm 5.4pt 0mm 5.4pt'>
<p class=MsoNormal><span style='font-size:10.0pt'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=5236"><span
- style='color:windowtext;text-decoration:none'> #5236</span></a></span></p>
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=5925"><span
+ style='color:windowtext;text-decoration:none'> #5925</span></a></span></p>
</td>
- <td width=499 valign=top style='width:373.95pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ <td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;
+ border-right:solid windowtext 1.0pt;padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=5925"><span
+ style='color:windowtext;text-decoration:none'>Running glite-lb script removes
+ mysql.sock file </span></a> </span></p>
+ </td>
+ </tr>
+ <tr>
+ <td valign=top style='border:solid windowtext 1.0pt;border-top:none;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=6416"><span
+ style='color:windowtext;text-decoration:none'> #6416</span></a></span></p>
+ </td>
+ <td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;
+ border-right:solid windowtext 1.0pt;padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=6416"><span
+ style='color:windowtext;text-decoration:none'>the BKserver on the LB machine
+ needs a symlink and the script doesn't check for it</span></a> </span></p>
+ </td>
+ </tr>
+ <tr>
+ <td valign=top style='border:solid windowtext 1.0pt;border-top:none;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=7032"><span
+ style='color:windowtext;text-decoration:none'> #7032</span></a></span></p>
+ </td>
+ <td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;
+ border-right:solid windowtext 1.0pt;padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=7032"><span
+ style='color:windowtext;text-decoration:none'>The LB installer fails with an
+ RPM not found message</span></a> </span></p>
+ </td>
+ </tr>
+ <tr>
+ <td valign=top style='border:solid windowtext 1.0pt;border-top:none;
padding:0mm 5.4pt 0mm 5.4pt'>
<p class=MsoNormal><span style='font-size:10.0pt'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=5236"><span
- style='color:windowtext;text-decoration:none'>LB install/config documentation
- has some errors</span></a> </span></p>
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=7152"><span
+ style='color:windowtext;text-decoration:none'> #7152</span></a></span></p>
+ </td>
+ <td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;
+ border-right:solid windowtext 1.0pt;padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=7152"><span
+ style='color:windowtext;text-decoration:none'>The LB installer tries to
+ install gridsite with a wrong rpm name</span></a> </span></p>
</td>
</tr>
<tr>
<td valign=top style='border:solid windowtext 1.0pt;border-top:none;
padding:0mm 5.4pt 0mm 5.4pt'>
<p class=MsoNormal><span style='font-size:10.0pt'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=5912"><span
- style='color:windowtext;text-decoration:none'> #5912</span></a></span></p>
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=7351"><span
+ style='color:windowtext;text-decoration:none'> #7351</span></a></span></p>
</td>
<td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;
border-right:solid windowtext 1.0pt;padding:0mm 5.4pt 0mm 5.4pt'>
<p class=MsoNormal><span style='font-size:10.0pt'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=5912"><span
- style='color:windowtext;text-decoration:none'>glite-lb-bkserver daemon looks
- hangs is /tmp/mysql.sock is not present</span></a> </span></p>
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=7351"><span
+ style='color:windowtext;text-decoration:none'>Star/restart of LB services </span></a> </span></p>
</td>
</tr>
<tr>
- <td valign=top style='border:solid windowtext 1.0pt;border-top:none;
+ <td valign=top style='border:solid windowtext 1.0pt;border-top:none;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=7401"><span
+ style='color:windowtext;text-decoration:none'> #7401</span></a></span></p>
+ </td>
+ <td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;
+ border-right:solid windowtext 1.0pt;padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=7401"><span
+ style='color:windowtext;text-decoration:none'>The first time the LB config
+ script is run it fails creating the db indices</span></a> </span></p>
+ </td>
+ </tr>
+ <tr>
+ <td valign=top style='border:solid windowtext 1.0pt;border-top:none;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=7423"><span
+ style='color:windowtext;text-decoration:none'> #7423</span></a></span></p>
+ </td>
+ <td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;
+ border-right:solid windowtext 1.0pt;padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=7423"><span
+ style='color:windowtext;text-decoration:none'>'/etc/rc.d/init.d/gLite status'
+ not working correctly in LB</span></a> </span></p>
+ </td>
+ </tr>
+</table>
+
+<p class=MsoNormal align=left style='text-align:left'> </p>
+
+<b><span style='font-size:12.0pt;font-family:Arial;text-transform:uppercase;
+layout-grid-mode:line'><br clear=all style='page-break-before:always'>
+</span></b>
+
+<h1>7. Previous Releases</h1>
+
+<h2>7.1. Release 1.1.0</h2>
+
+<h3><span lang=FR>7.1.1. </span><span lang=FR>Release Description</span></h3>
+
+<p class=MsoNormal>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. </p>
+
+<h3><span lang=FR>7.1.2. </span><span lang=FR>Changes in this Release</span></h3>
+
+<p class=MsoNormal>This release introduces the following changes:</p>
+
+<p class=MsoNormal> </p>
+
+<ul style='margin-top:0mm' type=disc>
+ <li class=MsoNormal>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</li>
+ <li class=MsoNormal>Bug fixes (see below for the complete lists)</li>
+</ul>
+
+<h3>7.1.3. Release contents</h3>
+
+<p class=MsoNormal>The gLite Logging & Bookkeeping Server v. 1.1.0 is
+composed of the following gLite components:</p>
+
+<p class=MsoNormal> </p>
+
+<table class=MsoTableGrid border=1 cellspacing=0 cellpadding=0 width=634
+ style='width:475.4pt;border-collapse:collapse;border:none'>
+ <tr>
+ <td width=177 valign=top style='width:133.0pt;border:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'>Component name</span></p>
+ </td>
+ <td width=63 valign=top style='width:47.5pt;border:solid windowtext 1.0pt;
+ border-left:none;padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'>Version</span></p>
+ </td>
+ <td width=393 valign=top style='width:294.9pt;border:solid windowtext 1.0pt;
+ border-left:none;padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'>File</span></p>
+ </td>
+ </tr>
+ <tr>
+ <td width=177 valign=top style='width:133.0pt;border:solid windowtext 1.0pt;
+ border-top:none;padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span lang=EN-US style='font-size:10.0pt'>org.glite.deployment.lb</span></p>
+ </td>
+ <td width=63 valign=top style='width:47.5pt;border-top:none;border-left:none;
+ border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span lang=EN-US style='font-size:10.0pt'>1.1.0</span></p>
+ </td>
+ <td width=393 valign=top style='width:294.9pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span lang=EN-US style='font-size:10.0pt'><a
+ href="http://glite.web.cern.ch/glite/packages/I20041126/installers/glite-lb_installer.sh">http://glite.web.cern.ch/glite/packages/I20050225/installers/glite-lb_installer.sh</a>
+ </span></p>
+ <p class=MsoNormal><span class=MsoHyperlink><span lang=EN-US
+ style='font-size:10.0pt'><a
+ href="http://glite.web.cern.ch/glite/packages/I20050218/bin/rhel30/noarch/RPMS/glite-lb-config-1.1.0-1.noarch.rpm">http://glite.web.cern.ch/glite/packages/I20050225/bin/rhel30/noarch/RPMS/glite-lb-config-1.1.0-1.noarch.rpm</a></span></span></p>
+ </td>
+ </tr>
+ <tr>
+ <td width=177 valign=top style='width:133.0pt;border:solid windowtext 1.0pt;
+ border-top:none;padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span lang=EN-US style='font-size:10.0pt'>org.glite.deployment.config</span></p>
+ </td>
+ <td width=63 valign=top style='width:47.5pt;border-top:none;border-left:none;
+ border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span lang=EN-US style='font-size:10.0pt'>0.8.2</span></p>
+ </td>
+ <td width=393 valign=top style='width:294.9pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span class=MsoHyperlink><span lang=EN-US
+ style='font-size:10.0pt'><a
+ href="http://glite.web.cern.ch/glite/packages/I20050225/bin/rhel30/noarch/RPMS/glite-%20config-0.8.2-1.noarch.rpm">http://glite.web.cern.ch/glite/packages/I20050225/bin/rhel30/noarch/RPMS/glite-
+ config-0.8.2-1.noarch.rpm</a></span></span></p>
+ </td>
+ </tr>
+ <tr>
+ <td width=177 valign=top style='width:133.0pt;border:solid windowtext 1.0pt;
+ border-top:none;padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span lang=FR style='font-size:10.0pt'>org.glite.lb.client-interface</span></p>
+ </td>
+ <td width=63 valign=top style='width:47.5pt;border-top:none;border-left:none;
+ border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span lang=FR style='font-size:10.0pt'>1.0.1</span></p>
+ </td>
+ <td width=393 valign=top style='width:294.9pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span class=MsoHyperlink><span lang=EN-US
+ style='font-size:10.0pt'><a
+ href="http://glite.web.cern.ch/glite/packages/I20050218/bin/rhel30/i386/RPMS/glite-lb-client-interface-1.0.1-1.i386.rpm">http://glite.web.cern.ch/glite/packages/I20050225/bin/rhel30/i386/RPMS/glite-lb-client-interface-1.0.1-1.i386.rpm</a></span></span></p>
+ </td>
+ </tr>
+ <tr>
+ <td width=177 valign=top style='width:133.0pt;border:solid windowtext 1.0pt;
+ border-top:none;padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span lang=FR style='font-size:10.0pt'>org.glite.lb.</span><span
+ lang=EN-US style='font-size:10.0pt'>common</span></p>
+ </td>
+ <td width=63 valign=top style='width:47.5pt;border-top:none;border-left:none;
+ border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span lang=EN-US style='font-size:10.0pt'>1.1.3</span></p>
+ </td>
+ <td width=393 valign=top style='width:294.9pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span class=MsoHyperlink><span lang=EN-US
+ style='font-size:10.0pt'><a
+ href="http://glite.web.cern.ch/glite/packages/I20050218/bin/rhel30/i386/RPMS/glite-lb-common-1.1.3-1.i386.rpm">http://glite.web.cern.ch/glite/packages/I20050225/bin/rhel30/i386/RPMS/glite-lb-common-1.1.3-1.i386.rpm</a></span></span></p>
+ </td>
+ </tr>
+ <tr>
+ <td width=177 valign=top style='width:133.0pt;border:solid windowtext 1.0pt;
+ border-top:none;padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span lang=FR style='font-size:10.0pt'>org.glite.lb.</span><span
+ lang=EN-US style='font-size:10.0pt'>logger</span></p>
+ </td>
+ <td width=63 valign=top style='width:47.5pt;border-top:none;border-left:none;
+ border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span lang=EN-US style='font-size:10.0pt'>1.0.1</span></p>
+ </td>
+ <td width=393 valign=top style='width:294.9pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span class=MsoHyperlink><span lang=FR style='font-size:
+ 10.0pt'><a
+ href="http://glite.web.cern.ch/glite/packages/I20050218/bin/rhel30/i386/RPMS/glite-lb-logger-1.0.1-1.i386.rpm">http://glite.web.cern.ch/glite/packages/I20050225/bin/rhel30/i386/RPMS/glite-lb-logger-1.0.1-1.i386.rpm</a></span></span></p>
+ </td>
+ </tr>
+ <tr>
+ <td width=177 valign=top style='width:133.0pt;border:solid windowtext 1.0pt;
+ border-top:none;padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span lang=FR style='font-size:10.0pt'>org.glite.lb.server</span></p>
+ </td>
+ <td width=63 valign=top style='width:47.5pt;border-top:none;border-left:none;
+ border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span lang=FR style='font-size:10.0pt'>1.0.1</span></p>
+ </td>
+ <td width=393 valign=top style='width:294.9pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span class=MsoHyperlink><span lang=FR style='font-size:
+ 10.0pt'><a
+ href="http://glite.web.cern.ch/glite/packages/I20050218/bin/rhel30/i386/RPMS/glite-lb-server-1.0.1-1.i386.rpm">http://glite.web.cern.ch/glite/packages/I20050225/bin/rhel30/i386/RPMS/glite-lb-server-1.0.1-1.i386.rpm</a></span></span></p>
+ </td>
+ </tr>
+ <tr>
+ <td width=177 valign=top style='width:133.0pt;border:solid windowtext 1.0pt;
+ border-top:none;padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span lang=FR style='font-size:10.0pt'>org.glite.lb.</span><span
+ lang=EN-US style='font-size:10.0pt'>server-bones</span></p>
+ </td>
+ <td width=63 valign=top style='width:47.5pt;border-top:none;border-left:none;
+ border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span lang=EN-US style='font-size:10.0pt'>1.0.0</span></p>
+ </td>
+ <td width=393 valign=top style='width:294.9pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span class=MsoHyperlink><span lang=EN-US
+ style='font-size:10.0pt'><a
+ 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/I20050225/bin/rhel30/i386/RPMS/glite-lb-server-bones-1.0.0-1.i386.rpm</a></span></span></p>
+ </td>
+ </tr>
+ <tr>
+ <td width=177 valign=top style='width:133.0pt;border:solid windowtext 1.0pt;
+ border-top:none;padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span lang=FR style='font-size:10.0pt'>org.glite.lb.</span><span
+ lang=EN-US style='font-size:10.0pt'>ws-interface</span></p>
+ </td>
+ <td width=63 valign=top style='width:47.5pt;border-top:none;border-left:none;
+ border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span lang=EN-US style='font-size:10.0pt'>1.0.0</span></p>
+ </td>
+ <td width=393 valign=top style='width:294.9pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span class=MsoHyperlink><span lang=EN-US
+ style='font-size:10.0pt'><a
+ 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/I20050225/bin/rhel30/i386/RPMS/glite-lb-ws-interface-1.0.0-1.i386.rpm</a></span></span></p>
+ </td>
+ </tr>
+ <tr>
+ <td width=177 valign=top style='width:133.0pt;border:solid windowtext 1.0pt;
+ border-top:none;padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span lang=FR style='font-size:10.0pt'>org.glite.security.</span><span
+ lang=EN-US style='font-size:10.0pt'>proxyrenewal</span></p>
+ </td>
+ <td width=63 valign=top style='width:47.5pt;border-top:none;border-left:none;
+ border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span lang=EN-US style='font-size:10.0pt'>1.0.1</span></p>
+ </td>
+ <td width=393 valign=top style='width:294.9pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span class=MsoHyperlink><span lang=EN-US
+ style='font-size:10.0pt'><a
+ href="http://glite.web.cern.ch/glite/packages/I20050218/bin/rhel30/i386/RPMS/glite-security-proxyrenewal-1.0.1-1.i386.rpm">http://glite.web.cern.ch/glite/packages/I20050225/bin/rhel30/i386/RPMS/glite-security-proxyrenewal-1.0.1-1.i386.rpm</a></span></span></p>
+ </td>
+ </tr>
+ <tr>
+ <td width=177 valign=top style='width:133.0pt;border:solid windowtext 1.0pt;
+ border-top:none;padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span lang=FR style='font-size:10.0pt'>org.glite.wms-utils.exception</span></p>
+ </td>
+ <td width=63 valign=top style='width:47.5pt;border-top:none;border-left:none;
+ border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span lang=EN-US style='font-size:10.0pt'>1.0.0</span></p>
+ </td>
+ <td width=393 valign=top style='width:294.9pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span class=MsoHyperlink><span lang=EN-US
+ style='font-size:10.0pt'><a
+ 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/I20050225/bin/rhel30/i386/RPMS/glite-wms-utils-exception-1.0.0-1.i386.rpm</a></span></span></p>
+ </td>
+ </tr>
+ <tr>
+ <td width=177 valign=top style='width:133.0pt;border:solid windowtext 1.0pt;
+ border-top:none;padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span lang=EN-US style='font-size:10.0pt'>org.glite.wms-utils.jobid</span></p>
+ </td>
+ <td width=63 valign=top style='width:47.5pt;border-top:none;border-left:none;
+ border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span lang=EN-US style='font-size:10.0pt'>1.0.0</span></p>
+ </td>
+ <td width=393 valign=top style='width:294.9pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span class=MsoHyperlink><span lang=EN-US
+ style='font-size:10.0pt'><a
+ 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/I20050225/bin/rhel30/i386/RPMS/glite-wms-utils-jobid-1.0.0-1.i386.rpm</a></span></span></p>
+ </td>
+ </tr>
+ <tr>
+ <td width=177 valign=top style='width:133.0pt;border:solid windowtext 1.0pt;
+ border-top:none;padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span lang=FR style='font-size:10.0pt'>org.glite.security.voms</span></p>
+ </td>
+ <td width=63 valign=top style='width:47.5pt;border-top:none;border-left:none;
+ border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span lang=EN-US style='font-size:10.0pt'>1.2.29</span></p>
+ </td>
+ <td width=393 valign=top style='width:294.9pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span class=MsoHyperlink><span lang=EN-US
+ style='font-size:10.0pt'><a
+ href="http://glite.web.cern.ch/glite/packages/I20050218/bin/rhel30/i386/RPMS/glite-security-voms-1.2.29-22.i386.rpm">http://glite.web.cern.ch/glite/packages/I20050225/bin/rhel30/i386/RPMS/glite-security-voms-1.2.29-22.i386.rpm</a></span></span></p>
+ </td>
+ </tr>
+ <tr>
+ <td width=177 valign=top style='width:133.0pt;border:solid windowtext 1.0pt;
+ border-top:none;padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span lang=EN-US style='font-size:10.0pt'>org.gridsite.core</span></p>
+ </td>
+ <td width=63 valign=top style='width:47.5pt;border-top:none;border-left:none;
+ border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span lang=EN-US style='font-size:10.0pt'>1.1.5</span></p>
+ </td>
+ <td width=393 valign=top style='width:294.9pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span class=MsoHyperlink><span lang=EN-US
+ style='font-size:10.0pt'><a
+ href="http://glite.web.cern.ch/glite/packages/I20050218/bin/rhel30/i386/RPMS/gridsite-1.1.5-1.i386.rpm">http://glite.web.cern.ch/glite/packages/I20050225/bin/rhel30/i386/RPMS/gridsite-1.1.5-1.i386.rpm</a></span></span></p>
+ </td>
+ </tr>
+</table>
+
+<p class=MsoNormal><span lang=EN-US> </span></p>
+
+<h3>7.1.4. Dependencies</h3>
+
+<p class=MsoNormal>The gLite Logging & Bookkeeping Server module has the
+following dependencies:</p>
+
+<p class=MsoNormal> </p>
+
+<table class=MsoTableGrid border=1 cellspacing=0 cellpadding=0 width=640
+ style='width:480.3pt;border-collapse:collapse;border:none'>
+ <tr>
+ <td width=187 valign=top style='width:140.1pt;border:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
+ 10.0pt'>Component name</span></p>
+ </td>
+ <td width=66 valign=top style='width:49.6pt;border:solid windowtext 1.0pt;
+ border-left:none;padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'>Version</span></p>
+ </td>
+ <td width=387 valign=top style='width:290.6pt;border:solid windowtext 1.0pt;
+ border-left:none;padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'>RPM file name</span></p>
+ </td>
+ </tr>
+ <tr>
+ <td width=187 valign=top style='width:140.1pt;border:solid windowtext 1.0pt;
+ border-top:none;padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal align=left style='text-align:left'><span lang=EN-US
+ style='font-size:10.0pt'>gLite Security Utilities</span></p>
+ </td>
+ <td width=66 valign=top style='width:49.6pt;border-top:none;border-left:none;
+ border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span lang=EN-US style='font-size:10.0pt'>0.6.1</span></p>
+ </td>
+ <td width=387 valign=top style='width:290.6pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span class=MsoHyperlink><span lang=EN-US
+ style='font-size:10.0pt'><a
+ href="http://glite.web.cern.ch/glite/packages/I20050218/installers/glite-security-utils_installer.sh">http://glite.web.cern.ch/glite/packages/I20050225/installers/glite-security-utils_installer.sh</a></span></span></p>
+ </td>
+ </tr>
+ <tr>
+ <td width=187 valign=top style='width:140.1pt;border:solid windowtext 1.0pt;
+ border-top:none;padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal align=left style='text-align:left'><span lang=EN-US
+ style='font-size:10.0pt'>gLite </span><span style='font-size:10.0pt'>R-GMA </span><span
+ lang=EN-US style='font-size:10.0pt'>Service Publisher</span></p>
+ </td>
+ <td width=66 valign=top style='width:49.6pt;border-top:none;border-left:none;
+ border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span lang=EN-US style='font-size:10.0pt'>4.1.2</span></p>
+ </td>
+ <td width=387 valign=top style='width:290.6pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span class=MsoHyperlink><span lang=EN-US
+ style='font-size:10.0pt'><a
+ href="http://glite.web.cern.ch/glite/packages/I20050225/installers/glite-rgma-servicetool_installer.sh">http://glite.web.cern.ch/glite/packages/I20050225/installers/glite-rgma-servicetool_installer.sh</a></span></span></p>
+ </td>
+ </tr>
+ <tr>
+ <td width=187 valign=top style='width:140.1pt;border:solid windowtext 1.0pt;
+ border-top:none;padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
+ 10.0pt'>GPT</span></p>
+ </td>
+ <td width=66 valign=top style='width:49.6pt;border-top:none;border-left:none;
+ border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'>VDT 1.2.2</span></p>
+ </td>
+ <td width=387 valign=top style='width:290.6pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span class=MsoHyperlink><span lang=EN-US
+ style='font-size:10.0pt'><a
+ href="http://glite.web.cern.ch/glite/packages/externals/bin/rhel30/RPMS/gpt-VDT1.2.0rh9-1.i386.rpm">http://glite.web.cern.ch/glite/packages/externals/bin/rhel30/RPMS/gpt-<span
+ lang=EN-GB>VDT1.2.0rh9</span>-1.i386.rpm</a></span></span></p>
+ </td>
+ </tr>
+ <tr>
+ <td width=187 valign=top style='width:140.1pt;border:solid windowtext 1.0pt;
+ border-top:none;padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
+ 10.0pt'>VDT Globus Essentials</span></p>
+ </td>
+ <td width=66 valign=top style='width:49.6pt;border-top:none;border-left:none;
+ border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'>VDT 1.2.2</span></p>
+ </td>
+ <td width=387 valign=top style='width:290.6pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span class=MsoHyperlink><span lang=EN-US
+ style='font-size:10.0pt'><a
+ href="http://glite.web.cern.ch/glite/packages/externals/bin/rhel30/RPMS/vdt_globus_essentials-VDT1.2.0rh9-1.i386.rpm">http://glite.web.cern.ch/glite/packages/externals/bin/rhel30/RPMS/vdt_globus_essentials-<span
+ lang=EN-GB>VDT1.2.0rh9</span>-1.i386.rpm</a></span></span></p>
+ </td>
+ </tr>
+ <tr>
+ <td width=187 valign=top style='width:140.1pt;border:solid windowtext 1.0pt;
+ border-top:none;padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
+ 10.0pt'>MySQL-server</span></p>
+ </td>
+ <td width=66 valign=top style='width:49.6pt;border-top:none;border-left:none;
+ border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'>4.0.20</span></p>
+ </td>
+ <td width=387 valign=top style='width:290.6pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span class=MsoHyperlink><span lang=EN-US
+ style='font-size:10.0pt'><a
+ href="http://glite.web.cern.ch/glite/packages/externals/bin/rhel30/RPMS/MySQL-server-4.0.20-0.i386.rpm">http://glite.web.cern.ch/glite/packages/externals/bin/rhel30/RPMS/MySQL-server-<span
+ lang=EN-GB>4.0.20</span>-0.i386.rpm</a></span></span></p>
+ </td>
+ </tr>
+ <tr>
+ <td width=187 valign=top style='width:140.1pt;border:solid windowtext 1.0pt;
+ border-top:none;padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
+ 10.0pt'>MySQL-client</span></p>
+ </td>
+ <td width=66 valign=top style='width:49.6pt;border-top:none;border-left:none;
+ border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'>4.0.20</span></p>
+ </td>
+ <td width=387 valign=top style='width:290.6pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span class=MsoHyperlink><span lang=EN-US
+ style='font-size:10.0pt'><a
+ href="http://glite.web.cern.ch/glite/packages/externals/bin/rhel30/RPMS/MySQL-client-4.0.20-0.i386.rpm">http://glite.web.cern.ch/glite/packages/externals/bin/rhel30/RPMS/MySQL-client-<span
+ lang=EN-GB>4.0.20</span>-0.i386.rpm</a></span></span></p>
+ </td>
+ </tr>
+ <tr>
+ <td width=187 valign=top style='width:140.1pt;border:solid windowtext 1.0pt;
+ border-top:none;padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
+ 10.0pt'>ares</span></p>
+ </td>
+ <td width=66 valign=top style='width:49.6pt;border-top:none;border-left:none;
+ border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'>1.1.1</span></p>
+ </td>
+ <td width=387 valign=top style='width:290.6pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span class=MsoHyperlink><span lang=EN-US
+ style='font-size:10.0pt'><a
+ href="http://glite.web.cern.ch/glite/packages/externals/bin/rhel30/RPMS/ares-1.1.1-EGEE.i386.rpm">http://glite.web.cern.ch/glite/packages/externals/bin/rhel30/RPMS/ares-<span
+ lang=EN-GB>1.1.1</span>-EGEE.i386.rpm</a></span></span></p>
+ </td>
+ </tr>
+ <tr>
+ <td width=187 valign=top style='width:140.1pt;border:solid windowtext 1.0pt;
+ border-top:none;padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
+ 10.0pt'>myproxy</span></p>
+ </td>
+ <td width=66 valign=top style='width:49.6pt;border-top:none;border-left:none;
+ border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'>1.14</span></p>
+ </td>
+ <td width=387 valign=top style='width:290.6pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span class=MsoHyperlink><span lang=EN-US
+ style='font-size:10.0pt'><a
+ href="http://glite.web.cern.ch/glite/packages/externals/bin/rhel30/RPMS/myproxy-1.14-EGEE.i386.rpm">http://glite.web.cern.ch/glite/packages/externals/bin/rhel30/RPMS/myproxy-<span
+ lang=EN-GB>1.14</span>-EGEE.i386.rpm</a></span></span></p>
+ </td>
+ </tr>
+ <tr>
+ <td width=187 valign=top style='width:140.1pt;border:solid windowtext 1.0pt;
+ border-top:none;padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal align=left style='text-align:left'><span style='font-size:
+ 10.0pt'>perl-Expect.pm</span></p>
+ </td>
+ <td width=66 valign=top style='width:49.6pt;border-top:none;border-left:none;
+ border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'>1.01</span></p>
+ </td>
+ <td width=387 valign=top style='width:290.6pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span class=MsoHyperlink><span lang=EN-US
+ style='font-size:10.0pt'><a
+ href="http://glite.web.cern.ch/glite/packages/externals/bin/rhel30/RPMS/per-Expect.pm-1.01-9.i386.rpm">http://glite.web.cern.ch/glite/packages/externals/bin/rhel30/RPMS/per-Expect.pm-<span
+ lang=EN-GB>1.01</span>-9.i386.rpm</a></span></span></p>
+ </td>
+ </tr>
+</table>
+
+<p class=MsoNormal> </p>
+
+<h3>7.1.5. Known bugs and issues</h3>
+
+<p class=MsoNormal align=left style='text-align:left'>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 <a
+href="https://savannah.cern.ch/bugs/?group=jra1mdw">https://savannah.cern.ch/bugs/?group=jra1mdw</a>
+.</p>
+
+<p class=MsoNormal align=left style='text-align:left'> </p>
+
+<ul style='margin-top:0mm' type=disc>
+ <li class=MsoNormal style='text-align:left'>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.</li>
+ <li class=MsoNormal style='text-align:left'>No inet.d scripts are installed or
+ activated in this release. This will be fixed in the next release</li>
+</ul>
+
+<p class=MsoNormal align=left style='text-align:left'> </p>
+
+<p class=MsoNormal align=left style='text-align:left'>Known open bugs:</p>
+
+<p class=MsoNormal align=left style='text-align:left'> </p>
+
+<table class=MsoTableGrid border=1 cellspacing=0 cellpadding=0
+ style='border-collapse:collapse;border:none'>
+ <tr>
+ <td width=58 valign=top style='width:43.55pt;border:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'>Bug number</span></p>
+ </td>
+ <td width=535 valign=top style='width:401.3pt;border:solid windowtext 1.0pt;
+ border-left:none;padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'>Description</span></p>
+ </td>
+ <td width=26 valign=top style='width:19.55pt;border:solid windowtext 1.0pt;
+ border-left:none;padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'> </span></p>
+ </td>
+ </tr>
+ <tr>
+ <td valign=top style='border:solid windowtext 1.0pt;border-top:none;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=6057"><span
+ style='color:windowtext;text-decoration:none'> #6057</span></a></span></p>
+ </td>
+ <td width=535 valign=top style='width:401.3pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=6057"><span
+ style='color:windowtext;text-decoration:none'>glite-lb configuration scripts
+ has missing dependency (CGI.pm)</span></a> </span></p>
+ </td>
+ <td width=26 valign=top style='width:19.55pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'> </span></p>
+ </td>
+ </tr>
+ <tr>
+ <td valign=top style='border:solid windowtext 1.0pt;border-top:none;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=6415"><span
+ style='color:windowtext;text-decoration:none'> #6415</span></a></span></p>
+ </td>
+ <td width=535 valign=top style='width:401.3pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=6415"><span
+ style='color:windowtext;text-decoration:none'>glite-lb-bkserver does not
+ start and blocks execution of glite-lb-config.py</span></a> </span></p>
+ </td>
+ <td width=26 valign=top style='width:19.55pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'> </span></p>
+ </td>
+ </tr>
+ <tr>
+ <td valign=top style='border:solid windowtext 1.0pt;border-top:none;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=6722"><span
+ style='color:windowtext;text-decoration:none'> #6722</span></a></span></p>
+ </td>
+ <td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;
+ border-right:solid windowtext 1.0pt;padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=6722"><span
+ style='color:windowtext;text-decoration:none'>glite-job-status -all doesn't
+ work</span></a> </span></p>
+ </td>
+ <td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;
+ border-right:solid windowtext 1.0pt;padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'> </span></p>
+ </td>
+ </tr>
+ <tr>
+ <td valign=top style='border:solid windowtext 1.0pt;border-top:none;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=6838"><span
+ style='color:windowtext;text-decoration:none'> #6838</span></a></span></p>
+ </td>
+ <td width=535 valign=top style='width:401.3pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=6838"><span
+ style='color:windowtext;text-decoration:none'>There are no test reports
+ provided for the L&B Server in gLite v1.0.6 RC1 (Integration Build
+ I20050204)</span></a> </span></p>
+ </td>
+ <td width=26 valign=top style='width:19.55pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'> </span></p>
+ </td>
+ </tr>
+ <tr>
+ <td valign=top style='border:solid windowtext 1.0pt;border-top:none;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=7032"><span
+ style='color:windowtext;text-decoration:none'> #7032</span></a></span></p>
+ </td>
+ <td width=535 valign=top style='width:401.3pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=7032"><span
+ style='color:windowtext;text-decoration:none'>The LB installer fails with an
+ RPM not found message</span></a> </span></p>
+ </td>
+ <td width=26 valign=top style='width:19.55pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'> </span></p>
+ </td>
+ </tr>
+ <tr>
+ <td valign=top style='border:solid windowtext 1.0pt;border-top:none;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=7039"><span
+ style='color:windowtext;text-decoration:none'> #7039</span></a></span></p>
+ </td>
+ <td width=535 valign=top style='width:401.3pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=7039"><span
+ style='color:windowtext;text-decoration:none'>Problem if LD_LIBRARY_PATH is
+ unset</span></a> </span></p>
+ </td>
+ <td width=26 valign=top style='width:19.55pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'> </span></p>
+ </td>
+ </tr>
+ <tr>
+ <td valign=top style='border:solid windowtext 1.0pt;border-top:none;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=7053"><span
+ style='color:windowtext;text-decoration:none'> #7053</span></a></span></p>
+ </td>
+ <td width=535 valign=top style='width:401.3pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=7053"><span
+ style='color:windowtext;text-decoration:none'>LB configuration fails if the
+ mysql root pwd is set</span></a> </span></p>
+ </td>
+ <td width=26 valign=top style='width:19.55pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'> </span></p>
+ </td>
+ </tr>
+ <tr>
+ <td valign=top style='border:solid windowtext 1.0pt;border-top:none;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=7180"><span
+ style='color:windowtext;text-decoration:none'> #7180</span></a></span></p>
+ </td>
+ <td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;
+ border-right:solid windowtext 1.0pt;padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=7180"><span
+ style='color:windowtext;text-decoration:none'>Logging & Bookkeping UI </span></a> </span></p>
+ </td>
+ <td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;
+ border-right:solid windowtext 1.0pt;padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'> </span></p>
+ </td>
+ </tr>
+</table>
+
+<p class=MsoNormal> </p>
+
+<p class=MsoNormal>Bugs fixed in this or previous releases, but not yet tested:</p>
+
+<p class=MsoNormal> </p>
+
+<table class=MsoTableGrid border=1 cellspacing=0 cellpadding=0
+ style='border-collapse:collapse;border:none'>
+ <tr>
+ <td width=59 valign=top style='width:44.45pt;border:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'>Bug number</span></p>
+ </td>
+ <td width=534 valign=top style='width:400.4pt;border:solid windowtext 1.0pt;
+ border-left:none;padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'>Description</span></p>
+ </td>
+ <td width=26 valign=top style='width:19.55pt;border:solid windowtext 1.0pt;
+ border-left:none;padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'> </span></p>
+ </td>
+ </tr>
+ <tr>
+ <td valign=top style='border:solid windowtext 1.0pt;border-top:none;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=5833"><span
+ style='color:windowtext;text-decoration:none'> #5833</span></a></span></p>
+ </td>
+ <td width=534 valign=top style='width:400.4pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=5833"><span
+ style='color:windowtext;text-decoration:none'>all jobs in SUBMITTED after a
+ job storm</span></a> </span></p>
+ </td>
+ <td width=26 valign=top style='width:19.55pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'> </span></p>
+ </td>
+ </tr>
+ <tr>
+ <td valign=top style='border:solid windowtext 1.0pt;border-top:none;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=5850"><span
+ style='color:windowtext;text-decoration:none'> #5850</span></a></span></p>
+ </td>
+ <td width=534 valign=top style='width:400.4pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=5850"><span
+ style='color:windowtext;text-decoration:none'>glite-lb-config.py has
+ glite.location and globus.location not set in params[]</span></a> </span></p>
+ </td>
+ <td width=26 valign=top style='width:19.55pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'> </span></p>
+ </td>
+ </tr>
+ <tr>
+ <td valign=top style='border:solid windowtext 1.0pt;border-top:none;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=5897"><span
+ style='color:windowtext;text-decoration:none'> #5897</span></a></span></p>
+ </td>
+ <td width=534 valign=top style='width:400.4pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=5897"><span
+ style='color:windowtext;text-decoration:none'>I20041203 LB installation
+ script has a missing dependency </span></a> </span></p>
+ </td>
+ <td width=26 valign=top style='width:19.55pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'> </span></p>
+ </td>
+ </tr>
+ <tr>
+ <td valign=top style='border:solid windowtext 1.0pt;border-top:none;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=5901"><span
+ style='color:windowtext;text-decoration:none'> #5901</span></a></span></p>
+ </td>
+ <td width=534 valign=top style='width:400.4pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=5901"><span
+ style='color:windowtext;text-decoration:none'>mysqlaccess command fails with
+ Broken pipe if mysql socket file is in /tmp </span></a> </span></p>
+ </td>
+ <td width=26 valign=top style='width:19.55pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'> </span></p>
+ </td>
+ </tr>
+ <tr>
+ <td valign=top style='border:solid windowtext 1.0pt;border-top:none;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=5908"><span
+ style='color:windowtext;text-decoration:none'> #5908</span></a></span></p>
+ </td>
+ <td width=534 valign=top style='width:400.4pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=5908"><span
+ style='color:windowtext;text-decoration:none'>Environment variables set via
+ the configuration script are not passed to daemon startup scripts</span></a> </span></p>
+ </td>
+ <td width=26 valign=top style='width:19.55pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'> </span></p>
+ </td>
+ </tr>
+ <tr>
+ <td valign=top style='border:solid windowtext 1.0pt;border-top:none;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=5910"><span
+ style='color:windowtext;text-decoration:none'> #5910</span></a></span></p>
+ </td>
+ <td width=534 valign=top style='width:400.4pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=5910"><span
+ style='color:windowtext;text-decoration:none'>glite-lb configuration scripts
+ don't set GLITE_USER environment</span></a> </span></p>
+ </td>
+ <td width=26 valign=top style='width:19.55pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'> </span></p>
+ </td>
+ </tr>
+ <tr>
+ <td valign=top style='border:solid windowtext 1.0pt;border-top:none;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=5925"><span
+ style='color:windowtext;text-decoration:none'> #5925</span></a></span></p>
+ </td>
+ <td width=534 valign=top style='width:400.4pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=5925"><span
+ style='color:windowtext;text-decoration:none'>Running glite-lb script removes
+ mysql.sock file </span></a> </span></p>
+ </td>
+ <td width=26 valign=top style='width:19.55pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'> </span></p>
+ </td>
+ </tr>
+ <tr>
+ <td valign=top style='border:solid windowtext 1.0pt;border-top:none;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=6075"><span
+ style='color:windowtext;text-decoration:none'> #6075</span></a></span></p>
+ </td>
+ <td width=534 valign=top style='width:400.4pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=6075"><span
+ style='color:windowtext;text-decoration:none'>glite-lb-config.py crashes with
+ KeyError: GLITE_CERT_DIR</span></a> </span></p>
+ </td>
+ <td width=26 valign=top style='width:19.55pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'> </span></p>
+ </td>
+ </tr>
+ <tr>
+ <td valign=top style='border:solid windowtext 1.0pt;border-top:none;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=6366"><span
+ style='color:windowtext;text-decoration:none'> #6366</span></a></span></p>
+ </td>
+ <td width=534 valign=top style='width:400.4pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=6366"><span
+ style='color:windowtext;text-decoration:none'>LB install script:: Fails but
+ no error reported</span></a> </span></p>
+ </td>
+ <td width=26 valign=top style='width:19.55pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'> </span></p>
+ </td>
+ </tr>
+ <tr>
+ <td valign=top style='border:solid windowtext 1.0pt;border-top:none;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=6412"><span
+ style='color:windowtext;text-decoration:none'> #6412</span></a></span></p>
+ </td>
+ <td width=534 valign=top style='width:400.4pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=6412"><span
+ style='color:windowtext;text-decoration:none'>--start and --stop options not
+ documented in glite-ce-config.py, glite-lb-config.py</span></a> </span></p>
+ </td>
+ <td width=26 valign=top style='width:19.55pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'> </span></p>
+ </td>
+ </tr>
+ <tr>
+ <td valign=top style='border:solid windowtext 1.0pt;border-top:none;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=6416"><span
+ style='color:windowtext;text-decoration:none'> #6416</span></a></span></p>
+ </td>
+ <td width=534 valign=top style='width:400.4pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=6416"><span
+ style='color:windowtext;text-decoration:none'>the BKserver on the LB machine
+ needs a symlink and the script doesn't check for it</span></a> </span></p>
+ </td>
+ <td width=26 valign=top style='width:19.55pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'> </span></p>
+ </td>
+ </tr>
+</table>
+
+<p class=MsoNormal align=left style='margin:0mm;margin-bottom:.0001pt;
+text-align:left;text-autospace:none'><span lang=EN-US style='font-size:10.0pt;
+font-family:"Courier New"'> </span></p>
+
+<h3>7.1.6. Bugs closed since last release</h3>
+
+<p class=MsoNormal align=left style='text-align:left'>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 <a
+href="https://savannah.cern.ch/bugs/?group=jra1mdw">https://savannah.cern.ch/bugs/?group=jra1mdw</a>
+ </p>
+
+<p class=MsoNormal align=left style='text-align:left'> </p>
+
+<table class=MsoTableGrid border=1 cellspacing=0 cellpadding=0
+ style='border-collapse:collapse;border:none'>
+ <tr>
+ <td width=120 valign=top style='width:89.9pt;border:solid windowtext 1.0pt;
padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span style='font-size:10.0pt'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=5930"><span
- style='color:windowtext;text-decoration:none'> #5930</span></a></span></p>
+ <p class=MsoNormal><span style='font-size:10.0pt'>Bug number</span></p>
</td>
- <td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;
- border-right:solid windowtext 1.0pt;padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span style='font-size:10.0pt'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=5930"><span
- style='color:windowtext;text-decoration:none'>running start on started
- service is not an error. </span></a> </span></p>
+ <td width=499 valign=top style='width:374.5pt;border:solid windowtext 1.0pt;
+ border-left:none;padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'>Description</span></p>
</td>
</tr>
</table>
<p class=MsoNormal align=left style='text-align:left'> </p>
-<h1>6. Previous Releases</h1>
-
-<h2>6.1. Release 0.1.0</h2>
+<h2>7.2. Release 1.0.0</h2>
-<h3><span lang=FR>6.1.1. </span><span lang=FR>Release Description</span></h3>
+<h3><span lang=FR>7.2.1. </span><span lang=FR>Release Description</span></h3>
<p class=MsoNormal>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. </p>
-<h3>6.1.2. <span lang=FR>Release</span> contents</h3>
+<h3><span lang=FR>7.2.2. </span><span lang=FR>Changes in this Release</span></h3>
-<p class=MsoNormal>The gLite Logging & Bookkeeping Server v. 0.1.0 is
+<p class=MsoNormal>This release doesn\92t contain any functional changes. It
+contains a number of bug fixes in the components and the deployment module to
+be submitted to testing.</p>
+
+<p class=MsoNormal>However, the version number has been changed to match the
+final release number 1.0.0.</p>
+
+<h3>7.2.3. Release contents</h3>
+
+<p class=MsoNormal>The gLite Logging & Bookkeeping Server v. 0.3.1 is
composed of the following gLite components:</p>
<p class=MsoNormal> </p>
<td width=63 valign=top style='width:47.5pt;border-top:none;border-left:none;
border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span lang=EN-US style='font-size:10.0pt'>0.1.0</span></p>
+ <p class=MsoNormal><span lang=EN-US style='font-size:10.0pt'>1.0.0</span></p>
</td>
<td width=393 valign=top style='width:294.9pt;border-top:none;border-left:
none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
padding:0mm 5.4pt 0mm 5.4pt'>
<p class=MsoNormal><span lang=EN-US style='font-size:10.0pt'><a
- href="http://glite.web.cern.ch/glite/packages/I20041126/installers/glite-lb_installer.sh">http://glite.web.cern.ch/glite/packages/I20041126/installers/glite-lb_installer.sh</a>
+ 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</a>
</span></p>
<p class=MsoNormal><span class=MsoHyperlink><span lang=EN-US
style='font-size:10.0pt'><a
- href="http://glite.web.cern.ch/glite/packages/I20041126/bin/rhel30/noarch/RPMS/glite-lb-config-0.1.0-1.noarch.rpm">http://glite.web.cern.ch/glite/packages/I20041126/bin/rhel30/noarch/RPMS/glite-lb-config-0.1.0-1.noarch.rpm</a></span></span></p>
+ 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</a></span></span></p>
</td>
</tr>
<tr>
<td width=63 valign=top style='width:47.5pt;border-top:none;border-left:none;
border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span lang=EN-US style='font-size:10.0pt'>0.1.0</span></p>
+ <p class=MsoNormal><span lang=EN-US style='font-size:10.0pt'>0.4.1</span></p>
</td>
<td width=393 valign=top style='width:294.9pt;border-top:none;border-left:
none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
padding:0mm 5.4pt 0mm 5.4pt'>
<p class=MsoNormal><span class=MsoHyperlink><span lang=EN-US
style='font-size:10.0pt'><a
- href="http://glite.web.cern.ch/glite/packages/I20041126/bin/rhel30/noarch/RPMS/glite-ce-config-0.1.0-1.noarch.rpm">http://glite.web.cern.ch/glite/packages/I20041126/bin/rhel30/noarch/RPMS/glite-
- config-0.1.0-1.noarch.rpm</a></span></span></p>
+ 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</a></span></span></p>
</td>
</tr>
<tr>
<td width=63 valign=top style='width:47.5pt;border-top:none;border-left:none;
border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span lang=FR style='font-size:10.0pt'>0.3.0</span></p>
+ <p class=MsoNormal><span lang=FR style='font-size:10.0pt'>1.0.0</span></p>
+ </td>
+ <td width=393 valign=top style='width:294.9pt;border-top:none;border-left:
+ none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span class=MsoHyperlink><span lang=EN-US
+ style='font-size:10.0pt'><a
+ href="http://glite.web.cern.ch/glite/packages/I20050107/bin/rhel30/i386/RPMS/glite-lb-client-interface-1.0.0-1.i386.rpm">http://glite.web.cern.ch/glite/packages/I20050114/bin/rhel30/i386/RPMS/glite-lb-client-interface-1.0.0-1.i386.rpm</a></span></span></p>
+ </td>
+ </tr>
+ <tr>
+ <td width=177 valign=top style='width:133.0pt;border:solid windowtext 1.0pt;
+ border-top:none;padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span lang=EN-US style='font-size:10.0pt'>glite-lb-common</span></p>
+ </td>
+ <td width=63 valign=top style='width:47.5pt;border-top:none;border-left:none;
+ border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span lang=EN-US style='font-size:10.0pt'>1.1.0</span></p>
</td>
<td width=393 valign=top style='width:294.9pt;border-top:none;border-left:
none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
padding:0mm 5.4pt 0mm 5.4pt'>
<p class=MsoNormal><span class=MsoHyperlink><span lang=EN-US
style='font-size:10.0pt'><a
- href="http://glite.web.cern.ch/glite/packages/I20041126/bin/rhel30/i386/RPMS/glite-lb-client-interface-0.3.0-2.i386.rpm">http://glite.web.cern.ch/glite/packages/I20041126/bin/rhel30/i386/RPMS/glite-lb-client-interface-0.3.0-2.i386.rpm</a></span></span></p>
+ 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</a></span></span></p>
</td>
</tr>
<tr>
<td width=63 valign=top style='width:47.5pt;border-top:none;border-left:none;
border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span lang=EN-US style='font-size:10.0pt'>0.3.0</span></p>
+ <p class=MsoNormal><span lang=EN-US style='font-size:10.0pt'>1.0.0</span></p>
</td>
<td width=393 valign=top style='width:294.9pt;border-top:none;border-left:
none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
padding:0mm 5.4pt 0mm 5.4pt'>
<p class=MsoNormal><span class=MsoHyperlink><span lang=FR style='font-size:
10.0pt'><a
- href="http://glite.web.cern.ch/glite/packages/I20041126/bin/rhel30/i386/RPMS/glite-lb-logger-0.3.0-3.i386.rpm">http://glite.web.cern.ch/glite/packages/I20041126/bin/rhel30/i386/RPMS/glite-lb-logger-0.3.0-3.i386.rpm</a></span></span></p>
+ 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</a></span></span></p>
</td>
</tr>
<tr>
<td width=177 valign=top style='width:133.0pt;border:solid windowtext 1.0pt;
border-top:none;padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span lang=EN-US style='font-size:10.0pt'>glite-lb-common</span></p>
+ <p class=MsoNormal><span lang=FR style='font-size:10.0pt'>glite-lb-server</span></p>
</td>
<td width=63 valign=top style='width:47.5pt;border-top:none;border-left:none;
border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span lang=EN-US style='font-size:10.0pt'>0.3.0</span></p>
+ <p class=MsoNormal><span lang=FR style='font-size:10.0pt'>1.0.0</span></p>
</td>
<td width=393 valign=top style='width:294.9pt;border-top:none;border-left:
none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span class=MsoHyperlink><span lang=EN-US
- style='font-size:10.0pt'><a
- href="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/I20041126/bin/rhel30/i386/RPMS/glite-lb-common-0.3.0-2.i386.rpm</a></span></span></p>
+ <p class=MsoNormal><span class=MsoHyperlink><span lang=FR style='font-size:
+ 10.0pt'><a
+ href="http://glite.web.cern.ch/glite/packages/I20050107/bin/rhel30/i386/RPMS/glite-lb-server-1.0.0-1.i386.rpm">http://glite.web.cern.ch/glite/packages/I20050114/bin/rhel30/i386/RPMS/glite-lb-server-1.0.0-1.i386.rpm</a></span></span></p>
</td>
</tr>
<tr>
<td width=177 valign=top style='width:133.0pt;border:solid windowtext 1.0pt;
border-top:none;padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span lang=EN-US style='font-size:10.0pt'>glite-lb-server</span></p>
+ <p class=MsoNormal><span lang=EN-US style='font-size:10.0pt'>glite-lb-server-bones</span></p>
</td>
<td width=63 valign=top style='width:47.5pt;border-top:none;border-left:none;
border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span lang=EN-US style='font-size:10.0pt'>0.5.2</span></p>
+ <p class=MsoNormal><span lang=EN-US style='font-size:10.0pt'>1.0.0</span></p>
</td>
<td width=393 valign=top style='width:294.9pt;border-top:none;border-left:
none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
padding:0mm 5.4pt 0mm 5.4pt'>
<p class=MsoNormal><span class=MsoHyperlink><span lang=EN-US
style='font-size:10.0pt'><a
- href="http://glite.web.cern.ch/glite/packages/I20041126/bin/rhel30/i386/RPMS/glite-lb-server-0.5.2-4.i386.rpm">http://glite.web.cern.ch/glite/packages/I20041126/bin/rhel30/i386/RPMS/glite-lb-server-0.5.2-4.i386.rpm</a></span></span></p>
+ 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</a></span></span></p>
</td>
</tr>
<tr>
<td width=177 valign=top style='width:133.0pt;border:solid windowtext 1.0pt;
border-top:none;padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span lang=EN-US style='font-size:10.0pt'>glite-lb-server-bones</span></p>
+ <p class=MsoNormal><span lang=EN-US style='font-size:10.0pt'>glite-lb-ws-interface</span></p>
</td>
<td width=63 valign=top style='width:47.5pt;border-top:none;border-left:none;
border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span lang=EN-US style='font-size:10.0pt'>0.1.0</span></p>
+ <p class=MsoNormal><span lang=EN-US style='font-size:10.0pt'>1.0.0</span></p>
</td>
<td width=393 valign=top style='width:294.9pt;border-top:none;border-left:
none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
padding:0mm 5.4pt 0mm 5.4pt'>
<p class=MsoNormal><span class=MsoHyperlink><span lang=EN-US
style='font-size:10.0pt'><a
- href="http://glite.web.cern.ch/glite/packages/I20041126/bin/rhel30/i386/RPMS/glite-lb-server-bones-0.1.0-1.i386.rpm">http://glite.web.cern.ch/glite/packages/I20041126/bin/rhel30/i386/RPMS/glite-lb-server-bones-0.1.0-1.i386.rpm</a></span></span></p>
+ 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</a></span></span></p>
</td>
</tr>
<tr>
<td width=177 valign=top style='width:133.0pt;border:solid windowtext 1.0pt;
border-top:none;padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span lang=EN-US style='font-size:10.0pt'>glite-wms-utils-jobid</span></p>
+ <p class=MsoNormal><span lang=EN-US style='font-size:10.0pt'>glite-security-proxyrenewal</span></p>
</td>
<td width=63 valign=top style='width:47.5pt;border-top:none;border-left:none;
border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span lang=EN-US style='font-size:10.0pt'>0.1.2</span></p>
+ <p class=MsoNormal><span lang=EN-US style='font-size:10.0pt'>1.0.0</span></p>
</td>
<td width=393 valign=top style='width:294.9pt;border-top:none;border-left:
none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
padding:0mm 5.4pt 0mm 5.4pt'>
<p class=MsoNormal><span class=MsoHyperlink><span lang=EN-US
style='font-size:10.0pt'><a
- href="http://glite.web.cern.ch/glite/packages/I20041126/bin/rhel30/i386/RPMS/glite-wms-utils-jobid-0.1.2-1.i386.rpm">http://glite.web.cern.ch/glite/packages/I20041126/bin/rhel30/i386/RPMS/glite-wms-utils-jobid-0.1.2-1.i386.rpm</a></span></span></p>
+ 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</a></span></span></p>
</td>
</tr>
<tr>
<td width=63 valign=top style='width:47.5pt;border-top:none;border-left:none;
border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span lang=EN-US style='font-size:10.0pt'>0.1.2</span></p>
+ <p class=MsoNormal><span lang=EN-US style='font-size:10.0pt'>1.0.0</span></p>
</td>
<td width=393 valign=top style='width:294.9pt;border-top:none;border-left:
none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
padding:0mm 5.4pt 0mm 5.4pt'>
<p class=MsoNormal><span class=MsoHyperlink><span lang=EN-US
style='font-size:10.0pt'><a
- href="http://glite.web.cern.ch/glite/packages/I20041126/bin/rhel30/i386/RPMS/glite-wms-utils-exception-0.1.2-1.i386.rpm">http://glite.web.cern.ch/glite/packages/I20041126/bin/rhel30/i386/RPMS/glite-wms-utils-exception-0.1.2-1.i386.rpm</a></span></span></p>
+ 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</a></span></span></p>
</td>
</tr>
<tr>
<td width=177 valign=top style='width:133.0pt;border:solid windowtext 1.0pt;
border-top:none;padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span lang=EN-US style='font-size:10.0pt'>glite-security-proxyrenewal</span></p>
+ <p class=MsoNormal><span lang=EN-US style='font-size:10.0pt'>glite-wms-utils-jobid</span></p>
</td>
<td width=63 valign=top style='width:47.5pt;border-top:none;border-left:none;
border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span lang=EN-US style='font-size:10.0pt'>0.1.0</span></p>
+ <p class=MsoNormal><span lang=EN-US style='font-size:10.0pt'>1.0.0</span></p>
</td>
<td width=393 valign=top style='width:294.9pt;border-top:none;border-left:
none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
padding:0mm 5.4pt 0mm 5.4pt'>
<p class=MsoNormal><span class=MsoHyperlink><span lang=EN-US
style='font-size:10.0pt'><a
- href="http://glite.web.cern.ch/glite/packages/I20041126/bin/rhel30/i386/RPMS/glite-security-proxyrenewal-0.1.0-1.i386.rpm">http://glite.web.cern.ch/glite/packages/I20041126/bin/rhel30/i386/RPMS/glite-security-proxyrenewal-0.1.0-1.i386.rpm</a></span></span></p>
+ 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</a></span></span></p>
</td>
</tr>
</table>
<p class=MsoNormal><span lang=EN-US> </span></p>
-<h3>6.1.3. <span lang=FR>Dependencies</span></h3>
+<h3>7.2.4. Dependencies</h3>
<p class=MsoNormal>The gLite Logging & Bookkeeping Server module has the
following dependencies:</p>
<td width=66 valign=top style='width:49.6pt;border-top:none;border-left:none;
border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><span lang=EN-US style='font-size:10.0pt'>0.2.0</span></p>
+ <p class=MsoNormal><span lang=EN-US style='font-size:10.0pt'>0.4.0</span></p>
</td>
<td width=387 valign=top style='width:290.6pt;border-top:none;border-left:
none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
padding:0mm 5.4pt 0mm 5.4pt'>
<p class=MsoNormal><span class=MsoHyperlink><span lang=EN-US
- style='font-size:10.0pt'>http://glite.web.cern.ch/glite/packages/I20041126/installers/glite-security-utils_installer.sh</span></span></p>
+ style='font-size:10.0pt'><a
+ href="http://glite.web.cern.ch/glite/packages/I20050107/installers/glite-security-utils_installer.sh">http://glite.web.cern.ch/glite/packages/I20050114/installers/glite-security-utils_installer.sh</a></span></span></p>
</td>
</tr>
<tr>
<p class=MsoNormal> </p>
-<h3>6.1.4. Known bugs and issues</h3>
+<h3>7.2.5. Known bugs and issues</h3>
<p class=MsoNormal align=left style='text-align:left'>This release has the
following bugs and issues. Bug numbers refer to the gLite Bug Tracking system
<table class=MsoTableGrid border=1 cellspacing=0 cellpadding=0
style='border-collapse:collapse;border:none'>
<tr>
- <td width=121 valign=top style='width:90.45pt;border:solid windowtext 1.0pt;
+ <td width=85 valign=top style='width:63.6pt;border:solid windowtext 1.0pt;
padding:0mm 5.4pt 0mm 5.4pt'>
<p class=MsoNormal><span style='font-size:10.0pt'>Bug number</span></p>
</td>
- <td width=499 valign=top style='width:373.95pt;border:solid windowtext 1.0pt;
+ <td width=534 valign=top style='width:400.8pt;border:solid windowtext 1.0pt;
border-left:none;padding:0mm 5.4pt 0mm 5.4pt'>
<p class=MsoNormal><span style='font-size:10.0pt'>Description</span></p>
</td>
</tr>
<tr>
- <td width=121 valign=top style='width:90.45pt;border:solid windowtext 1.0pt;
- border-top:none;padding:0mm 5.4pt 0mm 5.4pt'>
+ <td valign=top style='border:solid windowtext 1.0pt;border-top:none;
+ padding:0mm 5.4pt 0mm 5.4pt'>
<p class=MsoNormal><span style='font-size:10.0pt'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=5125"><span
- style='color:windowtext;text-decoration:none'> #5125</span></a></span></p>
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=5202"><span
+ style='color:windowtext;text-decoration:none'> #5202</span></a></span></p>
</td>
- <td width=499 valign=top style='width:373.95pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
+ <td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;
+ border-right:solid windowtext 1.0pt;padding:0mm 5.4pt 0mm 5.4pt'>
<p class=MsoNormal><span style='font-size:10.0pt'><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=5125"><span
- style='color:windowtext;text-decoration:none'>glite-lb-bkserverd
- start/stop/status displays usage options</span></a> </span></p>
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=5202"><span
+ style='color:windowtext;text-decoration:none'>no RPM provides the
+ lb-local-logger daemon - </span></a> </span></p>
</td>
</tr>
<tr>
- <td width=121 valign=top style='width:90.45pt;border:solid windowtext 1.0pt;
+ <td width=85 valign=top style='width:63.6pt;border:solid windowtext 1.0pt;
border-top:none;padding:0mm 5.4pt 0mm 5.4pt'>
<p class=MsoNormal><span style='font-size:10.0pt'><a
href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=5248"><span
style='color:windowtext;text-decoration:none'> #5248</span></a></span></p>
</td>
- <td width=499 valign=top style='width:373.95pt;border-top:none;border-left:
+ <td width=534 valign=top style='width:400.8pt;border-top:none;border-left:
none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
padding:0mm 5.4pt 0mm 5.4pt'>
<p class=MsoNormal><span style='font-size:10.0pt'><a
background</span></a> </span></p>
</td>
</tr>
+ <tr>
+ <td valign=top style='border:solid windowtext 1.0pt;border-top:none;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=5833"><span
+ style='color:windowtext;text-decoration:none'> #5833</span></a></span></p>
+ </td>
+ <td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;
+ border-right:solid windowtext 1.0pt;padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=5833"><span
+ style='color:windowtext;text-decoration:none'>all jobs in SUBMITTED after a
+ job storm</span></a> </span></p>
+ </td>
+ </tr>
+ <tr>
+ <td valign=top style='border:solid windowtext 1.0pt;border-top:none;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=5850"><span
+ style='color:windowtext;text-decoration:none'> #5850</span></a></span></p>
+ </td>
+ <td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;
+ border-right:solid windowtext 1.0pt;padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=5850"><span
+ style='color:windowtext;text-decoration:none'>glite-lb-config.py has
+ glite.location and globus.location not set in params[]</span></a> </span></p>
+ </td>
+ </tr>
+ <tr>
+ <td valign=top style='border:solid windowtext 1.0pt;border-top:none;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=5897"><span
+ style='color:windowtext;text-decoration:none'> #5897</span></a></span></p>
+ </td>
+ <td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;
+ border-right:solid windowtext 1.0pt;padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=5897"><span
+ style='color:windowtext;text-decoration:none'>I20041203 LB installation
+ script has a missing dependency </span></a> </span></p>
+ </td>
+ </tr>
+ <tr>
+ <td valign=top style='border:solid windowtext 1.0pt;border-top:none;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=5900"><span
+ style='color:windowtext;text-decoration:none'> #5900</span></a></span></p>
+ </td>
+ <td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;
+ border-right:solid windowtext 1.0pt;padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=5900"><span
+ style='color:windowtext;text-decoration:none'>location of mysql.sock file </span></a> </span></p>
+ </td>
+ </tr>
+ <tr>
+ <td valign=top style='border:solid windowtext 1.0pt;border-top:none;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=5901"><span
+ style='color:windowtext;text-decoration:none'> #5901</span></a></span></p>
+ </td>
+ <td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;
+ border-right:solid windowtext 1.0pt;padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=5901"><span
+ style='color:windowtext;text-decoration:none'>mysqlaccess command fails with
+ Broken pipe if mysql socket file is in /tmp </span></a></span></p>
+ </td>
+ </tr>
+ <tr>
+ <td valign=top style='border:solid windowtext 1.0pt;border-top:none;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=5903"><span
+ style='color:windowtext;text-decoration:none'> #5903</span></a></span></p>
+ </td>
+ <td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;
+ border-right:solid windowtext 1.0pt;padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=5903"><span
+ style='color:windowtext;text-decoration:none'>glite-lb-bkserverd script gives
+ bash: /root/.bashrc: Permission denied error </span></a> </span></p>
+ </td>
+ </tr>
+ <tr>
+ <td valign=top style='border:solid windowtext 1.0pt;border-top:none;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=5904"><span
+ style='color:windowtext;text-decoration:none'> #5904</span></a></span></p>
+ </td>
+ <td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;
+ border-right:solid windowtext 1.0pt;padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=5904"><span
+ style='color:windowtext;text-decoration:none'>glite-lb-bkserverd does not
+ check default location for credentials</span></a> </span></p>
+ </td>
+ </tr>
+ <tr>
+ <td valign=top style='border:solid windowtext 1.0pt;border-top:none;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=5910"><span
+ style='color:windowtext;text-decoration:none'>#5910</span></a></span></p>
+ </td>
+ <td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;
+ border-right:solid windowtext 1.0pt;padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=5910"><span
+ style='color:windowtext;text-decoration:none'>glite-lb configuration scripts
+ don't set GLITE_USER environment</span></a> </span></p>
+ </td>
+ </tr>
+ <tr>
+ <td valign=top style='border:solid windowtext 1.0pt;border-top:none;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=5925"><span
+ style='color:windowtext;text-decoration:none'> #5925</span></a></span></p>
+ </td>
+ <td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;
+ border-right:solid windowtext 1.0pt;padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=5925"><span
+ style='color:windowtext;text-decoration:none'>Running glite-lb script removes
+ mysql.sock file </span></a> </span></p>
+ </td>
+ </tr>
+ <tr>
+ <td valign=top style='border:solid windowtext 1.0pt;border-top:none;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=5926"><span
+ style='color:windowtext;text-decoration:none'> #5926</span></a></span></p>
+ </td>
+ <td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;
+ border-right:solid windowtext 1.0pt;padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=5926"><span
+ style='color:windowtext;text-decoration:none'>Default user should not be used
+ in the init.d scripts</span></a> </span></p>
+ </td>
+ </tr>
+ <tr>
+ <td valign=top style='border:solid windowtext 1.0pt;border-top:none;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=5932"><span
+ style='color:windowtext;text-decoration:none'> #5932</span></a></span></p>
+ </td>
+ <td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;
+ border-right:solid windowtext 1.0pt;padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=5932"><span
+ style='color:windowtext;text-decoration:none'>credential file created in
+ /var/tmp is unnecessary</span></a> </span></p>
+ </td>
+ </tr>
+ <tr>
+ <td valign=top style='border:solid windowtext 1.0pt;border-top:none;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=5934"><span
+ style='color:windowtext;text-decoration:none'> #5934</span></a></span></p>
+ </td>
+ <td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;
+ border-right:solid windowtext 1.0pt;padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=5934"><span
+ style='color:windowtext;text-decoration:none'>service start and stop
+ notifications are inconsistent for glite-lb-bkserverd init,d script</span></a> </span></p>
+ </td>
+ </tr>
+ <tr>
+ <td valign=top style='border:solid windowtext 1.0pt;border-top:none;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=6057"><span
+ style='color:windowtext;text-decoration:none'> #6057</span></a></span></p>
+ </td>
+ <td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;
+ border-right:solid windowtext 1.0pt;padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=6057"><span
+ style='color:windowtext;text-decoration:none'>glite-lb configuration scripts
+ has missing dependency (CGI.pm)</span></a> </span></p>
+ </td>
+ </tr>
+ <tr>
+ <td valign=top style='border:solid windowtext 1.0pt;border-top:none;
+ padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=6075"><span
+ style='color:windowtext;text-decoration:none'>#6075</span></a></span></p>
+ </td>
+ <td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;
+ border-right:solid windowtext 1.0pt;padding:0mm 5.4pt 0mm 5.4pt'>
+ <p class=MsoNormal><span style='font-size:10.0pt'><a
+ href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=6075"><span
+ style='color:windowtext;text-decoration:none'>glite-lb-config.py crashes with
+ KeyError: GLITE_CERT_DIR</span></a> </span></p>
+ </td>
+ </tr>
</table>
<p class=MsoNormal align=left style='text-align:left'> </p>
text-align:left;text-autospace:none'><span lang=EN-US style='font-size:10.0pt;
font-family:"Courier New"'> </span></p>
-<h3>6.1.5. Bugs closed since last release</h3>
+<h3>7.2.6. Bugs closed since last release</h3>
<p class=MsoNormal align=left style='text-align:left'>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 <a
+following bugs and issues. Bug numbers refer to the gLite Bug Tracking system
+database hosted on the CERN Savannah system at <a
href="https://savannah.cern.ch/bugs/?group=jra1mdw">https://savannah.cern.ch/bugs/?group=jra1mdw</a>
</p>
<table class=MsoTableGrid border=1 cellspacing=0 cellpadding=0
style='border-collapse:collapse;border:none'>
<tr>
- <td width=121 valign=top style='width:90.45pt;border:solid windowtext 1.0pt;
+ <td width=120 valign=top style='width:89.9pt;border:solid windowtext 1.0pt;
padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal>Bug number</p>
+ <p class=MsoNormal><span style='font-size:10.0pt'>Bug number</span></p>
</td>
- <td width=499 valign=top style='width:373.95pt;border:solid windowtext 1.0pt;
+ <td width=499 valign=top style='width:374.5pt;border:solid windowtext 1.0pt;
border-left:none;padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal>Description</p>
- </td>
- </tr>
- <tr>
- <td width=121 valign=top style='width:90.45pt;border:solid windowtext 1.0pt;
- border-top:none;padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=4627"><span
- style='color:windowtext;text-decoration:none'> #4627</span></a></p>
- </td>
- <td width=499 valign=top style='width:373.95pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=4627"><span
- style='color:windowtext;text-decoration:none'>no licence found in lb packages</span></a> </p>
- </td>
- </tr>
- <tr>
- <td width=121 valign=top style='width:90.45pt;border:solid windowtext 1.0pt;
- border-top:none;padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=5236"><span
- style='color:windowtext;text-decoration:none'> #5236</span></a></p>
- </td>
- <td width=499 valign=top style='width:373.95pt;border-top:none;border-left:
- none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
- padding:0mm 5.4pt 0mm 5.4pt'>
- <p class=MsoNormal><a
- href="https://savannah.cern.ch/bugs/?func=detailitem&item_id=5236"><span
- style='color:windowtext;text-decoration:none'>LB install/config documentation
- has some errors</span></a> </p>
+ <p class=MsoNormal><span style='font-size:10.0pt'>Description</span></p>
</td>
</tr>
</table>
--- /dev/null
+#Wed Apr 27 10:35:06 CEST 2005
+module.build=222
<service name="glite-lb-service">
<components>
<component name="glite-config"
- version="0.3.0"
- age="1"
- build="1"
+ version="@org.glite.deployment.config.info.version@"
+ age="@org.glite.deployment.config.info.age@"
+ build="@org.glite.deployment.config.info.build@"
arch="noarch"/>
<component name="glite-lb-config"
arch="noarch"/>
<component name="glite-lb-client-interface"
- version="@org.glite.lb.client-interface.version@"
- age="@org.glite.lb.client-interface.age@"
- build="@org.glite.lb.client-interface.build@"
+ version="@org.glite.lb.client-interface.info.version@"
+ age="@org.glite.lb.client-interface.info.age@"
+ build="@org.glite.lb.client-interface.info.build@"
arch="i386"/>
<component name="glite-lb-ws-interface"
- version="@org.glite.lb.ws-interface.version@"
- age="@org.glite.lb.ws-interface.age@"
- build="@org.glite.lb.ws-interface.build@"
+ version="@org.glite.lb.ws-interface.info.version@"
+ age="@org.glite.lb.ws-interface.info.age@"
+ build="@org.glite.lb.ws-interface.info.build@"
arch="i386"/>
<component name="glite-lb-logger"
- version="@org.glite.lb.logger.version@"
- age="@org.glite.lb.logger.age@"
- build="@org.glite.lb.logger.build@"
+ version="@org.glite.lb.logger.info.version@"
+ age="@org.glite.lb.logger.info.age@"
+ build="@org.glite.lb.logger.info.build@"
arch="i386"/>
<component name="glite-lb-common"
- version="@org.glite.lb.common.version@"
- age="@org.glite.lb.common.age@"
- build="@org.glite.lb.common.build@"
+ version="@org.glite.lb.common.info.version@"
+ age="@org.glite.lb.common.info.age@"
+ build="@org.glite.lb.common.info.build@"
arch="i386"/>
<component name="glite-lb-server"
- version="@org.glite.lb.server.version@"
- age="@org.glite.lb.server.age@"
- build="@org.glite.lb.server.build@"
+ version="@org.glite.lb.server.info.version@"
+ age="@org.glite.lb.server.info.age@"
+ build="@org.glite.lb.server.info.build@"
arch="i386"/>
<component name="glite-lb-server-bones"
- version="@org.glite.lb.server-bones.version@"
- age="@org.glite.lb.server-bones.age@"
- build="@org.glite.lb.server-bones.build@"
+ version="@org.glite.lb.server-bones.info.version@"
+ age="@org.glite.lb.server-bones.info.age@"
+ build="@org.glite.lb.server-bones.info.build@"
arch="i386"/>
<component name="glite-wms-utils-jobid"
- version="@org.glite.wms-utils.jobid.version@"
- age="@org.glite.wms-utils.jobid.age@"
- build="@org.glite.wms-utils.jobid.build@"
+ version="@org.glite.wms-utils.jobid.info.version@"
+ age="@org.glite.wms-utils.jobid.info.age@"
+ build="@org.glite.wms-utils.jobid.info.build@"
arch="i386"/>
<component name="glite-wms-utils-exception"
- version="@org.glite.wms-utils.exception.version@"
- age="@org.glite.wms-utils.exception.age@"
- build="@org.glite.wms-utils.exception.build@"
+ version="@org.glite.wms-utils.exception.info.version@"
+ age="@org.glite.wms-utils.exception.info.age@"
+ build="@org.glite.wms-utils.exception.info.build@"
arch="i386"/>
<component name="glite-security-proxyrenewal"
- version="@org.glite.security.proxyrenewal.version@"
- age="@org.glite.security.proxyrenewal.age@"
- build="@org.glite.security.proxyrenewal.build@"
+ version="@org.glite.security.proxyrenewal.info.version@"
+ age="@org.glite.security.proxyrenewal.info.age@"
+ build="@org.glite.security.proxyrenewal.info.build@"
arch="i386"/>
-
+ <component name="glite-security-voms"
+ version="@org.glite.security.voms.info.version@"
+ age="@org.glite.security.voms.info.age@"
+ build="@org.glite.security.voms.info.build@"
+ arch="i386"/>
+ <component name="gridsite"
+ version="@org.gridsite.core.info.version@"
+ age="@org.gridsite.core.info.age@"
+ build="@org.gridsite.core.info.build@"
+ arch="i386"/>
</components>
<dependencies>
<external name="MySQL-server"
age="EGEE"
arch="i386"/>
<external name="vdt_globus_essentials"
- version="VDT1.2.0rh9"
+ version="VDT1.2.2rh9"
age="1"
arch="i386"/>
<external name="gpt"
- version="VDT1.2.0rh9"
+ version="VDT1.2.2rh9"
age="1"
arch="i386"/>
<external name="myproxy"
arch="i386"/>
</dependencies>
</service>
+
+ <!-- Security Utilities -->
+ <service name="glite-security-utils">
+ <subservice name="glite-security-utils"/>
+ </service>
+ <!-- RGMA servicetool -->
+ <service name="glite-rgma-servicetool">
+ <subservice name="glite-rgma-servicetool"/>
+ </service>
</services>
<dependencies>
- <!-- glite service tool -->
</dependencies>
</node>
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
omit-xml-declaration="yes"/>
<!-- Definition of variables and parameters -->
+ <xsl:param name="installers"/>
<xsl:param name="repository"/>
<xsl:param name="ext-repository"/>
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
<xsl:for-each select="node/services/service">
+ # Download <xsl:value-of select="@name"/> scripts from repository
+ <xsl:for-each select=".">
+ <xsl:apply-templates select="subservice">
+ <xsl:with-param name="install">true</xsl:with-param>
+ </xsl:apply-templates>
+ </xsl:for-each>
+
+
# Download <xsl:value-of select="@name"/> dependencies RPMS from repository
<xsl:for-each select="dependencies">
<xsl:apply-templates>
</xsl:for-each>
</xsl:for-each>
+
+ # Download and install subservices
+ parseScriptList
+
# Install all RPMS
echo
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 ..
}
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
}
###############################################################################
exit 0
</xsl:template>
+ <xsl:template name="subservices" match="subservice">
+ <xsl:param name="install"/>
+ <xsl:variable name="package"><xsl:value-of select="@name"/>_installer.sh</xsl:variable>
+ <xsl:choose>
+ <xsl:when test="$install = 'true'">
+wget -N --non-verbose <xsl:value-of select="$installers"/><xsl:value-of select="$package"/>
+if [ ! -f "<xsl:value-of select="$package"/>" ]
+then
+ echo
+ echo ERROR: <xsl:value-of select="$package"/> could not be downloaded!
+ exit 1
+fi
+chmod u+x <xsl:value-of select="$package"/>
+SCRIPTLIST="$SCRIPTLIST ./<xsl:value-of select="$package"/>"
+ </xsl:when>
+ <xsl:otherwise>
+SCRIPTLISTUn="$SCRIPTLISTUn ./<xsl:value-of select="$package"/> -u "
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+
<xsl:template name="dependencies" match="external">
<xsl:param name="install"/>
<xsl:variable name="package"><xsl:value-of select="@name"/>-<xsl:value-of select="@version"/>-<xsl:value-of select="@age"/>.<xsl:value-of select="@arch"/>.rpm</xsl:variable>
-#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
+++ /dev/null
-# 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 $<
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" ?>
-<!--
- Copyright (c) Members of the EGEE Collaboration. 2004
- See http://eu-egee.org/partners/ for details on the copyright holders
- For license conditions see the license file or http://eu-egee.org/license.html
-
- Build file for the GLite JP Common module
-
- Authors: Ales Krenek <ljocha@ics.muni.cz>
- Version info: $Id$
- Release: $Name$
-
- Revision history:
- $Log$
- Revision 1.1.1.1 2004/10/15 09:49:02 akrenek
--->
-
-<project name="common" default="dist">
-
- <!-- =========================================
- Builds the GLite JP Primary Module
- ========================================= -->
-
- <!-- =========================================
- Import properties (order is important)
- ========================================= -->
-
- <!-- import baseline & user properties -->
- <import file="../org.glite/project/baseline.properties.xml" />
-
- <!-- import component build properties,
- component properties &
- component common properties -->
- <import file="./project/properties.xml"/>
-
- <!-- import subsystem build properties,
- subsystem properties &
- subsystem common properties -->
- <import file="${subsystem.properties.file}"/>
-
- <!-- import global build properties &
- global properties -->
- <import file="${global.properties.file}" />
-
- <!-- =========================================
- Load dependency property files (order is important)
- ========================================= -->
- <property file="${user.dependencies.file}"/>
- <property file="${component.dependencies.file}" />
- <property file="${subsystem.dependencies.file}" />
- <property file="${global.dependencies.file}"/>
-
- <!-- =========================================
- Load configure options (order is important)
- ========================================= -->
- <import file="${global.configure.options.file}"/>
- <import file="${component.configure.options.file}"/>
-
- <!-- =========================================
- Import task definitions (order is important)
- ========================================= -->
- <import file="${subsystem.taskdefs.file}" />
- <import file="${global.taskdefs.file}" />
-
- <!-- =========================================
- Load common targets
- ========================================= -->
- <import file="${global.targets-simple_make.file}" />
-
- <!-- =========================================
- Load version file
- ========================================= -->
- <property file="${module.version.file}"/>
-
- <!-- ==============================================
- Local private targets
- ============================================== -->
-
- <target name="localinit"
- description="Module specific initialization tasks">
-
- <antcall target="lbmakefiles" />
- </target>
-
- <target name="localcompile"
- description="Module specific compile tasks">
- </target>
-
- <target name="localclean"
- description="Module specific cleaning tasks">
- </target>
-
-</project>
+++ /dev/null
-#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
+++ /dev/null
-#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 */
+++ /dev/null
-#ifndef __GLITE_JP_TYPES
-#define __GLITE_JP_TYPES
-
-#include <sys/time.h>
-
-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
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" ?>
-<!--
- Copyright (c) Members of the EGEE Collaboration. 2004
- See http://eu-egee.org/partners/ for details on the copyright holders
- For license conditions see the license file or http://eu-egee.org/license.html
-
- Configuration options for the gLite JP Common module
-
- Authors: Ales Krenek <ljocha@ics.muni.cz>
- Version info: $Id$
- Release: $Name$
-
- Revision history:
- $Log$
- Revision 1.2 2004/11/22 13:36:42 dimeglio
- First version of this file
-
- Revision 1.1.1.1 2004/10/15 09:49:02 akrenek
--->
-
- <!-- ======================================================
- Define extra properties here ...
- ====================================================== -->
-
- <project name="JP Common configuration options">
- <target name="lbmakefiles">
- <exec executable="ln" failonerror="true">
- <arg line="-fs ${component.dir}/Makefile ${module.build.dir}/Makefile"/>
- </exec>
- <echo file="${module.build.dir}/Makefile.inc">
-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}
- </echo>
- </target>
- </project>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (c) Members of the EGEE Collaboration. 2004
- See http://eu-egee.org/partners/ for details on the copyright holders
- For license conditions see the license file or http://eu-egee.org/license.html
-
- Common build properties file for the gLite JP Common component
-
- Authors: Ales Krenek <ljocha@ics.muni.cz>
- Version info: $Id$
- Release: $Name$
-
- Revision history:
- $Log$
- Revision 1.1.1.1 2004/10/15 09:49:02 akrenek
--->
-
-<project name="JP Common component common properties">
-
- <!-- Include build properties to allow overwriting
- of properties for subsystem -->
- <property file="project/build.properties" />
-
- <!-- ======================================================
- Define corresponding subsystem properties
- ====================================================== -->
-
- <!-- Subsystem name -->
- <property name="subsystem.name" value="${jp.subsystem.name}"/>
-
- <!-- Subsystem prefix -->
- <property name="subsystem.prefix" value="${jp.subsystem.prefix}"/>
-
- <!-- ======================================================
- Define component properties
- ====================================================== -->
-
- <!-- Component name prefix -->
- <property name="component.prefix" value="common" />
-
- <!-- ======================================================
- Define general component properties
- ====================================================== -->
-
- <import file="${component.general.properties.file}" />
-
- <!-- ======================================================
- Define extra properties here ...
- ====================================================== -->
-
-
-</project>
+++ /dev/null
-tar_exclude
-CVS
-build.xml
-build
-build.properties
-properties.xml
-configure.properties.xml
-.cvsignore
-.project
-.cdtproject
+++ /dev/null
-#Fri Dec 10 13:33:53 CET 2004
-module.version=0.1.0
-module.build=3
-module.age=1
+++ /dev/null
-#include <string.h>
-#include <stdlib.h>
-
-#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; i<cnt; i++) {
- if (ret = (*ctx->deferred_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;
-}
+++ /dev/null
-#include <openssl/md5.h>
-#include <string.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-#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);
-}
+++ /dev/null
-# 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
-
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" ?>
-<!--
- Copyright (c) Members of the EGEE Collaboration. 2004
- See http://eu-egee.org/partners/ for details on the copyright holders
- For license conditions see the license file or http://eu-egee.org/license.html
-
- Build file for the gLite JP Index module
-
- Authors: Ales Krenek <ljocha@ics.muni.cz>
- Version info: $Id$
- Release: $Name$
-
- Revision history:
- $Log$
- Revision 1.1.1.1 2004/10/15 09:49:13 akrenek
--->
-
-<project name="index" default="dist">
-
- <!-- =========================================
- Builds the GLite JP Index Module
- ========================================= -->
-
- <!-- =========================================
- Import properties (order is important)
- ========================================= -->
-
- <!-- import baseline & user properties -->
- <import file="../org.glite/project/baseline.properties.xml" />
-
- <!-- import component build properties,
- component properties &
- component common properties -->
- <import file="./project/properties.xml"/>
-
- <!-- import subsystem build properties,
- subsystem properties &
- subsystem common properties -->
- <import file="${subsystem.properties.file}"/>
-
- <!-- import global build properties &
- global properties -->
- <import file="${global.properties.file}" />
-
- <!-- =========================================
- Load dependency property files (order is important)
- ========================================= -->
- <property file="${user.dependencies.file}"/>
- <property file="${component.dependencies.file}" />
- <property file="${subsystem.dependencies.file}" />
- <property file="${global.dependencies.file}"/>
-
- <!-- =========================================
- Load configure options (order is important)
- ========================================= -->
- <import file="${global.configure.options.file}"/>
- <import file="${component.configure.options.file}"/>
-
- <!-- =========================================
- Import task definitions (order is important)
- ========================================= -->
- <import file="${subsystem.taskdefs.file}" />
- <import file="${global.taskdefs.file}" />
-
- <!-- =========================================
- Load common targets
- ========================================= -->
- <import file="${global.targets-simple_make.file}" />
-
- <!-- =========================================
- Load version file
- ========================================= -->
- <property file="${module.version.file}"/>
-
- <!-- ==============================================
- Local private targets
- ============================================== -->
-
- <target name="localinit"
- description="Module specific initialization tasks">
-
- <antcall target="lbmakefiles" />
- </target>
-
- <target name="localcompile"
- description="Module specific compile tasks">
- </target>
-
- <target name="localclean"
- description="Module specific cleaning tasks">
- </target>
-
-</project>
+++ /dev/null
-<WSDL:definitions
- xmlns:tns="http://glite.org/wsdl/services/jp"
- xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:xsd="http://www.w3.org/2001/XMLSchema"
- xmlns:jp="http://glite.org/wsdl/types/jp"
- xmlns:SOAP="http://schemas.xmlsoap.org/wsdl/soap/"
- xmlns:WSDL="http://schemas.xmlsoap.org/wsdl/"
- xmlns="http://schemas.xmlsoap.org/wsdl/"
- targetNamespace="http://glite.org/wsdl/services/jp"
- name="JobProvenance">
-
- <WSDL:types>
- <schema
- targetNamespace="http://glite.org/wsdl/types/jp"
- xmlns="http://www.w3.org/2001/XMLSchema"
- elementFormDefault="unqualified" attributeFormDefault="unqualified">
- <import namespace="http://schemas.xmlsoap.org/soap/encoding/"/>
-
- <simpleType name="Attribute">
- <restriction base="xsd:string">
- </restriction>
- </simpleType>
- <simpleType name="UploadClass">
- <restriction base="xsd:string">
- <enumeration value="INPUT-SANDBOX"/>
- <enumeration value="OUTPUT-SANDBOX"/>
- <enumeration value="JOB-LOG"/>
- </restriction>
- </simpleType>
- <simpleType name="QueryOp">
- <restriction base="xsd:string">
- <enumeration value="EQUAL"/>
- <enumeration value="UNEQUAL"/>
- <enumeration value="LESS"/>
- <enumeration value="GREATER"/>
- <enumeration value="WITHIN"/>
- </restriction>
- </simpleType>
- <complexType name="TagValue">
- <sequence>
- <element name="name" type="xsd:string" minOccurs="1" maxOccurs="1" nillable="true"/>
- <element name="sequence" type="xsd:int" minOccurs="0" maxOccurs="1"/>
- <element name="timestamp" type="xsd:dateTime" minOccurs="0" maxOccurs="1" nillable="true"/>
- <element name="stringValue" type="xsd:string" minOccurs="0" maxOccurs="1" nillable="true"/>
- <element name="blobValue" type="xsd:base64Binary" minOccurs="0" maxOccurs="1" nillable="true"/>
- </sequence>
- </complexType>
- <complexType name="Attributes">
- <sequence>
- <element name="item" type="jp:Attribute" minOccurs="0" maxOccurs="unbounded" nillable="true"/>
- </sequence>
- </complexType>
- <complexType name="GenericJPFaultType">
- <sequence>
- <element name="source" type="xsd:string" minOccurs="1" maxOccurs="1"/>
- <element name="code" type="xsd:int" minOccurs="1" maxOccurs="1"/>
- <element name="text" type="xsd:string" minOccurs="1" maxOccurs="1"/>
- <element name="description" type="xsd:string" minOccurs="0" maxOccurs="1"/>
- <element name="reason" type="jp:GenericJPFaultType" minOccurs="0" maxOccurs="1"/>
- </sequence>
- </complexType>
- <complexType name="PrimaryQueryElement">
- <sequence>
- <element name="attr" type="jp:Attribute" minOccurs="1" maxOccurs="1"/>
- <element name="op" type="jp:QueryOp" minOccurs="1" maxOccurs="1"/>
- <element name="value" type="xsd:string" minOccurs="1" maxOccurs="1"/>
- </sequence>
- </complexType>
- <complexType name="PrimaryQuery">
- <sequence>
- <element name="item" type="jp:PrimaryQueryElement" minOccurs="0" maxOccurs="unbounded"/>
- </sequence>
- </complexType>
- <complexType name="IndexQueryRecord">
- <sequence>
- <element name="op" type="jp:QueryOp" minOccurs="1" maxOccurs="1"/>
- <element name="value" type="xsd:string" minOccurs="1" maxOccurs="1"/>
- </sequence>
- </complexType>
- <complexType name="IndexQueryElement">
- <sequence>
- <element name="attr" type="jp:Attribute" minOccurs="1" maxOccurs="1"/>
- <element name="record" type="jp:IndexQueryRecord" minOccurs="1" maxOccurs="unbounded"/>
- </sequence>
- </complexType>
- <complexType name="IndexQuery">
- <sequence>
- <element name="item" type="jp:IndexQueryElement" minOccurs="1" maxOccurs="unbounded"/>
- </sequence>
- </complexType>
- <complexType name="JobRecord">
- <sequence>
- <element name="jobid" type="xsd:string" minOccurs="1" maxOccurs="1"/>
- <element name="PSContact" type="xsd:string" minOccurs="1" maxOccurs="1"/>
- </sequence>
- </complexType>
- <complexType name="JobRecords">
- <sequence>
- <element name="record" type="jp:JobRecord" minOccurs="0" maxOccurs="unbounded"/>
- </sequence>
- </complexType>
-
- <complexType name="AttrUpdate">
- <sequence>
- <element name="name" type="xsd:string" minOccurs="1" maxOccurs="1"/>
- <element name="value" type="xsd:string" minOccurs="0" maxOccurs="1"/>
- </sequence>
- </complexType>
- <complexType name="AttrUpdates">
- <sequence>
- <element name="item" type="jp:AttrUpdate" minOccurs="0" maxOccurs="unbounded" nillable="true"/>
- </sequence>
- </complexType>
- <complexType name="JobUpdate">
- <sequence>
- <element name="jobid" type="xsd:string" minOccurs="1" maxOccurs="1"/>
- <element name="attributes" type="jp:AttrUpdates" minOccurs="1" maxOccurs="1"/>
- <element name="tags" type="jp:AttrUpdates" minOccurs="1" maxOccurs="1"/>
- </sequence>
- </complexType>
- <complexType name="UpdateJobsData">
- <sequence>
- <element name="job" type="jp:JobUpdate" minOccurs="0" maxOccurs="unbounded"/>
- </sequence>
- </complexType>
-
- <complexType name="FeedIndexResponse">
- <sequence>
- <element name="feedId" type="xsd:string" minOccurs="0" maxOccurs="1" nillable="true"/>
- <element name="expires" type="xsd:dateTime" minOccurs="0" maxOccurs="1" nillable="true"/>
- </sequence>
- </complexType>
- <complexType name="GetJobResponse">
- <sequence>
- <element name="jobLog" type="xsd:string" minOccurs="0" maxOccurs="1" nillable="true"/>
- <element name="inputSandbox" type="xsd:string" minOccurs="0" maxOccurs="1" nillable="true"/>
- <element name="outputSandbox" type="xsd:string" minOccurs="0" maxOccurs="1" nillable="true"/>
- <element name="tags" type="xsd:string" minOccurs="0" maxOccurs="1" nillable="true"/>
- </sequence>
- </complexType>
- <complexType name="StartUploadResponse">
- <sequence>
- <element name="destination" type="xsd:string" minOccurs="0" maxOccurs="1" nillable="true"/>
- <element name="commitBefore" type="xsd:dateTime" minOccurs="0" maxOccurs="1" nillable="true"/>
- </sequence>
- </complexType>
- <element name="GenericJPFault" type="jp:GenericJPFaultType"/>
- </schema>
- </WSDL:types>
- <message name="RegisterJobRequest">
- <part name="x" type="xsd:string"/>
- </message>
- <message name="StartUploadRequest">
- <part name="uclass" type="jp:UploadClass"/>
- <part name="commitTimeout" type="xsd:duration"/>
- <part name="contentType" type="xsd:string"/>
- </message>
- <message name="StartUploadResponse">
- <part name="destination" type="xsd:string"/>
- <part name="commitBefore" type="xsd:dateTime"/>
- </message>
- <message name="CommitUploadRequest">
- <part name="destination" type="xsd:string"/>
- </message>
- <message name="RecordTagRequest">
- <part name="jobid" type="xsd:string"/>
- <part name="tag" type="jp:TagValue"/>
- </message>
- <message name="FeedIndexRequest">
- <part name="destination" type="xsd:string"/>
- <part name="attributes" type="jp:Attributes"/>
- <part name="conditions" type="jp:PrimaryQuery"/>
- <part name="continuous" type="xsd:boolean"/>
- </message>
- <message name="FeedIndexResponse">
- <part name="feedId" type="xsd:string"/>
- <part name="expires" type="xsd:dateTime"/>
- </message>
- <message name="FeedIndexRefreshRequest">
- <part name="feedId" type="xsd:string"/>
- </message>
- <message name="GetJobRequest">
- <part name="jobid" type="xsd:string"/>
- </message>
- <message name="GetJobResponse">
- <part name="jobLog" type="xsd:string"/>
- <part name="inputSandbox" type="xsd:string"/>
- <part name="outputSandbox" type="xsd:string"/>
- <part name="tags" type="xsd:string"/>
- </message>
- <message name="GenericJPFault">
- <part name="fault" element="jp:GenericJPFault"/>
- </message>
- <message name="EmptyResponse"/>
- <portType name="JobProvenancePS_PortType">
- <operation name="RegisterJob">
- <documentation>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
- </documentation>
- <input message="tns:RegisterJobRequest"/>
- <output message="tns:EmptyResponse"/>
- <fault name="f" message="tns:GenericJPFault"/>
- </operation>
- <operation name="StartUpload">
- <documentation>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.</documentation>
- <input message="tns:StartUploadRequest"/>
- <output message="tns:StartUploadResponse"/>
- <fault name="f" message="tns:GenericJPFault"/>
- </operation>
- <operation name="CommitUpload">
- <documentation>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
- </documentation>
- <input message="tns:CommitUploadRequest"/>
- <output message="tns:EmptyResponse"/>
- <fault name="f" message="tns:GenericJPFault"/>
- </operation>
- <operation name="RecordTag">
- <documentation>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
- </documentation>
- <input message="tns:RecordTagRequest"/>
- <output message="tns:EmptyResponse"/>
- <fault name="f" message="tns:GenericJPFault"/>
- </operation>
- <operation name="FeedIndex">
- <documentation>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
- </documentation>
- <input message="tns:FeedIndexRequest"/>
- <output message="tns:FeedIndexResponse"/>
- <fault name="f" message="tns:GenericJPFault"/>
- </operation>
- <operation name="FeedIndexRefresh">
- <documentation>Extend batch feed subscription (used by index server)
-
-Input: feedId returned previously by FeedIndex
-
-Output: the same as for FeedIndex
-
-Faults: GenericJPFault
- </documentation>
- <input message="tns:FeedIndexRefreshRequest"/>
- <output message="tns:FeedIndexResponse"/>
- <fault name="f" message="tns:GenericJPFault"/>
- </operation>
- <operation name="GetJob">
- <documentation>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
- </documentation>
- <input message="tns:GetJobRequest"/>
- <output message="tns:GetJobResponse"/>
- <fault name="f" message="tns:GenericJPFault"/>
- </operation>
- </portType>
- <binding name="JobProvenancePS" type="tns:JobProvenancePS_PortType">
- <SOAP:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
- <operation name="RegisterJob">
- <SOAP:operation style="rpc"/>
- <input>
- <SOAP:body use="literal" namespace="http://glite.org/wsdl/services/jp"/>
- </input>
- <output>
- <SOAP:body use="literal" namespace="http://glite.org/wsdl/services/jp"/>
- </output>
- <fault name="f">
- <SOAP:fault name="f" use="literal"/>
- </fault>
- </operation>
- <operation name="StartUpload">
- <SOAP:operation style="rpc"/>
- <input>
- <SOAP:body use="literal" namespace="http://glite.org/wsdl/services/jp"/>
- </input>
- <output>
- <SOAP:body use="literal" namespace="http://glite.org/wsdl/services/jp"/>
- </output>
- <fault name="f">
- <SOAP:fault name="f" use="literal"/>
- </fault>
- </operation>
- <operation name="CommitUpload">
- <SOAP:operation style="rpc"/>
- <input>
- <SOAP:body use="literal" namespace="http://glite.org/wsdl/services/jp"/>
- </input>
- <output>
- <SOAP:body use="literal" namespace="http://glite.org/wsdl/services/jp"/>
- </output>
- <fault name="f">
- <SOAP:fault name="f" use="literal"/>
- </fault>
- </operation>
- <operation name="RecordTag">
- <SOAP:operation style="rpc"/>
- <input>
- <SOAP:body use="literal" namespace="http://glite.org/wsdl/services/jp"/>
- </input>
- <output>
- <SOAP:body use="literal" namespace="http://glite.org/wsdl/services/jp"/>
- </output>
- <fault name="f">
- <SOAP:fault name="f" use="literal"/>
- </fault>
- </operation>
- <operation name="FeedIndex">
- <SOAP:operation style="rpc"/>
- <input>
- <SOAP:body use="literal" namespace="http://glite.org/wsdl/services/jp"/>
- </input>
- <output>
- <SOAP:body use="literal" namespace="http://glite.org/wsdl/services/jp"/>
- </output>
- <fault name="f">
- <SOAP:fault name="f" use="literal"/>
- </fault>
- </operation>
- <operation name="FeedIndexRefresh">
- <SOAP:operation style="rpc"/>
- <input>
- <SOAP:body use="literal" namespace="http://glite.org/wsdl/services/jp"/>
- </input>
- <output>
- <SOAP:body use="literal" namespace="http://glite.org/wsdl/services/jp"/>
- </output>
- <fault name="f">
- <SOAP:fault name="f" use="literal"/>
- </fault>
- </operation>
- <operation name="GetJob">
- <SOAP:operation style="rpc"/>
- <input>
- <SOAP:body use="literal" namespace="http://glite.org/wsdl/services/jp"/>
- </input>
- <output>
- <SOAP:body use="literal" namespace="http://glite.org/wsdl/services/jp"/>
- </output>
- <fault name="f">
- <SOAP:fault name="f" use="literal"/>
- </fault>
- </operation>
- </binding>
- <service name="JobProvenancePS">
- <documentation>Job Provenance Primary Storage service</documentation>
- <port name="JobProvenancePS" binding="tns:JobProvenancePS">
- <SOAP:address location="http://localhost:10001"/>
- </port>
- </service>
-
- <message name="QueryJobsRequest">
- <part name="conditions" type="jp:IndexQuery"/>
- </message>
-
- <message name="QueryJobsResponse">
- <part name="jobs" type="jp:JobRecords"/>
- </message>
-
- <message name="UpdateJobsRequest">
- <part name="feedId" type="xsd:string"/>
- <part name="data" type="jp:UpdateJobsData"/>
- <part name="feedDone" type="xsd:boolean"/>
- </message>
-
- <portType name="JobProvenanceIS_PortType">
- <operation name="UpdateJobs">
- <documentation>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
-
-
- </documentation>
- <input message="tns:UpdateJobsRequest"/>
- <output message="tns:EmptyResponse"/>
- <fault name="f" message="tns:GenericJPFault"/>
- </operation>
- <operation name="QueryJobs">
- <documentation>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
- </documentation>
- <input message="tns:QueryJobsRequest"/>
- <output message="tns:QueryJobsResponse"/>
- <fault name="f" message="tns:GenericJPFault"/>
- </operation>
- </portType>
-
- <binding name="JobProvenanceIS" type="tns:JobProvenanceIS_PortType">
- <SOAP:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
- <operation name="UpdateJobs">
- <SOAP:operation style="rpc"/>
- <input>
- <SOAP:body use="literal" namespace="http://glite.org/wsdl/services/jp"/>
- </input>
- <output>
- <SOAP:body use="literal" namespace="http://glite.org/wsdl/services/jp"/>
- </output>
- <fault name="f">
- <SOAP:fault name="f" use="literal"/>
- </fault>
- </operation>
- <operation name="QueryJobs">
- <SOAP:operation style="rpc"/>
- <input>
- <SOAP:body use="literal" namespace="http://glite.org/wsdl/services/jp"/>
- </input>
- <output>
- <SOAP:body use="literal" namespace="http://glite.org/wsdl/services/jp"/>
- </output>
- <fault name="f">
- <SOAP:fault name="f" use="literal"/>
- </fault>
- </operation>
- </binding>
-
- <service name="JobProvenanceIS">
- <documentation>Job Provenance Index service</documentation>
- <port name="JobProvenanceIS" binding="tns:JobProvenanceIS">
- <SOAP:address location="http://localhost:10001"/>
- </port>
- </service>
-
-
-</WSDL:definitions>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" ?>
-<!--
- Copyright (c) Members of the EGEE Collaboration. 2004
- See http://eu-egee.org/partners/ for details on the copyright holders
- For license conditions see the license file or http://eu-egee.org/license.html
-
- Configuration options for the gLite JP Index module
-
- Authors: Ales Krenek <ljocha@ics.muni.cz>
- Version info: $Id$
- Release: $Name$
-
- Revision history:
- $Log$
- Revision 1.2 2004/11/22 14:00:37 dimeglio
- Updated to use standard files
- Fixed names (was using common instead of real module name)
-
- Revision 1.1.1.1 2004/10/15 09:49:13 akrenek
--->
-
- <!-- ======================================================
- Define extra properties here ...
- ====================================================== -->
-
- <project name="JP Common configuration options">
- <target name="lbmakefiles">
- <exec executable="ln" failonerror="true">
- <arg line="-fs ${component.dir}/Makefile ${module.build.dir}/Makefile"/>
- </exec>
- <echo file="${module.build.dir}/Makefile.inc">
-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}
- </echo>
- </target>
- </project>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (c) Members of the EGEE Collaboration. 2004
- See http://eu-egee.org/partners/ for details on the copyright holders
- For license conditions see the license file or http://eu-egee.org/license.html
-
- Common build properties file for the gLite JP Index component
-
- Authors: Ales Krenek <ljocha@ics.muni.cz>
- Version info: $Id$
- Release: $Name$
-
- Revision history:
- $Log$
- Revision 1.1.1.1 2004/10/15 09:49:13 akrenek
--->
-
-<project name="JP Index component common properties">
-
- <!-- Include build properties to allow overwriting
- of properties for subsystem -->
- <property file="project/build.properties" />
-
- <!-- ======================================================
- Define corresponding subsystem properties
- ====================================================== -->
-
- <!-- Subsystem name -->
- <property name="subsystem.name" value="${jp.subsystem.name}"/>
-
- <!-- Subsystem prefix -->
- <property name="subsystem.prefix" value="${jp.subsystem.prefix}"/>
-
- <!-- ======================================================
- Define component properties
- ====================================================== -->
-
- <!-- Component name prefix -->
- <property name="component.prefix" value="index" />
-
- <!-- ======================================================
- Define general component properties
- ====================================================== -->
-
- <import file="${component.general.properties.file}" />
-
- <!-- ======================================================
- Define extra properties here ...
- ====================================================== -->
-
-
-</project>
+++ /dev/null
-tar_exclude
-CVS
-build.xml
-build
-build.properties
-properties.xml
-configure.properties.xml
-.cvsignore
-.project
-.cdtproject
+++ /dev/null
-#Fri Dec 10 13:35:33 CET 2004
-module.version=0.1.0
-module.build=2
-module.age=1
+++ /dev/null
-#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;
-}
+++ /dev/null
-#include <stdio.h>
-#include <fcntl.h>
-
-#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;
-}
-
+++ /dev/null
-jpsrv = http://glite.org/wsdl/services/jp
-jptype = http://glite.org/wsdl/types/jp
+++ /dev/null
-# 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
-
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" ?>
-<!--
- Copyright (c) Members of the EGEE Collaboration. 2004
- See http://eu-egee.org/partners/ for details on the copyright holders
- For license conditions see the license file or http://eu-egee.org/license.html
-
- Build file for the GLite JP Primary module
-
- Authors: Ales Krenek <ljocha@ics.muni.cz>
- Version info: $Id$
- Release: $Name$
-
- Revision history:
- $Log$
- Revision 1.2 2004/11/22 13:55:30 dimeglio
- First version of this file
- Use central subsystem definition
-
- Revision 1.1.1.1 2004/10/15 09:49:24 akrenek
--->
-
-<project name="primary" default="dist">
-
- <!-- =========================================
- Builds the gLite JP Primary Module
- ========================================= -->
-
- <!-- =========================================
- Import properties (order is important)
- ========================================= -->
-
- <!-- import baseline & user properties -->
- <import file="../org.glite/project/baseline.properties.xml" />
-
- <!-- import component build properties,
- component properties &
- component common properties -->
- <import file="./project/properties.xml"/>
-
- <!-- import subsystem build properties,
- subsystem properties &
- subsystem common properties -->
- <import file="${subsystem.properties.file}"/>
-
- <!-- import global build properties &
- global properties -->
- <import file="${global.properties.file}" />
-
- <!-- =========================================
- Load dependency property files (order is important)
- ========================================= -->
- <property file="${user.dependencies.file}"/>
- <property file="${component.dependencies.file}" />
- <property file="${subsystem.dependencies.file}" />
- <property file="${global.dependencies.file}"/>
-
- <!-- =========================================
- Load configure options (order is important)
- ========================================= -->
- <import file="${global.configure.options.file}"/>
- <import file="${component.configure.options.file}"/>
-
- <!-- =========================================
- Import task definitions (order is important)
- ========================================= -->
- <import file="${subsystem.taskdefs.file}" />
- <import file="${global.taskdefs.file}" />
-
- <!-- =========================================
- Load common targets
- ========================================= -->
- <import file="${global.targets-simple_make.file}" />
-
- <!-- =========================================
- Load version file
- ========================================= -->
- <property file="${module.version.file}"/>
-
- <!-- ==============================================
- Local private targets
- ============================================== -->
-
- <target name="localinit"
- description="Module specific initialization tasks">
-
- <antcall target="lbmakefiles" />
- </target>
-
- <target name="localcompile"
- description="Module specific compile tasks">
- </target>
-
- <target name="localclean"
- description="Module specific cleaning tasks">
- </target>
-
-</project>
+++ /dev/null
-#include <stdio.h>
-#include <sysexits.h>
-#include <string.h>
-#include <assert.h>
-
-#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<attr.__sizeitem; i++) ap[i] = sample_attr+i;
-
- for (i=0; sample_query[qi][i].attr; i++)
- qp[i] = &sample_query[qi][i];
- qry.__sizeitem = i;
-
- if (!check_fault(soap,soap_call_jpsrv__FeedIndex(soap,server,"",
- argv[2],&attr,&qry,!strcasecmp(argv[4],"true"),
- !strcasecmp(argv[5],"true"),
- &r)))
- {
- printf("FeedId: %s\nExpires: %s\n",r.feedId,ctime(&r.expires));
- }
- } else if (!strcasecmp(argv[1], "FeedIndexRefresh")) {
- struct jpsrv__FeedIndexRefreshResponse r;
-
- if (argc != 3) usage(argv[0]);
- if (!check_fault(soap,
- soap_call_jpsrv__FeedIndexRefresh(soap, server, "",
- argv[2], &r))) {
- printf("FeedId: %s\nExpires: %s\n",r.feedId,ctime(&r.expires));
- }
- } else if (!strcasecmp(argv[1],"GetJob")) {
- struct jpsrv__GetJobResponse r;
-
- if (argc != 3) usage(argv[0]);
-
- if (!check_fault(soap,soap_call_jpsrv__GetJob(soap,server,"",
- argv[2],&r)))
- {
- printf("JobLog:\t%s\nInput:\t%s\nOutput:\t%s\nTags:\t%s\n",
- r.jobLog,r.inputSandbox,r.outputSandbox,r.tags);
- }
-
- }
- else usage(argv[0]);
-
- return 0;
-}
-
-
-/* XXX: we don't use it */
-SOAP_NMAC struct Namespace namespaces[] = { {NULL,NULL} };
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" ?>
-<!--
- Copyright (c) Members of the EGEE Collaboration. 2004
- See http://eu-egee.org/partners/ for details on the copyright holders
- For license conditions see the license file or http://eu-egee.org/license.html
-
- Configuration options for the gLite JP Primary module
-
- Authors: Ales Krenek <ljocha@ics.muni.cz>
- Version info: $Id$
- Release: $Name$
-
- Revision history:
- $Log$
- Revision 1.2 2004/10/15 12:19:28 akrenek
- build with gsoap 2.7 too
-
- Revision 1.1.1.1 2004/10/15 09:49:24 akrenek
--->
-
- <!-- ======================================================
- Define extra properties here ...
- ====================================================== -->
-
- <project name="LB Common configuration options">
- <target name="lbmakefiles">
- <exec executable="ln" failonerror="true">
- <arg line="-fs ${component.dir}/Makefile ${module.build.dir}/Makefile"/>
- </exec>
- <echo file="${module.build.dir}/Makefile.inc">
-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}
- </echo>
- </target>
- </project>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (c) Members of the EGEE Collaboration. 2004
- See http://eu-egee.org/partners/ for details on the copyright holders
- For license conditions see the license file or http://eu-egee.org/license.html
-
- Common build properties file for the gLite JP Primary component
-
- Authors: Ales Krenek <ljocha@ics.muni.cz>
- Version info: $Id$
- Release: $Name$
-
- Revision history:
- $Log$
--->
-
-<project name="JP Primary component common properties">
-
- <!-- Include build properties to allow overwriting
- of properties for subsystem -->
- <property file="project/build.properties" />
-
- <!-- ======================================================
- Define corresponding subsystem properties
- ====================================================== -->
-
- <!-- Subsystem name -->
- <property name="subsystem.name" value="${jp.subsystem.name}"/>
-
- <!-- Subsystem prefix -->
- <property name="subsystem.prefix" value="${jp.subsystem.prefix}"/>
-
- <!-- ======================================================
- Define component properties
- ====================================================== -->
-
- <!-- Component name prefix -->
- <property name="component.prefix" value="primary" />
-
- <!-- ======================================================
- Define general component properties
- ====================================================== -->
-
- <import file="${component.general.properties.file}" />
-
- <!-- ======================================================
- Define extra properties here ...
- ====================================================== -->
-
-
-</project>
+++ /dev/null
-tar_exclude
-CVS
-build.xml
-build
-build.properties
-properties.xml
-configure.properties.xml
-.cvsignore
-.project
-.cdtproject
+++ /dev/null
-#Fri Dec 10 13:37:05 CET 2004
-module.version=0.1.0
-module.build=3
-module.age=1
+++ /dev/null
-#ifndef __GLITE_JP_BACKEND
-#define __GLITE_JP_BACKEND
-
-#include <sys/types.h>
-#include <unistd.h>
-
-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
+++ /dev/null
-#include <stdio.h>
-#include <time.h>
-#include <stdlib.h>
-#include <string.h>
-#include <errno.h>
-#include <assert.h>
-
-#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; i<GLITE_JP_ATTR__LAST; i++) attri[i] = -1;
- for (i=0; attrs[i].attr.type; i++) attri[attrs[i].attr.type] = i;
-
- if (feed->qry) {
- int j,complete = 1;
-
- memset(qi,0,sizeof qi);
- for (i=0; feed->qry[i].attr.type; i++) {
- assert(i<QUERY_MAX);
- if ((j=attri[feed->qry[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; i++) attri[i] = -1;
- for (i=0; attrs[i].attr.type; i++) {
- if (attrs[i].attr.type >= 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;
-}
-
+++ /dev/null
-#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
-
+++ /dev/null
-#ident "$Header$"
-
-#include <getopt.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <string.h>
-#include <errno.h>
-#include <stdio.h>
-#include <fcntl.h>
-#include <assert.h>
-#include <limits.h>
-#include <dirent.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-
-#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
-*/
+++ /dev/null
-#include <stdio.h>
-#include <time.h>
-#include <stdlib.h>
-#include <string.h>
-#include <errno.h>
-#include <assert.h>
-
-#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;
-}
+++ /dev/null
-#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
-
+++ /dev/null
-#include <stdio.h>
-
-#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} };
+++ /dev/null
-#include <stdio.h>
-#include <fcntl.h>
-
-#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<attributes->__sizeitem; i++) s2jp_attr(attributes->item[i],attrs+i);
- for (i = 0; i<query->__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 <history> and <continous> 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;
-}
-
+++ /dev/null
-#include <stdio.h>
-#include <string.h>
-#include <assert.h>
-#include <errno.h>
-#include <stdlib.h>
-
-#include <glite/jp/types.h>
-#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);
-}
+++ /dev/null
-int glite_jpps_tag_append(glite_jp_context_t,void *,const glite_jp_tagval_t *);
+++ /dev/null
-jpsrv = http://glite.org/wsdl/services/jp
-jptype = http://glite.org/wsdl/types/jp
+++ /dev/null
-.project
-.cdtproject
\ No newline at end of file
+++ /dev/null
-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
-<email address>.
-
-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/
-
-
+++ /dev/null
-# 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
-
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" ?>
-<!--
- 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), Finland
- University of Bergen (UiB), Norway
- Council for the Central Laboratory of the Research Councils (CCLRC), United Kingdom
-
- Build file for the GLite jp ws-interface component
-
- Authors: Joachim Flammer <Joachim.Flammer@Cern.ch>
- Version info: $Id$
- Release: $Name$
-
- Revision history:
- $Log$
- Revision 1.5 2004/07/20 16:08:30 flammer
- Changed incorrect my_... instead of .._template entries for subsystem and component.
-
- Revision 1.4 2004/07/16 16:32:53 flammer
- Added comment where to add language target.
-
- Revision 1.3 2004/07/16 14:56:55 flammer
- Corrected input path of build.properties.
-
- Revision 1.2 2004/07/06 20:43:19 flammer
- Update of configure & targets.
-
- Revision 1.1.1.1 2004/06/18 12:40:17 flammer
- Added general component template.
-
-
--->
-
-<project name="ws-interface" default="dist">
-
- <!-- ==============================================
- Builds the GLite jp ws-interface component
- ============================================== -->
-
- <!-- =========================================
- Import properties (order is important)
- ========================================= -->
-
- <!-- Import baseline properties & user properties -->
- <import file="../org.glite/project/baseline.properties.xml" />
-
- <!-- import component build properties,
- component properties &
- component common properties -->
- <import file="./project/properties.xml"/>
-
- <!-- import subsystem build properties,
- subsystem properties &
- subsystem common properties -->
- <import file="${subsystem.properties.file}"/>
-
- <!-- import global build properties &
- global properties -->
- <import file="${global.properties.file}" />
-
- <!-- =========================================
- Load dependency property files (order is important)
- ========================================= -->
- <property file="${user.dependencies.file}"/>
- <property file="${component.dependencies.file}" />
- <property file="${subsystem.dependencies.file}" />
- <property file="${global.dependencies.file}"/>
-
- <!-- =========================================
- Load configuration definitions (order is important)
- ========================================= -->
- <import file="${global.configure.options.file}"/>
- <import file="${component.configure.options.file}"/>
-
- <!-- =========================================
- Import task definitions (order is important)
- ========================================= -->
- <import file="${subsystem.taskdefs.file}" />
- <import file="${global.taskdefs.file}" />
-
- <!-- =========================================
- Load common targets
- ========================================= -->
- <!-- Put your language target (java/c++-ant/c++-autotool/perl) here -->
- <import file="${global.targets-simple_make.file}" />
-
- <!-- =========================================
- Load version file
- ========================================= -->
- <property file="${module.version.file}"/>
-
- <!-- ==============================================
- Local private targets
- ============================================== -->
-
- <target name="localinit"
- description="Module specific initialization tasks">
- <antcall target="lbmakefiles" />
- </target>
-
- <target name="localcompile"
- description="Module specific compile tasks">
- </target>
-
- <target name="localclean"
- description="Module specific cleaning tasks">
- </target>
-
-</project>
+++ /dev/null
-<WSDL:definitions
- xmlns:tns="http://glite.org/wsdl/services/jp"
- xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:xsd="http://www.w3.org/2001/XMLSchema"
- xmlns:jp="http://glite.org/wsdl/types/jp"
- xmlns:SOAP="http://schemas.xmlsoap.org/wsdl/soap/"
- xmlns:WSDL="http://schemas.xmlsoap.org/wsdl/"
- xmlns="http://schemas.xmlsoap.org/wsdl/"
- targetNamespace="http://glite.org/wsdl/services/jp"
- name="JobProvenanceIS">
-
- <import namespace="http://glite.org/wsdl/types/jp" location="JobProvenanceTypes.wsdl"/>
-
- <message name="GenericJPFault">
- <part name="fault" element="jp:GenericJPFault"/>
- </message>
-
- <message name="QueryJobsRequest">
- <part name="conditions" type="jp:IndexQuery"/>
- </message>
-
- <message name="QueryJobsResponse">
- <part name="jobs" type="jp:JobRecords"/>
- </message>
-
- <message name="UpdateJobsRequest">
- <part name="feedId" type="xsd:string"/>
- <part name="data" type="jp:UpdateJobsData"/>
- <part name="feedDone" type="xsd:boolean"/>
- </message>
- <message name="EmptyResponse"/>
-
- <portType name="JobProvenanceIS_PortType">
- <operation name="UpdateJobs">
- <documentation>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
-
-
- </documentation>
- <input message="tns:UpdateJobsRequest"/>
- <output message="tns:EmptyResponse"/>
- <fault name="f" message="tns:GenericJPFault"/>
- </operation>
- <operation name="QueryJobs">
- <documentation>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
- </documentation>
- <input message="tns:QueryJobsRequest"/>
- <output message="tns:QueryJobsResponse"/>
- <fault name="f" message="tns:GenericJPFault"/>
- </operation>
- </portType>
-
- <binding name="JobProvenanceIS" type="tns:JobProvenanceIS_PortType">
- <SOAP:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
- <operation name="UpdateJobs">
- <SOAP:operation style="rpc"/>
- <input>
- <SOAP:body use="literal" namespace="http://glite.org/wsdl/services/jp"/>
- </input>
- <output>
- <SOAP:body use="literal" namespace="http://glite.org/wsdl/services/jp"/>
- </output>
- <fault name="f">
- <SOAP:fault name="f" use="literal"/>
- </fault>
- </operation>
- <operation name="QueryJobs">
- <SOAP:operation style="rpc"/>
- <input>
- <SOAP:body use="literal" namespace="http://glite.org/wsdl/services/jp"/>
- </input>
- <output>
- <SOAP:body use="literal" namespace="http://glite.org/wsdl/services/jp"/>
- </output>
- <fault name="f">
- <SOAP:fault name="f" use="literal"/>
- </fault>
- </operation>
- </binding>
-
- <service name="JobProvenanceIS">
- <documentation>Job Provenance Index service</documentation>
- <port name="JobProvenanceIS" binding="tns:JobProvenanceIS">
- <SOAP:address location="http://localhost:10001"/>
- </port>
- </service>
-
-
-</WSDL:definitions>
+++ /dev/null
-<WSDL:definitions
- xmlns:tns="http://glite.org/wsdl/services/jp"
- xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:xsd="http://www.w3.org/2001/XMLSchema"
- xmlns:jp="http://glite.org/wsdl/types/jp"
- xmlns:SOAP="http://schemas.xmlsoap.org/wsdl/soap/"
- xmlns:WSDL="http://schemas.xmlsoap.org/wsdl/"
- xmlns="http://schemas.xmlsoap.org/wsdl/"
- targetNamespace="http://glite.org/wsdl/services/jp"
- name="JobProvenancePS">
-
- <import namespace="http://glite.org/wsdl/types/jp" location="JobProvenanceTypes.wsdl"/>
-
- <message name="RegisterJobRequest">
- <part name="job" type="xsd:string"/>
- </message>
- <message name="StartUploadRequest">
- <part name="job" type="xsd:string"/>
- <part name="uclass" type="jp:UploadClass"/>
- <part name="commitBefore" type="xsd:dateTime"/>
- <part name="contentType" type="xsd:string"/>
- </message>
- <message name="StartUploadResponse">
- <part name="destination" type="xsd:string"/>
- <part name="commitBefore" type="xsd:dateTime"/>
- </message>
- <message name="CommitUploadRequest">
- <part name="destination" type="xsd:string"/>
- </message>
- <message name="RecordTagRequest">
- <part name="jobid" type="xsd:string"/>
- <part name="tag" type="jp:TagValue"/>
- </message>
- <message name="FeedIndexRequest">
- <part name="destination" type="xsd:string"/>
- <part name="attributes" type="jp:Attributes"/>
- <part name="conditions" type="jp:PrimaryQuery"/>
- <part name="history" type="xsd:boolean"/>
- <part name="continuous" type="xsd:boolean"/>
- </message>
- <message name="FeedIndexResponse">
- <part name="feedId" type="xsd:string"/>
- <part name="expires" type="xsd:dateTime"/>
- </message>
- <message name="FeedIndexRefreshRequest">
- <part name="feedId" type="xsd:string"/>
- </message>
- <message name="GetJobRequest">
- <part name="jobid" type="xsd:string"/>
- </message>
- <message name="GetJobResponse">
- <part name="jobLog" type="xsd:string"/>
- <part name="inputSandbox" type="xsd:string"/>
- <part name="outputSandbox" type="xsd:string"/>
- <part name="tags" type="xsd:string"/>
- </message>
- <message name="GenericJPFault">
- <part name="fault" element="jp:GenericJPFault"/>
- </message>
- <message name="EmptyResponse"/>
- <portType name="JobProvenancePS_PortType">
- <operation name="RegisterJob">
- <documentation>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
- </documentation>
- <input message="tns:RegisterJobRequest"/>
- <output message="tns:EmptyResponse"/>
- <fault name="f" message="tns:GenericJPFault"/>
- </operation>
- <operation name="StartUpload">
- <documentation>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.</documentation>
- <input message="tns:StartUploadRequest"/>
- <output message="tns:StartUploadResponse"/>
- <fault name="f" message="tns:GenericJPFault"/>
- </operation>
- <operation name="CommitUpload">
- <documentation>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
- </documentation>
- <input message="tns:CommitUploadRequest"/>
- <output message="tns:EmptyResponse"/>
- <fault name="f" message="tns:GenericJPFault"/>
- </operation>
- <operation name="RecordTag">
- <documentation>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
- </documentation>
- <input message="tns:RecordTagRequest"/>
- <output message="tns:EmptyResponse"/>
- <fault name="f" message="tns:GenericJPFault"/>
- </operation>
- <operation name="FeedIndex">
- <documentation>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
- </documentation>
- <input message="tns:FeedIndexRequest"/>
- <output message="tns:FeedIndexResponse"/>
- <fault name="f" message="tns:GenericJPFault"/>
- </operation>
- <operation name="FeedIndexRefresh">
- <documentation>Extend batch feed subscription (used by index server)
-
-Input: feedId returned previously by FeedIndex
-
-Output: the same as for FeedIndex
-
-Faults: GenericJPFault
- </documentation>
- <input message="tns:FeedIndexRefreshRequest"/>
- <output message="tns:FeedIndexResponse"/>
- <fault name="f" message="tns:GenericJPFault"/>
- </operation>
- <operation name="GetJob">
- <documentation>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
- </documentation>
- <input message="tns:GetJobRequest"/>
- <output message="tns:GetJobResponse"/>
- <fault name="f" message="tns:GenericJPFault"/>
- </operation>
- </portType>
- <binding name="JobProvenancePS" type="tns:JobProvenancePS_PortType">
- <SOAP:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
- <operation name="RegisterJob">
- <SOAP:operation style="rpc"/>
- <input>
- <SOAP:body use="literal" namespace="http://glite.org/wsdl/services/jp"/>
- </input>
- <output>
- <SOAP:body use="literal" namespace="http://glite.org/wsdl/services/jp"/>
- </output>
- <fault name="f">
- <SOAP:fault name="f" use="literal"/>
- </fault>
- </operation>
- <operation name="StartUpload">
- <SOAP:operation style="rpc"/>
- <input>
- <SOAP:body use="literal" namespace="http://glite.org/wsdl/services/jp"/>
- </input>
- <output>
- <SOAP:body use="literal" namespace="http://glite.org/wsdl/services/jp"/>
- </output>
- <fault name="f">
- <SOAP:fault name="f" use="literal"/>
- </fault>
- </operation>
- <operation name="CommitUpload">
- <SOAP:operation style="rpc"/>
- <input>
- <SOAP:body use="literal" namespace="http://glite.org/wsdl/services/jp"/>
- </input>
- <output>
- <SOAP:body use="literal" namespace="http://glite.org/wsdl/services/jp"/>
- </output>
- <fault name="f">
- <SOAP:fault name="f" use="literal"/>
- </fault>
- </operation>
- <operation name="RecordTag">
- <SOAP:operation style="rpc"/>
- <input>
- <SOAP:body use="literal" namespace="http://glite.org/wsdl/services/jp"/>
- </input>
- <output>
- <SOAP:body use="literal" namespace="http://glite.org/wsdl/services/jp"/>
- </output>
- <fault name="f">
- <SOAP:fault name="f" use="literal"/>
- </fault>
- </operation>
- <operation name="FeedIndex">
- <SOAP:operation style="rpc"/>
- <input>
- <SOAP:body use="literal" namespace="http://glite.org/wsdl/services/jp"/>
- </input>
- <output>
- <SOAP:body use="literal" namespace="http://glite.org/wsdl/services/jp"/>
- </output>
- <fault name="f">
- <SOAP:fault name="f" use="literal"/>
- </fault>
- </operation>
- <operation name="FeedIndexRefresh">
- <SOAP:operation style="rpc"/>
- <input>
- <SOAP:body use="literal" namespace="http://glite.org/wsdl/services/jp"/>
- </input>
- <output>
- <SOAP:body use="literal" namespace="http://glite.org/wsdl/services/jp"/>
- </output>
- <fault name="f">
- <SOAP:fault name="f" use="literal"/>
- </fault>
- </operation>
- <operation name="GetJob">
- <SOAP:operation style="rpc"/>
- <input>
- <SOAP:body use="literal" namespace="http://glite.org/wsdl/services/jp"/>
- </input>
- <output>
- <SOAP:body use="literal" namespace="http://glite.org/wsdl/services/jp"/>
- </output>
- <fault name="f">
- <SOAP:fault name="f" use="literal"/>
- </fault>
- </operation>
- </binding>
-
- <service name="JobProvenancePS">
- <documentation>Job Provenance Primary Storage service</documentation>
- <port name="JobProvenancePS" binding="tns:JobProvenancePS">
- <SOAP:address location="http://localhost:10001"/>
- </port>
- </service>
-</WSDL:definitions>
+++ /dev/null
-<?xml version="1.0"?>
-<WSDL:definitions
- xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
- xmlns:xsd="http://www.w3.org/2001/XMLSchema"
- xmlns:WSDL="http://schemas.xmlsoap.org/wsdl/"
- xmlns="http://schemas.xmlsoap.org/wsdl/"
- xmlns:jp="http://glite.org/wsdl/types/jp"
- targetNamespace="http://glite.org/wsdl/types/jp"
- name="JobProvenanceTypes">
-
-
-<WSDL:types>
-
-<schema
- targetNamespace="http://glite.org/wsdl/types/jp"
- xmlns="http://www.w3.org/2001/XMLSchema"
- elementFormDefault="unqualified" attributeFormDefault="unqualified">
- <import namespace="http://schemas.xmlsoap.org/soap/encoding/"/>
-
- <simpleType name="AttributeType">
- <restriction base="xsd:string">
- <enumeration value="OWNER"/>
- <enumeration value="TIME"/>
- <enumeration value="TAG"/>
- </restriction>
- </simpleType>
- <simpleType name="UploadClass">
- <restriction base="xsd:string">
- <enumeration value="INPUT-SANDBOX"/>
- <enumeration value="OUTPUT-SANDBOX"/>
- <enumeration value="JOB-LOG"/>
- </restriction>
- </simpleType>
- <simpleType name="QueryOp">
- <restriction base="xsd:string">
- <enumeration value="EQUAL"/>
- <enumeration value="UNEQUAL"/>
- <enumeration value="LESS"/>
- <enumeration value="GREATER"/>
- <enumeration value="WITHIN"/>
- </restriction>
- </simpleType>
- <complexType name="TagValue">
- <sequence>
- <element name="name" type="xsd:string" minOccurs="1" maxOccurs="1" nillable="true"/>
- <element name="sequence" type="xsd:int" minOccurs="0" maxOccurs="1"/>
- <element name="timestamp" type="xsd:dateTime" minOccurs="0" maxOccurs="1" nillable="true"/>
- <element name="stringValue" type="xsd:string" minOccurs="0" maxOccurs="1" nillable="true"/>
- <element name="blobValue" type="xsd:base64Binary" minOccurs="0" maxOccurs="1" nillable="true"/>
- </sequence>
- </complexType>
- <complexType name="Attribute">
- <sequence>
- <element name="type" type="jp:AttributeType" minOccurs="1" maxOccurs="1"/>
- <element name="name" type="xsd:string" minOccurs="0" maxOccurs="1"/>
- </sequence>
- </complexType>
- <complexType name="Attributes">
- <sequence>
- <element name="item" type="jp:Attribute" minOccurs="0" maxOccurs="unbounded"/>
- </sequence>
- </complexType>
- <complexType name="GenericJPFaultType">
- <sequence>
- <element name="source" type="xsd:string" minOccurs="1" maxOccurs="1"/>
- <element name="code" type="xsd:int" minOccurs="1" maxOccurs="1"/>
- <element name="text" type="xsd:string" minOccurs="1" maxOccurs="1"/>
- <element name="description" type="xsd:string" minOccurs="0" maxOccurs="1"/>
- <element name="reason" type="jp:GenericJPFaultType" minOccurs="0" maxOccurs="1"/>
- </sequence>
- </complexType>
- <complexType name="PrimaryQueryElement">
- <sequence>
- <element name="attr" type="jp:Attribute" minOccurs="1" maxOccurs="1"/>
- <element name="op" type="jp:QueryOp" minOccurs="1" maxOccurs="1"/>
- <element name="value" type="xsd:string" minOccurs="1" maxOccurs="1"/>
- <element name="value2" type="xsd:string" minOccurs="1" maxOccurs="1"/>
- </sequence>
- </complexType>
- <complexType name="PrimaryQuery">
- <sequence>
- <element name="item" type="jp:PrimaryQueryElement" minOccurs="0" maxOccurs="unbounded"/>
- </sequence>
- </complexType>
- <complexType name="IndexQueryRecord">
- <sequence>
- <element name="op" type="jp:QueryOp" minOccurs="1" maxOccurs="1"/>
- <element name="value" type="xsd:string" minOccurs="1" maxOccurs="1"/>
- </sequence>
- </complexType>
- <complexType name="IndexQueryElement">
- <sequence>
- <element name="attr" type="jp:Attribute" minOccurs="1" maxOccurs="1"/>
- <element name="record" type="jp:IndexQueryRecord" minOccurs="1" maxOccurs="unbounded"/>
- </sequence>
- </complexType>
- <complexType name="IndexQuery">
- <sequence>
- <element name="item" type="jp:IndexQueryElement" minOccurs="1" maxOccurs="unbounded"/>
- </sequence>
- </complexType>
- <complexType name="JobRecord">
- <sequence>
- <element name="jobid" type="xsd:string" minOccurs="1" maxOccurs="1"/>
- <element name="PSContact" type="xsd:string" minOccurs="1" maxOccurs="1"/>
- </sequence>
- </complexType>
- <complexType name="JobRecords">
- <sequence>
- <element name="record" type="jp:JobRecord" minOccurs="0" maxOccurs="unbounded"/>
- </sequence>
- </complexType>
-
- <complexType name="AttrUpdate">
- <sequence>
- <element name="name" type="xsd:string" minOccurs="1" maxOccurs="1"/>
- <element name="value" type="xsd:string" minOccurs="0" maxOccurs="1"/>
- </sequence>
- </complexType>
- <complexType name="AttrUpdates">
- <sequence>
- <element name="item" type="jp:AttrUpdate" minOccurs="0" maxOccurs="unbounded" nillable="true"/>
- </sequence>
- </complexType>
- <complexType name="JobUpdate">
- <sequence>
- <element name="jobid" type="xsd:string" minOccurs="1" maxOccurs="1"/>
- <element name="attributes" type="jp:AttrUpdates" minOccurs="1" maxOccurs="1"/>
- <element name="tags" type="jp:AttrUpdates" minOccurs="1" maxOccurs="1"/>
- </sequence>
- </complexType>
- <complexType name="UpdateJobsData">
- <sequence>
- <element name="job" type="jp:JobUpdate" minOccurs="0" maxOccurs="unbounded"/>
- </sequence>
- </complexType>
-
- <complexType name="FeedIndexResponse">
- <sequence>
- <element name="feedId" type="xsd:string" minOccurs="0" maxOccurs="1" nillable="true"/>
- <element name="expires" type="xsd:dateTime" minOccurs="0" maxOccurs="1" nillable="true"/>
- </sequence>
- </complexType>
- <complexType name="GetJobResponse">
- <sequence>
- <element name="jobLog" type="xsd:string" minOccurs="0" maxOccurs="1" nillable="true"/>
- <element name="inputSandbox" type="xsd:string" minOccurs="0" maxOccurs="1" nillable="true"/>
- <element name="outputSandbox" type="xsd:string" minOccurs="0" maxOccurs="1" nillable="true"/>
- <element name="tags" type="xsd:string" minOccurs="0" maxOccurs="1" nillable="true"/>
- </sequence>
- </complexType>
- <complexType name="StartUploadResponse">
- <sequence>
- <element name="destination" type="xsd:string" minOccurs="0" maxOccurs="1" nillable="true"/>
- <element name="commitBefore" type="xsd:dateTime" minOccurs="0" maxOccurs="1" nillable="true"/>
- </sequence>
- </complexType>
- <element name="GenericJPFault" type="jp:GenericJPFaultType"/>
-</schema>
-
-</WSDL:types>
-</WSDL:definitions>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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), Finland
- University of Bergen (UiB), Norway
- Council for the Central Laboratory of the Research Councils (CCLRC), United Kingdom
-
- Configuration build properties file for the GLite jp ws-interface component
-
- Authors: Joachim Flammer <Joachim.Flammer@cern.ch>
- Version info: $Id$
- Release: $Name$
-
- Revision history:
- $Log$
- Revision 1.3 2004/07/20 16:08:30 flammer
- Changed incorrect my_... instead of .._template entries for subsystem and component.
-
- Revision 1.2 2004/07/16 14:56:55 flammer
- Corrected input path of build.properties.
-
- Revision 1.1 2004/07/06 20:43:19 flammer
- Update of configure & targets.
-
-
-
--->
-<project name="jp ws-interface component configuration properties">
-
-<target name="lbmakefiles">
- <exec executable="ln" failonerror="true">
- <arg line="-fs ${component.dir}/Makefile ${module.build.dir}/Makefile"/>
- </exec>
- <echo file="${module.build.dir}/Makefile.inc">
-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}
- </echo>
- </target>
-</project>
+++ /dev/null
-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
-
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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), Finland
- University of Bergen (UiB), Norway
- Council for the Central Laboratory of the Research Councils (CCLRC), United Kingdom
-
- Common build properties file for the GLite jp ws-interface component
-
- Authors: Joachim Flammer <Joachim.Flammer@cern.ch>
- Version info: $Id$
- Release: $Name$
-
- Revision history:
- $Log$
- Revision 1.4 2004/07/20 16:08:30 flammer
- Changed incorrect my_... instead of .._template entries for subsystem and component.
-
- Revision 1.3 2004/07/16 14:56:55 flammer
- Corrected input path of build.properties.
-
- Revision 1.2 2004/07/16 14:36:49 flammer
-
- Corrected build.properties include.
-
- Revision 1.1.1.1 2004/06/18 12:40:17 flammer
- Added general component template.
-
-
--->
-
-<project name="jp ws-interface component common properties">
-
- <!-- Include build properties to allow overwriting
- of properties for subsystem -->
- <property file="project/build.properties" />
-
- <!-- ======================================================
- Define corresponding subsystem properties
- ====================================================== -->
-
- <!-- Subsystem name -->
- <property name="subsystem.name" value="${jp.subsystem.name}"/>
-
- <!-- Subsystem prefix -->
- <property name="subsystem.prefix" value="${jp.subsystem.prefix}"/>
-
- <!-- ======================================================
- Define component properties
- ====================================================== -->
-
- <!-- Component name prefix -->
- <property name="component.prefix" value="ws-interface" />
-
- <!-- ======================================================
- Define general component properties
- ====================================================== -->
-
- <import file="${component.general.properties.file}" />
-
- <!-- ======================================================
- Define extra properties here ...
- ====================================================== -->
-
-
-</project>
+++ /dev/null
-module.version = 0.0.0
-module.build = 0
-module.age = 0
\ No newline at end of file
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" ?>
-<!--
- Copyright (c) Members of the EGEE Collaboration. 2004
- See http://eu-egee.org/partners/ for details on the copyright holders
- For license conditions see the license file or http://eu-egee.org/license.html
-
- Build file for the GLite Middleware Job Provenance Subsystem
-
- Authors: Ales Krenek <ljocha@ics.muni.cz>
- Version info: $Id$
- Release: $Name$
-
- Revision history:
- $Log$
- Revision 1.2 2004/12/01 18:36:00 zsalvet
- Add component targets.
-
- Revision 1.1 2004/11/22 13:21:49 dimeglio
- First version of this file
-
--->
-
-<project name="jp" default="dist">
-
- <description>
- Ant build file to build the GLite Job Provenance Subsystem
- </description>
-
- <!-- =========================================
- Builds the GLite JP subsystem
- ========================================= -->
-
- <!-- Import baseline & user properties -->
- <import file="../org.glite/project/baseline.properties.xml" />
-
- <!-- Import subsystem build properties,
- subsystem properties &
- subsystem common properties -->
- <import file="./project/properties.xml" />
-
- <!-- Import global build properties and global properties -->
- <import file="${global.properties.file}" />
-
- <!-- =========================================
- Load dependencies properties files (order is important)
- ========================================= -->
- <property file="${user.dependencies.file}"/>
- <property file="${subsystem.dependencies.file}"/>
- <property file="${global.dependencies.file}"/>
-
- <!-- =========================================
- Load configure options
- ========================================= -->
- <import file="${global.configure.options.file}"/>
-
- <!-- =========================================
- Import global task definitions
- ========================================= -->
- <import file="${global.taskdefs.file}" />
-
- <!-- =========================================
- Import global compiler definitions
- ========================================= -->
- <import file="${global.compilerdefs.file}" />
-
- <!-- =========================================
- Import targets
- ========================================= -->
- <import file="${global.targets-common.file}"/>
-
- <!-- =========================================
- Load version file
- ========================================= -->
- <property file="${module.version.file}"/>
-
- <!-- ===============================================
- Public common targets
- =============================================== -->
-
- <target name="localinit" depends="envcheck">
-
- <echo> Preparing directories ... </echo>
-
- <mkdir dir="${stage.bin.dir}" />
- <mkdir dir="${stage.lib.dir}" />
- <mkdir dir="${stage.java.dir}" />
- <mkdir dir="${stage.inc.dir}" />
- <mkdir dir="${stage.int.dir}" />
-
- <mkdir dir="${dist.dir}" />
-
- </target>
-
- <target name="init" depends="localinit">
- <antcall target="buildmodules">
- <param name="target" value="init"/>
- </antcall>
- </target>
-
- <target name="checkstyle" depends="localinit">
- <antcall target="buildmodules">
- <param name="target" value="checkstyle"/>
- </antcall>
- </target>
-
- <target name="compile" depends="localinit">
- <antcall target="buildmodules">
- <param name="target" value="compile"/>
- </antcall>
- </target>
-
- <target name="compiletest" depends="localinit">
- <antcall target="buildmodules">
- <param name="target" value="compiletest"/>
- </antcall>
- </target>
-
- <target name="unittest" depends="localinit">
- <antcall target="buildmodules">
- <param name="target" value="unittest"/>
- </antcall>
- </target>
-
- <target name="unitcoverage" depends="localinit">
- <antcall target="buildmodules">
- <param name="target" value="unitcoverage"/>
- </antcall>
- </target>
-
- <target name="stage" depends="localinit">
- <antcall target="buildmodules">
- <param name="target" value="stage"/>
- </antcall>
- </target>
-
- <target name="dist" depends="localinit">
- <antcall target="buildmodules">
- <param name="target" value="dist"/>
- </antcall>
- </target>
-
- <target name="install" depends="localinit">
- <antcall target="buildmodules">
- <param name="target" value="install"/>
- </antcall>
- </target>
-
- <target name="doc" depends="localinit">
- <antcall target="buildmodules">
- <param name="target" value="doc"/>
- </antcall>
- </target>
-
- <target name="all" depends="localinit">
- <antcall target="buildmodules">
- <param name="target" value="all"/>
- </antcall>
- </target>
-
- <target name="clean" depends="envcheck">
-
- <property name="offline.repository" value="true" />
- <antcall target="buildmodules">
- <param name="target" value="clean"/>
- </antcall>
-
- <delete dir="${module.bin.dir}" />
- <delete dir="${module.lib.dir}" />
- <delete dir="${module.autosrc.dir}" />
- <delete dir="${module.autodoc.dir}" />
- <delete dir="${module.test.reports.dir}" />
-
- </target>
-
- <target name="cleanAll" depends="clean"/>
-
- <!-- ===============================================
- Private targets
- =============================================== -->
-
- <!-- ===============================================
- Modules proxy targets
- =============================================== -->
-
- <!-- component targets definitions tag = do not remove = -->
-
- <target name="ws-interface" unless="setenvonly" depends="envset" >
- <if>
- <isset property="small.memory" />
- <then>
- <exec dir="${jp.subsystem.dir}.ws-interface" executable="${antExec}" failonerror="${failonerror}">
- <arg line="${target} "-Dsmall.memory=true" "-Dbootstrap=${bootstrap}" "-Dfailonerror=${failonerror}" "-Ddo.cvs.tag=${do.cvs.tag}""/>
- </exec>
- </then>
- <else>
- <ant dir="${jp.subsystem.dir}.ws-interface"
- target="${target}"
- inheritall="false" />
- </else>
- </if>
- </target>
-
- <target name="common" unless="setenvonly" depends="envset" >
- <if>
- <isset property="small.memory" />
- <then>
- <exec dir="${jp.subsystem.dir}.common" executable="${antExec}" failonerror="${failonerror}">
- <arg line="${target} "-Dsmall.memory=true" "-Dbootstrap=${bootstrap}" "-Dfailonerror=${failonerror}" "-Ddo.cvs.tag=${do.cvs.tag}""/>
- </exec>
- </then>
- <else>
- <ant dir="${jp.subsystem.dir}.common"
- target="${target}"
- inheritall="false" />
- </else>
- </if>
- </target>
-
- <target name="index" unless="setenvonly" depends="envset, common" >
- <if>
- <isset property="small.memory" />
- <then>
- <exec dir="${jp.subsystem.dir}.index" executable="${antExec}" failonerror="${failonerror}">
- <arg line="${target} "-Dsmall.memory=true" "-Dbootstrap=${bootstrap}" "-Dfailonerror=${failonerror}" "-Ddo.cvs.tag=${do.cvs.tag}""/>
- </exec>
- </then>
- <else>
- <ant dir="${jp.subsystem.dir}.index"
- target="${target}"
- inheritall="false" />
- </else>
- </if>
- </target>
-
- <target name="primary" unless="setenvonly" depends="envset, ws-interface, common" >
- <if>
- <isset property="small.memory" />
- <then>
- <exec dir="${jp.subsystem.dir}.primary" executable="${antExec}" failonerror="${failonerror}">
- <arg line="${target} "-Dsmall.memory=true" "-Dbootstrap=${bootstrap}" "-Dfailonerror=${failonerror}" "-Ddo.cvs.tag=${do.cvs.tag}""/>
- </exec>
- </then>
- <else>
- <ant dir="${jp.subsystem.dir}.primary"
- target="${target}"
- inheritall="false" />
- </else>
- </if>
- </target>
-
- <!-- Main proxy -->
- <target name="buildmodules" depends="envset,
- ws-interface,
- common,
- index,
- primary">
- <echo append="true" file="${global.project.dir}/cruisecontrol-stub.xml">
- <project name="${subsystem.name}" type="post-subsystem" packageName="${global.prefix}-${subsystem.prefix}"/>
- </echo>
- </target>
-
-</project>
+++ /dev/null
-###################################################################
-# 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
+++ /dev/null
-<?xml version="1.0"?>
-<!--
- Copyright (c) Members of the EGEE Collaboration. 2004
- See http://eu-egee.org/partners/ for details on the copyright holders
- For license conditions see the license file or http://eu-egee.org/license.html
-
- GLite Middleware Job Provenance Configuration Specification File
-
- Authors: Alberto Di Meglio <alberto.di.meglio@cern.ch>
- Version info: $Id$
- Release: $Name$
-
- Revision history:
- $Log$
- Revision 1.2 2004/12/01 18:24:25 zsalvet
- common, index, and primary components defined
-
- Revision 1.1 2004/11/22 13:21:49 dimeglio
- First version of this file
-
--->
-
-
-<project name="GLite Middleware JP CSF" default="all">
-
- <!-- ===============================================
- Determine workspace directory
- =============================================== -->
-
- <!-- Relative workspace root directory -->
- <property name="workspace.dir" value="../.." />
-
- <!-- ===============================================
- Load properties
- =============================================== -->
-
- <!-- load baseline and user properties -->
- <import file="${workspace.dir}/org.glite/project/baseline.properties.xml" />
-
- <!-- define build properties file location since we are already in project dir -->
- <property name="subsystem.build.properties.file" value="./build.properties" />
-
- <!-- Load subsystem-specific property file -->
- <property file="./properties.xml"/>
-
- <!-- load global properties -->
- <import file="${global.properties.file}" />
-
- <!-- ===============================================
- Load dependencies
- =============================================== -->
-
- <!-- Load user dependencies file -->
- <property file="${user.dependencies.file}" />
-
- <!-- Load subsystem dependencies file -->
- <property file="./dependencies.properties" />
-
- <!-- Load global dependencies file -->
- <property file="${global.dependencies.file}" />
-
- <!-- ===============================================
- Load targets
- =============================================== -->
- <import file="${global.targets-envchecks.file}" />
- <import file="${global.targets-external-dependencies.file}" />
-
- <!-- ===============================================
- Evaluate CVS tags
- =============================================== -->
-
- <target name="evaluate.cvs.tags" description="Figure out if we need tagged CVS checkout">
-
- <condition property="glite.head">
- <and>
- <equals arg1="${org.glite.version}" arg2="HEAD" />
- <or>
- <istrue value="${update}" />
- <not>
- <available file="${global.dependencies.file}" type="file" />
- </not>
- </or>
- </and>
- </condition>
-
- <condition property="glite.tag">
- <and>
- <not>
- <equals arg1="${org.glite.version}" arg2="HEAD" />
- </not>
- <or>
- <istrue value="${update}" />
- <not>
- <available file="${global.dependencies.file}" type="file" />
- </not>
- </or>
- </and>
- </condition>
-
- <condition property="glite-jp.head">
- <and>
- <equals arg1="${org.glite.jp.version}" arg2="HEAD" />
- <istrue value="${update}" />
- </and>
- </condition>
-
- <condition property="glite-jp.tag">
- <and>
- <not>
- <equals arg1="${org.glite.jp.version}" arg2="HEAD" />
- </not>
- <istrue value="${update}" />
- </and>
- </condition>
-
- <!-- condition property tag = do not remove = -->
-
- <condition property="common.head">
- <equals arg1="${org.glite.jp.common.version}" arg2="HEAD" />
- </condition>
-
- <condition property="ws-interface.head">
- <equals arg1="${org.glite.jp.ws-interface.version}" arg2="HEAD" />
- </condition>
-
- <condition property="index.head">
- <equals arg1="${org.glite.jp.index.version}" arg2="HEAD" />
- </condition>
-
- <condition property="primary.head">
- <equals arg1="${org.glite.jp.primary.version}" arg2="HEAD" />
- </condition>
-
- </target>
-
- <presetdef name="cvs-co">
- <cvs command="checkout" dest="${workspace.dir}" />
- </presetdef>
-
- <!-- =====================================================
- Self-update if required
- ===================================================== -->
-
- <!-- Update main GLite module -->
- <target name="org.glite" depends="get.glite.head, get.glite.tag"/>
-
- <target name="get.glite.head" if="glite.head">
- <cvs-co package="org.glite" />
- </target>
-
- <target name="get.glite.tag" if="glite.tag">
- <cvs-co package="org.glite"
- tag="${org.glite.version}" />
- </target>
-
- <!-- Update the current module -->
- <target name="org.glite.jp" depends="get.glite-jp.head,
- get.glite-jp.tag"/>
-
- <target name="get.glite-jp.head" if="glite-jp.head">
- <cvs-co package="org.glite.jp" />
- <fail>The org.glite and org.glite.jp modules have been updated, please rerun the configuration file</fail>
- </target>
-
- <target name="get.glite-jp.tag" if="glite-jp.tag">
- <cvs-co package="org.glite.jp"
- tag="${org.glite.jp.version}" />
- <fail>The org.glite and org.glite.jp modules have been updated, please rerun the configuration file</fail>
- </target>
-
- <!-- *****************************************************-->
- <!-- Development tools -->
- <!-- *****************************************************-->
-
- <!-- All development tools -->
- <target name="devtools" depends="oscheck,
- junitcheck,
- junit,
- chkstyle,
- jalopy,
- ant-contrib,
- cpptasks,
- log4j,
- egee-ant-ext"
- description="Get development tools into repository."/>
-
- <!-- =====================================================
- External libraries
- ===================================================== -->
-
- <!-- All external libraries -->
- <target name="external"
- description="Install external packages" depends="oscheck"/>
-
- <!-- =====================================================
- GLite Middleware jp modules
- ===================================================== -->
-
- <!-- component targets tag = do not remove = -->
-
- <!-- ws-interface -->
- <target name="ws-interface" depends="evaluate.cvs.tags, get.ws-interface.head, get.ws-interface.tag"/>
- <target name="get.ws-interface.head" if="ws-interface.head">
- <cvs-co package="org.glite.jp.ws-interface" />
- </target>
- <target name="get.ws-interface.tag" unless="ws-interface.head">
- <cvs-co package="org.glite.jp.ws-interface"
- tag="${org.glite.jp.ws-interface.version}" />
- </target>
-
- <!-- common -->
- <target name="common" depends="evaluate.cvs.tags, get.common.head, get.common.tag"/>
- <target name="get.common.head" if="common.head">
- <cvs-co package="org.glite.jp.common" />
- </target>
- <target name="get.common.tag" unless="common.head">
- <cvs-co package="org.glite.jp.common"
- tag="${org.glite.jp.common.version}" />
- </target>
-
- <!-- index -->
- <target name="index" depends="evaluate.cvs.tags, get.index.head, get.index.tag"/>
- <target name="get.index.head" if="index.head">
- <cvs-co package="org.glite.jp.index" />
- </target>
- <target name="get.index.tag" unless="index.head">
- <cvs-co package="org.glite.jp.index"
- tag="${org.glite.jp.index.version}" />
- </target>
-
- <!-- primary -->
- <target name="primary" depends="evaluate.cvs.tags, get.primary.head, get.primary.tag"/>
- <target name="get.primary.head" if="primary.head">
- <cvs-co package="org.glite.jp.primary" />
- </target>
- <target name="get.primary.tag" unless="primary.head">
- <cvs-co package="org.glite.jp.primary"
- tag="${org.glite.jp.primary.version}" />
- </target>
-
- <!-- All project modules -->
- <target name="project" depends="ws-interface,
- common,
- index,
- primary" />
-
- <!-- ====================================================
- Checkout all
- ==================================================== -->
-
- <!-- All libraries -->
- <target name="all" depends="oscheck,
- evaluate.cvs.tags,
- defaultenvchecks,
- org.glite,
- org.glite.jp,
- devtools,
- external,
- project" />
-
- <!-- ====================================================
- Print dependecies to console
- ==================================================== -->
-
- <target name="dependencies">
- <concat>
- <fileset dir="." includes="dependencies.properties" />
- </concat>
- </target>
-
-</project>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (c) Members of the EGEE Collaboration. 2004
- See http://eu-egee.org/partners/ for details on the copyright holders
- For license conditions see the license file or http://eu-egee.org/license.html
-
- Common build properties file for the gLite JP modules
-
- Authors: Ales Krenek <ljocha@ics.muni.cz>
- Alberto Di Meglio <alberto.di.meglio@cern.ch>
- Version info: $Id$
- Release: $Name$
-
- Revision history:
- $Log$
--->
-
-<project name="Job Provenance subsystem common properties">
-
- <!-- Include build properties to allow overwriting
- of properties for subsystem -->
- <property name="subsystem.build.properties.file" value="./project/build.properties" />
- <property file="${subsystem.build.properties.file}" />
-
- <!-- ======================================================
- Define subsystem properties
- ====================================================== -->
-
- <!-- Subsystem name -->
- <property name="subsystem.name" value="${jp.subsystem.name}"/>
-
- <!-- Subsystem prefix -->
- <property name="subsystem.prefix" value="${jp.subsystem.prefix}"/>
-
- <!-- ======================================================
- Define general subsystem properties
- ====================================================== -->
-
- <!-- Include common subsystem properties -->
- <import file="${subsystem.general.properties.file}" />
-
- <!-- ======================================================
- Define extra properties here ...
- ====================================================== -->
-
-
-</project>
+++ /dev/null
-#!/bin/sh
-
-cd ../..
-
-cvs co org.glite
-cvs co org.glite.jp
-
-cd org.glite.jp/project
-ant -f glite.jp.csf.xml
-
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (c) Members of the EGEE Collaboration. 2004
- See http://eu-egee.org/partners/ for details on the copyright holders
- For license conditions see the license file or http://eu-egee.org/license.html
-
- Common Ant task definition file for the gLite Job Provenance modules
-
- Authors: Ales Krenek <ljocha@ics.muni.cz>
- Alberto Di Meglio <alberto.di.meglio@cern.ch>
- Version info: $Id$
- Release: $Name$
-
- Revision history:
- $Log$
--->
-
-<project name="Job Provenance subsystem common tasks and types definitions">
-
- <!-- ======================================================
- Subsystem task definitions
- ====================================================== -->
-
-</project>
\ No newline at end of file
+++ /dev/null
-#Fri Dec 10 13:38:38 CET 2004
-module.version=0.1.0
-module.build=3
-module.age=1
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
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
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
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
Load version file
========================================= -->
<property file="${module.version.file}"/>
+ <property file="${module.build.file}"/>
<!-- ==============================================
Local private targets
#ifndef __EDG_WORKLOAD_LOGGING_CLIENT_COUNTREF_HPP__
#define __EDG_WORKLOAD_LOGGING_CLIENT_COUNTREF_HPP__
+/**
+ * Switching into glite.lb namespace (couple with EWL_END_NAMESPACE).
+ */
#define EWL_BEGIN_NAMESPACE namespace glite { namespace lb {
+
+/**
+ * Leave the glite.lb namespace.
+ */
#define EWL_END_NAMESPACE } }
-EWL_BEGIN_NAMESPACE;
+EWL_BEGIN_NAMESPACE
+/** Class implementing simple reference counting mechanism.
+ *
+ * This class is used instead of simple pointers to enable sharing of
+ * objects using simple reference counting mechanism. It encapsulates
+ * the given (pointer to) object and remembers the number of
+ * references to it. Taking and getting rid of the reference to
+ * encapsulated object is explicit by calling member functions use()
+ * and release().
+ */
template<typename T>
class CountRef {
public:
- CountRef(void *);
+ CountRef(void *);
// CountRef(void *,void (*)(void *));
- void use(void);
+ void use(void);
void release(void);
- void *ptr;
+ void *ptr; /**< Pointer to the encapsulated object. */
+
private:
int count;
// void (*destroy)(void *);
};
+/**
+ * Encapsulate the given object and set reference count to 1.
+ *
+ */
template <typename T>
CountRef<T>::CountRef(void *p)
{
count = 1;
}
+/** Decrease the reference count, possibly deallocating the
+ * encapsulated object.
+ *
+ * This method should be called when the holder no longer plans to use
+ * the encapsulated object, instead of deleting it.
+ */
template <typename T>
void CountRef<T>::release(void)
{
}
}
+/** Increase the number of references to the object.
+ *
+ * This method should be called every time the pointer (ie. this
+ * instance) is copied.
+ */
template <typename T>
void CountRef<T>::use(void)
{
count++;
}
-EWL_END_NAMESPACE;
+EWL_END_NAMESPACE
#endif
#include "glite/lb/events.h"
#include "glite/lb/notifid.h"
-EWL_BEGIN_NAMESPACE;
-
+EWL_BEGIN_NAMESPACE
+
+/** Class representing one event in the L&B database.
+ *
+ * This class represents a L&B event, which is basically list of
+ * attribute -- value pairs. For each particular event type (returned
+ * by name()) there is a list of allowed attributes (returned by
+ * getAttrs()). The Event class provides methods for reading these
+ * attributes, but no means of changing the
+ * event are provided; this class is used as a result of L&B queries.
+ */
class Event {
friend class Job;
friend class ServerConnection;
friend class CountRef<Event>;
public:
- /** Event type codes.
- * Identify which of the event fields are valid.
+ /** Event type codes
+ * identify which of the event fields are valid.
*/
-
enum Type {
- UNDEF = 0,
+ UNDEF = 0, /**< Undefined event type. */
@@@{
for my $e ($event->getTypesOrdered) {
my $u = uc $e;
gen "\t\t$u,\t/**< $c */\n";
}
@@@}
- TYPE_MAX
+ TYPE_MAX /**< Limit for checking type validity. */
};
- /** Event attribute symbolic identifier. */
+ /** Event attribute symbolic identifier.
+ * These symbols provide symbolic names for event
+ * attributes. In braces are shown the event types for which the
+ * attribute is defined, for each event type the attribute
+ * meaning is described.
+ */
enum Attr {
@@@{
for (sort {$a cmp $b} getAllFields $event) {
selectType $event $t;
my $cc = getFieldComment $event $_;
$t = 'common' if $t eq '_common_';
- $c .= "\t * $t: $cc\n";
+ $c .= "\t * \\n\[$t\] $cc\n";
}
$c .= "\t */\n";
gen "$c\t\t$u,\n";
}
@@@}
- ATTR_MAX
+ ATTR_MAX /**< Limit for checking attribute code
+ validity. */
};
@@@{
my $ff;
my $ut;
my $utf;
+ my $fc;
if ($t eq '_common_') {
$ff = $f;
$ut = '';
$utf = '';
+ $fc = '';
}
else {
selectType $event $t;
$ff = getField $event;
$ut = uc $t . '_';
$utf = ucfirst $t;
+ $fc = $event->getFieldComment($f);
}
if ($ff->{codes}) {
gen qq{
+! /** $fc */
! enum ${utf}Code \{
};
for (@{$ff->{codes}}) {
}
@@@}
- enum AttrType { INT_T, STRING_T, TIMEVAL_T, PORT_T, LOGSRC_T, JOBID_T, NOTIFID_T };
+ /** Symbolic names for types of attribute values. */
+ enum AttrType { INT_T, /**< Integer value. */
+ STRING_T, /**< String value. */
+ TIMEVAL_T, /**< Time value (ie. struct
+ timeval). */
+ PORT_T, /**< Service port (integer). */
+ LOGSRC_T, /**< Source of the event
+ (integer). */
+ JOBID_T, /**< JobId value. */
+ NOTIFID_T /**< NotifId value. */
+ };
- Type type;
+ Type type; /**< Type of the event as defined by Type. */
+ /** Default constructor.
+ *
+ * Initializes an empty event.
+ */
Event(void);
+
+ /** Constructor from corresponding C type.
+ *
+ * Initializes the object from the corresponding C struct, in
+ * fact holding the pointer to it.
+ */
Event(edg_wll_Event *);
+
+ /** Copy constructor.
+ *
+ * Creates a copy of the object by sharing the C struct
+ * with the original.
+ */
Event(const Event &);
+
+ /** Destructor.
+ *
+ * Releases the C struct (possibly deallocating it).
+ */
~Event(void);
- /** Assign new Event to an existing instance. */
+ /** Assign new Event to an existing instance.
+ *
+ * The original data are released and new ones are made
+ * accessible.
+ * \returns Reference to this object.
+ */
Event & operator= (const Event &);
- /** String representation of the event type */
+ /** String representation of the event type.
+ *
+ * Returns string representing the event type.
+ * \returns Name of the event.
+ * \throw Exception Invalid event type.
+ */
const std::string & name(void) const;
- /** Retrieve integer attribute */
- int getValInt(Attr) const;
-
- /** Retrieve string attribute */
- std::string getValString(Attr) const;
+ /** Retrieve integer attribute.
+ *
+ * Retrieves value for attributes of integer type.
+ * \param[in] name Name of the attribute to retrieve.
+ * \returns Integer value of the attribute.
+ * \throw Exception Invalid event type or attribute not
+ * defined for this event.
+ */
+ int getValInt(Attr name) const;
+
+ /** Retrieve string attribute.
+ *
+ * Retrieves value for attributes of string type.
+ * \param[in] name Name of the attribute to retrieve.
+ * \returns String value of the attribute.
+ * \throw Exception Invalid event type or attribute not
+ * defined for this event.
+ */
+ std::string getValString(Attr name) const;
- /** Retrieve time attribute */
- struct timeval getValTime(Attr) const;
+ /** Retrieve time attribute.
+ *
+ * Retrieves value for attributes of timeval type.
+ * \param[in] name Name of the attribute to retrieve.
+ * \returns struct timeval value of the attribute.
+ */
+ struct timeval getValTime(Attr name) const;
- /** Retrieve jobid attribute */
- const glite::wmsutils::jobid::JobId getValJobId(Attr) const;
-
- /** Attribute name */
- const std::string & getAttrName(Attr) const;
+ /** Retrieve jobid attribute
+ *
+ * Retrieves value for attributes of JobId type.
+ * \param[in] name Name of the attribute to retrieve.
+ * \returns JobId value of the attribute.
+ * \throw Exception Invalid event type or attribute not
+ * defined for this event.
+ */
+ const glite::wmsutils::jobid::JobId getValJobId(Attr name) const;
+
+ /** Attribute name.
+ *
+ * Retrieves string representation of the attribute name.
+ * \param[in] name Symbolic name of the attribute.
+ * \returns String name of the attribute.
+ * \throw Exception Invalid event type or attribute not
+ * defined for this event.
+ */
+ const std::string & getAttrName(Attr name) const;
- /** List of attributes and types valid for this instance */
+ /** List of attributes and types valid for this instance.
+ *
+ * Retrieves description of all attributes defined for this event.
+ * \returns Vector of Attr -- AttrType pairs.
+ * \throw Exception Invalid event type.
+ */
const std::vector<std::pair<Attr,AttrType> > & getAttrs(void) const;
private:
CountRef<Event> *flesh;
};
-EWL_END_NAMESPACE;
+EWL_END_NAMESPACE
#endif
* @version $Revision$
*/
-EWL_BEGIN_NAMESPACE;
+EWL_BEGIN_NAMESPACE
-/** L&B job.
- * Implementation of L&B job-specific calls.
- * Connection to the server is maintained transparently.
-*/
-
+/** Class encapsulating the job info stored in the L&B database.
+ *
+ * This class is the primary interface for getting information about
+ * jobs stored in the L&B database. It is constructed from known job
+ * id, which uniquely identifies the job as well as the bookkeeping
+ * server where the job data is stored. The Job class provides methods
+ * for obtaining the data from the bookkeeping server and for setting
+ * various parameters of the connection to the bookkeeping server.
+ *
+ * All query methods have their counterpart in C functions taking
+ * taking edg_wll_Context and edg_wll_JobId as their first parameters
+ * (in fact, those functions are used to do the actual work).
+ */
class Job {
public:
- Job(void);
- Job(const glite::wmsutils::jobid::JobId &);
- ~Job();
-
- /** Assign new JobId to an existing instance.
- * Connection to server is preserved if possible.
- */
+
+ /** Default constructor.
+ *
+ * Initializes the job as empty, not representing anything.
+ */
+ Job(void);
+
+ /** Constructor from job id.
+ *
+ * Initializes the job to obtain information for the given job id.
+ * \param[in] jobid The job id of the job this object will
+ * represent.
+ * \throws Exception Could not copy the job id.
+ */
+ Job(const glite::wmsutils::jobid::JobId &jobid);
+
+
+ /** Destructor.
+ *
+ * All the actual work is done by member destructors, namely ServerConnection.
+ */
+ ~Job();
- Job & operator= (const glite::wmsutils::jobid::JobId &);
+ /** Assign new job id to an existing instance.
+ *
+ * Redirect this instance to obtain information about
+ * different job; connection to the server is preserved, if
+ * possible.
+ * \param[in] jobid New job id.
+ * \returns Reference to this object.
+ * \throws Exception Could not copy the job id.
+ */
+ Job & operator= (const glite::wmsutils::jobid::JobId &jobid);
-/**
- * Status retrieval bitmasks. Used ORed as Job::status() argument,
- * determine which status fields are actually retrieved.
- */
- static const int STAT_CLASSADS; /**< various job description fields */
- static const int STAT_CHILDREN; /**< list of subjob JobId's */
- static const int STAT_CHILDSTAT; /**< apply the flags recursively to subjobs */
+ /*
+ * Status retrieval bitmasks. Used ORed as Job::status() argument,
+ * determine which status fields are actually retrieved.
+ */
+ static const int STAT_CLASSADS; /**< Include the job
+ * description in the
+ * query result. */
+ static const int STAT_CHILDREN; /**< Include the list of
+ * subjob id's in the
+ * query result. */
+ static const int STAT_CHILDSTAT; /**< Apply the flags
+ * recursively to
+ * subjobs. */
- /** Return job status */
- JobStatus status(int) const;
+ /** Return job status.
+ *
+ * Obtain the job status (as JobStatus) from the bookkeeping
+ * server.
+ * \param[in] flags Specify details of the query.
+ * \returns Status of the job.
+ * \throws Exception Could not query the server.
+ * \see STAT_CLASSADS, STAT_CHILDREN, STAT_CHILDSTAT
+ */
+ JobStatus status(int flags) const;
- /** Return all events corresponding to this job */
- void log(std::vector<Event> &) const;
- const std::vector<Event> log(void) const;
+ /** Return all events corresponding to this job
+ *
+ * Obtain all events corresponding to the job that are stored
+ * in the bookkeeping server database. The maximum number of
+ * returned events can be set by calling setParam().
+ * \param[out] events Vector of events (of type Event).
+ * \throws Exception Could not query the server.
+ */
+ void log(std::vector<Event> &events) const;
+
+ /** Return all events corresponding to this job
+ *
+ * Obtain all events corresponding to the job that are stored
+ * in the bookkeeping server database. The maximum number of
+ * returned events can be set by calling setParam().
+ * \returns Vector of events (of type Event).
+ * \throws Exception Could not query the server.
+ */
+ const std::vector<Event> log(void) const;
- /** Return last known address of a listener associated to the job.
- * \param name name of the listener
- * \return hostname and port number
- */
- const std::pair<std::string,uint16_t> queryListener(const std::string & name) const;
+ /** Return last known address of a listener associated to the job.
+ *
+ * Obtains the information about last listener that has been
+ * registered for this job in the bookkeeping server database.
+ * \param[in] name Name of the listener.
+ * \returns Hostname and port number of the registered
+ * listener.
+ * \throws Exception Could not query the server.
+ */
+ const std::pair<std::string,uint16_t> queryListener(const std::string &name) const;
- /** Manipulate LB parameters, the same as for edg_wll_Context in C */
- void setParam(edg_wll_ContextParam, int);
- void setParam(edg_wll_ContextParam, const std::string);
- void setParam(edg_wll_ContextParam, const struct timeval &);
-
- int getParamInt(edg_wll_ContextParam) const;
- std::string getParamString(edg_wll_ContextParam) const;
- struct timeval getParamTime(edg_wll_ContextParam) const;
+ /**
+ * Manipulate LB parameters.
+ *
+ * This method sets integer typed parameters for the server connection.
+ *
+ * \param[in] ctx Symbolic name of the parameter to change.
+ * \param[in] val New value of the parameter.
+ */
+ void setParam(edg_wll_ContextParam ctx, int val);
+
+ /**
+ * Manipulate LB parameters.
+ *
+ * This method sets string typed parameters for the server connection.
+ *
+ * \param[in] ctx Symbolic name of the parameter to change.
+ * \param[in] val New value of the parameter.
+ */
+ void setParam(edg_wll_ContextParam ctx, const std::string val);
+
+ /**
+ * Manipulate LB parameters.
+ *
+ * This method sets timeval typed parameters for the server connection.
+ *
+ * \param[in] ctx Symbolic name of the parameter to change.
+ * \param[in] val New value of the parameter.
+ */
+ void setParam(edg_wll_ContextParam ctx, const struct timeval &val);
+
+ /**
+ * Get LB parameters.
+ *
+ * Obtain value of the named integer parameter.
+ *
+ * \param[in] ctx Symbolic name of the paramater to obtain.
+ * \return Value of the parameter.
+ */
+ int getParamInt(edg_wll_ContextParam ctx) const;
+
+ /**
+ * Get LB parameters.
+ *
+ * Obtain value of the named string parameter.
+ *
+ * \param[in] ctx Symbolic name of the paramater to obtain.
+ * \return Value of the parameter.
+ */
+ std::string getParamString(edg_wll_ContextParam ctx) const;
+
+ /**
+ * Get LB parameters.
+ *
+ * Obtain value of the named timeval parameter.
+ *
+ * \param[in] ctx Symbolic name of the paramater to obtain.
+ * \return Value of the parameter.
+ */
+ struct timeval getParamTime(edg_wll_ContextParam ctx) const;
private:
ServerConnection server;
glite::wmsutils::jobid::JobId jobId;
};
-EWL_END_NAMESPACE;
+EWL_END_NAMESPACE
#endif
EWL_BEGIN_NAMESPACE;
-/**
- * Description of job status.
- * The status is computed from a sequence of logged events
+/** Class representing status of job.
+ *
+ * This class is used to represent all information about the job status
+ * as computed and stored in the bookkeeping server's database. Job
+ * status is, like Event, list of attribute -- value pairs. One of the
+ * attributes is the job's state as seen by the L&B, ie. something
+ * like <tt>RUNNING</tt> or * <tt>DONE</tt>, other attributes contain
+ * more information about the job.
+ *
+ * The JobStatus class provides methods for reading values of these
+ * attributes and it is used as a result of server queries.
*/
-
-
class JobStatus {
friend class Job;
friend class CountRef<JobStatus>;
public:
+
+ /** Symbolic names of job states. */
enum Code {
- UNDEF = 0, /**< indicates invalid, i.e. uninitialized instance */
+ UNDEF = 0, /**< Indicates invalid, i.e. uninitialized instance. */
@@@{
for my $stat ($status->getTypesOrdered)
{
};
}
@@@}
- CODE_MAX
+ CODE_MAX /**< Limit for range checking. */
};
+ /** Symbolic names of attributes.
+ *
+ * These constants are used for naming individual attributes
+ * when invoking their access methods.
+ */
enum Attr {
@@@{
selectType $status '_common_';
gen "\t/** $f->{comment} */\n\t\t$u,\n";
}
@@@}
- ATTR_MAX
+ ATTR_MAX /**< Limit for range checking. */
};
@@@{
}
}
@@@}
- enum AttrType { INT_T,
- STRING_T,
- TIMEVAL_T,
- BOOL_T,
- JOBID_T,
- INTLIST_T,
- STRLIST_T,
- TAGLIST_T,
- STSLIST_T
+ /** Symbolic names of attribute types.
+ *
+ * These constants are used to name the various attribute
+ * types.
+ */
+ enum AttrType { INT_T, /**< Integer type. */
+ STRING_T, /**< String type. */
+ TIMEVAL_T, /**< <tt>struct timeval</tt> type. */
+ BOOL_T, /**< Boolean type (true or false). */
+ JOBID_T, /**< Job id type. */
+ INTLIST_T, /**< List of integer values. */
+ STRLIST_T, /**< List of string values. */
+ TAGLIST_T, /**< List of user tags. */
+ STSLIST_T /**< List of states. */
};
- /** Numeric status code */
+ /** Numeric status code.
+ *
+ * This code represents the state of the job.
+ * \see Code.
+ */
Code status;
- /** String representation of the status code */
+ /** Get state name.
+ *
+ * Returns string representation of the job's state.
+ */
const std::string & name(void) const;
- /** Retrieve integer attribute */
- int getValInt(Attr) const;
+ /** Access method for attribute values.
+ *
+ * Retrieve integer value of named attribute.
+ * \param[in] name Symbolic name of attribute.
+ * \returns Value of attribute.
+ * \throws LoggingException Invalid attribute name.
+ */
+ int getValInt(Attr name) const;
- /** Retrieve string attribute */
- std::string getValString(Attr) const;
+ /** Access method for attribute values.
+ *
+ * Retrieve string value of named attribute.
+ * \param[in] name Symbolic name of attribute.
+ * \returns Value of attribute.
+ * \throws LoggingException Invalid attribute name.
+ */
+ std::string getValString(Attr name) const;
- /** Retrieve time attribute */
- struct timeval getValTime(Attr) const;
+ /** Access method for attribute values.
+ *
+ * Retrieve <tt>struct timeval</tt> value of named attribute.
+ * \param[in] name Symbolic name of attribute.
+ * \returns Value of attribute.
+ * \throws LoggingException Invalid attribute name.
+ */
+ struct timeval getValTime(Attr name) const;
- /** Retrieve jobid attribute */
- const glite::wmsutils::jobid::JobId getValJobId(Attr) const;
+ /** Access method for attribute values.
+ *
+ * Retrieve JobId value of named attribute.
+ * \param[in] name Symbolic name of attribute.
+ * \returns Value of attribute.
+ * \throws LoggingException Invalid attribute name.
+ */
+ const glite::wmsutils::jobid::JobId getValJobId(Attr name) const;
- /** Retrieve bool attribute */
- bool getValBool(Attr) const;
+ /** Access method for attribute values.
+ *
+ * Retrieve <tt>bool</tt> value of named attribute.
+ * \param[in] name Symbolic name of attribute.
+ * \returns Value of attribute.
+ * \throws LoggingException Invalid attribute name.
+ */
+ bool getValBool(Attr name) const;
- /** Retrieve int list attribute */
- const std::vector<int> getValIntList(Attr) const;
+ /** Access method for attribute values.
+ *
+ * Retrieve integer values of named attribute.
+ * \param[in] name Symbolic name of attribute.
+ * \returns Value of attribute.
+ * \throws LoggingException Invalid attribute name.
+ */
+ const std::vector<int> getValIntList(Attr name) const;
- /** Retrieve string list attribute */
- const std::vector<std::string> getValStringList(Attr) const;
+ /** Access method for attribute values.
+ *
+ * Retrieve string values of named attribute.
+ * \param[in] name Symbolic name of attribute.
+ * \returns Value of attribute.
+ * \throws LoggingException Invalid attribute name.
+ */
+ const std::vector<std::string> getValStringList(Attr name) const;
- /** Retrieve tag list attribute */
- const std::vector<std::pair<std::string,std::string> > getValTagList(Attr) const;
+ /** Access method for attribute values.
+ *
+ * Retrieve user tags values of named attribute.
+ * \param[in] name Symbolic name of attribute.
+ * \returns Value of attribute.
+ * \throws LoggingException Invalid attribute name.
+ */
+ const std::vector<std::pair<std::string,std::string> > getValTagList(Attr name) const;
- /** Retrieve job status list attribute */
- const std::vector<JobStatus> getValJobStatusList(Attr) const;
+ /** Access method for attribute values.
+ *
+ * Retrieve status values of named attribute.
+ * \param[in] name Symbolic name of attribute.
+ * \returns Value of attribute.
+ * \throws LoggingException Invalid attribute name.
+ */
+ const std::vector<JobStatus> getValJobStatusList(Attr name) const;
- /** Attribute name */
- const std::string& getAttrName(Attr) const;
+ /** Get name of attribute.
+ *
+ * Retrieve string representation of symbolic name of attribute.
+ * \param[in] name Symbolic name of attribute.
+ * \returns Name of attribute.
+ * \throws LoggingException Invalid attribute name.
+ */
+ const std::string& getAttrName(Attr name) const;
- /** List of attributes and types valid for this instance */
+ /** List of attributes and their types valid for this
+ * instance.
+ *
+ * Returns the vector of (attribute, attribute type) pairs
+ * that this instance of JobStatus contains.
+ * \returns List of attributes.
+ */
const std::vector<std::pair<Attr,AttrType> >& getAttrs(void) const;
+ /** Default constructor.
+ *
+ * Initializes an empty instance.
+ */
JobStatus(void);
- JobStatus(const JobStatus &);
- JobStatus & operator=(const JobStatus &);
- JobStatus(const edg_wll_JobStat &);
- JobStatus & operator=(const edg_wll_JobStat&);
+
+ /** Copy constructor.
+ *
+ * Creates identical copy of the original object.
+ * The underlying C struct edg_wll_JobStatus is shared using
+ * the CountRef mechanism.
+ * \param[in] orig Original.
+ */
+ JobStatus(const JobStatus &orig);
+
+ /** Assignment operator.
+ *
+ * Creates identical copy of the original object.
+ * The underlying C struct edg_wll_JobStatus is shared using
+ * the CountRef mechanism.
+ * \param[in] orig Original.
+ */
+ JobStatus & operator=(const JobStatus &orig);
+
+ /** Constructor from the C type.
+ *
+ * Encapsulates the given struct.
+ * \param[in] src C struct that holds the status.
+ */
+ JobStatus(const edg_wll_JobStat &src);
+
+ /** Assignment from the C type.
+ *
+ * Encapsulates the given struct.
+ * \param[in] src C struct that holds the status.
+ */
+ JobStatus & operator=(const edg_wll_JobStat& src);
+
+ /** Destructor.
+ *
+ * Releases the encapsulated C struct.
+ */
virtual ~JobStatus();
protected:
#include <pthread.h>
-EWL_BEGIN_NAMESPACE;
-
+EWL_BEGIN_NAMESPACE
+
+/** Base class for all exceptions thrown by the L&B C++ classes.
+ *
+ * This class serves as a common base for all exceptions thrown by the
+ * L&B C++ API classes. In case when the exception is constructed from
+ * another exception (creating chained exception list), the error
+ * message is created by concatenating the error message of the
+ * original exception and the new error message. All the other
+ * functionality (printing error message, logging it, printing stack
+ * trace) is inherited from the base class glite::wmsutils::exception::Exception.
+ */
class Exception: public glite::wmsutils::exception::Exception {
public:
- /* constructor for mandatory fields */
+ /** Constructor for mandatory fields.
+ *
+ * Updates all the mandatory fields and names the exception.
+ * \param[in] source Source filename where the exception was raised.
+ * \param[in] line_number Line in the source that caused the exception.
+ * \param[in] method Name of the method that raised the exception.
+ * \param[in] code Error code giving the reason for exception.
+ * \param[in] exception Error message describing the exception.
+ */
Exception(const std::string& source,
int line_number,
const std::string& method,
int code,
const std::string& exception)
: glite::wmsutils::exception::Exception(source,
- line_number,
- method,
- code,
- "glite::lb::Exception")
+ line_number,
+ method,
+ code,
+ "glite::lb::Exception")
{ error_message = exception; };
- /* constructor for mandatory fields AND exception chain */
+ /** Constructor for mandatory fields and the exception chain.
+ *
+ * Updates all the mandatory fields, names the exception and
+ * adds the original exception's error message to the current
+ * one.
+ * \param[in] source Source filename where the exception was raised.
+ * \param[in] line_number Line in the source that caused the exception.
+ * \param[in] method Name of the method that raised the exception.
+ * \param[in] code Error code giving the reason for exception.
+ * \param[in] exception Error message describing the exception.
+ * \param[in] exc Originally raised exception.
+ */
Exception(const std::string& source,
int line_number,
const std::string& method,
const std::string& exception,
const glite::wmsutils::exception::Exception &exc)
: glite::wmsutils::exception::Exception(source,
- line_number,
- method,
- code,
- "glite::lb::Exception")
+ line_number,
+ method,
+ code,
+ "glite::lb::Exception")
{ error_message = exception + ": " + exc.what(); };
};
+/** Exception encapsulating error states originating in the L&B.
+ *
+ * This class is simple child of the base Exception class, adding no
+ * new functionality. Its purpose is to differentiate the error
+ * conditions originating in the L&B subsystem from other errors (such
+ * as system ones).
+ */
class LoggingException: public Exception {
public:
- /* constructor for mandatory fields */
+ /** Constructor for mandatory fields.
+ *
+ * Updates all the mandatory fields and names the exception.
+ * \param[in] source Source filename where the exception was raised.
+ * \param[in] line_number Line in the source that caused the exception.
+ * \param[in] method Name of the method that raised the exception.
+ * \param[in] code Error code giving the reason for exception.
+ * \param[in] exception Error message describing the exception.
+ */
LoggingException(const std::string& source,
int line_number,
const std::string& method,
: Exception(source, line_number, method, code, exception)
{};
- /* constructor for mandatory fields AND exception chain */
+ /** Constructor for mandatory fields and the exception chain.
+ *
+ * Updates all the mandatory fields, names the exception and
+ * adds the original exception's error message to the current
+ * one.
+ * \param[in] source Source filename where the exception was raised.
+ * \param[in] line_number Line in the source that caused the exception.
+ * \param[in] method Name of the method that raised the exception.
+ * \param[in] code Error code giving the reason for exception.
+ * \param[in] exception Error message describing the exception.
+ * \param[in] exc Originally raised exception.
+ */
LoggingException(const std::string& source,
int line_number,
const std::string& method,
};
+/** Exceptions caused by system errors.
+ *
+ * This class represents error conditions caused by failing system
+ * calls. The error message is augmented with the system error message
+ * obtained by calling strerror().
+ */
class OSException: public Exception {
public:
- /* constructor for mandatory fields */
+ /** Constructor for mandatory fields.
+ *
+ * Updates all the mandatory fields and names the exception.
+ * \param[in] source Source filename where the exception was raised.
+ * \param[in] line_number Line in the source that caused the exception.
+ * \param[in] method Name of the method that raised the exception.
+ * \param[in] code Error code giving the reason for exception.
+ * \param[in] exception Error message describing the exception.
+ */
OSException(const std::string& source,
int line_number,
const std::string& method,
exception + ": " + strerror(code))
{};
- /* constructor for mandatory fields AND exception chain */
+ /** Constructor for mandatory fields and the exception chain.
+ *
+ * Updates all the mandatory fields, names the exception and
+ * adds the original exception's error message to the current
+ * one.
+ * \param[in] source Source filename where the exception was raised.
+ * \param[in] line_number Line in the source that caused the exception.
+ * \param[in] method Name of the method that raised the exception.
+ * \param[in] code Error code giving the reason for exception.
+ * \param[in] exception Error message describing the exception.
+ * \param[in] exc Originally raised exception.
+ */
OSException(const std::string& source,
int line_number,
const std::string& method,
};
+/** Mandatory exception fields.
+ *
+ * This defines the mandatory parameters for all exception
+ * constructors (filename, line, method name).
+ */
#define EXCEPTION_MANDATORY \
__FILE__, \
__LINE__, \
std::string(CLASS_PREFIX) + __FUNCTION__
+/** Stacking exceptions.
+ *
+ * This was originally used for creating the exception chain; now the
+ * same result is achieved by adding the nested exception to the
+ * constructor parameter list.
+ */
#define STACK_ADD
-/* note: we can use __LINE__ several times in macro, it is expanded into one row */
+/** Utility macro to throw LoggingException.
+ *
+ * This macro is used to obtain the L&B error message and throw the
+ * appropriate exception.
+ * Note: we can use __LINE__ several times in macro, it is expanded into
+ * one row.
+ */
#define throw_exception(context, exception) \
{ STACK_ADD; \
{ \
} \
}
+/** Utility macro to check result of L&B calls.
+ *
+ * Checks return value of L&B calls and throws exception if the code
+ * failed.
+ */
#define check_result(code, context, desc) \
if((code)) throw_exception((context), desc)
-EWL_END_NAMESPACE;
+EWL_END_NAMESPACE
#endif
#include "glite/lb/JobStatus.h"
-EWL_BEGIN_NAMESPACE;
+EWL_BEGIN_NAMESPACE
/** Manage LB notifications.
*/
Notification();
- /** Create from server,port pair
+ /** Create from server host,port pair
* to be used for new notifications, i.e. with Register()
- * \param host
- * \param port
+ * \param[in] host host
+ * \param[in] port port
*/
- Notification(const std::string,const u_int16_t);
+ Notification(const std::string host,const u_int16_t port);
/** Create from NotifId
* to be used for existing notifications, i.e. with Bind()
- * \param notifId
+ * \param[in] notifId NotifId
*/
- Notification(const std::string);
+ Notification(const std::string notifId);
~Notification();
/** Add this job to the list.
* Local operation only, Register() has to be called
* to propagate changes to server
+ * \param[in] jobId JobId
*/
- void addJob(const glite::wmsutils::jobid::JobId &);
+ void addJob(const glite::wmsutils::jobid::JobId &jobId);
- /** Remove job from the list, local op again. */
- void removeJob(const glite::wmsutils::jobid::JobId &);
+ /** Remove job from the list, local op again.
+ * \param[in] jobId JobId
+ */
+ void removeJob(const glite::wmsutils::jobid::JobId &jobId);
/** Get jobs on the list */
std::string getJobs();
/** Bind to the existing notification at the server
* i.e. change the receiving local address
- * \param address_override
+ * \param[in] address address override
*/
- void Bind(const std::string);
+ void Bind(const std::string address);
/** Receive notification.
* Blocks at most the specified timeout (maybe 0 for local polling).
};
-EWL_END_NAMESPACE;
+EWL_END_NAMESPACE
#endif
#include "glite/lb/JobStatus.h"
#include "glite/lb/consumer.h"
-EWL_BEGIN_NAMESPACE;
-
-/** Auxiliary class to hold an atomic query condition. */
+EWL_BEGIN_NAMESPACE
+
+/** Auxiliary class to hold atomic query condition.
+ *
+ * This class is used to construct queries to the L&B database. Each
+ * query is composed of multiple atomic conditions in the form of
+ * 'attribute' 'predicate' 'value'. QueryRecord represents such an
+ * atomic condition.
+ */
class QueryRecord {
public:
friend class ServerConnection;
friend edg_wll_QueryRec *convertQueryVector(const std::vector<QueryRecord> &in);
/* IMPORTANT: must match lbapi.h */
+ /** Symbolic names of queryable attributes.
+ *
+ * The queryable attributes correspond to the table columns in
+ * the bookkeeping server database, they relate both to the
+ * event records and job records.
+ * \see Event::Attr
+ */
enum Attr {
UNDEF=0, /**< Not-defined value, used to terminate lists etc. */
- JOBID, /**< Job Id \see _edg_wll_QueryRec */
- OWNER, /**< Job owner \see _edg_wll_QueryRec */
- STATUS, /**< Current job status */
- LOCATION, /**< Where is the job processed */
- DESTINATION, /**< Destination CE */
- DONECODE, /**< Minor done status (OK,fail,cancel) */
- USERTAG, /**< User tag (not implemented yet) */
- TIME, /**< Timestamp \see _edg_wll_QueryRec */
- LEVEL, /**< Logging level (see "dglog.h") * \see _edg_wll_QueryRec */
- HOST, /**< Where the event was generated */
- SOURCE, /**< Source component */
- INSTANCE, /**< Instance of the source component */
- EVENT_TYPE, /**< Event type \see _edg_wll_QueryRec */
- CHKPT_TAG, /**< Checkpoint tag */
+ JOBID, /**< Job id. */
+ OWNER, /**< Job owner (certificate subject). */
+ STATUS, /**< Current job status code. */
+ LOCATION, /**< Where is the job being processed. */
+ DESTINATION, /**< Destination CE. */
+ DONECODE, /**< Minor done status (OK,fail,cancel). */
+ USERTAG, /**< User tag. */
+ TIME, /**< Timestamp of the event. */
+ LEVEL, /**< Logging level. */
+ HOST, /**< Hostname where the event was generated. */
+ SOURCE, /**< Source component that sent the event. */
+ INSTANCE, /**< Instance of the source component. */
+ EVENT_TYPE, /**< Event type. */
+ CHKPT_TAG, /**< Checkpoint tag. */
RESUBMITTED, /**< Job was resubmitted */
- PARENT, /**< Job was resubmitted */
- EXITCODE, /**< Unix exit code */
+ PARENT, /**< Id of the parent job. */
+ EXITCODE, /**< Job system exit code. */
};
+ /** Symbolic names of predicates.
+ *
+ * These are the predicates used for creating atomic query
+ * conditions.
+ */
enum Op {
- EQUAL=EDG_WLL_QUERY_OP_EQUAL,
- LESS=EDG_WLL_QUERY_OP_LESS,
- GREATER=EDG_WLL_QUERY_OP_GREATER,
- WITHIN=EDG_WLL_QUERY_OP_WITHIN,
- UNEQUAL=EDG_WLL_QUERY_OP_UNEQUAL
+ EQUAL=EDG_WLL_QUERY_OP_EQUAL, /**< Equal. */
+ LESS=EDG_WLL_QUERY_OP_LESS, /**< Less than. */
+ GREATER=EDG_WLL_QUERY_OP_GREATER, /**< Greater than. */
+ WITHIN=EDG_WLL_QUERY_OP_WITHIN, /**< Within the
+ range. */
+ UNEQUAL=EDG_WLL_QUERY_OP_UNEQUAL /**< Not equal. */
};
+
+ /** Default constructor.
+ *
+ * Initializes empty query condition.
+ */
QueryRecord();
- /* copy and assignment */
- QueryRecord(const QueryRecord &);
- QueryRecord& operator=(const QueryRecord &);
+ /** Copy constructor
+ *
+ * Initializes an exact copy of the object.
+ * \param[in] src Original object.
+ */
+ QueryRecord(const QueryRecord &src);
+
+ /** Assignment operator.
+ *
+ * Initializes an exact copy of the object.
+ * \param[in] src Original object.
+ * \returns Reference to this object.
+ */
+ QueryRecord& operator=(const QueryRecord &src);
+
+ /** Constructor for condition on string typed value.
+ *
+ * Initializes the object to hold condition on string typed
+ * attribute value.
+ * \param[in] name Name of the attribute.
+ * \param[in] op Symbolic name of the predicate.
+ * \param[in] value Actual value.
+ * \throw Exception Invalid value type for given attribute.
+ */
+ QueryRecord(const Attr name, const Op op, const std::string &value);
+
+ /** Constructor for condition on integer typed value.
+ *
+ * Initializes the object to hold condition on integer typed
+ * attribute value.
+ * \param[in] name Name of the attribute.
+ * \param[in] op Symbolic name of the predicate.
+ * \param[in] value Actual value.
+ * \throw Exception Invalid value type for given attribute.
+ */
+ QueryRecord(const Attr name, const Op op, const int value);
+
+ /** Constructor for condition on timeval typed value.
+ *
+ * Initializes the object to hold condition on timeval typed
+ * attribute value.
+ * \param[in] name Name of the attribute.
+ * \param[in] op Symbolic name of the predicate.
+ * \param[in] value Actual value.
+ * \throw Exception Invalid value type for given attribute.
+ */
+ QueryRecord(const Attr name, const Op op, const struct timeval &value);
+
+ /** Constructor for condition on JobId typed value.
+ *
+ * Initializes the object to hold condition on JobId typed
+ * attribute value.
+ * \param[in] name Name of the attribute.
+ * \param[in] op Symbolic name of the predicate.
+ * \param[in] value Actual value.
+ * \throw Exception Invalid value type for given attribute.
+ */
+ QueryRecord(const Attr name, const Op op, const glite::wmsutils::jobid::JobId &value);
- /* constructors for simple attribute queries */
- QueryRecord(const Attr, const Op, const std::string &);
- QueryRecord(const Attr, const Op, const int);
- QueryRecord(const Attr, const Op, const struct timeval &);
- QueryRecord(const Attr, const Op, const glite::wmsutils::jobid::JobId&);
/* this one is for attr==TIME and particular state */
- QueryRecord(const Attr, const Op, const int, const struct timeval &);
+ /** Constructor for condition on timeval typed value.
+ *
+ * Initializes the object to hold condition on the time the job
+ * stays in given state.
+ * \param[in] name Name of the attribute.
+ * \param[in] op Symbolic name of the predicate.
+ * \param[in] state State of thet job.
+ * \param[in] value Actual value.
+ * \throw Exception Invalid value type for given attribute.
+ */
+ QueryRecord(const Attr name, const Op op, const int state, const struct timeval &value);
/* constructors for WITHIN operator */
- QueryRecord(const Attr, const Op, const std::string &, const std::string &);
- QueryRecord(const Attr, const Op, const int, const int);
- QueryRecord(const Attr, const Op, const struct timeval &, const struct timeval &);
- QueryRecord(const Attr, const Op, const int, const struct timeval &, const struct timeval &);
+ /** Constructor for condition on string typed interval.
+ *
+ * Initializes the object to hold condition on string typed
+ * attribute interval.
+ * \param[in] name Name of the attribute.
+ * \param[in] op Symbolic name of the predicate.
+ * \param[in] value_min Low interval boundary.
+ * \param[in] value_max High interval boundary.
+ * \throw Exception Invalid value type for given attribute.
+ */
+ QueryRecord(const Attr name, const Op op, const std::string &value_min, const std::string &value_max);
+
+ /** Constructor for condition on integer typed interval.
+ *
+ * Initializes the object to hold condition on integer typed
+ * attribute interval.
+ * \param[in] name Name of the attribute.
+ * \param[in] op Symbolic name of the predicate.
+ * \param[in] value_min Low interval boundary.
+ * \param[in] value_max High interval boundary.
+ * \throw Exception Invalid value type for given attribute.
+ */
+ QueryRecord(const Attr name, const Op op, const int value_min, const int value_max);
+
+ /** Constructor for condition on timeval typed interval.
+ *
+ * Initializes the object to hold condition on timeval typed
+ * attribute interval.
+ * \param[in] name Name of the attribute.
+ * \param[in] op Symbolic name of the predicate.
+ * \param[in] value_min Low interval boundary.
+ * \param[in] value_max High interval boundary.
+ * \throw Exception Invalid value type for given attribute.
+ */
+ QueryRecord(const Attr name, const Op op, const struct timeval &value_min, const struct timeval &value_max);
+
+ /** Constructor for condition on timeval typed interval for
+ * given state.
+ *
+ * Initializes the object to hold condition on the time job
+ * stayed in given state.
+ * \param[in] name Name of the attribute.
+ * \param[in] op Symbolic name of the predicate.
+ * \param[in] state State of thet job.
+ * \param[in] value_min Low interval boundary.
+ * \param[in] value_max High interval boundary.
+ * \throw Exception Invalid value type for given attribute.
+ */
+ QueryRecord(const Attr name, const Op op, const int state, const struct timeval &value_min, const struct timeval &value_max);
/* convenience for user tags */
- QueryRecord(const std::string &, const Op, const std::string &);
- QueryRecord(const std::string &, const Op, const std::string &, const std::string &);
+ /** Convenience constructor for condition on user tags.
+ *
+ * Initializes the object to hold condition on the value of
+ * user tag.
+ * \param[in] tag Name of the tag.
+ * \param[in] op Symbolic name of the predicate.
+ * \param[in] value Value of the tag.
+ */
+ QueryRecord(const std::string &tag, const Op op, const std::string &value);
+
+ /** Convenience constructor for condition on user tags.
+ *
+ * Initializes the object to hold condition on the value of
+ * user tag.
+ * \param[in] tag Name of the tag.
+ * \param[in] op Symbolic namen of the predicate.
+ * \param[in] value_min Minimal value of the tag.
+ * \param[in] value_max Maximal value of the tag.
+ * \throws Exception Predicate is not WITHIN.
+ */
+ QueryRecord(const std::string &tag, const Op op, const std::string &value_min, const std::string &value_max);
+ /** Destructor.
+ *
+ * The actual work is done by member destructors.
+ */
~QueryRecord();
- static const std::string AttrName(const Attr) ;
+ /** Return the string representation of symbolic attribute
+ * name.
+ * \param[in] attr Symbolic attribute name.
+ * \returns Printable attribute name.
+ */
+ static const std::string AttrName(const Attr attr) ;
protected:
};
-/** Supported aggregate operations */
+/** Supported aggregate operations. */
enum AggOp { AGG_MIN=1, AGG_MAX, AGG_COUNT };
/**
- * Connection to the L&B server.
- * Maintain connection to the server.
- * Implement non job-specific API calls
+ * Class representing a connection to the L&B server.
+ *
+ * This class serves as an interface for queries not related to
+ * particular job. The address of the bookkeeping server to query can
+ * be set arbitrarily during the lifetime of this object, connection
+ * to the server is maintained automatically by the underlying C API
+ * layer. This class can be thought of also as an encapsulation of
+ * edg_wll_Context from L&B C API.
+ *
+ * ServerConnection's methods correlate to the L&B C API functions
+ * taking edg_wll_Context as their first argument and not having
+ * edg_wll_JobId as the second argument.
+ * \see edg_wll_Context
*/
-
class ServerConnection {
public:
+ /** \defgroup query Methods for querying the bookkeeping
+ * server.
+ *
+ * These methods serve for obtaining data from the bookkeeping
+ * server. The L&B service queries come in two flavors:
+ * \li conjunctive query, as in <tt>(cond1) or (cond2)</tt>
+ * \li conjunction of disjunctive queries, as in <tt>( (cond1)
+ * or (cond2) ) and ( (cond3) or (cond4) )</tt>
+ * Methods for both query flavors are provided.
+ *
+ * Query methods actually do communicate with the server and
+ * they are synchronous; their completion can take some time
+ * not exceeding the query timeout.
+ */
+
+ /** \defgroup property Methods for setting and getting
+ * connection properties.
+ *
+ * These methods are used for setting and obtaining various
+ * parameters of the communication (timeouts, user
+ * certificates, limits). Both general methods (taking the
+ * symbolic name of the parameter as an argument) and
+ * convenience methods (for some parameters) are provided.
+ *
+ * The methods are local, no communication takes place.
+ */
+
friend class Job;
+ /** Default constructor.
+ *
+ * Initializes the context to default values.
+ * \throws OSException Initialization failed.
+ */
ServerConnection(void);
- /* DEPRECATED: do not use
- * connections are now handled automagically inside the implementation
+ /** DEPRECATED.
+ *
+ * \throws Exception Always.
*/
ServerConnection(const std::string &);
- /** Open connection to a given server */
+ /** DEPRECATED.
+ *
+ * \throws Exception Always.
+ */
void open(const std::string &);
- /** Close the current connection */
+ /** DEPRECATED.
+ *
+ * \throws Exception Always.
+ */
void close(void);
/* END DEPRECATED */
/* set & get parameter methods */
- /* consumer parameter settings */
- void setQueryServer(const std::string&, int);
- void setQueryTimeout(int);
-
- void setX509Proxy(const std::string&);
- void setX509Cert(const std::string&, const std::string&);
-
+ /** Set bookkeeping server address.
+ * \ingroup property
+ *
+ * Directs the instance to query the given bookkeping server.
+ * \param[in] host Hostname of the server.
+ * \param[in] port Service port.
+ * \throws LoggingException Setting parameters failed.
+ */
+ void setQueryServer(const std::string& host, int port);
+
+ /** Set query timeout.
+ * \ingroup property
+ *
+ * Sets the time interval to wait for server response.
+ * \param[in] time Time in seconds before the query expires.
+ * \throws LoggingException Setting parameters failed.
+ */
+ void setQueryTimeout(int time);
+
+ /** Set user's proxy certificate.
+ * \ingroup property
+ *
+ * Instructs the instance to authenticate to the server using
+ * user's X509 proxy certificate.
+ * \param[in] proxy Name of file containing the user's proxy certificate.
+ * \throws LoggingException Setting paramater failed.
+ */
+ void setX509Proxy(const std::string& proxy);
+
+ /** Set user's certificate.
+ * \ingroup property
+ *
+ * Instructs the instance to authenticate to the server using
+ * users's full X509 certificate (which is not a good thing).
+ * \param[in] cert Name of file containing the user's certificate.
+ * \param[in] key Name of file containing the user's private
+ * key.
+ * \throws LoggingException Setting parameters failed.
+ */
+ void setX509Cert(const std::string& cert, const std::string& key);
+
+ /** Get address of the bookkeeping server.
+ * \ingroup property
+ *
+ * Returns address of the bookkeeping server this instance is
+ * bound to.
+ * \returns Address (hostname,port).
+ * \throws LoggingException Getting parameter failed.
+ */
std::pair<std::string, int> getQueryServer() const;
+
+ /** Get query timeout.
+ * \ingroup property
+ *
+ * Returns the time interval this instance waits for server
+ * response.
+ * \returns Number of seconds to wait.
+ * \throws LoggingException Getting parameter failed.
+ */
int getQueryTimeout() const;
+ /** Get user's proxy.
+ * \ingroup property
+ *
+ * Returns filename of the user's X509 proxy certificate used
+ * to authenticate to the server.
+ * \returns Filename of the proxy certificate.
+ * \throws LoggingException Getting parameter failed.
+ */
std::string getX509Proxy() const;
+
+ /** Get user's X509 certificate.
+ * \ingroup property
+ *
+ * Returns filenames of the user's full X509 certificate used
+ * to authenticate to the server.
+ * \returns Pair of (certificate, key) filenames.
+ * \throws LoggingException Getting parameter failed.
+ */
std::pair<std::string, std::string> getX509Cert() const;
/* end of set & get */
+ /** Destructor.
+ *
+ * Closes the connections and frees the context.
+ */
virtual ~ServerConnection();
/* consumer API */
/** Retrieve the set of single indexed attributes.
- * outer vector elements correspond to indices
- * inner vector elements correspond to index columns
- * if .first of the pair is USERTAG, .second is its name
- * if .first is TIME, .second is state name
- * otherwise .second is meaningless (empty string anyway)
+ * \ingroup query
+ *
+ * Returns the set of attributes that are indexed on the
+ * server. Every query must contain at least one indexed
+ * attribute for performance reason; exception to this rule
+ * requires setting appropriate paramater on the server and is
+ * not advised.
+ *
+ * In the vector returned, outer elements correspond to indices,
+ * inner vector elements correspond to index
+ * columns.
+ * If <tt>.first</tt> of the pair is USERTAG, <tt>.second</tt> is its name;
+ * if <tt>.first</tt> is TIME, <tt>.second</tt> is state name
+ * otherwise <tt>.second</tt> is meaningless (empty string anyway).
*/
std::vector<std::vector<std::pair<QueryRecord::Attr,std::string> > >
getIndexedAttrs(void);
- /** Retrieve hard and soft result set size limit */
- std::pair<int,int> getLimits(void) const;
-
- /** Set the soft result set size limit */
- void setQueryJobsLimit(int);
- void setQueryEventsLimit(int);
+ /* Retrieve hard and soft result set size limit.
+ * \ingroup property
+ *
+ * Returns both the hard and soft limit on the number of
+ * results returned by the bookkeeping server.
+ * \returns Pair (hard, soft) of limits.
+ * \throws
+ */
+ // std::pair<int,int> getLimits(void) const;
+
+ /** Set the soft result set size limit.
+ * \ingroup property
+ *
+ * Sets the maximum number of results this instance is willing
+ * to obtain when querying for jobs.
+ * \param max Maximum number of results.
+ * \throws LoggingException Setting parameter failed.
+ */
+ void setQueryJobsLimit(int max);
+
+ /** Set the soft result set size limit.
+ * \ingroup property
+ *
+ * Sets the maximum number of results this instance is willing
+ * to obtain when querying for Events.
+ * \param max Maximum number of results.
+ * \throws LoggingException Setting parameter failed.
+ */
+ void setQueryEventsLimit(int max);
- /** Retrieve all events satisfying the query records
- * @param job_cond, event_cond - vectors of conditions to be satisfied
- * by jobs as a whole or particular events, conditions are ANDed
- * @param events vector of returned events
+ /** Retrieve all events satisfying the query records.
+ * \ingroup query
+ *
+ * Returns all events belonging to the jobs specified by \arg
+ * job_cond and in addition satisfying the \arg event_cond.
+ * \param[in] job_cond Conjunctive query on jobs.
+ * \param[in] event_cond Conjunctive query on events.
+ * \param[out] events Vector of Event objects representing L&B
+ * events.
+ * \throws LoggingException Query failed.
*/
void queryEvents(const std::vector<QueryRecord>& job_cond,
const std::vector<QueryRecord>& event_cond,
- std::vector<Event>&) const;
+ std::vector<Event>& events) const;
+ /** Convenience form of queryEvents.
+ *
+ */
const std::vector<Event> queryEvents(const std::vector<QueryRecord>& job_cond,
const std::vector<QueryRecord>& event_cond) const;
+ /** Another modification of queryEvents.
+ *
+ * The same method, but the results are returned as a list
+ * instead of vector.
+ */
const std::list<Event> queryEventsList(const std::vector<QueryRecord>& job_cond,
const std::vector<QueryRecord>& event_cond) const;
- /** The same as queryEvents but return only an aggregate.
- * @param job_cond, event_cond - vectors of conditions to be satisfied
- * by jobs as a whole or particular events, conditions are ANDed
- * @param op aggregate operator to apply
- * @param attr attribute to apply the operation to
+ /** NOT IMPLEMENTED.
+ * \param[in] job_cond
+ * \param[in] event_cond Vectors of conditions to be satisfied
+ * by jobs as a whole or particular events.
+ * \param[in] op Aggregate operator to apply.
+ * \param[in] attr Attribute to apply the operation to.
*/
std::string queryEventsAggregate(const std::vector<QueryRecord>& job_cond,
const std::vector<QueryRecord>& event_cond,
std::string const attr) const;
- /** Retrieve all events satisfying the query records
- * @param job_cond, event_cond - vectors of vectors of job or event conditions,
- * respectively. The inner vectors are logically ANDed, the outer are ORed
- * (cond1 AND cond2 AND ...) OR (condN AND ...)
- * @param events vector of returned events
+ /** Retrieve all events satisfying the conjunctive-disjunctive
+ * query.
+ *
+ * Returns all events belonging to the jobs specified by
+ * <tt>job_cond</tt> and satisfying <tt>query_cond</tt>. The
+ * conditions are given in conjunctive-disjunctive form
+ * <tt>((cond1 OR cond2 OR ...) AND ...)</tt>
+ * \param[in] job_cond Vector of conditions on jobs.
+ * \param[in] event_cond Vector of coditions on events.
+ * \param[out] eventList Returned Event's.
+ * \throws LoggingException Query failed.
*/
void queryEvents(const std::vector<std::vector<QueryRecord> >& job_cond,
const std::vector<std::vector<QueryRecord> >& event_cond,
- std::vector<Event>&) const;
+ std::vector<Event>& eventList) const;
+ /** Convenience form of queryEvents.
+ *
+ * The same as previous, but the resulting vector is passed as
+ * a return value.
+ */
const std::vector<Event>
queryEvents(const std::vector<std::vector<QueryRecord> >& job_cond,
const std::vector<std::vector<QueryRecord> >& event_cond) const;
- /** Retrieve jobs satisfying the query records, including their states
- * @param query vector of Query records that are anded to form the
- * query
- * @param ids vector of returned job id's
- * @param states vector of returned job states
+ /** Retrieve jobs satisfying the query.
+ *
+ * Finds all jobs (represented as JobId's) satisfying given
+ * query.
+ * \param[in] query Query in conjunctive form.
+ * \param[out] jobList List of job id's.
+ * \throws LoggingException Query failed.
*/
-
void queryJobs(const std::vector<QueryRecord>& query,
- std::vector<glite::wmsutils::jobid::JobId>& ids) const;
-
+ std::vector<glite::wmsutils::jobid::JobId>& jobList) const;
+
+ /** Convenience form of queryJobs.
+ *
+ * The same as above, but job id's are passed as a return
+ * value.
+ */
const std::vector<glite::wmsutils::jobid::JobId>
queryJobs(const std::vector<QueryRecord>& query) const;
- /** Retrieve jobs satisfying the query records, including their states
- * @param query vector of Query record vectors that are ORed and ANDed to form the
- * query
- * @param ids vector of returned job id's
- * @param states vector of returned job states
+ /** Retrieve jobs satisfying the query.
+ *
+ * Finds all jobs satisfying query given in
+ * conjunctive-disjunctive form.
+ * \param[in] query Conjunction of disjunctive queries.
+ * \param[out] jobList Job id's of found jobs.
+ * \throws LoggingException Query failed.
*/
-
void queryJobs(const std::vector<std::vector<QueryRecord> >& query,
- std::vector<glite::wmsutils::jobid::JobId>& ids) const;
+ std::vector<glite::wmsutils::jobid::JobId>& jobList) const;
+ /** Convenience form of queryJobs.
+ *
+ * Same as above, but result is passed as a retutrn value.
+ */
const std::vector<glite::wmsutils::jobid::JobId>
queryJobs(const std::vector<std::vector<QueryRecord> >& query) const;
- /** Retrieve jobs satisfying the query records, including status
- * information
- * @param query vector of Query records that are anded to form the
- * query
- * @param ids vector of returned job id's
- * @param states vector of returned job states
+ /** Retrieve status of jobs satisfying the given simple query.
+ *
+ * Returns states (represented by JobStatus) of all jobs
+ * satisfying the query in conjunctive form.
+ * \param[in] query Condition on jobs.
+ * \param[in] flags The same as Job::status() flags.
+ * \param[out] states States of jobs satysfying the condition.
+ * \throws LoggingException Query failed.
*/
void queryJobStates(const std::vector<QueryRecord>& query,
int flags,
std::vector<JobStatus> & states) const;
+
+ /** Convenience form of queryJobStates.
+ *
+ * Same as above, but the result is passed as a return value.
+ */
const std::vector<JobStatus> queryJobStates(const std::vector<QueryRecord>& query,
int flags) const;
+ /** Convenience form of queryJobStates.
+ *
+ * Same as above, but results are returned as list instead of
+ * vector.
+ */
const std::list<JobStatus> queryJobStatesList(const std::vector<QueryRecord>& query,
int flags) const;
- /** Retrieve jobs satisfying the query records, including status
- * information
- * @param query vector of Query records that are anded to form the
- * query
- * @param ids vector of returned job id's
- * @param states vector of returned job states
+ /** Retrieve status of jobs satisfying the given
+ * conjunctive-disjunctive query.
+ *
+ * Returns states (represented by JobStatus) of all jobs
+ * satisfying the query in conjunctive form.
+ * \param[in] query Condition on jobs.
+ * \param[in] flags The same as Job::status() flags.
+ * \param[out] states States of jobs satysfying the condition.
+ * \throws LoggingException Query failed.
*/
void queryJobStates(const std::vector<std::vector<QueryRecord> >& query,
int flags,
std::vector<JobStatus> & states) const;
+
+ /** Convenience form of queryJobStates.
+ *
+ * Same as above, but the result is passed as a return value.
+ */
const std::vector<JobStatus>
queryJobStates(const std::vector<std::vector<QueryRecord> >& query,
int flags) const;
- /** States of all user's jobs.
- * Convenience wrapper around queryJobs.
+ /** Return states of all user's jobs.
+ *
+ * Convenience wrapper around queryJobStates, returns status of all
+ * jobs whose owner is the current user (as named in the X509
+ * certificate subject).
+ * \param[out] stateList States of jobs owned by this user.
+ * \throws LoggingException Query failed.
*/
void userJobStates(std::vector<JobStatus>& stateList) const;
const std::vector<JobStatus> userJobStates() const;
- /** JobId's of all user's jobs.
- * Convenience wrapper around queryJobs.
+ /** Find all user's jobs.
+ *
+ * Convenience wrapper around queryJobs, returns id's of all
+ * jobs whose owner is the current user (as named in the X509
+ * certificate subject).
+ * \param[out] jobs Id's of jobs owned by this user.
+ * \throws LoggingException Query failed.
*/
- void userJobs(std::vector<glite::wmsutils::jobid::JobId> &) const;
- const std::vector<glite::wmsutils::jobid::JobId> userJobs() const;
+ void userJobs(std::vector<glite::wmsutils::jobid::JobId> &jobs) const;
- /** Manipulate LB parameters, the same as for edg_wll_Context in C */
- void setParam(edg_wll_ContextParam, int);
- void setParam(edg_wll_ContextParam, const std::string);
- void setParam(edg_wll_ContextParam, const struct timeval &);
+ /** Convenience form of userJobs.
+ *
+ * Same as above, but results are passed as a return value.
+ */
+ const std::vector<glite::wmsutils::jobid::JobId> userJobs() const;
- int getParamInt(edg_wll_ContextParam) const;
- std::string getParamString(edg_wll_ContextParam) const;
- struct timeval getParamTime(edg_wll_ContextParam) const;
+ /** Set communication parameters of integer type.
+ *
+ * Sets the named parameter to the given integer value.
+ * \param[in] name Symbolic name of the parameter.
+ * \param[in] value Value.
+ * \throws LoggingException Setting parameter failed.
+ * \see edg_wll_SetParam()
+ */
+ void setParam(edg_wll_ContextParam name, int value);
+
+ /** Set communication parameters of string type.
+ *
+ * Sets the named parameter to the given string value.
+ * \param[in] name Symbolic name of the parameter.
+ * \param[in] value Value.
+ * \throws LoggingException Setting parameter failed.
+ * \see edg_wll_SetParam()
+ */
+ void setParam(edg_wll_ContextParam name, const std::string &value);
+
+ /** Set communication parameters of timeval type.
+ *
+ * Sets the named parameter to the given timeval value.
+ * \param[in] name Symbolic name of the parameter.
+ * \param[in] value Value.
+ * \throws LoggingException Setting parameter failed.
+ * \see edg_wll_SetParam()
+ */
+ void setParam(edg_wll_ContextParam name, const struct timeval &value);
+
+ /** Get communication parameters of integer type.
+ *
+ * Gets the named parameter of integer type.
+ * \param[in] name Symbolic name of the parameter.
+ * \throws LoggingException Getting parameter failed.
+ * \see edg_wll_GetParam()
+ */
+ int getParamInt(edg_wll_ContextParam name) const;
+
+ /** Get communication parameters of string type.
+ *
+ * Gets the named parameter of string type.
+ * \param[in] name Symbolic name of the parameter.
+ * \throws LoggingException Getting parameter failed.
+ * \see edg_wll_GetParam()
+ */
+ std::string getParamString(edg_wll_ContextParam name) const;
+
+ /** Get communication parameters of timeval type.
+ *
+ * Gets the named parameter of timeval type.
+ * \param[in] name Symbolic name of the parameter.
+ * \throws LoggingException Getting parameter failed.
+ * \see edg_wll_GetParam()
+ */
+ struct timeval getParamTime(edg_wll_ContextParam name) const;
protected:
edg_wll_Context context;
};
-EWL_END_NAMESPACE;
+EWL_END_NAMESPACE
#endif
#define __EDG_WORKLOAD_LOGGING_CLIENT_CONSUMER_H__
/*!
- * \file client/consumer.h (lbapi.h originaly)
+ * \file consumer.h
* \brief L&B consumer API
- *
- * General rules:
- * - functions return 0 on success, nonzero on error, errror details can
- * be found via edg_wll_ErrorCode()
- * - OUT are ** types, functions malloc()-ate objects and fill in the pointer
- * pointed to by the OUT argument
- * - returned lists of pointers are NULL-terminated malloc()-ed arrays
- * - edg_wll_Query + wrapper terminate arrays with EDG_WLL_EVENT_UNDEF event
- * - OUT is NULL if the list is empty
*/
#ident "$Header$"
extern "C" {
#endif
-/*!
+/**
+ * \defgroup querying Server querying
+ * \brief The core part of the LB querying API.
+ *
+ * The functions in this part of the API are responsible for
+ * transforming the user query to the LB protocol, contacting the server,
+ * receiving back the response and transforming back the results to the
+ * API data structures.
+ *
+ * General rules:
+ * - functions return 0 on success, nonzero on error, errror details can
+ * be found via edg_wll_ErrorCode()
+ * - OUT are ** types, functions malloc()-ate objects and fill in the pointer
+ * pointed to by the OUT argument
+ * - returned lists of pointers are NULL-terminated malloc()-ed arrays
+ * - edg_wll_Query + wrapper terminate arrays with EDG_WLL_EVENT_UNDEF event
+ * - OUT is NULL if the list is empty
+ *@{
+ */
+
+/**
* Predefined types for query attributes
*/
typedef enum _edg_wll_QueryAttr{
} edg_wll_QueryAttr;
-/*!
+/**
* Predefined types for query operands
*/
typedef enum _edg_wll_QueryOp{
} edg_wll_QueryOp;
-/*!
+/**
* Single query condition for edg_wll_Query().
* Those records are composed to form an SQL \a where clause
* when processed at the L&B server
} value, value2;
} edg_wll_QueryRec;
-/************************************************
- * API FUNCTION DECLARATIONS *
+/**
+ * default query timeout (in seconds)
*/
-
-
-#ifdef CLIENT_SBIN_PROG
-extern int edg_wll_http_send_recv(
- edg_wll_Context,
- char *, const char * const *, char *,
- char **,char ***,char **
-);
-
-extern int http_check_status(
- edg_wll_Context,
- char *,
- char **
-);
-
-extern int set_server_name_and_port(
- edg_wll_Context,
- const edg_wll_QueryRec **
-);
-
-#endif
+#define EDG_WLL_QUERY_TIMEOUT_DEFAULT 120
/**
- * \name Server querying
- *
- *@{
+ * maximal query timeout (in seconds)
*/
+#define EDG_WLL_QUERY_TIMEOUT_MAX 1800
/**
* General query on events.
- * Return events satysfying all conditions
+ * Return events satisfying all conditions
* query records represent conditions in the form
* \a attr \a op \a value eg. time > 87654321.
* \see edg_wll_QueryRec
*
- * \param context IN: context to work with
- * \param job_conditions IN: query conditions (ANDed) on current job status, null (i.e. ATTR_UNDEF) terminated list. NULL means empty list, i.e. always TRUE
- * \param event_conditions: conditions on events, null terminated list, NULL means empty list, i.e. always TRUE
- * \param events OUT: list of matching events
+ * \param[in] context context to work with
+ * \param[in] job_conditions query conditions (ANDed) on current job status, null (i.e. ATTR_UNDEF) terminated list. NULL means empty list, i.e. always TRUE
+ * \param[in] event_conditions conditions on events, null terminated list, NULL means empty list, i.e. always TRUE
+ * \param[out] events list of matching events
*/
int edg_wll_QueryEvents(
edg_wll_Context context,
edg_wll_Event ** events
);
+/**
+ * Extended event query interface.
+ * Similar to \ref edg_wll_QueryEvents but the conditions are nested lists.
+ * Elements of the inner lists have to refer to the same attribute and they
+ * are logically ORed.
+ * The inner lists themselves are logically ANDed then.
+ */
+
int edg_wll_QueryEventsExt(
edg_wll_Context context,
const edg_wll_QueryRec ** job_conditions,
/**
* Query LBProxy and use plain communication
+ * \warning edg_wll_*Proxy() functions are not implemented in release 1.
*/
int edg_wll_QueryEventsProxy(
edg_wll_Context context,
edg_wll_Event ** events
);
+/**
+ * \warning edg_wll_*Proxy() functions are not implemented in release 1.
+ */
+
int edg_wll_QueryEventsExtProxy(
edg_wll_Context context,
const edg_wll_QueryRec ** job_conditions,
* Return jobs (and possibly their states) for which an event satisfying the conditions
* exists.
* \see edg_wll_QueryEvents
- * \param context IN: context to work with
- * \param conditions IN: query records (ANDed), null (i.e. EDG_WLL_ATTR_UNDEF) terminated list
- * \param flags IN: additional status fields to retrieve (\see edg_wll_JobStatus)
- * \param jobs OUT: list of job ids. May be NULL.
- * \param states OUT: list of corresponding states (returned only if not NULL)
+ * \param[in] context context to work with
+ * \param[in] conditions query records (ANDed), null (i.e. EDG_WLL_ATTR_UNDEF) terminated list
+ * \param[in] flags additional status fields to retrieve (\see edg_wll_JobStatus)
+ * \param[out] jobs list of job ids. May be NULL.
+ * \param[out] states list of corresponding states (returned only if not NULL)
*/
int edg_wll_QueryJobs(
edg_wll_Context context,
edg_wll_JobStat ** states
);
+/**
+ * Extended job query interface.
+ * Similar to \ref edg_wll_QueryJobs but the conditions are nested lists.
+ * Elements of the inner lists have to refer to the same attribute and they
+ * are logically ORed.
+ * The inner lists themselves are logically ANDed then.
+ */
+
+
int edg_wll_QueryJobsExt(
edg_wll_Context context,
const edg_wll_QueryRec ** conditions,
/**
* Query LBProxy and use plain communication
+ * \warning edg_wll_*Proxy() functions are not implemented in release 1.
*/
int edg_wll_QueryJobsProxy(
edg_wll_Context context,
edg_wll_JobStat ** states
);
+/**
+ * \warning edg_wll_*Proxy() functions are not implemented in release 1.
+ */
+
int edg_wll_QueryJobsExtProxy(
edg_wll_Context context,
const edg_wll_QueryRec ** conditions,
/* starting from bit 10 private flags begins - do not add 1024 and more! */
/** Return status of a single job.
- * \param context IN: context to operate on
- * \param jobid IN: query this job
- * \param flags IN: specifies optional status fields to retrieve,
+ * \param[in] context context to operate on
+ * \param[in] jobid query this job
+ * \param[in] flags specifies optional status fields to retrieve,
* \see EDG_WLL_STAT_CLASSADS, EDG_WLL_STAT_CHILDREN, EDG_WLL_STAT_CHILDSTAT
+ * \param[out] status status
*/
int edg_wll_JobStatus(
/**
* Query LBProxy and use plain communication
+ * \param[in] context context to operate on
+ * \param[in] jobid query this job
+ * \param[in] flags specifies optional status fields to retrieve,
+ * \see EDG_WLL_STAT_CLASSADS, EDG_WLL_STAT_CHILDREN, EDG_WLL_STAT_CHILDSTAT
+ * \param[out] status the status of the job
+
+ * \warning edg_wll_*Proxy() functions are not implemented in release 1.
*/
int edg_wll_JobStatusProxy(
edg_wll_Context context,
- const edg_wlc_JobId jobid,
+ const edg_wlc_JobId jobid,
int flags,
edg_wll_JobStat *status
);
/**
* Return all events related to a single job.
* Convenience wrapper around edg_wll_Query()
- * \param context IN: context to work with
- * \param jobId IN: job to query
- * \param events OUT: list of events
+ * \param[in] context context to work with
+ * \param[in] jobId job to query
+ * \param[out] events list of events
*/
int edg_wll_JobLog(
/**
* Query LBProxy and use plain communication
+ * \warning edg_wll_*Proxy() functions are not implemented in release 1.
+
*/
int edg_wll_JobLogProxy(
edg_wll_Context context,
/**
* All current user's jobs.
- * \param context IN: context to work with
- * \param jobs OUT: list of the user's jobs
- * \param states OUT: list of the jobs' states
+ * \param[in] context context to work with
+ * \param[out] jobs list of the user's jobs
+ * \param[out] states list of the jobs' states
*/
int edg_wll_UserJobs(
edg_wll_Context context,
/**
* Query LBProxy and use plain communication
+ * \warning edg_wll_*Proxy() functions are not implemented in release 1.
+
*/
int edg_wll_UserJobsProxy(
edg_wll_Context context,
/**
* Server supported indexed attributes
* \see DataGrid-01-TEN-0125
- * \param context IN: context to work with
- * \param attrs OUT: configured indices (each index is an UNDEF-terminated
+ * \param[in] context context to work with
+ * \param[out] attrs configured indices (each index is an UNDEF-terminated
* array of QueryRec's from which only attr (and attr_id
* eventually) are meaningful
*/
/**
* Retrieve limit on query result size (no. of events or jobs).
- * FIXME: not implemented.
+ * \warning not implemented.
* \see DataGrid-01-TEN-0125
- * \param context IN: context to work with
- * \param limit OUT: server imposed limit
+ * \param[in] context context to work with
+ * \param[out] limit server imposed limit
*/
int edg_wll_GetServerLimit(
edg_wll_Context context,
);
/**
- * UI port for the job
- * \param context IN: context to work with
- * \param jobId IN: job to query
- * \param name IN: name of the UI-port
- * \param host OUT: hostname of port
- * \param port OUT: port number
+ * UI port for intactive jobs. Used internally by WMS.
+ * \param[in] context context to work with
+ * \param[in] jobId job to query
+ * \param[in] name name of the UI-port
+ * \param[out] host hostname of port
+ * \param[out] port port number
*/
int edg_wll_QueryListener(
edg_wll_Context context,
/**
* Query LBProxy and use plain communication
+ * \warning edg_wll_*Proxy() functions are not implemented in release 1.
+
*/
-int edg_wll_QueryListener(
+int edg_wll_QueryListenerProxy(
edg_wll_Context context,
edg_wlc_JobId jobId,
const char * name,
/**
* Ask LB Proxy server for sequence number
- * \param context IN: context to work with
- * \param jobId IN: job to query
- * \param code OUT: sequence code
+ * \param[in] context context to work with
+ * \param[in] jobId job to query
+ * \param[out] code sequence code
+ * \warning edg_wll_*Proxy() functions are not implemented in release 1.
+
*/
char ** code
);
-/*@}*/
-
/*
* edg_wll_QueryRec manipulation
*/
/** Free edg_wll_QueryRec internals, not the structure itself */
void edg_wll_QueryRecFree(edg_wll_QueryRec *);
+/*
+ *@} end of group
+ */
+#ifdef CLIENT_SBIN_PROG
+extern int edg_wll_http_send_recv(
+ edg_wll_Context,
+ char *, const char * const *, char *,
+ char **,char ***,char **
+);
-/**
- * default and maximal query timeout (in seconds)
- */
-#define EDG_WLL_QUERY_TIMEOUT_DEFAULT 120
-#define EDG_WLL_QUERY_TIMEOUT_MAX 1800
+extern int http_check_status(
+ edg_wll_Context,
+ char *,
+ char **
+);
+
+extern int set_server_name_and_port(
+ edg_wll_Context,
+ const edg_wll_QueryRec **
+);
+
+#endif
#ifdef __cplusplus
}
#define _EDG_WORKLOAD_LOGGING_CLIENT_CONTEXT_H
/**
- * \file edg/workload/logging/client/context.h
* \brief L&B API common context (publicly visible) and related definitions
*/
extern "C" {
#endif
+/**
+ * \defgroup context Context
+ *
+ *@{
+ */
+
/** Opaque context type */
typedef struct _edg_wll_Context *edg_wll_Context;
/** Allocate an initialize a new context object.
- * \param context OUT returned context
+ * \param[out] context returned context
* \return 0 on success, ENOMEM if malloc() fails
*/
int edg_wll_InitContext(edg_wll_Context *context);
/** Destroy and free context object.
* Also performs necessary cleanup (closing connections etc.)
- * \param context IN context to free
+ * \param[in] context context to free
*/
void edg_wll_FreeContext(edg_wll_Context context);
/** Set a context parameter.
- * \param context INOUT context to work with
- * \param param IN parameter to set
- * \param ... IN value to set (if NULL or 0, default is used)
+ * \param[in,out] context context to work with
+ * \param[in] param parameter to set
+ * \param[in] ... value to set (if NULL or 0, default is used)
* \retval 0 success
* \retval EINVAL param is not a valid parameter, or invalid value
*/
...
);
-struct timeval; /* gcc, shut up! */
+struct timeval; /* XXX: gcc, shut up! */
+
+/** Set a context parameter of type int.
+ * \param[in,out] ctx context to work with
+ * \param[in] param parameter to set
+ * \param[in] val value to set
+ * \retval 0 success
+ * \retval EINVAL param is not a valid parameter, or invalid value
+ */
+int edg_wll_SetParamInt(edg_wll_Context ctx,edg_wll_ContextParam param,int val);
+
+/** Set a context parameter of type string.
+ * \param[in,out] ctx context to work with
+ * \param[in] param parameter to set
+ * \param[in] val value to set (if NULL, default is used)
+ * \retval 0 success
+ * \retval EINVAL param is not a valid parameter, or invalid value
+ */
+int edg_wll_SetParamString(edg_wll_Context ctx,edg_wll_ContextParam param,const char *val);
-int edg_wll_SetParamInt(edg_wll_Context,edg_wll_ContextParam,int);
-int edg_wll_SetParamString(edg_wll_Context,edg_wll_ContextParam,const char *);
-int edg_wll_SetParamTime(edg_wll_Context,edg_wll_ContextParam,const struct timeval *);
+/** Set a context parameter of type timeval.
+ * \param[in,out] ctx context to work with
+ * \param[in] param parameter to set
+ * \param[in] val value to set (if NULL, default is used)
+ * \retval 0 success
+ * \retval EINVAL param is not a valid parameter, or invalid value
+ */
+int edg_wll_SetParamTime(edg_wll_Context ctx,edg_wll_ContextParam param,const struct timeval *val);
/** Get current parameter value.
- * \param context INOUT context to work with
- * \param param IN parameter to retrieve
- * \param ... OUT pointer to output variable
+ * \param[in,out] context context to work with
+ * \param[in] param parameter to retrieve
+ * \param[out] ... pointer to output variable
* \retval 0 success
* \retval EINVAL param is not a valid parameter
*/
/**
* Retrieve error details on recent API call
- * \param context IN: context to work with
- * \param errText OUT: standard error text
+ * \param[in] context context to work with
+ * \param[out] errText standard error text
* (may be NULL - no text returned)
- * \param errDesc OUT: additional error description
+ * \param[out] errDesc additional error description
* (may be NULL - no text returned)
* \return Error code of the recent error
*/
int edg_wll_Error(
edg_wll_Context context,
char **errText,
- char **eddDesc
+ char **errDesc
);
/** Convert source code to printable string
edg_wlc_JobId *jobid_out
);
+/*
+ *@} end of group
+ */
+
#ifdef __cplusplus
}
#endif
#ifndef __EDG_WORKLOAD_LOGGING_CLIENT_EVENTS_H__
#define __EDG_WORKLOAD_LOGGING_CLIENT_EVENTS_H__
-/**
- * \file edg/workload/logging/client/events.h
- * \brief contains definition of event type codes for use both by lbapi.h and dglog.h
- */
-
#ident "$Header$"
/*
@@@AUTO
extern "C" {
#endif
+/**
+ * \defgroup events Events
+ * \brief All L&B event types.
+ *
+ *@{
+ */
/**
* Predefined type for ULM string
} edg_wll_EventCode;
/**
- * \fn edg_wll_EventCode edg_wll_StringToEvent(char *name)
- * \param name a string event name (e.g. "JobTransfer")
+ * \fn edg_wll_EventCode edg_wll_StringToEvent(const char *name)
+ * \param[in] name a string event name (e.g. "JobTransfer")
* \return corresponding numeric code (edg_wll_EventCode)
* \brief convert a string event name to the corresponding numeric code
*/
-extern edg_wll_EventCode edg_wll_StringToEvent(char *);
+extern edg_wll_EventCode edg_wll_StringToEvent(const char *name);
/**
* \fn char *edg_wll_EventToString(edg_wll_EventCode event)
- * \param event an event numeric code (edg_wll_EventCode)
+ * \param[in] event an event numeric code (edg_wll_EventCode)
* \return corresponding string (e.g. "JobTransfer")
* \brief convert an event numeric code to the corresponding string
*/
-extern char *edg_wll_EventToString(edg_wll_EventCode);
+extern char *edg_wll_EventToString(edg_wll_EventCode event);
/**
} edg_wll_KeyNameCode;
/**
- * \fn edg_wll_KeyNameCode edg_wll_StringToKeyName(char *name)
- * \param name a string ULM key name (e.g. "DG.JOB.TRANSFER.DEST")
+ * \fn edg_wll_KeyNameCode edg_wll_StringToKeyName(const char *name)
+ * \param[in] name a string ULM key name (e.g. "DG.JOB.TRANSFER.DEST")
* \return corresponding numeric code (edg_wll_KeyNameCode)
* \brief convert a string ULM key name to the corresponding numeric code
*/
-extern edg_wll_KeyNameCode edg_wll_StringToKeyName(char *);
+extern edg_wll_KeyNameCode edg_wll_StringToKeyName(const char *name);
/**
* \fn char *edg_wll_KeyNameToString(edg_wll_KeyNameCode key)
- * \param key a ULM key name numeric code (edg_wll_KeyNameCode)
+ * \param[in] key a ULM key name numeric code (edg_wll_KeyNameCode)
* \return corresponding string (e.g. "DG.JOB.TRANSFER.DEST")
* \brief convert a ULM key name numeric code to the corresponding string
*/
-extern char *edg_wll_KeyNameToString(edg_wll_KeyNameCode);
+extern char *edg_wll_KeyNameToString(edg_wll_KeyNameCode key);
/**
# enum
gen qq{
/**
- * \\enum $enum
+ * \\$enum
* $fn codes
*/
$enum \{
# function StringTo:
gen qq{
/**
- * \\fn $enum edg_wll_StringTo${c}(char *name);
- * \\param name a string representing $fn code (e.g. \"${$f->{codes}}[1]->{name}\")
+ * \\fn $enum edg_wll_StringTo${c}(const char *name);
+ * \\param[in] name a string representing $fn code (e.g. \"${$f->{codes}}[1]->{name}\")
* \\return corresponding numeric code ($enum)
* \\brief converts a string $fn code to corresponding numeric code
*/
-extern $enum edg_wll_StringTo${c}(char *name);
+extern $enum edg_wll_StringTo${c}(const char *name);
};
# function ToString:
gen qq{
/**
* \\fn char *edg_wll\_${c}ToString($enum code);
- * \\param code a $fn numeric code ($enum)
+ * \\param[in] code a $fn numeric code ($enum)
* \\return corresponding string (e.g. \"${$f->{codes}}[1]->{name}\")
* \\brief converts a $fn numeric code to corresponding string
*/
# enum
gen qq{
/**
- * \\enum $enum
+ * \\$enum
* $fn codes of the $t event
*/
$enum \{
# function StringTo:
gen qq{
/**
- * \\fn $enum edg_wll_StringTo${c}(char *name);
- * \\param name a string representing $t $fn code (e.g. \"${$f->{codes}}[1]->{name}\")
+ * \\fn $enum edg_wll_StringTo${c}(const char *name);
+ * \\param[in] name a string representing $t $fn code (e.g. \"${$f->{codes}}[1]->{name}\")
* \\return corresponding numeric code ($enum)
* \\brief converts a string $t $fn code to corresponding numeric code
*/
-extern $enum edg_wll_StringTo${c}(char *name);
+extern $enum edg_wll_StringTo${c}(const char *name);
};
# function ToString:
gen qq{
/**
* \\fn char *edg_wll\_${c}ToString($enum code);
- * \\param code a $t $fn numeric code ($enum)
+ * \\param[in] code a $t $fn numeric code ($enum)
* \\return corresponding string (e.g. \"${$f->{codes}}[1]->{name}\")
* \\brief converts a $t $fn numeric code to corresponding string
*/
gen "\n";
@@@}
+/**
+ * \typedef edg_wll_AnyEvent
+ * common structure definition contained in all types of the events
+ */
typedef struct _edg_wll_AnyEvent {
_EDG_WLL_EVENT_COMMON
} edg_wll_AnyEvent;
/**
* Free the contents of event structure
- * \param IN event structure to be freed
+ * \param[in] event structure to be freed
* \warning As event structures are likely to be allocated in arrays,
* the structure itself is not freed.
* Its the responsibility of the caller to call free(event)
edg_wll_Event * event
);
+/*
+ *@} end of group
+ */
#ifdef __cplusplus
}
*/
/*!
- * \file client/jobstat.h
+ * \file jobstat.h
* \brief edg_wll_JobStat definition and related stuff
*/
#endif
/**
+ * \defgroup jobstatus Job Status
+ * \brief Job status structure definition and related definitions.
+ *@{
+ */
+
+/**
* Miscelaneous job status numeric codes
*/
* \name edg_wll_JobStat manipulation
*/
-/*@{*/
-
/**
* Initialize empty status structure.
* Fills in the stucture with NULL's or values with no meaning
/*@}*/
+/*
+ *@} end of group
+ */
+
#ifdef __cplusplus
}
#endif
#endif
/**
+ * \defgroup notifications Notifications handling
+ * \brief Notifications handling.
+ *@{
+ */
+
+/**
* default and maximal notif timeout (in seconds)
*/
#define EDG_WLL_NOTIF_TIMEOUT_DEFAULT 120
/** Register for receiving notifications.
* Connects to the server specified by EDG_WLL_NOTIF_SERVER context parameter
* (temporary workaround, should be resolved by registry in future).
- * \param conditions: the same conditions as for \see edg_wll_QueryJobsExt.
+ * \param[in,out] context context to work with
+ * \param[in] conditions the same conditions as for \ref edg_wll_QueryJobsExt.
* currently one or more JOBID's are required.
* Only a single occurence of a specific attribute is allowed
* among ANDed conditions (due to the ability to modify them
* further).
- * \param fd = -1 create or reuse the default listening socket (one per context)
+ * \param[in] fd = -1 create or reuse the default listening socket (one per context)
* >= 0 non-default listening socket
- * \param address_override if not NULL, use this address instead of extracting it
+ * \param[in] address_override if not NULL, use this address instead of extracting it
* from the connection (useful when multiple interfaces are present,
* circumventing NAT problems etc.)
- * \param valid until when the registration is valid (NULL means no interest in
+ * \param[in] valid until when the registration is valid (NULL means no interest in
+ * \param[out] id_out returened NotifId
* the value
* \retval 0 OK
* \retval EINVAL restrictions on conditions are not met
/** Change the receiving local address.
* Report the new address to the server.
*
- * \param fd
- * \param address_override
- * \param valid all same as for \see edg_wll_NotifNew
+ * \param[in,out] context context to work with
+ * \param[in] id notification ID you are binding to
+ * \param[in] fd same as for \ref edg_wll_NotifNew
+ * \param[in] address_override same as for \ref edg_wll_NotifNew
+ * \param[in] valid same as for \ref edg_wll_NotifNew
*/
int edg_wll_NotifBind(
);
typedef enum _edg_wll_NotifChangeOp {
+ /** No operation, equal to not defined */
EDG_WLL_NOTIF_NOOP = 0,
+ /** Replace notification registration with new one */
EDG_WLL_NOTIF_REPLACE,
+ /** Add new condition when to be notifed */
EDG_WLL_NOTIF_ADD,
+ /** Remove condition on notification */
EDG_WLL_NOTIF_REMOVE
/* if adding new attribute, add conversion string to common/xml_conversions.c too !! */
} edg_wll_NotifChangeOp;
* of uniqueness the original conditions must have contained only a single
* OR-ed row of conditions on the attributes infolved in the change.
*
- * \param op action to be taken on existing conditions,
- * \see edg_wll_NotifChangeOp
+ * \param[in,out] context context to work with
+ * \param[in] id notification ID you are working with
+ * \param[in] conditions same as for \ref edg_wll_NotifNew
+ * \param[in] op action to be taken on existing conditions,
+ * \ref edg_wll_NotifChangeOp
*/
int edg_wll_NotifChange(
edg_wll_Context context,
);
/** Refresh the registration, i.e. extend its validity period.
- * \param valid until when the registration is valid (NULL means no interest in
+ * \param[in,out] context context to work with
+ * \param[in] id notification ID you are working with
+ * \param[in] valid until when the registration is valid (NULL means no interest in
* the value
*/
/** Drop the registration.
* Server is instructed not to send notifications anymore, pending ones
* are discarded, listening socket is closed, and allocated memory freed.
+ * \param[in,out] context context to work with
+ * \param[in] id notification ID you are working with
*/
int edg_wll_NotifDrop(
/** Receive notification.
* The first incoming notification is returned.
- * \param fd receive on this socket (-1 means the default for the context)
- * \param timeout wait atmost this time long. (0,0) means polling, NULL waiting
+ * \param[in,out] context context to work with
+ * \param[in] fd receive on this socket (-1 means the default for the context)
+ * \param[in] timeout wait atmost this time long. (0,0) means polling, NULL waiting
* indefinitely
- *
+ * \param[out] state_out returned JobStatus
+ * \param[out] id_out returned NotifId
* \retval 0 notification received, state_out contains the current job state
* \retval EAGAIN no notification available, timeout occured
*/
/** Default socket descriptor where to select(2) for notifications.
- * Even if nothing is available for reading freom the socket,
- * there may be some data cached so calling \see edg_wll_NotifReceive
+ * Even if nothing is available for reading from the socket,
+ * there may be some data cached so calling \ref edg_wll_NotifReceive
* may return notifications immediately.
*
+ * \param[in,out] context context to work with
* \retval >=0 socket descriptor
* \retval -1 error, details set in context
*/
);
/** Close the default local listening socket.
- * Useful to force following \see edg_wll_NotifBind to open
+ * Useful to force following \ref edg_wll_NotifBind to open
* a new one.
+ * \param[in,out] context context to work with
*/
int edg_wll_NotifCloseFd(
edg_wll_Context context
);
+/*
+ *@} end of group
+ */
+
#ifdef __cplusplus
}
#endif
extern "C" {
#endif
+/**
+ * \defgroup notifid Notification Id (NotifId)
+ * \brief NotifId description and handling.
+ *@{
+ */
+
/** Notification handle.
* Refers to a particular registration for receiving notifications.
*/
typedef void *edg_wll_NotifId;
-/** Parse and unparse the Id. */
-int edg_wll_NotifIdParse(const char *,edg_wll_NotifId *);
-char* edg_wll_NotifIdUnparse(const edg_wll_NotifId);
+/**
+ * Create a Job ID.
+ * \param[in] server notification server hostname
+ * \param[in] port port of the notification server
+ * \param[out] notifid newly created NotifId
+ * \retval 0 for success
+ * \retval EINVAL invalid notification server
+ * \retval ENOMEM if memory allocation fails
+ */
+int edg_wll_NotifIdCreate(const char *server, int port ,edg_wll_NotifId *notifid);
+
+/**
+ * Free the NotifId structure
+ * \param[in] notifid for dealocation
+ */
+void edg_wll_NotifIdFree(edg_wll_NotifId notifid);
+
+/** Parse the NotifId string and creates NotifId structure
+ * \param[in] notifidstr string representation of NotifId
+ * \param[out] notifid parsed NotifId
+ * \retval 0 for success
+ * \retval EINVAL notifidstr can't be parsed
+ * \retval ENOMEM if memory allocation fails
+ */
+int edg_wll_NotifIdParse(const char *notifidstr, edg_wll_NotifId *notifid);
+
+/** Unparse the NotifId (produce the string form of NotifId).
+ * \param[in] notifid NotifId to be converted to string
+ * \return allocated string which represents the NotifId
+ */
+char* edg_wll_NotifIdUnparse(const edg_wll_NotifId notifid);
+
+/**
+ * Extract notification server address (address:port)
+ * \param[in] notifid NotifId from which the address should be extracted
+ * \param[in,out] srvName pointer where to return server name
+ * \param[in,out] srvPort pointer where to return server port
+ */
+void edg_wll_NotifIdGetServerParts(const edg_wll_NotifId notifid, char **srvName, unsigned int *srvPort);
-int edg_wll_NotifIdCreate(const char *,int,edg_wll_NotifId *);
-void edg_wll_NotifIdFree(edg_wll_NotifId);
+/**
+ * Extract unique string
+ * \param[in] notifid NotifId
+ * \retval pointer to allocated unique string representing jobid
+ * \retval NULL if jobid is 0 or memory allocation fails
+ */
+char *edg_wll_NotifIdGetUnique(const edg_wll_NotifId notifid);
-void edg_wll_NotifIdGetServerParts(const edg_wll_NotifId, char **, unsigned int *);
-char *edg_wll_NotifIdGetUnique(const edg_wll_NotifId);
-int edg_wll_NotifIdSetUnique(edg_wll_NotifId *, const char *);
+/**
+ * Recreate a NotifId by a new unique string
+ * \param[in] unique string which represent created notifid (if NULL then new
+ * one is created)
+ * \param[in,out] notifid newly created NotifId
+ * \retval 0 success
+ * \retval EINVAL invalid NotifId
+ * \retval ENOMEM if memory allocation fails
+ */
+int edg_wll_NotifIdSetUnique(edg_wll_NotifId *notifid, const char *unique);
+
+/*
+ *@} end of group
+ */
#ifdef __cplusplus
}
#define __EDG_WORKLOAD_LOGGING_CLIENT_PRODUCER_H__
/**
- * \file edg/workload/logging/client/producer.h
+ * \file producer.h
* \brief client API for storing data into L&B service
*/
my $a = "(edg_wll_Context context";
my $b = "(context,EDG_WLL_EVENT_$tu,EDG_WLL_FORMAT_$tu";
my $doc = qq{
- * \\param context\tcontext to work with,
+ * \\param[in,out] context\tcontext to work with,
};
selectType $event $t;
for ($event->getFieldsOrdered) {
my $fc = $f->getComment;
$a = $a . ", $ft $fn";
$b = $b . ", $fn";
- $doc = $doc . " * \\param $fn\t$fc\n";
+ $doc = $doc . " * \\param[in] $fn\t$fc\n";
}
$a = $a . ")";
$b = $b . ")";
*/
};
gen "\nextern int edg_wll_Log${t}$a;\n";
- gen "\nextern int edg_wll_Log${t}Proxy$a;\n";
+# gen "\nextern int edg_wll_Log${t}Proxy$a;\n";
# gen qq{
#int edg_wll_Log$t$a
#\{
my $e = $doc;
$c =~ s/, $ftreg $fn//g;
$d =~ s/$fn/"$code"/g;
- $e =~ s/ \* \\param $fn\t$fc\n//g;
+# FIXME: this documentation line in $e doesn't delete!!
+ $e =~ s/ \* \\param\[in\] $fn\t$fc\n//g;
gen qq{
/**
* \\fn int edg_wll_Log$t$code$c;
*/
};
gen "\nextern int edg_wll_Log$t${code}$c;\n";
- gen "\nextern int edg_wll_Log$t${code}Proxy$c;\n";
+# gen "\nextern int edg_wll_Log$t${code}Proxy$c;\n";
# gen qq{
#int edg_wll_Log$t$code$c
#\{
/**
* Formats a logging message and sends it asynchronously to local-logger
* \brief generic asynchronous logging function
- * \param context INOUT context to work with,
- * \param event IN type of the event,
- * \param fmt IN printf()-like format string,
- * \param ... IN event specific values/data according to fmt,
+ * \param[in,out] context context to work with,
+ * \param[in] event type of the event,
+ * \param[in] fmt printf()-like format string,
+ * \param[in] ... event specific values/data according to fmt,
* \retval 0 successful completition,
* \retval EINVAL bad jobId, unknown event code, or the format string together with the remaining arguments does not form a valid event,
* \retval ENOSPC L&B infrastructure failed to accept the event due to lack of disk space etc.,
/**
* Formats a logging message and sends it synchronously to local-logger
* \brief generic synchronous logging function
- * \param context INOUT context to work with,
- * \param event IN type of the event,
- * \param fmt IN printf()-like format string,
- * \param ... IN event specific values/data according to fmt,
+ * \param[in,out] context context to work with,
+ * \param[in] event type of the event,
+ * \param[in] fmt printf()-like format string,
+ * \param[in] ... event specific values/data according to fmt,
* \retval 0 successful completition,
* \retval EINVAL bad jobId, unknown event code, or the format string together with the remaining arguments does not form a valid event,
* \retval ENOSPC L&B infrastructure failed to accept the event due to lack of disk space etc.,
char *fmt, ...);
/**
- * Formats a logging message and sends it synchronously to L&B Proxy
- * \brief generic synchronous logging function
- * \param context INOUT context to work with,
- * \param event IN type of the event,
- * \param fmt IN printf()-like format string,
- * \param ... IN event specific values/data according to fmt,
- * \retval 0 successful completition,
- * \retval EINVAL bad jobId, unknown event code, or the format string together with the remaining arguments does not form a valid event,
- * \retval ENOSPC L&B infrastructure failed to accept the event due to lack of disk space etc.,
- * \retval ENOMEM failed to allocate memory,
- * \retval ECONNREFUSED cannot connect to the specified L&B Proxy
- * \retval EAGAIN non blocking return from the call, the event may or may not get logged,
- * \retval EDG_WLL_ERROR_NOJOBID logging call attempted without assigning jobId to the context.
- */
-extern int edg_wll_LogEventProxy(
- edg_wll_Context context,
- edg_wll_EventCode event,
- char *fmt, ...);
-
-/**
* Instructs interlogger to to deliver all pending events related to current job
* \brief flush events from interlogger
* \note sort of status query more than a command
- * \param context INOUT context to work with,
- * \param timeout INOUT wait at most this much time for completition, remaining time on return,
- * \retval 0 successful completition,
+ * \param[in,out] context context to work with,
+ * \param[in,out] timeout wait at most this much time for completition, remaining time on return,
+ * \retval 0 successful completition,
* \retval EDG_WLL_ERROR_INTERLOG_TIMEOUT the inter-logger did not respond within the timeout,
* \retval EDG_WLL_ERROR_INTERLOG_CONLOST inter-logger lost connection to one or more servers,
* \retval EDG_WLL_ERROR_INTERLOG_AGAIN not all pending events were delivered within the timeout.
/**
* Set a current job for given context.
* \note Should be called before any logging call.
- * \param context INOUT context to work with
- * \param job IN further logging calls are related to this job
- * \param code IN sequence code as obtained from previous component
- * \param flags IN flags on code handling (\see API documentation)
+ * \param[in,out] context context to work with
+ * \param[in] job further logging calls are related to this job
+ * \param[in] code sequence code as obtained from previous component
+ * \param[in] flags flags on code handling (\see API documentation)
*/
extern int edg_wll_SetLoggingJob(
edg_wll_Context context,
);
/**
- * Set a current job for given context.
- * \note Should be called before any logging call.
- * \param context INOUT context to work with
- * \param job IN further logging calls are related to this job
- * \param code IN sequence code as obtained from previous component
- * \param user IN user credentials
- * \param flags IN flags on code handling (\see API documentation)
- */
-extern int edg_wll_SetLoggingJobProxy(
- edg_wll_Context context,
- const edg_wlc_JobId job,
- const char * code,
- const char * user,
- int flags
-);
-
-
-/**
* Register job with L&B service.
* Done via logging REGJOB event, may generate subjob id's and create
* the parent-children associations.
* Partitionable jobs should set num_subjobs=0 initially,
* and re-register when number of subjobs becomes known.
*
- * \param type IN EDG_WLL_JOB_SIMPLE, EDG_WLL_JOB_DAG, or EDG_WLL_JOB_PARTITIONABLE
- * \param jdl IN user-specified JDL
- * \param ns IN network server contact
- * \param num_subjobs IN number of subjobs to create
- * \param seed IN seed used for subjob id's generator.
+ * \param[in,out] context context to work with
+ * \param[in] job jobId
+ * \param[in] type EDG_WLL_JOB_SIMPLE, EDG_WLL_JOB_DAG, or EDG_WLL_JOB_PARTITIONABLE
+ * \param[in] jdl user-specified JDL
+ * \param[in] ns network server contact
+ * \param[in] num_subjobs number of subjobs to create
+ * \param[in] seed seed used for subjob id's generator.
* Use non-NULL value to be able to regenerate the set of jobid's
- * \param subjobs OUT returned subjob id's
+ * \param[out] subjobs returned subjob id's
*/
/* backward compatibility */
);
/**
- * Register job with L&B Proxy service.
- * Done via logging REGJOB event, may generate subjob id's and create
- * the parent-children associations.
- * Set the job as current for the context and initialize sequence code.
- *
- * Partitionable jobs should set num_subjobs=0 initially,
- * and re-register when number of subjobs becomes known.
- *
- * \param type IN EDG_WLL_JOB_SIMPLE, EDG_WLL_JOB_DAG, or EDG_WLL_JOB_PARTITIONABLE
- * \param user IN user credentials
- * \param jdl IN user-specified JDL
- * \param ns IN network server contact
- * \param num_subjobs IN number of subjobs to create
- * \param seed IN seed used for subjob id's generator.
- * Use non-NULL value to be able to regenerate the set of jobid's
- * \param subjobs OUT returned subjob id's
- */
-
-extern int edg_wll_RegisterJobProxy(
- edg_wll_Context context,
- const edg_wlc_JobId job,
- enum edg_wll_RegJobJobtype type,
- const char * user,
- const char * jdl,
- const char * ns,
- int num_subjobs,
- const char * seed,
- edg_wlc_JobId ** subjobs
-);
-
-
-/**
* Register subjobs in a batch.
* Mainly used to provide JDL's of individual subjobs in a more efficient
* way than logging them one by one.
- * \param jdls array of JDL's
- * \param subjobs array of jobid's in the same order
+ * \param[in,out] context context to work with
+ * \param[in] parent parent's jobId
+ * \param[in] jdls array of JDL's
+ * \param[in] ns network server contact
+ * \param[out] subjobs array of jobid's in the same order
*/
extern int edg_wll_RegisterSubjobs(
/**
* Change ACL for given job.
- * \param specification of user's credential
- * \param user_id_type type of user_id,
+ * \param[in,out] context context to work with
+ * \param[in] job jobId
+ * \param[in] user_id specification of user's credential
+ * \param[in] user_id_type type of user_id,
* for EDG_WLL_USER_SUBJECT the user_id parameter is expected to be user's subject name
* for EDG_WLL_USER_VOMS_GROUP the user_id is expected to be of the form VO:group specifying required group membersip as managed by VOMS
- * \param permission ACL permission to change
- * \param permission_type type of given permission (allow or deny operation)
- * \param operation operation to perform with ACL (add or remove record)
+ * \param[in] permission ACL permission to change
+ * \param[in] permission_type type of given permission (allow or deny operation)
+ * \param[in] operation operation to perform with ACL (add or remove record)
*/
extern int edg_wll_ChangeACL(
#endif
/** Count the number of jobs which entered the specified state.
- * \param group IN: group of jobs of interest, eg. DESTINATION = something
+ * \param[in] group group of jobs of interest, eg. DESTINATION = something
* (XXX: this is the only query supported right now)
- * \param major IN: major code of the state of interest
- * \param minor IN: minor state code, eg. DONE_FAILED
- * \param from,to INOUT: on input - requested interval of interest
+ * \param[in] major major code of the state of interest
+ * \param[in] minor minor state code, eg. DONE_FAILED
+ * \param[in,out] from,to on input - requested interval of interest
* on output - when the data were available
- * \param rate OUT: average rate per second in which the jobs enter this state
- * \param res_from, res_to: time resolution of the data (seconds)
+ * \param[out] rate average rate per second in which the jobs enter this state
+ * \param[out] res_from,res_to time resolution of the data (seconds)
*/
int edg_wll_StateRate(
--- /dev/null
+#Wed Apr 13 06:21:19 CEST 2005
+module.build=233
Revision history:
$Log$
+ Revision 1.2.2.5 2005/02/25 13:39:29 mmulac
+ remove duplicate notifid in configure.properties.xml
+
+ Revision 1.2.2.4 2005/02/25 13:37:11 mmulac
+ add notifid to doxygen
+ see -> ref
+
+ Revision 1.2.2.3 2005/02/25 12:03:11 jpospi
+ Added PDF options to doxygen conf.
+
+ Revision 1.2.2.2 2005/02/25 09:37:52 mmulac
+ generate doxygen doc for notification.h
+
+ Revision 1.2.2.1 2005/02/18 14:00:16 jpospi
+ - Removed all L&B Proxy related things
+ - Documentation update
+
+ Revision 1.2 2004/12/08 13:04:29 jpospi
+ first attemtp to generate documentation using doxygen
+
Revision 1.1 2004/07/06 17:47:31 flammer
Update of classpath definitions, targets & configure file.
version=${module.version}
</echo>
<echo file="${module.build.dir}/C.dox">
-PROJECT_NAME = "Glite LB Client: C - Interface"
-PROJECT_NUMBER = ${module.version}
-OUTPUT_DIRECTORY = ${component.dir}/doc/C
-OPTIMIZE_OUTPUT_FOR_C = YES
-INPUT = ./events.h \
- ./jobstat.h \
- ./producer.h \
- ../interface/context.h \
- ../interface/consumer.h
-#HAVE_DOT = YES
-#CALL_GRAPH = YES
+PROJECT_NAME = "Glite LB Client: C - Interface"
+PROJECT_NUMBER = ${module.version}
+OUTPUT_DIRECTORY = ${component.dir}/doc/C
+OPTIMIZE_OUTPUT_FOR_C = YES
+INPUT = ./events.h \
+ ./jobstat.h \
+ ./producer.h \
+ ../interface/context.h \
+ ../interface/notifid.h \
+ ../interface/notification.h \
+ ../interface/consumer.h
+SHOW_DIRECTORIES = NO
+FULL_PATH_NAMES = NO
+EXTRACT_ALL = YES
+PDF_HYPERLINKS = YES
+USE_PDFLATEX = YES
+MACRO_EXPANSION = YES
+EXPAND_ONLY_PREDEF = YES
+PREDEFINED = _EDG_WLL_EVENT_COMMON
+HAVE_DOT = NO
</echo>
<echo file="${module.build.dir}/CPP.dox">
PROJECT_NAME = "Glite LB Client: CPP - Interface"
../interface/LoggingExceptions.h \
../interface/ServerConnection.h \
../interface/Notification.h
+SHOW_DIRECTORIES = NO
+FULL_PATH_NAMES = NO
+EXTRACT_ALL = YES
+PDF_HYPERLINKS = YES
+USE_PDFLATEX = YES
#HAVE_DOT = YES
#CALL_GRAPH = YES
</echo>
-#Fri Dec 10 13:18:21 CET 2004
-module.version=0.3.1
-module.build=113
-module.age=2
+
+module.version = 1.0.3
+module.age = 1
+
THRPLUSLIB:=libglite_lb_clientpp_${thrflavour}.la
TOOLS:=dump load purge
-EXAMPLES:=log_usertag_proxy job_log job_reg feed_shark notify query_ext query_seq_code stats
+EXAMPLES:=job_log job_reg feed_shark notify query_ext query_seq_code stats abort_job change_acl job_status
FAKE_EXAMPLES:=job_log_fake
version_info=-version-info `echo ${version} | cut -d. -f1,2 | tr . :`
install:
mkdir -p ${PREFIX}/bin
+ mkdir -p ${PREFIX}/sbin
mkdir -p ${PREFIX}/lib
mkdir -p ${PREFIX}/share/doc/${package}-${version}
${INSTALL} -m 644 ${LIB} ${THRLIB} ${PLUSLIB} ${THRPLUSLIB} ${PREFIX}/lib
${INSTALL} -m 644 ${top_srcdir}/LICENSE ${PREFIX}/share/doc/${package}-${version}
+ ${INSTALL} -m 644 ${top_srcdir}/doc/README-fake ${top_srcdir}/doc/README-notify ${PREFIX}/share/doc/${package}-${version}
mkdir -p ${PREFIX}/examples
- for p in ${TOOLS} logevent; do \
+ for p in ${TOOLS}; do \
+ ${INSTALL} -m 755 "$$p" "${PREFIX}/sbin/glite-lb-$$p"; \
+ done
+ for p in logevent; do \
${INSTALL} -m 755 "$$p" "${PREFIX}/bin/glite-lb-$$p"; \
done
- for p in ${TOOLS} logevent ${EXAMPLES} ${sh_PROGS}; do \
+ for p in ${EXAMPLES} ${sh_PROGS}; do \
${INSTALL} -m 755 "$$p" "${PREFIX}/examples/glite-lb-$$p"; \
done
Revision history:
$Log$
+ Revision 1.5 2004/10/18 19:16:09 zsalvet
+ RPM descriptions
+
Revision 1.4 2004/07/28 12:18:12 dimeglio
Changed default target from compile to dist
Load version file
========================================= -->
<property file="${module.version.file}"/>
+ <property file="${module.build.file}"/>
<!-- ==============================================
Local private targets
--- /dev/null
+By default, information about a job stored in the LB server is only available
+to the user who submitted the job, i.e. the job owner. When requesting any
+information about a job from the LB server, the users must authenticate
+properly using their PKI certificates so the LB server can verify that they are
+allowed to access this information (i.e. they submitted the job in question).
+
+Besides this default functionality, the LB server also allows the job owner to
+share job information with another users. Each job can be assigned an access
+control list (ACL) that specifies another users who are also allowed to access
+the job information. The management of ACL's is entirely under control of the
+job owner so she can modify the ACL arbitrarily, specifying the set of users
+who have access to the job information. The users in the ACL's can be specified
+using either the subject names from their X.509 certificates or names of VOMS
+groups.
+
+Current ACL for a job is returned as part of the job status information
+returned by the job_status command. The commands output ACL's in the original
+XML format as specified by GACL/GridSite.
+
+Example of an ACL:
+<?xml version="1.0"?><gacl version="0.0.1">
+ <entry>
+ <voms-cred><vo>VOCE</vo><group>/VOCE</group></voms-cred>
+ <allow><read/></allow>
+ </entry>
+ <entry>
+ <person><dn>/O=CESNET/O=Masaryk University/CN=Daniel Kouril</dn></person>
+ <deny><read/></deny>
+ </entry>
+</gacl>
+
+this ACL allows all people in the VOMS /VOCE in the VO VOCE, but deny access to
+user Daniel Kouril (even if he was a member of the /VOCE group).
+
+The job owner herself is not specified in the ACL as she is always allowed to
+access the information regardles the content of the job ACL.
+
+An ACL for a job can be changed using the change_acl command-line program
+provided in the example subdirectory. In order to use change_acl, the LB
+daemons locallogger and interlogger must be running. The usage of the command
+is as follows:
+
+change_acl [-r] [-g] [-d] jobid user_id
+
+ jobid specifies the job to change
+ user_id specifies the user to use, it can be either an X.500 name
+ (subject name) or a VOMS group (if the -g option is specified).
+
+ -r Remove user/group from the ACL.
+ -g If this option is given, the user_id is handled as a VOMS group. It
+ must of the form VO:group, where VO is name of the VO (as printed out
+ by voms-proxy-info in the VO: field) and group is name of the group.
+ -d The user specified by the user_id parameter will be denied to access
+ information about job.
+
+Examples (resulting in the ACL above):
+ change_acl -g https://scientific.civ.zcu.cz:9000/PC8Y6jBitHt_fKMTEKFnVw VOCE:/VOCE
+ change_acl -d https://scientific.civ.zcu.cz:9000/PC8Y6jBitHt_fKMTEKFnVw '/O=CESNET/O=Masaryk University/CN=Daniel Kouril'
+
+LB server configuration
+In order to support the VOMS groups in the ACL's, glite_lb_bkserverd must be
+able to verify client's VOMS proxy certificate using a trusted VOMS service
+certificate stored on a local disk. Default directory with trusted VOMS
+certificates is /etc/grid-security/vomsdir, another location can be
+specified using by either the -V option to glite_lb_bkserverd or setting the
+VOMS_CERT_DIR environment variable.
edg_wll_Log* (functions for logging all event types)
edg_wll_LogEvent
edg_wll_LogEventSync
- edg_wll_LogEventProxy
edg_wll_LogFlush
edg_wll_LogFlushAll
edg_wll_SetLoggingJob
- edg_wll_SetLoggingJobProxy
edg_wll_RegisterJobSync
edg_wll_RegisterJob
edg_wll_RegisterSubjob
typedef int (edg_wll_Logging_cb_f)(edg_wll_Context context);
int edg_wll_RegisterTestLogging(edg_wll_Logging_cb_f *cb);
- int edg_wll_RegisterTestLoggingProxy(edg_wll_Logging_cb_f *cb);
It possible to unregister registered callbacks using following functions:
void edg_wll_UnregisterTestQueryEvents();
void edg_wll_UnregisterTestQueryListener();
void edg_wll_UnregisterTestLogging();
- void edg_wll_UnregisterTestLoggingProxy();
Library name is libglite_lb_client_fake_gcc32dbg[pthr].so. It is built
--- /dev/null
+LB notifications
+----------------
+
+LB infrastructure enables its users to be notified when something interesting happens on a bookkeeping server.
+
+User registers to infrastructure via client API (notification.h) or he/she can use example program glite-lb-notify (see bellow). He/she must specify a condition under which the notification is sent. The condition(s) is(are) stored in edg_wll_QueryRec data structure. Currently one or more JOBID's are required in it and only a single occurence of a specific attribute is allowed among ANDed conditions.
+
+The request for notification is then delivered to a bookkeeping server. Whenever a new event arrives to the bookkeeping server, the notification condition is tested. Always when it is true, the notification is sent to the user. Notifications are incomming until the user cancels notification registration on the server.
+
+For a notification deliveriy, a special deamon, notification interlogger is used. It stores registrations in files until they are delivered.
+
+
+
+Notification example
+--------------------
+
+In next steps, you will be instucted how to register for a notification and how to triger this registration on the bookkeeping server in order to receive registration. Our example program 'glite-lb-notify' is used for this purpose. It uses mentioned client API calls to manipulate with registrations.
+
+
+1) Set up LB environment
+
+ a) Download, compile and install LB module from SCM CVS
+ b) Install it from RPMs
+
+ See instructions at section 'Installation & Configuration'
+ from EGEE JRA1 web site. It was located at (Jan 2005) :
+
+ http://egee-jra1-wm.mi.infn.it/egee-jra1-wm/lb_install.shtml
+
+
+2) Get globus proxy certificate
+ ./grid-proxy-init -key PATH_TO_YOUR_KEY -cert PATH_TO_YOUR_CERT
+
+
+3) Start LB deamons
+
+ Substitute KEY with location server private key, CERT with location
+ of server certificate, and CERTS_DIR directory containing CA
+ certificates.
+
+ ./glite-lb-logd -k KEY -c CERT -C CERTS_DIR -d -v
+
+ ./glite-lb-interlogd -k KEY -c CERT -C CERTS_DIR -b -d -v
+
+ ./glite-lb-bkserverd -d -k KEY -c CERT -C CERTS_DIR
+
+ ./glite-lb-notif-interlogd -k KEY -c CERT -C CERTS_DIR -d -v
+
+
+4) Register a job
+ export EDG_WL_LOG_DESTINATION=HOSTNAME:9002
+ ./glite-lb-job_reg -m HOSTNAME:9000 -s UserInterface
+
+ -> returns JOBID - used in the next steps
+
+
+5) Register notification
+ export EDG_WL_NOTIF_SERVER=HOSTNAME:9000
+ ./glite-lb-notify test JOBID
+
+
+6) Change status of your job
+ export EDG_WL_LOG_DESTINATION=HOSTNAME:9002
+ ./glite-lb-running.sh -j JOBID
+
+
+7) Watch incomming notifications
+
+
+Warning: Try to destroy all your registrations when you finish, otherwise the system will still try to deliver you your notifications to nonexistent destinations (ports which nobody listens at).
+
+TIP: If you are stucked, try to clean up notif-interlogger's cache files. They are by default stored at /tmp/notif_events*, or wherever you set by -f option.
--- /dev/null
+#ident "$Header$"
+
+#ifndef _GNU_SOURCE
+#define _GNU_SOURCE
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <errno.h>
+
+#include "glite/lb/events_parse.h"
+#include "glite/lb/consumer.h"
+#include "glite/wmsutils/jobid/cjobid.h"
+
+static void free_events(edg_wll_Event *);
+
+static void help(const char* n)
+{
+ fprintf(stderr,"usage: %s <jobid> <source>\n", n);
+ exit(1);
+}
+
+int main(int argc,char **argv)
+{
+ edg_wll_Context ctx;
+ char *errt,*errd,*e,a;
+ edg_wll_Event *events;
+ int i;
+ edg_wll_QueryRec jq[2],eq[2];
+ edg_wlc_JobId job;
+ edg_wll_Source src;
+
+ if (argc != 3) help(argv[0]);
+
+ puts(
+"*\n"
+"* USE WITH CARE, AT YOUR OWN RISK, UNDER ABNORMAL CONDITIONS ONLY,\n"
+"* AND BE ALWAYS SURE WHAT YOU ARE DOING.\n"
+"* \n"
+"* THIS PROGRAM IS A PERFECT EXAMPLE HOW L&B SEQENCE CODES SHOULD NOT BE USED\n"
+"* IN NORMAL OPERATION.\n"
+"\n"
+"Do you want to proceed?"
+ );
+
+ scanf("%c",&a);
+ if (a != 'y' && a != 'Y') return 1;
+
+ edg_wll_InitContext(&ctx);
+
+ if (edg_wlc_JobIdParse(argv[1],&job)) {
+ fprintf(stderr,"%s: can't parse job ID\n",argv[1]);
+ return 1;
+ }
+
+ if (( src = edg_wll_StringToSource(argv[2])) == EDG_WLL_SOURCE_NONE) {
+ fprintf(stderr,"%s: unknown event source\n",argv[2]);
+ return 1;
+ }
+
+ jq[0].attr = EDG_WLL_QUERY_ATTR_JOBID;
+ jq[0].op = EDG_WLL_QUERY_OP_EQUAL;
+ jq[0].value.j = job;
+ jq[1].attr = EDG_WLL_QUERY_ATTR_UNDEF;
+
+ eq[0].attr = EDG_WLL_QUERY_ATTR_SOURCE;
+ eq[0].op = EDG_WLL_QUERY_OP_EQUAL;
+ eq[0].value.i = src;
+ eq[1].attr = EDG_WLL_QUERY_ATTR_UNDEF;
+
+ if ( edg_wll_QueryEvents(ctx,jq,eq,&events) )
+ {
+ if ( edg_wll_Error(ctx, &errt, &errd) != E2BIG )
+ goto err;
+
+ fprintf(stderr,"%s: %s (%s)\n",argv[0],errt,errd);
+ }
+
+ for ( i = 0; events[i].type != EDG_WLL_EVENT_UNDEF; i++ );
+
+ e = edg_wll_UnparseEvent(ctx,events+i-1);
+
+ fputs(e,stdout);
+ fputs("\n",stdout);
+
+ if (edg_wll_SetParam(ctx,EDG_WLL_PARAM_SOURCE,src) ||
+ edg_wll_SetLoggingJob(ctx,job,events[i-1].any.seqcode,EDG_WLL_SEQ_NORMAL) ||
+ edg_wll_IncSequenceCode(ctx) || /* necessary to simulate this
+ * call in last event logging
+ * _after_ current seq. was used */
+ edg_wll_LogAbort(ctx,"manual abort")) goto err;
+
+
+ free(e);
+ free_events(events);
+
+ edg_wll_FreeContext(ctx);
+
+ return 0;
+
+err:
+ switch (edg_wll_Error(ctx,&errt,&errd)) {
+ case 0: break;
+ case ENOENT:
+ puts("No events found");
+ break;
+ default:
+ fprintf(stderr,"%s: %s (%s)\n",argv[0],errt,errd);
+ return 1;
+ }
+
+ edg_wll_FreeContext(ctx);
+
+ return 0;
+}
+
+static void free_events(edg_wll_Event *events)
+{
+ int i;
+
+ if (events) {
+ for (i=0; events[i].type != EDG_WLL_EVENT_UNDEF; i++) edg_wll_FreeEvent(&(events[i]));
+ edg_wll_FreeEvent(&(events[i])); /* free last line */
+ free(events);
+ events = NULL;
+ }
+}
--- /dev/null
+#ident "$Header$"
+
+#include <stdio.h>
+#include <unistd.h>
+
+#include "glite/wmsutils/jobid/cjobid.h"
+#include "glite/lb/producer.h"
+#include "glite/lb/authz.h"
+
+void
+usage(const char *me)
+{
+ fprintf(stderr,"usage: %s [-r] [-d] [-g] jobid user_id\n"
+ "\t-r \tRemove\n"
+ "\t-d \tOperation is considered as `allow' by default, if -d is given 'deny' will be used\n"
+ "\t-g \tuser_id is treated as DN by default, if -g is given user_id is expectedto be of form VO:group\n",
+
+ me);
+}
+
+int
+main(int argc, char *argv[])
+{
+ edg_wll_Context ctx;
+ int operation = EDG_WLL_ACL_ADD;
+ int permission = EDG_WLL_PERM_READ;
+ int permission_type = EDG_WLL_PERM_ALLOW;
+ int user_id_type = EDG_WLL_USER_SUBJECT;
+ edg_wlc_JobId jobid;
+ int opt;
+ int ret;
+
+ if (argc < 3) {
+ usage(argv[0]);
+ return 1;
+ }
+
+ while ((opt=getopt(argc, argv, "rdg")) != -1)
+ switch(opt) {
+ case 'r': operation = EDG_WLL_ACL_REMOVE; break;
+ case 'd': permission_type = EDG_WLL_PERM_DENY; break;
+ case 'g': user_id_type = EDG_WLL_USER_VOMS_GROUP; break;
+ default:
+ usage(argv[0]);
+ return 1;
+ break;
+ }
+
+ edg_wll_InitContext(&ctx);
+
+ if (edg_wlc_JobIdParse(argv[optind], &jobid)) {
+ fprintf(stderr,"can't parse job ID\n");
+ goto err;
+ }
+
+ edg_wll_SetParam(ctx, EDG_WLL_PARAM_SOURCE, EDG_WLL_SOURCE_USER_INTERFACE);
+
+ ret = edg_wll_ChangeACL(ctx,
+ jobid,
+ argv[optind+1], user_id_type,
+ permission, permission_type,
+ operation);
+
+ if (ret) {
+ char *et, *ed;
+ edg_wll_Error(ctx, &et, &ed);
+ fprintf(stderr, "%s: edg_wll_LogChangeACL() failed: %s (%s)\n",
+ argv[0], et, ed);
+ goto err;
+ }
+
+ edg_wll_FreeContext(ctx);
+ return 0;
+
+err:
+ edg_wll_FreeContext(ctx);
+ return 1;
+}
--- /dev/null
+/* sample how to use fake testing library instead glite_lb_client */
+
+#include <iostream>
+
+#include <cppunit/extensions/HelperMacros.h>
+#include <cppunit/CompilerOutputter.h>
+#include <cppunit/extensions/TestFactoryRegistry.h>
+#include <cppunit/ui/text/TestRunner.h>
+
+#include "glite/lb/consumer_fake.h"
+
+class JobLogFakeExample: public CppUnit::TestFixture {
+ CPPUNIT_TEST_SUITE(JobLogFakeExample);
+ CPPUNIT_TEST(testWithFake);
+ CPPUNIT_TEST_SUITE_END();
+
+private:
+ static int query_events_cb(edg_wll_Context context, edg_wll_Event **events) {
+ return edg_wll_SetError(context, ENOENT, "Some error");
+ }
+
+public:
+
+ void testWithFake(void) {
+ edg_wll_Context ctx;
+ edg_wlc_JobId job;
+ edg_wll_Event *events;
+
+ edg_wll_InitContext(&ctx);
+ CPPUNIT_ASSERT(edg_wlc_JobIdParse("https://localhost:9000/someid", &job) == 0);
+
+ CPPUNIT_ASSERT(edg_wll_JobLog(ctx, job, &events) == 0);
+ freeEvents(events);
+
+ edg_wll_RegisterTestQueryEvents(&query_events_cb);
+ CPPUNIT_ASSERT(edg_wll_JobLog(ctx, job, &events) != 0);
+ // no events disposed here (they are deallocated on error)
+
+ edg_wll_UnregisterTestQueryEvents();
+ edg_wlc_JobIdFree(job);
+ edg_wll_FreeContext(ctx);
+ }
+
+private:
+
+ /* free returned events
+ */
+ void freeEvents(edg_wll_Event *events) {
+ int i;
+
+ i = 0;
+ while (events[i].type != EDG_WLL_EVENT_UNDEF) {
+ edg_wll_FreeEvent(&events[i]);
+ i++;
+ }
+ free(events);
+ }
+
+};
+
+CPPUNIT_TEST_SUITE_REGISTRATION(JobLogFakeExample);
+
+int main(void) {
+ CppUnit::Test *suite;
+ CppUnit::TextUi::TestRunner runner;
+
+ suite = CppUnit::TestFactoryRegistry::getRegistry().makeTest();
+ runner.addTest(suite);
+
+ return runner.run() ? 0 : 1;
+}
--- /dev/null
+#ident "$Header$"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <time.h>
+
+#include <expat.h>
+
+#include "glite/lb/consumer.h"
+#include "glite/lb/xml_conversions.h"
+
+static void dgerr(edg_wll_Context,char *);
+static void printstat(edg_wll_JobStat,int);
+
+#define MAX_SERVERS 20
+
+static char *myname;
+
+
+int main(int argc,char *argv[])
+{
+ edg_wll_Context ctx, sctx[MAX_SERVERS];
+ int i, result=0, nsrv=0;
+ char *servers[MAX_SERVERS];
+ char *errstr = NULL;
+
+
+ myname = argv[0];
+ printf("\n");
+
+ if (argc < 2 || strcmp(argv[1],"--help") == 0) {
+ fprintf(stderr,"Usage: %s job_id [job_id [...]]\n",argv[0]);
+ fprintf(stderr," %s -all\n",argv[0]);
+ return 1;
+ }
+ else if (argc >= 2 && strcmp(argv[1],"-all") == 0) {
+ edg_wll_JobStat *statesOut;
+ edg_wlc_JobId *jobsOut;
+ edg_wll_QueryRec jc[2];
+
+ jobsOut = NULL;
+ statesOut = NULL;
+/* init context */
+ if (edg_wll_InitContext(&ctx)) {
+ fprintf(stderr,"%s: cannot initialize edg_wll_Context\n",myname);
+ exit(1);
+ }
+/* retrieve job ID's */
+ memset(jc,0,sizeof jc);
+
+ jc[0].attr = EDG_WLL_QUERY_ATTR_OWNER;
+ jc[0].op = EDG_WLL_QUERY_OP_EQUAL;
+ jc[0].value.c = NULL; /* is NULL, peerName filled in on server side */
+ jc[1].attr = EDG_WLL_QUERY_ATTR_UNDEF;
+
+ //if (edg_wll_QueryJobs(ctx,jc,EDG_WLL_STAT_CLASSADS | EDG_WLL_STAT_CHILDREN | EDG_WLL_STAT_CHILDSTAT,
+ result = edg_wll_QueryJobs(ctx,jc,0,&jobsOut, &statesOut);
+ if (result == E2BIG) {
+ int r;
+ edg_wll_Error(ctx, NULL, &errstr);
+ if (edg_wll_GetParam(ctx, EDG_WLL_PARAM_QUERY_RESULTS, &r)) {
+ dgerr(ctx,"edg_wll_GetParam(EDG_WLL_PARAM_QUERY_RESULTS)");
+ free(errstr);
+ result=1; goto cleanup;
+ }
+ if (r != EDG_WLL_QUERYRES_LIMITED) goto late_error;
+ } else if (result) {
+ dgerr(ctx,"edg_wll_QueryJobs");
+ result=1; goto cleanup;
+ }
+
+/* retrieve and print status of each job */
+ for (i=0; statesOut[i].state; i++)
+ printstat(statesOut[i],0);
+
+late_error: if (result) {
+ edg_wll_SetError(ctx, result, errstr);
+ free(errstr);
+ dgerr(ctx,"edg_wll_QueryJobs");
+ result=1;
+ }
+
+cleanup:
+ if (jobsOut)
+ {
+ for (i=0; jobsOut[i]; i++) edg_wlc_JobIdFree(jobsOut[i]);
+ free(jobsOut);
+ }
+ if (statesOut)
+ {
+ for (i=0; statesOut[i].state; i++) edg_wll_FreeStatus(&statesOut[i]);
+ free(statesOut);
+ }
+ edg_wll_FreeContext(ctx);
+ }
+ else {
+ for (i=1; i<argc; i++) {
+ int j;
+ char *bserver;
+ edg_wlc_JobId job;
+ edg_wll_JobStat status;
+
+ memset(&status,0,sizeof status);
+
+/* parse job ID */
+ if (edg_wlc_JobIdParse(argv[i],&job)) {
+ fprintf(stderr,"%s: %s: cannot parse jobId\n",
+ myname,argv[i]);
+ continue;
+ }
+/* determine bookkeeping server address */
+ bserver = edg_wlc_JobIdGetServer(job);
+ if (!bserver) {
+ fprintf(stderr,"%s: %s: cannot extract bookkeeping server address\n",
+ myname,argv[i]);
+ edg_wlc_JobIdFree(job);
+ continue;
+ }
+/* use context database */
+ for (j=0; j<nsrv && strcmp(bserver,servers[j]); j++);
+ if (j==nsrv) {
+ edg_wll_InitContext(&sctx[j]);
+ nsrv++;
+ servers[j] = bserver;
+ }
+
+ if (edg_wll_JobStatus(sctx[j], job, EDG_WLL_STAT_CLASSADS | EDG_WLL_STAT_CHILDREN | EDG_WLL_STAT_CHILDSTAT, &status)) {
+ dgerr(sctx[j],"edg_wll_JobStatus");
+ result=1; goto cleanup2;
+ }
+
+/* print job status */
+ printstat(status,0);
+
+cleanup2:
+ if (job) edg_wlc_JobIdFree(job);
+ if (status.state) edg_wll_FreeStatus(&status);
+ }
+ for (i=0; i<nsrv; i++) edg_wll_FreeContext(sctx[i]);
+ }
+
+ return result;
+}
+
+static void
+dgerr(edg_wll_Context ctx,char *where)
+{
+ char *etxt,*edsc;
+
+ edg_wll_Error(ctx,&etxt,&edsc);
+ fprintf(stderr,"%s: %s: %s",myname,where,etxt);
+ if (edsc) fprintf(stderr," (%s)",edsc);
+ putc('\n',stderr);
+ free(etxt); free(edsc);
+}
+
+static void printstat(edg_wll_JobStat stat, int level)
+{
+ char *s, *j, ind[10];
+ int i;
+
+
+ for (i=0; i < level; i++)
+ ind[i]='\t';
+ ind[i]='\0';
+
+ s = edg_wll_StatToString(stat.state);
+/* print whole flat structure */
+ printf("%sstate : %s\n", ind, s);
+ printf("%sjobId : %s\n", ind, j = edg_wlc_JobIdUnparse(stat.jobId));
+ printf("%sowner : %s\n", ind, stat.owner);
+ printf("%sjobtype : %s\n", ind, (stat.jobtype ? "DAG" : "SIMPLE") );
+ printf("%sparent_job : %s\n", ind,
+ j = edg_wlc_JobIdUnparse(stat.parent_job));
+ if (stat.jobtype) {;
+ printf("%sseed : %s\n", ind, stat.seed);
+ printf("%schildren_num : %d\n", ind, stat.children_num);
+ printf("%schildren :\n", ind);
+ if (stat.children)
+ for (i=0; stat.children[i]; i++)
+ printf("%s\tchildren : %s\n", ind, stat.children[i]);
+ printf("%schildren_states :\n", ind);
+ if (stat.children_states)
+ for (i=0; stat.children_states[i].state; i++)
+ printstat(stat.children_states[i], level+1);
+ printf("%schildren_hist :\n",ind);
+ if (stat.children_hist)
+ for (i=1; i<=stat.children_hist[0]; i++)
+ printf("%s%14s %d\n", ind, edg_wll_StatToString(i-1),stat.children_hist[i]);
+ }
+ printf("%scondorId : %s\n", ind, stat.condorId);
+ printf("%sglobusId : %s\n", ind, stat.globusId);
+ printf("%slocalId : %s\n", ind, stat.localId);
+ printf("%sjdl : %s\n", ind, stat.jdl);
+ printf("%smatched_jdl : %s\n", ind, stat.matched_jdl);
+ printf("%sdestination : %s\n", ind, stat.destination);
+ printf("%snetwork server : %s\n", ind, stat.network_server);
+ printf("%scondor_jdl : %s\n", ind, stat.condor_jdl);
+ printf("%srsl : %s\n", ind, stat.rsl);
+ printf("%sreason : %s\n", ind, stat.reason);
+ printf("%slocation : %s\n", ind, stat.location);
+ printf("%sce_node : %s\n", ind, stat.ce_node);
+ printf("%ssubjob_failed : %d\n", ind, stat.subjob_failed);
+ printf("%sdone_code : %s\n", ind, edg_wll_done_codeToString(stat.done_code));
+ printf("%sexit_code : %d\n", ind, stat.exit_code);
+ printf("%sresubmitted : %d\n", ind, stat.resubmitted);
+ printf("%scancelling : %d\n", ind, stat.cancelling);
+ printf("%scancelReason : %s\n", ind, stat.cancelReason);
+ printf("%scpuTime : %d\n", ind, stat.cpuTime);
+ printf("%suser_tags :\n",ind);
+ if (stat.user_tags)
+ for (i=0; stat.user_tags[i].tag; i++) printf("%s%14s = \"%s\"\n", ind,
+ stat.user_tags[i].tag,stat.user_tags[i].value);
+ printf("%sstateEnterTime : %ld.%06ld\n", ind, stat.stateEnterTime.tv_sec,stat.stateEnterTime.tv_usec);
+ printf("%sstateEnterTimes : \n",ind);
+ if (stat.stateEnterTimes)
+ for (i=1; i<=stat.stateEnterTimes[0]; i++)
+ printf("%s%14s %s", ind, edg_wll_StatToString(i-1), (stat.stateEnterTimes[i] == 0) ?
+ " - not available -\n" : ctime((time_t *) &stat.stateEnterTimes[i]));
+ printf("%slastUpdateTime : %ld.%06ld\n", ind, stat.lastUpdateTime.tv_sec,stat.lastUpdateTime.tv_usec);
+ printf("%sexpectUpdate : %d\n", ind, stat.expectUpdate);
+ printf("%sexpectFrom : %s\n", ind, stat.expectFrom);
+ printf("%sacl : %s\n", ind, stat.acl);
+ printf("\n");
+
+ free(j);
+ free(s);
+}
+
+++ /dev/null
-#include <getopt.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <string.h>
-#include <errno.h>
-
-#include <globus_common.h>
-
-#include "glite/wmsutils/jobid/cjobid.h"
-#include "glite/lb/notifid.h"
-#include "glite/lb/producer.h"
-#include "glite/lb/events.h"
-
-
-static struct option opts[] = {
- {"help", 0, NULL, 'h'},
- {"sock", 1, NULL, 's'},
- {"jobid", 1, NULL, 'j'},
- {"seq", 1, NULL, 'c'},
- {"name", 1, NULL, 'n'},
- {"value", 1, NULL, 'v'}
-};
-
-static void usage(char *me)
-{
- fprintf(stderr, "usage: %s [option]\n"
- "\t-h, --help Shows this screen.\n"
- "\t-s, --server LB Proxy socket.\n"
- "\t-j, --jobid ID of requested job.\n"
- "\t-c, --seq Sequence code.\n"
- "\t-n, --name Name of the tag.\n"
- "\t-v, --value Value of the tag.\n"
- , me);
-}
-
-
-int main(int argc, char *argv[])
-{
- edg_wll_Context ctx;
- edg_wlc_JobId jobid = NULL;
- char *server, *code, *jobid_s, *name, *value;
- int opt, err = 0;
-
-
- server = code = jobid_s = name = value = NULL;
- while ( (opt = getopt_long(argc, argv, "hs:j:c:n:v:", opts, NULL)) != EOF)
- switch (opt) {
- case 'h': usage(name); return 0;
- case 's': server = strdup(optarg); break;
- case 'j': jobid_s = strdup(optarg); break;
- case 'c': code = strdup(optarg); break;
- case 'n': name = strdup(optarg); break;
- case 'v': value = strdup(optarg); break;
- case '?': usage(name); return 1;
- }
-
- if ( !jobid_s ) { fprintf(stderr, "JobId not given\n"); return 1; }
- if ( !code ) { fprintf(stderr, "Sequence code not given\n"); return 1; }
- if ( !server ) { fprintf(stderr, "LB proxy socket not given\n"); return 1; }
- if ( !name ) { fprintf(stderr, "Tag name not given\n"); return 1; }
- if ( !value ) { fprintf(stderr, "Tag value not given\n"); return 1; }
-
- if ( (errno = edg_wlc_JobIdParse(jobid_s, &jobid)) ) { perror(jobid_s); return 1; }
-
- if (globus_module_activate(GLOBUS_COMMON_MODULE) != GLOBUS_SUCCESS) {
- fprintf(stderr, "Cannot initialize Globus common module\n");
- exit(1);
- }
-
- edg_wll_InitContext(&ctx);
-
- edg_wll_SetParam(ctx, EDG_WLL_PARAM_SOURCE, EDG_WLL_SOURCE_USER_INTERFACE);
- edg_wll_SetParam(ctx, EDG_WLL_PARAM_LBPROXY_STORE_SOCK, server);
-
- if (edg_wll_SetLoggingJob(ctx, jobid, code, EDG_WLL_SEQ_NORMAL)) {
- char *et,*ed;
- edg_wll_Error(ctx,&et,&ed);
- fprintf(stderr,"SetLoggingJob(%s,%s): %s (%s)\n",jobid_s,code,et,ed);
- exit(1);
- }
-
- err = edg_wll_LogEventProxy(ctx,
- EDG_WLL_EVENT_USERTAG, EDG_WLL_FORMAT_USERTAG,
- name, value);
-
- if (err) {
- char *et,*ed;
-
- edg_wll_Error(ctx,&et,&ed);
- fprintf(stderr,"%s: edg_wll_LogEvent*(): %s (%s)\n",
- argv[0],et,ed);
- free(et); free(ed);
- }
-
- code = edg_wll_GetSequenceCode(ctx);
- puts(code);
- free(code);
-
- edg_wll_FreeContext(ctx);
-
- return err;
-}
static edg_wll_Logging_cb_f *Logging_cb = NULL;
-static edg_wll_Logging_cb_f *LoggingProxy_cb = NULL;
/* register the logging callback */
}
-/* register the proxy logging callback */
-int edg_wll_RegisterTestLoggingProxy(edg_wll_Logging_cb_f *cb) {
- if (LoggingProxy_cb) return 0;
-
- LoggingProxy_cb = cb;
- return 1;
-}
-
-
/* unregister the logging callback */
void edg_wll_UnregisterTestLogging() {
Logging_cb = NULL;
}
-/* unregister the proxy logging callback */
-void edg_wll_UnregisterTestLoggingProxy() {
- LoggingProxy_cb = NULL;
-}
-
-
/* "fake" implementation of function sending formated UML string */
int edg_wll_DoLogEvent(edg_wll_Context context, edg_wll_LogLine logLine) {
if (Logging_cb)
return edg_wll_Error(context, NULL, NULL);
}
-
-/* "fake" implementation of function sending formated ULM string */
-int edg_wll_DoLogEventProxy(edg_wll_Context context, edg_wll_LogLine logline) {
- if (Logging_cb)
- return Logging_cb(context);
- else
- return edg_wll_Error(context, NULL, NULL);
-}
--- /dev/null
+#Sun Apr 03 06:49:43 CEST 2005
+module.build=222
-#Fri Dec 10 13:24:00 CET 2004
-module.version=0.5.0
-module.build=112
-module.age=2
+
+module.version = 1.0.1
+module.age = 1
+
std::pair<std::string, int>
ServerConnection::getQueryServer() const
{
- /* FIXME: not implemented in C API */
- STACK_ADD;
- throw Exception(EXCEPTION_MANDATORY, 0, "method not implemented");
+ char *hostname;
+ int port;
+
+ check_result(edg_wll_GetParam(context,
+ EDG_WLL_PARAM_QUERY_SERVER,
+ &hostname),
+ context,
+ "getting query server address");
+ check_result(edg_wll_GetParam(context,
+ EDG_WLL_PARAM_QUERY_SERVER_PORT,
+ &port),
+ context,
+ "getting query server port");
+ return std::pair<std::string,int>(std::string(strdup(hostname)), port);
}
int
ServerConnection::getQueryTimeout() const
{
- /* FIXME: not implemented in C API */
- STACK_ADD;
- throw Exception(EXCEPTION_MANDATORY, 0, "method not implemented");
+ int timeout;
+
+ check_result(edg_wll_GetParam(context,
+ EDG_WLL_PARAM_QUERY_TIMEOUT,
+ &timeout),
+ context,
+ "getting query timeout");
+ return timeout;
}
std::string
ServerConnection::getX509Proxy() const
{
- /* FIXME: not implemented in C API */
- STACK_ADD;
- throw Exception(EXCEPTION_MANDATORY, 0, "method not implemented");
+ char *proxy;
+
+ check_result(edg_wll_GetParam(context,
+ EDG_WLL_PARAM_X509_PROXY,
+ &proxy),
+ context,
+ "getting X509 proxy");
+ return std::string(strdup(proxy));
}
std::pair<std::string, std::string>
ServerConnection::getX509Cert() const
{
- /* FIXME: not implemented in C API */
- STACK_ADD;
- throw Exception(EXCEPTION_MANDATORY, 0, "method not implemented");
+ char *cert, *key;
+
+ check_result(edg_wll_GetParam(context,
+ EDG_WLL_PARAM_X509_CERT,
+ &cert),
+ context,
+ "getting X509 cert");
+ check_result(edg_wll_GetParam(context,
+ EDG_WLL_PARAM_X509_KEY,
+ &key),
+ context,
+ "getting X509 key");
+
+ return std::pair<std::string, std::string>(std::string(strdup(cert)),
+ std::string(strdup(key)));
}
// static
convertQueryVectorExt(const std::vector<std::vector<QueryRecord> > &in)
{
unsigned i;
- edg_wll_QueryRec **out = new (edg_wll_QueryRec*)[in.size() + 1];
+ edg_wll_QueryRec **out = new edg_wll_QueryRec*[in.size() + 1];
if(out == NULL) {
STACK_ADD;
"edg_wll_SetParamInt()");
}
-void ServerConnection::setParam(edg_wll_ContextParam par, const std::string val)
+void ServerConnection::setParam(edg_wll_ContextParam par, const std::string &val)
{
check_result(edg_wll_SetParamString(context,par,val.c_str()),
context,
edg_wll_Args parray[] = {
{ EDG_WLL_ARGS_EVENT, "e", "event", "select event type (see -e help)", &event },
{ EDG_WLL_ARGS_BOOL, "p", "priority", "send as priority event", &pri },
- { EDG_WLL_ARGS_STRING, "x", "lbproxy", "send directly to L&B Proxy (not locallogger) with given credentials", &lbproxy },
{ EDG_WLL_ARGS_STRING, "m", "machine", 0, &server },
{ EDG_WLL_ARGS_SOURCE, "s", "source", "event source (see -s help)", &src },
{ EDG_WLL_ARGS_STRING, "i", "source-instance", "event source instance", &src_instance },
/* log the event - priority/normal/proxy */
logev = (pri) ? edg_wll_LogEventSync : edg_wll_LogEvent;
- logev = (lbproxy) ? edg_wll_LogEventProxy : logev;
/* if no job given - generate some */
if (jobid_s == 0) {
edg_wll_SetParam(ctx, EDG_WLL_PARAM_LEVEL,
(deb) ? EDG_WLL_LEVEL_DEBUG : EDG_WLL_LEVEL_SYSTEM);
- if (lbproxy) {
- edg_wll_SetParam(ctx, EDG_WLL_PARAM_LBPROXY_STORE_SOCK, "/tmp/lb_proxy_store.sock");
- edg_wll_SetParam(ctx, EDG_WLL_PARAM_LBPROXY_SERVE_SOCK, "/tmp/lb_proxy_serve.sock");
- if (edg_wll_SetLoggingJobProxy(ctx,jobid,code,lbproxy,EDG_WLL_SEQ_NORMAL)) {
- char *et,*ed;
- edg_wll_Error(ctx,&et,&ed);
- fprintf(stderr,"SetLoggingJobProxy(%s,%s,%s): %s (%s)\n",jobid_s,code,lbproxy,et,ed);
- exit(1);
- }
- } else {
- if (edg_wll_SetLoggingJob(ctx,jobid,code,EDG_WLL_SEQ_NORMAL)) {
- char *et,*ed;
- edg_wll_Error(ctx,&et,&ed);
- fprintf(stderr,"SetLoggingJob(%s,%s): %s (%s)\n",jobid_s,code,et,ed);
- exit(1);
- }
+ if (edg_wll_SetLoggingJob(ctx,jobid,code,EDG_WLL_SEQ_NORMAL)) {
+ char *et,*ed;
+ edg_wll_Error(ctx,&et,&ed);
+ fprintf(stderr,"SetLoggingJob(%s,%s): %s (%s)\n",jobid_s,code,et,ed);
+ exit(1);
}
#ifdef ENABLE_REASON_LENGTH
#ifdef FAKE_VERSION
int edg_wll_DoLogEvent(edg_wll_Context context, edg_wll_LogLine logline);
-int edg_wll_DoLogEventProxy(edg_wll_Context context, edg_wll_LogLine logline);
#else
/**
*----------------------------------------------------------------------
return edg_wll_Error(context, NULL, NULL);
}
-/**
- *----------------------------------------------------------------------
- * Connects to L&B Proxy and sends already formatted ULM string
- * \brief helper logging function
- * \param context INOUT context to work with,
- * \param logline IN formated ULM string
- *----------------------------------------------------------------------
- */
-static int edg_wll_DoLogEventProxy(
- edg_wll_Context context,
- edg_wll_LogLine logline)
-{
- int answer;
- struct sockaddr_un saddr;
- int flags;
- edg_wll_PlainConnection conn;
-
- edg_wll_ResetError(context);
- answer = 0;
-
- /* open a connection to the L&B Proxy: */
-
-#ifdef EDG_WLL_LOG_STUB
- fprintf(stderr,"Logging to L&B Proxy at socket %s\n",
- context->p_lbproxy_store_sock? context->p_lbproxy_store_sock: socket_path);
-#endif
- memset(&conn, 0, sizeof(conn));
- conn.sock = socket(PF_UNIX, SOCK_STREAM, 0);
- if (conn.sock < 0) {
- edg_wll_SetError(context,answer = errno,"socket() error");
- goto edg_wll_DoLogEventProxy_end;
- }
- memset(&saddr, 0, sizeof(saddr));
- saddr.sun_family = AF_UNIX;
- strcpy(saddr.sun_path, context->p_lbproxy_store_sock?
- context->p_lbproxy_store_sock: socket_path);
- if ((flags = fcntl(conn.sock, F_GETFL, 0)) < 0 || fcntl(conn.sock, F_SETFL, flags | O_NONBLOCK) < 0) {
- edg_wll_SetError(context,answer = errno,"fcntl()");
- close(conn.sock);
- goto edg_wll_DoLogEventProxy_end;
- }
- if (connect(conn.sock, (struct sockaddr *)&saddr, sizeof(saddr)) < 0) {
- if(errno != EISCONN) {
- edg_wll_SetError(context,answer = errno,"connect()");
- close(conn.sock);
- goto edg_wll_DoLogEventProxy_end;
- }
- }
-
-
- /* and send the message to the L&B Proxy: */
-
- answer = edg_wll_log_proto_client_proxy(context,&conn,logline);
-
- edg_wll_plain_close(&conn);
-
-edg_wll_DoLogEventProxy_end:
-
- switch(answer) {
- case 0:
- case EINVAL:
- case ENOSPC:
- case ENOMEM:
- case EDG_WLL_ERROR_GSS:
- case EDG_WLL_ERROR_DNS:
- case ENOTCONN:
- case ECONNREFUSED:
- case ETIMEDOUT:
- case EAGAIN:
- break;
- case EDG_WLL_ERROR_PARSE_EVENT_UNDEF:
- case EDG_WLL_ERROR_PARSE_MSG_INCOMPLETE:
- case EDG_WLL_ERROR_PARSE_KEY_DUPLICITY:
- case EDG_WLL_ERROR_PARSE_KEY_MISUSE:
-// case EDG_WLL_ERROR_PARSE_OK_WITH_EXTRA_FIELDS:
- edg_wll_UpdateError(context,EINVAL,"edg_wll_DoLogEventProxy(): Error code mapped to EINVAL");
- break;
-
- default:
- edg_wll_UpdateError(context,EAGAIN,"edg_wll_DoLogEventProxy(): Error code mapped to EAGAIN");
- break;
- }
-
- return edg_wll_Error(context, NULL, NULL);
-}
#endif /* FAKE_VERSION */
/**
*----------------------------------------------------------------------
- * Formats a logging message and sends it to L&B Proxy
- * \brief master proxy logging event function
- * \param context INOUT context to work with,
- * \param event IN type of the event,
- * \param fmt IN printf()-like format string,
- * \param ... IN event specific values/data according to fmt.
- *----------------------------------------------------------------------
- */
-static int edg_wll_LogEventMasterProxy(
- edg_wll_Context context,
- edg_wll_EventCode event,
- char *fmt, ...)
-{
- va_list fmt_args;
- int ret,answer;
- char *fix,*var,*dguser;
- char *source,*eventName,*lvl, *fullid,*seq,*name_esc;
- struct timeval start_time;
- char date[ULM_DATE_STRING_LENGTH+1];
- edg_wll_LogLine out;
- size_t size;
- int i;
-
- i = errno = size = 0;
- seq = fix = var = dguser = out = source = eventName = lvl = fullid = NULL;
-
- edg_wll_ResetError(context);
-
- /* default return value is "Try Again" */
- answer = ret = EAGAIN;
-
- /* format the message: */
- va_start(fmt_args,fmt);
-
- gettimeofday(&start_time,0);
- if (edg_wll_ULMTimevalToDate(start_time.tv_sec,start_time.tv_usec,date) != 0) {
- edg_wll_SetError(context,ret = EINVAL,"edg_wll_LogEventMasterProxy(): edg_wll_ULMTimevalToDate() error");
- goto edg_wll_logeventmasterproxy_end;
- }
- source = edg_wll_SourceToString(context->p_source);
- lvl = edg_wll_LevelToString(context->p_level);
- eventName = edg_wll_EventToString(event);
- if (!eventName) {
- edg_wll_SetError(context,ret = EINVAL,"edg_wll_LogEventMasterProxy(): event name not specified");
- goto edg_wll_logeventmasterproxy_end;
- }
- if (!(fullid = edg_wlc_JobIdUnparse(context->p_jobid))) {
- edg_wll_SetError(context,ret = EINVAL,"edg_wll_LogEventMasterProxy(): edg_wlc_JobIdUnparse() error");
- goto edg_wll_logeventmasterproxy_end;
- }
- seq = edg_wll_GetSequenceCode(context);
- if (edg_wll_IncSequenceCode(context)) {
- ret = EINVAL;
- goto edg_wll_logeventmasterproxy_end;
- }
- if (trio_asprintf(&fix,EDG_WLL_FORMAT_COMMON,
- date,context->p_host,lvl,1,
- source,context->p_instance ? context->p_instance : "",
- eventName,fullid,seq) == -1) {
- edg_wll_SetError(context,ret = ENOMEM,"edg_wll_LogEventMasterProxy(): trio_asprintf() error");
- goto edg_wll_logeventmasterproxy_end;
- }
- if (trio_vasprintf(&var,fmt,fmt_args) == -1) {
- edg_wll_SetError(context,ret = ENOMEM,"edg_wll_LogEventMasterProxy(): trio_vasprintf() error");
- goto edg_wll_logeventmasterproxy_end;
- }
- /* format the DG.USER string */
-/* XXX: put user credentials here probably from context */
- name_esc = edg_wll_LogEscape(context->p_user_lbproxy);
- if (asprintf(&dguser,"DG.USER=\"%s\" ",name_esc) == -1) {
- edg_wll_SetError(context,ret = ENOMEM,"edg_wll_LogEventMasterProxy(): asprintf() error");
- goto edg_wll_logeventmasterproxy_end;
- }
- if (asprintf(&out,"%s%s%s\n",dguser,fix,var) == -1) {
- edg_wll_SetError(context,ret = ENOMEM,"edg_wll_LogEventMasterProxy(): asprintf() error");
- goto edg_wll_logeventmasterproxy_end;
- }
- size = strlen(out);
-
- if (size > EDG_WLL_LOG_SYNC_MAXMSGSIZE) {
- edg_wll_SetError(context,ret = ENOSPC,"edg_wll_LogEventMasterProxy(): Message size too large for synchronous transfer");
- goto edg_wll_logeventmasterproxy_end;
- }
-
-#ifdef EDG_WLL_LOG_STUB
-// fprintf(stderr,"edg_wll_LogEvent (%d chars): %s",size,out);
-#endif
-
- context->p_tmp_timeout = context->p_sync_timeout;
-
- /* and send the message to the L&B Proxy: */
- ret = edg_wll_DoLogEventProxy(context, out);
-
-edg_wll_logeventmasterproxy_end:
- va_end(fmt_args);
- if (seq) free(seq);
- if (fix) free(fix);
- if (var) free(var);
- if (dguser) free(dguser);
- if (out) free(out);
- if (source) free(source);
- if (lvl) free(lvl);
- if (eventName) free(eventName);
- if (fullid) free(fullid);
- if (name_esc) free(name_esc);
-
- if (ret) edg_wll_UpdateError(context,0,"Logging library ERROR: ");
-
- return edg_wll_Error(context,NULL,NULL);
-}
-
-/**
- *----------------------------------------------------------------------
* Formats a logging message and sends it asynchronously to local-logger
* \brief generic asynchronous logging function
*----------------------------------------------------------------------
}
/**
- *----------------------------------------------------------------------
- * Formats a logging message and sends it synchronously to L&B Proxy
- * \brief generic synchronous logging function
- *----------------------------------------------------------------------
- */
-int edg_wll_LogEventProxy(
- edg_wll_Context context,
- edg_wll_EventCode event,
- char *fmt, ...)
-{
- int ret=0;
- char *list=NULL;
- va_list fmt_args;
-
- edg_wll_ResetError(context);
-
- va_start(fmt_args,fmt);
- if (trio_vasprintf(&list,fmt,fmt_args) == -1) {
- edg_wll_SetError(context,ret = ENOMEM,"edg_wll_LogEventProxy(): trio_vasprintf() error");
- goto edg_wll_logevent_end;
- }
-
- ret=edg_wll_LogEventMasterProxy(context,event,"%s",list);
-
-edg_wll_logevent_end:
- va_end(fmt_args);
- if (list) free(list);
-
- if (ret) edg_wll_UpdateError(context,0,"edg_wll_LogEventProxy(): ");
-
- return edg_wll_Error(context,NULL,NULL);
-}
-
-
-/**
*-----------------------------------------------------------------------
* Instructs interlogger to to deliver all pending events related to current job
* \brief flush events from interlogger
/**
*-----------------------------------------------------------------------
- * Set a current job for given context.
- * \note Should be called before any logging call.
- *-----------------------------------------------------------------------
- */
-int edg_wll_SetLoggingJobProxy(
- edg_wll_Context context,
- const edg_wlc_JobId job,
- const char *code,
- const char *user,
- int flags)
-{
- int err;
- char *code_loc = NULL;
-
- edg_wll_ResetError(context);
-
- if (!job) return edg_wll_SetError(context,EINVAL,"jobid is null");
-
- edg_wlc_JobIdFree(context->p_jobid);
- if ((err = edg_wlc_JobIdDup(job,&context->p_jobid))) {
- edg_wll_SetError(context,err,"edg_wll_SetLoggingJob(): edg_wlc_JobIdDup() error");
- goto edg_wll_setloggingjobproxy_end;
- }
-
- /* add user credentials to context */
- edg_wll_SetParamString(context, EDG_WLL_PARAM_LBPROXY_USER, user);
-
- /* query LBProxyServer for sequence code if not user-suplied */
-/* FIXME: doesn't work yet
- if (!code) {
- edg_wll_QuerySequenceCodeProxy(context, job, &code_loc);
- goto edg_wll_setloggingjobproxy_end;
- } else {
- code_loc = strdup(code);
- }
-
- if (!edg_wll_SetSequenceCode(context,code_loc,flags)) */ {
- edg_wll_IncSequenceCode(context);
- }
-
-edg_wll_setloggingjobproxy_end:
- if (code_loc) free(code_loc);
- return edg_wll_Error(context,NULL,NULL);
-}
-
-/**
- *-----------------------------------------------------------------------
* Register job with L&B service.
*-----------------------------------------------------------------------
*/
return edg_wll_Error(context,NULL,NULL);
}
-/**
- *-----------------------------------------------------------------------
- * Register job with L&B Proxy service.
- *-----------------------------------------------------------------------
- */
-static int edg_wll_RegisterJobMasterProxy(
- edg_wll_Context context,
- const edg_wlc_JobId job,
- enum edg_wll_RegJobJobtype type,
- const char * user,
- const char * jdl,
- const char * ns,
- edg_wlc_JobId parent,
- int num_subjobs,
- const char * seed,
- edg_wlc_JobId ** subjobs)
-{
- char *type_s = NULL,*intseed = NULL, *seq = NULL;
- char *parent_s = NULL;
- int err = 0;
-
- edg_wll_ResetError(context);
-
- intseed = seed ? strdup(seed) :
- str2md5base64(seq = edg_wll_GetSequenceCode(context));
-
- free(seq);
-
- type_s = edg_wll_RegJobJobtypeToString(type);
- if (!type_s) return edg_wll_SetError(context,EINVAL,"edg_wll_RegisterJobMaster(): no jobtype specified");
-
- if ((type == EDG_WLL_REGJOB_DAG || type == EDG_WLL_REGJOB_PARTITIONED)
- && num_subjobs > 0)
- err = edg_wll_GenerateSubjobIds(context,job,
- num_subjobs,intseed,subjobs);
-
- parent_s = parent ? edg_wlc_JobIdUnparse(parent) : strdup("");
-
- if (err == 0 &&
- edg_wll_SetLoggingJobProxy(context,job,NULL,user,EDG_WLL_SEQ_NORMAL) == 0)
- edg_wll_LogEventMasterProxy(context,
- EDG_WLL_EVENT_REGJOB,EDG_WLL_FORMAT_REGJOB,
- (char *)jdl,ns,parent_s,type_s,num_subjobs,intseed);
-
- free(type_s); free(intseed); free(parent_s);
- return edg_wll_Error(context,NULL,NULL);
-}
-
int edg_wll_RegisterJobSync(
edg_wll_Context context,
const edg_wlc_JobId job,
return edg_wll_Error(ctx, NULL, NULL);
}
-int edg_wll_RegisterJobProxy(
- edg_wll_Context context,
- const edg_wlc_JobId job,
- enum edg_wll_RegJobJobtype type,
- const char * user,
- const char * jdl,
- const char * ns,
- int num_subjobs,
- const char * seed,
- edg_wlc_JobId ** subjobs)
-{
- return edg_wll_RegisterJobMasterProxy(context,job,type,user,jdl,ns, NULL, num_subjobs,seed,subjobs);
-}
-
int edg_wll_ChangeACL(
edg_wll_Context ctx,
const edg_wlc_JobId jobid,
return edg_wll_LogEvent$b;
\}\n
};
- gen qq{
-int edg_wll_Log${t}Proxy$a
-\{
-$decl
- return edg_wll_LogEventProxy$b;
-\}\n
-};
+# gen qq{
+#int edg_wll_Log${t}Proxy$a
+#\{
+#$decl
+# return edg_wll_LogEventProxy$b;
+#\}\n
+#};
for ($event->getFieldsOrdered) {
my $f = selectField $event $_;
my $fn = $f->getName;
return edg_wll_LogEvent$d;
\}\n
};
- gen qq{
-int edg_wll_Log$t${code}Proxy$c
-\{
-$decl
- return edg_wll_LogEventProxy$d;
-\}\n
-};
+# gen qq{
+#int edg_wll_Log$t${code}Proxy$c
+#\{
+#$decl
+# return edg_wll_LogEventProxy$d;
+#\}\n
+#};
}
}
}
# major version more frequently. This variable specifies how many steps ahead
# we are.
-VERSION_AHEAD=1
+VERSION_AHEAD=0
GLOBUS_LIBS:=-L${globus_prefix}/lib \
-lglobus_common_${nothrflavour} \
Revision history:
$Log$
+ Revision 1.6 2004/10/18 19:16:09 zsalvet
+ RPM descriptions
+
Revision 1.5 2004/07/28 12:27:00 dimeglio
Changed default target from compile to dist
Load version file
========================================= -->
<property file="${module.version.file}"/>
+ <property file="${module.build.file}"/>
<!-- ==============================================
Local private targets
typedef struct _edg_wll_GssConnection {
gss_ctx_id_t context;
int sock;
- char buffer[BUFSIZ];
+ char *buffer;
size_t bufsize;
} edg_wll_GssConnection;
--- /dev/null
+#Sun Apr 03 06:47:19 CEST 2005
+module.build=221
-#Fri Dec 10 13:22:02 CET 2004
-module.version=1.0.0
-module.build=111
-module.age=2
+
+module.version = 1.1.4
+module.age = 1
+
};
/**
- * \fn edg_wll_EventCode edg_wll_StringToEvent(char *name)
+ * \fn edg_wll_EventCode edg_wll_StringToEvent(const char *name)
* \param name a string event name (e.g. "JobTransfer")
* \return corresponding numeric code (edg_wll_EventCode)
* \brief convert a string event name to the corresponding numeric code
* Calls: strcasecmp
* Algorithm: array lookup
*/
-edg_wll_EventCode edg_wll_StringToEvent(char *name)
+edg_wll_EventCode edg_wll_StringToEvent(const char *name)
{
unsigned int i;
};
/*
- * \fn edg_wll_KeyNameCode edg_wll_StringToKeyName(char *name)
+ * \fn edg_wll_KeyNameCode edg_wll_StringToKeyName(const char *name)
* \param name a string ULM key name (e.g. "DG.JOB.TRANSFER.DEST")
* \return corresponding numeric code (edg_wll_KeyNameCode)
* \brief convert a string ULM key name to the corresponding numeric code
* Calls: strcasecmp
* Algorithm: array lookup
*/
-edg_wll_KeyNameCode edg_wll_StringToKeyName(char *name)
+edg_wll_KeyNameCode edg_wll_StringToKeyName(const char *name)
{
unsigned int i;
# function StringTo:
gen qq{
/**
- * \\fn $enum edg_wll_StringTo${c}(char *name)
+ * \\fn $enum edg_wll_StringTo${c}(const char *name)
* Calls: strcasecmp
* Algorithm: array lookup
*/
-$enum edg_wll_StringTo${c}(char *name)
+$enum edg_wll_StringTo${c}(const char *name)
\{
unsigned int i;
# function StringTo:
gen qq{
/**
- * \\fn $enum edg_wll_StringTo${c}(char *name)
+ * \\fn $enum edg_wll_StringTo${c}(const char *name)
* Calls: strcasecmp
* Algorithm: array lookup
*/
-$enum edg_wll_StringTo${c}(char *name)
+$enum edg_wll_StringTo${c}(const char *name)
\{
unsigned int i;
if ($ft eq 'string') {
gen $indent."\tif (event->$tl.$fn) free(event->$tl.$fn);\n"
}
+ if ($ft eq 'jobid') {
+ gen $indent."\tif (event->$tl.$fn) edg_wlc_JobIdFree(event->$tl.$fn);\n"
+ }
+ if ($ft eq 'notifid') {
+ gen $indent."\tif (event->$tl.$fn) edg_wll_NotifIdFree(event->$tl.$fn);\n"
+ }
}
gen $indent.$indent."break;\n"
}
#include <stdlib.h>
#include <stdarg.h>
#include <syslog.h>
+#include <pthread.h>
int log_level;
vasprintf(&err_text, fmt, fmt_args);
va_end(fmt_args);
- if(level <= log_level)
+ if(level <= log_level) {
+ fprintf(stderr, "[%6d] ", pthread_self());
fprintf(stderr, err_text);
-
+ }
+
if(level <= LOG_ERR) {
openlog("edg-wl-interlogd", LOG_PID | LOG_CONS, LOG_DAEMON);
syslog(level, "%s", err_text);
input_token.value = (void*)buf;
input_token.length = bufsize;
- maj_stat = gss_wrap (&min_stat, connection->context, 0, GSS_C_QOP_DEFAULT,
+ maj_stat = gss_wrap (&min_stat, connection->context, 1, GSS_C_QOP_DEFAULT,
&input_token, NULL, &output_token);
if (GSS_ERROR(maj_stat)) {
if (gss_code) {
len = (connection->bufsize < bufsize) ? connection->bufsize : bufsize;
memcpy(buf, connection->buffer, len);
- connection->bufsize -= len;
- if (connection->bufsize > 0) {
- for (i = 0; i < sizeof(connection->buffer) - len; i++)
+ if (connection->bufsize - len == 0) {
+ free(connection->buffer);
+ connection->buffer = NULL;
+ } else {
+ for (i = 0; i < connection->bufsize - len; i++)
connection->buffer[i] = connection->buffer[i+len];
}
+ connection->bufsize -= len;
return len;
}
maj_stat = gss_unwrap(&min_stat, connection->context, &input_token,
&output_token, NULL, NULL);
+ gss_release_buffer(&min_stat, &input_token);
if (GSS_ERROR(maj_stat)) {
/* XXX cleanup */
return EDG_WLL_GSS_ERROR_GSS;
} while (maj_stat == 0 && output_token.length == 0 && output_token.value == NULL);
if (output_token.length > bufsize) {
- if (output_token.length - bufsize > sizeof(connection->buffer))
- return EINVAL;
connection->bufsize = output_token.length - bufsize;
+ connection->buffer = malloc(connection->bufsize);
+ if (connection->buffer == NULL) {
+ connection->bufsize = 0;
+ ret = EDG_WLL_GSS_ERROR_ERRNO;
+ goto end;
+ }
memcpy(connection->buffer, output_token.value + bufsize, connection->bufsize);
output_token.length = bufsize;
}
+
memcpy(buf, output_token.value, output_token.length);
+ ret = output_token.length;
- return output_token.length;
+end:
+ gss_release_buffer(&min_stat, &output_token);
+
+ return ret;
}
int
if (connection->bufsize > 0) {
size_t len;
-
len = (connection->bufsize < bufsize) ? connection->bufsize : bufsize;
memcpy(buf, connection->buffer, len);
- connection->bufsize -= len;
- if (connection->bufsize > 0) {
- for (i = 0; i < sizeof(connection->buffer) - len; i++)
+ if (connection->bufsize - len == 0) {
+ free(connection->buffer);
+ connection->buffer = NULL;
+ } else {
+ for (i = 0; i < connection->bufsize - len; i++)
connection->buffer[i] = connection->buffer[i+len];
}
+ connection->bufsize -= len;
*total = len;
}
if (con->sock >= 0)
close(con->sock);
}
+ if (con->buffer)
+ free(con->buffer);
memset(con, 0, sizeof(*con));
con->context = GSS_C_NO_CONTEXT;
con->sock = -1;
Revision history:
$Log$
+ Revision 1.4 2004/10/18 19:16:09 zsalvet
+ RPM descriptions
+
Revision 1.3 2004/07/29 23:21:51 dimeglio
Changed default target from compile to dist
Load version file
========================================= -->
<property file="${module.version.file}"/>
+ <property file="${module.build.file}"/>
<!-- ==============================================
Local private targets
--- /dev/null
+#Wed Apr 13 06:32:27 CEST 2005
+module.build=229
-#Fri Dec 10 13:27:13 CET 2004
-module.version=0.5.0
-module.build=112
-module.age=3
+
+module.version = 1.0.1
+module.age = 1
+
\ No newline at end of file
assert(eq != NULL);
event_queue_lock_ro(eq);
- ret = eq->head == NULL;
+ ret = (eq->head == NULL);
event_queue_unlock(eq);
return(ret);
if(eq->mark_this && (el->prev == eq->mark_this))
eq->mark_prev = el;
#endif
+
event_queue_unlock(eq);
/* end of critical section */
assert(eq != NULL);
assert(msg != NULL);
- event_queue_lock_ro(eq);
+ event_queue_lock(eq);
el = eq->head;
#if defined(INTERLOGD_EMS)
/* this message is marked for removal, it is first on the queue */
}
if(el == eq->tail) {
/* we are removing the last message */
- eq->tail = NULL;
+ eq->tail = prev;
}
if(el == eq->tail_ems) {
/* we are removing last priority message */
- eq->tail_ems = NULL;
+ eq->tail_ems = prev;
}
eq->mark_this = NULL;
eq_s->tail = NULL;
while(p) {
if(strcmp(p->msg->job_id_s, notif_id) == 0) {
- il_log(LOG_DEBUG, " moving event with notif id %s from %s:%d to %s:%d\n",
- notif_id, eq_s->dest_name,eq_s->dest_port, eq_d ? eq_d->dest_name : "trash",eq_d ? eq_d->dest_port : -1);
+ il_log(LOG_DEBUG, " moving event at offset %d from %s:%d to %s:%d\n",
+ p->msg->offset, eq_s->dest_name,eq_s->dest_port, eq_d ? eq_d->dest_name : "trash",eq_d ? eq_d->dest_port : -1);
+ il_log(LOG_DEBUG, " current: %x, next: %x\n", p, p->prev);
/* remove the message from the source list */
*source_prev = p->prev;
if(eq_d) {
* 2) es->offset is set only by recover() and next().
* 3) Additional recover can not do much harm.
* 4) And next() is only called by the same thread as sync().
- * => no one is messing with us right now */
+ * 5) use_lock is in place, so no cleanup possible
+ * => no one is messing with us right now */
event_store_lock_ro(es);
if(ret < 0)
ret = -1;
else
- /* somehow we suppose that now es->offset >= offset */
- /* in fact it must be es->offset > offset, anything else would be weird */
- ret = (es->offset > offset) ? 0 : 1;
+ if(es->offset <= offset) {
+ /* Apparently there is something wrong - we are receiving an event
+ * which is beyond the end of file. Someone must have removed the file
+ * when we were not looking. The question is - what should we do with the event?
+ * We have to send it, as this is the only one occasion when we see it.
+ * However, we must not allow the es->offset to be set using this event,
+ * as it would point after the end of file. Sort this out in event_store_next().
+ */
+ ret = 1;
+ } else if(es->offset > offset) {
+ /* we have seen at least this event */
+ ret = 0;
+ }
}
event_store_unlock(es);
return(ret);
int
-event_store_next(struct event_store *es, int len)
+event_store_next(struct event_store *es, long offset, int len)
{
assert(es != NULL);
event_store_lock(es);
- es->offset += len;
+ /* Whoa, be careful now. The es->offset points right after the last enqueued event,
+ * but it may not be the offset of the event WE have just enqueued, because:!
+ * 1) someone could have removed the event file behind our back
+ * 2) the file could have been recover()ed and more events read
+ * In either case the offset should not be moved.
+ */
+ if(es->offset == offset) {
+ es->offset += len;
+ }
event_store_unlock(es);
return(0);
(messsage was just to change the delivery address) */
if(msg->len == 0)
return(0);
-
#endif
/* avoid losing signal to thread */
event_queue_cond_lock(eq);
/* insert new event */
- if(event_queue_insert(eq, msg) < 0)
+ if(event_queue_insert(eq, msg) < 0) {
+ event_queue_cond_unlock(eq);
return(-1);
+ }
/* signal thread that we have a new message */
event_queue_signal(eq);
#endif
/* if there was no error, set the next expected event offset */
- event_store_next(es, msg->ev_len);
+ event_store_next(es, offset, msg->ev_len);
+
/* allow cleanup thread to check on this event_store */
event_store_release(es);
int event_store_recover_all(void);
struct event_store *event_store_find(char *);
int event_store_sync(struct event_store *, long);
-int event_store_next(struct event_store *, int);
+int event_store_next(struct event_store *, long, int);
int event_store_commit(struct event_store *, int, int);
int event_store_recover(struct event_store *);
int event_store_release(struct event_store *);
queue_thread(void *q)
{
struct event_queue *eq = (struct event_queue *)q;
- int ret, exit, flushing;
+ int ret, exit;
if(init_errors(0) < 0) {
il_log(LOG_ERR, "Error initializing thread specific data, exiting!");
pthread_exit(NULL);
}
+ il_log(LOG_DEBUG, " started new thread for delivery to %s:%d\n", eq->dest_name, eq->dest_port);
+
pthread_cleanup_push(queue_thread_cleanup, q);
event_queue_cond_lock(eq);
ret = 0;
while (event_queue_empty(eq)
#if defined(INTERLOGD_HANDLE_CMD) && defined(INTERLOGD_FLUSH)
- && ((flushing=eq->flushing) != 1)
+ && (eq->flushing != 1)
#endif
) {
ret = event_queue_wait(eq, 0);
event_queue_cond_lock(eq);
/* Check if we are flushing and if we are, report status to master */
- if(flushing == 1) {
+ if(eq->flushing == 1) {
il_log(LOG_DEBUG, " flushing mode detected, reporting status\n");
/* 0 - events waiting, 1 - events sent, < 0 - some error */
eq->flush_result = ret;
{
assert(eq != NULL);
+ event_queue_lock(eq);
+
/* if there is a thread already, just return */
- if(eq->thread_id > 0)
+ if(eq->thread_id > 0) {
+ event_queue_unlock(eq);
return(0);
+ }
/* create the thread itself */
if(pthread_create(&eq->thread_id, NULL, queue_thread, eq) < 0) {
eq->thread_id = 0;
set_error(IL_SYS, errno, "event_queue_create_thread: error creating new thread");
+ event_queue_unlock(eq);
return(-1);
}
/* the thread is never going to be joined */
pthread_detach(eq->thread_id);
+
+ event_queue_unlock(eq);
return(1);
}
Revision history:
$Log$
+ Revision 1.2 2004/10/18 19:16:09 zsalvet
+ RPM descriptions
+
Revision 1.1 2004/09/22 15:41:24 jskrabal
- sorry! Forgot to add
Load version file
========================================= -->
<property file="${module.version.file}"/>
+ <property file="${module.build.file}"/>
<!-- ==============================================
Local private targets
--- /dev/null
+#Sun Apr 03 06:53:19 CEST 2005
+module.build=180
-#Fri Dec 10 13:25:32 CET 2004
-module.version=0.1.0
-module.build=70
-module.age=1
+
+module.version = 1.0.0
+module.age = 1
+
\ No newline at end of file
SUFFIXES = .T
DEBUG:=-g -O0 -Wall
-# not yet
-# -I${voms}/include \
-# -I${gacl}/include \
-# -I/usr/include/libxml2 \
-
-# -DNO_VOMS -DNO_GACL to be removed when voms/gridsite are available
-CFLAGS:= -DNO_VOMS -DNO_GACL \
- ${WS_CFLAGS} ${DEBUG} \
+
+GRIDSITE_CFLAGS = `xml2-config --cflags`
+GRIDSITE_LIBS = -lgridsite_globus `xml2-config --libs`
+
+CFLAGS:= ${WS_CFLAGS} ${DEBUG} \
-DVERSION=\"${version}\" \
-I${stagedir}/include -I${top_srcdir}/src -I. \
-I${expat_prefix}/include \
${COVERAGE_FLAGS} \
-I${mysql_prefix}/include -I${mysql_prefix}/include/mysql \
-I${globus_prefix}/include/${nothrflavour} \
- -I${gridsite_prefix}/include -I${globus_prefix}/include/${nothrflavour}/openssl \
+ $(GRIDSITE_CFLAGS) \
-D_GNU_SOURCE
-
TEST_LIBS:=-L${cppunit}/lib -lcppunit
TEST_INC:=-I${cppunit}/include
EXT_LIBS:= -L${ares_prefix}/lib -lares \
${myslqlib} -lmysqlclient -lz\
${expatlib} -lexpat \
+ ${GRIDSITE_LIBS} \
+ -lvomsc \
${GLOBUS_LIBS}
GSOAP_LIBS:= -L${gsoap_prefix}/lib -lgsoap
Revision history:
$Log$
+ Revision 1.4 2004/10/18 19:16:09 zsalvet
+ RPM descriptions
+
Revision 1.3 2004/08/05 15:24:32 dimeglio
Changed default target from compile to dist
Load version file
========================================= -->
<property file="${module.version.file}"/>
+ <property file="${module.build.file}"/>
<!-- ==============================================
Local private targets
--- /dev/null
+#Sun Apr 03 06:56:54 CEST 2005
+module.build=223
-#Fri Dec 10 13:29:01 CET 2004
-module.version=0.7.0
-module.build=113
-module.age=4
+
+module.version = 1.0.1
+module.age = 1
+
\ No newline at end of file
-include Makefile.inc
-VPATH=${top_srcdir}/interface
+SUFFIXES = .T
+
+VPATH=${top_srcdir}/src
+AT3=perl -I${top_srcdir}/project ${top_srcdir}/project/at3
+XSLTPROC=xsltproc
+
STAGETO=interface
WSDL=LB.wsdl
-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}
+# install -m 644 ${WSDL} ${PREFIX}/${STAGETO}
clean:
rm -f *.h
+
+%.xml: %.xml.T
+ rm -f $@
+ ${AT3} $< >$@ || rm -f $@
+ chmod -w $@ >/dev/null
+
+${WSDL}: LB.xml puke-wsdl.xsl
+ ${XSLTPROC} ../src/puke-wsdl.xsl LB.xml >$@
+
+
+LB-ug.xml: LB.xml puke-ug.xsl
+ ${XSLTPROC} ../src/puke-ug.xsl LB.xml >$@
Revision history:
$Log$
- Revision 1.5 2004/07/20 16:08:30 flammer
- Changed incorrect my_... instead of .._template entries for subsystem and component.
-
- Revision 1.4 2004/07/16 16:32:53 flammer
- Added comment where to add language target.
-
- Revision 1.3 2004/07/16 14:56:55 flammer
- Corrected input path of build.properties.
-
- Revision 1.2 2004/07/06 20:43:19 flammer
- Update of configure & targets.
-
- Revision 1.1.1.1 2004/06/18 12:40:17 flammer
- Added general component template.
+ Revision 1.1.1.1.2.1 2005/02/12 01:39:43 glbuild
+ Changed start time
+ Revision 1.1.1.1 2004/11/25 15:20:10 akrenek
+ initial import
-->
Load version file
========================================= -->
<property file="${module.version.file}"/>
+ <property file="${module.build.file}"/>
<!-- ==============================================
Local private targets
<target name="localinit"
description="Module specific initialization tasks">
+ <copy toDir="${module.project.dir}">
+ <fileset dir="${subsystem.project.dir}">
+ <include name="at3" />
+ <include name="*.T" />
+ <include name="*.pm" />
+ </fileset>
+ </copy>
<antcall target="lbmakefiles" />
</target>
--- /dev/null
+#Sun Apr 03 06:45:36 CEST 2005
+module.build=123
-#Fri Dec 10 13:20:01 CET 2004
-module.version=0.1.0
-module.build=13
-module.age=0
+
+module.version = 1.0.1
+module.age = 1
+
\ No newline at end of file
--- /dev/null
+<?xml version="1.0"?>
+
+@@@LANG: wsdl
+<!--
+@@@AUTO
+-->
+
+<service name="LoggingAndBookkeeping"
+ ns="http://glite.org/wsdl/services/lb"
+ prefix="lb">
+
+LB web service interface currently reflects the functionality of legacy
+LB query API.
+
+
+ <types ns="http://glite.org/wsdl/types/lb" prefix="lbt">
+ <flags name="jobFlags">
+ Flags determining which fields of job status should be retrieved.
+ <val name="CLASSADS">Include also long job descriptions (JDL).</val>
+ <val name="CHILDREN">Return list of subjobs of a DAG.</val>
+ <val name="CHILDSTAT">Return state of the subjobs, i.e. apply other flags recursively </val>
+ </flags>
+
+ <enum name="statName">
+ Classification of job states.
+@@@{
+ for my $stat ($status->getTypesOrdered) {
+ my $u = uc $stat;
+ my $c = getTypeComment $status $stat;
+ gen qq{
+! <val name="$u">$c</val>
+};
+ }
+@@@}
+ </enum>
+
+@@@{
+ 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{
+! <enum name="$n">
+! Auxiliary type; values of the jobStatus.$n field.
+};
+ for (@{$f->{codes}}) {
+ my $uc = uc $_->{name};
+ gen qq{
+! <val name="$uc">$_->{comment}</val>
+};
+ }
+ gen qq{
+! </enum>
+};
+ }
+ }
+@@@}
+
+<!-- FIXME: list which are arrays in fact are not portable and
+ will not work most likely in this way -->
+
+ <struct name="jobStatus">
+ Status of a job, possibly including subjobs.
+ <elem name="state" type="statName">Status name.</elem>
+@@@{
+ 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{
+! <elem name="$name" type="$type" list="$list" optional="no">$comment</elem>
+};
+ }
+@@@}
+ </struct>
+
+ <struct name="tagValue">
+ Value of a single user tag.
+ <elem name="tag" type="xsd:string">Tag name</elem>
+ <elem name="value" type="xsd:string" optional="yes">Tag value</elem>
+ </struct>
+
+ <struct name="timeval">
+ UNIX time representation.
+ <elem name="tvSec" type="xsd:long">Seconds since Jan 1 1970</elem>
+ <elem name="tvUsec" type="xsd:long">Microseconds</elem>
+ </struct>
+
+
+ <struct name="genericFault" fault="yes">
+ Generic SOAP fault, used to deliver any LB errors.
+ May be returned by any of the operations.
+ <elem name="source" type="xsd:string">Source component (module) of the error.</elem>
+ <elem name="code" type="xsd:int">Numeric error code.</elem>
+ <elem name="text" type="xsd:string">Error text corresponding to the code.</elem>
+ <elem name="description" type="xsd:string" optional="yes">Additional description of the error (e.g. filename)</elem>
+ <elem name="reason" type="genericFault" optional="yes">Reason of the error, coming from lower levels.</elem>
+ </struct>
+
+ <simple name="string"/>
+ <simple name="int"/>
+
+ <struct name="queryConditions">
+ 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.
+ <elem name="attr" type="queryAttr"> The job attribute to which the query conditions apply. </elem>
+ <elem name="tagName" type="string" optional="yes"> Name of the queried user tag if attr is USERTAG.</elem>
+ <elem name="statName" type="statName" optional="yes"> Name of the job state to which "attr = TIME" condition refers.</elem>
+ <elem name="record" type="queryRecord" list="yes"> The conditions. </elem>
+ </struct>
+
+ <enum name="queryAttr">
+ Specification of a job attribute in query.
+ <val name="JOBID">A concrete JobId</val>
+ <val name="OWNER">Owner of the job (X509 certificate subject).</val>
+ <val name="STATUS">Status of the job (see statName type).</val>
+ <val name="LOCATION">Where the job is currently handled (hostname).</val>
+ <val name="DESTINATION">Where the job is or was scheduled to be executed.</val>
+ <val name="DONECODE">How the job terminated (see doneCode type)</val>
+ <val name="USERTAG">Value of particular user tag. The tag name has to be specified in queryConditions.tagName.</val>
+ <val name="TIME">When the job entered a particular state. The state has to be specified in queryCondition.statName.</val>
+ <val name="RESUBMITTED">The job was resubmitted.</val>
+ <val name="PARENT">JobId of the job parend (DAG).</val>
+ <val name="EXITCODE">UNIX exit code of the job.</val>
+ </enum>
+
+ <struct name="queryRecord">
+ A single query condition.
+ <elem name="op" type="queryOp"> Relational operator of the condition.</elem>
+ <elem name="value1" type="queryRecValue"> Value to compare the attribute with.</elem>
+ <elem name="value2" type="queryRecValue" optional="yes"> Another value to compare the attribute with (op = WITHIN only).</elem>
+ </struct>
+
+ <enum name="queryOp">
+ Relational operator of query conditions.
+ <val name="EQUAL"> Attribute is equal to the specified value </val>
+ <val name="LESS"> Attribute is less than the specified value or equal </val>
+ <val name="GREATER"> Attribute is greater than the specified value or equal </val>
+ <val name="WITHIN"> Attribute is withing a range (queryRecord.value2 must be specified) </val>
+ <val name="UNEQUAL"> Attribute is not equal to the specified value.</val>
+ </enum>
+
+ <struct name="queryRecValue">
+ A value to compare an attribute with in queries.
+ Exactly one of the elements must be specified.
+ <elem name="i" type="int">Integer.</elem>
+ <elem name="c" type="string">String.</elem>
+ <elem name="t" type="timeval">Timestamp.</elem>
+ </struct>
+
+ </types>
+
+
+
+ <op name="JobStatus">
+ Query state of a single job.
+ <input name="jobid" type="string"> Id of the queried job. </input>
+ <input name="flags" type="jobFlags"> Which data fields to retrieve. </input>
+ <output name="stat" type="jobStatus"> Current state of the job. </output>
+ <fault name="genericFault" type="genericFault"> Any error. </fault>
+ </op>
+
+ <op name="QueryJobs">
+ 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.
+
+ <input name="conditions" type="queryConditions" list="yes">The query conditions.</input>
+ <input name="flags" type="jobFlags"> Which data fields to retrieve.</input>
+ <output name="jobs" type="string" list="yes"> JobId's of jobs matching the query.</output>
+ <output name="states" type="jobStatus" list="yes"> States of jobs matching the query.</output>
+ <fault name="genericFault" type="genericFault"> Any error. </fault>
+ </op>
+
+ <op name="GetVersion">
+ Return version of the service.
+ <output name="version" type="string">Returned version.</output>
+ <fault name="genericFault" type="genericFault"> Any error. </fault>
+ </op>
+
+ <op name="UserJobs">
+ Simplified query, return all jobs of the authenticated user.
+ <output name="jobs" type="string" list="yes"> JobId's of jobs matching the query.</output>
+ <output name="states" type="jobStatus" list="yes"> States of jobs matching the query.</output>
+ <fault name="genericFault" type="genericFault"> Any error. </fault>
+ </op>
+
+</service>
--- /dev/null
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns="">
+
+<xsl:output indent="yes"/>
+
+
+<xsl:template match="/service">
+
+ <chapter>
+ <title><xsl:value-of select="@name"/></title>
+ <sect1>
+ <title>Operations</title>
+ <xsl:apply-templates select="op">
+ <xsl:sort select="@name"/>
+ </xsl:apply-templates>
+ </sect1>
+
+ <sect1>
+ <title>Types</title>
+ <xsl:apply-templates select="types"/>
+ </sect1>
+
+ </chapter>
+
+</xsl:template>
+
+<xsl:template match="input|output|fault">
+ <varlistentry>
+ <term>
+ <type>
+ <xsl:choose>
+ <xsl:when test="@type!='string' and @type!='int'">
+ <link linkend="type:{@type}">
+ <xsl:value-of select="@type "/>
+ </link>
+ </xsl:when>
+ <xsl:otherwise>xsd:<xsl:value-of select="@type "/></xsl:otherwise>
+ </xsl:choose>
+ </type>
+ <parameter><xsl:value-of select="@name"/></parameter>
+ </term>
+ <listitem>
+ <simpara><xsl:value-of select="text()"/></simpara>
+ </listitem>
+ </varlistentry>
+</xsl:template>
+
+<xsl:template match="op" >
+ <sect2 id="op:{@name}">
+ <title><xsl:value-of select="@name"/></title>
+ <para><xsl:value-of select="text()"/></para>
+ <para>
+ Inputs:
+ <xsl:choose>
+ <xsl:when test="count(./input)>0">
+ <variablelist>
+ <xsl:apply-templates select="./input"/>
+ </variablelist>
+ </xsl:when>
+ <xsl:otherwise>N/A</xsl:otherwise>
+ </xsl:choose>
+ </para>
+ <para>
+ Outputs:
+ <variablelist>
+ <xsl:apply-templates select="./output"/>
+ </variablelist>
+ </para>
+ </sect2>
+</xsl:template>
+
+<xsl:template match="types">
+ <xsl:for-each select="flags|enum|struct">
+ <xsl:sort select="@name"/>
+ <sect2 id="type:{@name}">
+ <title> <xsl:value-of select="@name"/> </title>
+ <para> <xsl:value-of select="text()"/> </para>
+ <xsl:choose>
+ <xsl:when test="name(.)='struct'">
+ <para> <emphasis>Structure</emphasis> (sequence complex type in WSDL)</para>
+ <para> Fields: ( <type>type </type> <structfield>name</structfield> description )</para>
+ </xsl:when>
+ <xsl:when test="name(.)='enum'">
+ <para> <emphasis>Enumeration</emphasis> (restriction of xsd:string in WSDL),
+ exactly one of the values must be specified.
+ </para>
+ <para> Values: </para>
+ </xsl:when>
+ <xsl:when test="name(.)='flags'">
+ <para> <emphasis>Flags</emphasis> (sequence of restricted xsd:string in WSDL),
+ any number of values can be specified together.
+ </para>
+ <para> Values: </para>
+ </xsl:when>
+ </xsl:choose>
+ <variablelist>
+ <xsl:for-each select="elem|val">
+ <varlistentry>
+ <term>
+ <xsl:choose>
+ <xsl:when test="name(.)='elem'">
+ <type>
+ <xsl:choose>
+ <xsl:when test="@type!='string' and @type!='int' and @type!='xsd:string' and @type!='xsd:int' and @type!='xsd:boolean' and @type!='xsd:long'">
+ <link linkend="type:{@type}">
+ <xsl:value-of select="@type "/>
+ </link>
+ </xsl:when>
+ <xsl:otherwise><xsl:value-of select="@type "/></xsl:otherwise>
+ </xsl:choose>
+ </type>
+ <!-- <type><xsl:value-of select="@type"/></type> -->
+ <xsl:value-of select="' '"/>
+ <structfield><xsl:value-of select="@name"/></structfield>
+ </xsl:when>
+ <xsl:otherwise>
+ <constant><xsl:value-of select="@name"/></constant>
+ </xsl:otherwise>
+ </xsl:choose>
+ </term>
+ <listitem>
+ <simpara>
+ <xsl:if test="@optional = 'yes'"> (optional) </xsl:if>
+ <xsl:if test="@list = 'yes'"> (multiple occurence) </xsl:if>
+ <xsl:value-of select=" text()"/>
+ </simpara>
+ </listitem>
+ </varlistentry>
+ </xsl:for-each>
+ </variablelist>
+ </sect2>
+ </xsl:for-each>
+</xsl:template>
+
+
+</xsl:stylesheet>
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
Load version file
========================================= -->
<property file="${module.version.file}"/>
+ <property file="${module.build.file}"/>
<!-- ===============================================
Public common targets
--- /dev/null
+#Wed Apr 13 06:36:42 CEST 2005
+module.build=230
+
###################################################################
# System dependencies
###################################################################
-org.glite.version = HEAD
-org.glite.lb.version = HEAD
+org.glite.version = glite_R_1_1_0
+org.glite.lb.version = glite-lb_R_1_0_2
+
+org.glite.lb.client-interface.version = glite-lb-client-interface_R_1_0_3
+org.glite.lb.ws-interface.version = glite-lb-ws-interface_R_1_0_1
+org.glite.lb.common.version = glite-lb-common_R_1_1_4
+org.glite.lb.client.version = glite-lb-client_R_1_0_1
+org.glite.lb.server-bones.version = glite-lb-server-bones_R_1_0_0
+org.glite.lb.logger.version = glite-lb-logger_R_1_0_1
+org.glite.lb.server.version = glite-lb-server_R_1_0_1
+
-# Component dependencies tag = do not remove this line =
-org.glite.lb.client-interface.version = HEAD
-org.glite.lb.ws-interface.version = HEAD
-org.glite.lb.common.version = HEAD
-org.glite.lb.client.version = HEAD
-org.glite.lb.server.version = HEAD
-org.glite.lb.server-bones.version = HEAD
-org.glite.lb.logger.version = HEAD
@type _common_
- timeval timestamp timestamp of event generation
+ timeval timestamp Time the event was generated.
_alias_ date ULM
- timeval arrived timestamp of event store
+ timeval arrived Time the event was stored into the bookkeeping server database.
_alias_ arr_date ULM
_optional_
- string host hostname of the machine where the event was generated
+ string host Hostname of the machine where the event was generated.
_alias_ host ULM
- int level logging level (system, debug, ...)
+ int level Logging level (in the range from DEBUG to EMERGENCY).
_alias_ lvl ULM
_code_ EMERGENCY emergency
_code_ ALERT alert
_code_ SYSTEM system
_code_ IMPORTANT important
_code_ DEBUG debug
- int priority message priority (yet 0 for asynchronous and 1 for synchronous transfers)
+ int priority Message priority (yet 0 for asynchronous and 1 for synchronous transfers).
_null_ -1
- jobid jobId DataGrid job id of the source job
- string seqcode sequence code assigned to the event
- string user identity (cert. subj.) of the generator
- logsrc source source (WMS component) which generated this event
-# string prog name of program ("EDG WMS" of name of the application)
- string src_instance instance of WMS component (e.g. service communication endpoint)
+ jobid jobId Grid job id of the job the event belongs to.
+ string seqcode Sequence code assigned to the event.
+ string user Identity (certificate subject) of the event sender.
+ logsrc source Source (software component) which generated this event.
+# string prog name of program ("EDG WMS" of name of the application).
+ string src_instance Instance of source component (e.g. service communication endpoint).
_optional_
-@type Transfer Start, success, or failure of job transfer to another component
- logsrc destination destination where the job is being transfered to
- string dest_host destination hostname
- string dest_instance destination instance
+@type Transfer Start, success, or failure of job transfer to another component.
+ logsrc destination Destination where the job is being transfered to.
+ string dest_host Hostname of server that takes over control of the job.
+ string dest_instance Service (instance) that takes over control of the job.
_optional_
- string job job description in receiver language
- int result result of the attempt
- _code_ START the sending component has started or is about to start the transfer
- _code_ OK job was sent successfully
- _code_ REFUSED job was refused by the other component
- _code_ FAIL transfer failed for other reason than explicit refusal (eg. network timeout)
- string reason detailed description of transfer, especially reason of failure
+ string job Job description in receiver's language.
+ int result Result code of the transfer attempt (START, OK, REFUSED or FAIL).
+ _code_ START The sending component has started or is about to start the transfer.
+ _code_ OK The job was sent successfully.
+ _code_ REFUSED The job was refused by the other component.
+ _code_ FAIL The transfer failed for other reason than explicit refusal (eg. network timeout).
+ string reason Detailed description of the transfer, especially reason of failure.
_optional_
- string dest_jobid destination internal jobid
+ string dest_jobid Job id as assigned by the receiving software component.
_optional_
-@type Accepted Accepting job (successful couterpart to Transfer)
- logsrc from where was the job received from
- string from_host sending component hostname
- string from_instance sending component instance
+@type Accepted Accepting job (successful counterpart to Transfer).
+ logsrc from The software component the job was received from.
+ string from_host Hostname of the component the job was received from.
+ string from_instance Instance of the component the job was received from.
_optional_
- string local_jobid new jobId (Condor, Globus ...) assigned by the receiving component
+ string local_jobid New job id as assigned by the receiving component.
-@type Refused Refusing job (unsuccessful couterpart to Transfer)
- logsrc from where was the job received from
- string from_host sending component hostname
- string from_instance sending component instance
+@type Refused Refusing job (unsuccessful counterpart to Transfer).
+ logsrc from The software component that tried to send the job.
+ string from_host Hostname of the component that tried to send the job.
+ string from_instance Instance of the component that tried to send the job.
_optional_
- string reason reason of refusal
-
-@type EnQueued The job has been enqueued in an inter-component queue
- string queue destination queue
- string job job description in receiver language
- int result result of the attempt
- _code_ START the sending component has started or is about to start the transfer
- _code_ OK job was sent successfully
- _code_ REFUSED job was refused by the other component
- _code_ FAIL transfer failed for other reason than explicit refusal (eg. network timeout)
- string reason detailed description of transfer, especially reason of failure
-
-@type DeQueued The job has been dequeued from an inter-component queue
- string queue queue name
- string local_jobid new jobId assigned by the receiving component
-
-@type HelperCall Helper component is called
- string helper_name name of the called component
- string helper_params parameters of the call
- int src_role whether the logging component is called or calling one
- _code_ CALLING the logging component is caller
- _code_ CALLED the logging component is callee
-
-@type HelperReturn Helper component is returning the control
- string helper_name name of the called component
- string retval returned data
- int src_role whether the logging component is called or calling one
- _code_ CALLING the logging component is caller
- _code_ CALLED the logging component is callee
-
-@type Running Executable started
- string node worker node where the executable is run
-
-@type Resubmission Result of resubmission decision
- int result result code
- _code_ WILLRESUB will be resubmitted
- _code_ WONTRESUB will not be resubmitted
- string reason reason for the decision
- string tag value of the attribute on which the decision is based
-
-@type Done Execution terminated (normally or abnormally)
- int status_code way of termination
- _code_ OK terminated by itself
- _code_ FAILED disappeared from LRMS
- _code_ CANCELLED cancelled by user request
- string reason reason for the change
- int exit_code process exit code
+ string reason Description of the reason why the job was refused.
+
+@type EnQueued The job has been enqueued in an inter-component queue.
+ string queue Queue into which the job has been stored for retrieval by another component.
+ string job Job description in the receiver's language.
+ int result Result code of the attempt to put job into the queue (START, OK, REFUSED or FAIL).
+ _code_ START The sending component has started or is about to start enqueuing the job.
+ _code_ OK The job was enqueued successfully.
+ _code_ REFUSED The job was refused by the other component.
+ _code_ FAIL The transfer failed for other reason than explicit refusal.
+ string reason Detailed description of the attempt to enqueue the job, especially the reason of failure.
+
+@type DeQueued The job has been dequeued from an inter-component queue.
+ string queue Name of the queue the job was obtained from.
+ string local_jobid New job id as assigned by the retreiving component.
+
+@type HelperCall Helper component is called.
+ string helper_name Name of the called helper component.
+ string helper_params Parameters of the call to the helper component.
+ int src_role The role the event sender is playing in the helper call (CALLING or CALLEE).
+ _code_ CALLING The logging component is caller.
+ _code_ CALLED The logging component is callee.
+
+@type HelperReturn Helper component is returning the control.
+ string helper_name Name of the called helper component.
+ string retval Data returned by the call to the helper component.
+ int src_role The role the event sender is playing in the helper call (CALLING or CALLEE).
+ _code_ CALLING The logging component is caller.
+ _code_ CALLED The logging component is callee.
+
+@type Running Executable started.
+ string node Worker node on which the job executable is being run.
+
+@type Resubmission Result of resubmission decision.
+ int result Result code of the resubmission decision (WILLRESUB or WONTRESUB).
+ _code_ WILLRESUB The job will be resubmitted.
+ _code_ WONTRESUB The job will not be resubmitted.
+ string reason Reason why the job will or will not be resubmitted.
+ string tag Value of the attribute on which the decision to resubmit the job was based.
+
+@type Done Execution terminated (normally or abnormally).
+ int status_code Reason code for the termination of the job (OK, FAILED or CANCELLED).
+ _code_ OK The job terminated by itself.
+ _code_ FAILED The job disappeared from LRMS.
+ _code_ CANCELLED The job was cancelled by user request.
+ string reason Detailed description why the job was terminated.
+ int exit_code Exit code of the job's process.
_null_ -1
-@type Cancel Cancel operation has been attempted on the job
- int status_code classification of the cancel
- _code_ REQ request acknowledged
- _code_ REFUSE request declined by this component
- _code_ DONE request completed by whole WMS
- _code_ ABORT request refused by whole WMS
- string reason detailed description
+@type Cancel Cancel operation has been attempted on the job.
+ int status_code Classification of the attempt to cancel the job (REQ, REFUSE, DONE or ABORT).
+ _code_ REQ The request was acknowledged.
+ _code_ REFUSE The request was declined by this component.
+ _code_ DONE The request was completed by whole WMS.
+ _code_ ABORT The request was refused by whole WMS.
+ string reason Detailed description of the attempt to cancel the job, especially the reason of failure.
-@type Abort Job aborted by system
- string reason reason of abort
+@type Abort Job aborted by system.
+ string reason Reason why the job was aborted by the system.
@type Clear Job cleared, output sandbox removed
- int reason why the job was cleared
- _code_ USER user retrieved output sandbox
- _code_ TIMEOUT timed out, resource purge forced
- _code_ NOOUTPUT no output was generated
+ int reason Description of the reason why the job was cleared and the output sandbox removed (USER, TIMEOUT or NOOUTPUT).
+ _code_ USER User retrieved output sandbox.
+ _code_ TIMEOUT Timed out, resource forced purge of the sandbox.
+ _code_ NOOUTPUT No output was generated.
-@type Purge Job is purged from bookkepping server
+@type Purge Job is purged from bookkepping server.
-@type Match Matching CE found
- string dest_id Id of the destination CE/queue
+@type Match Matching CE found.
+ string dest_id Identification of the queue on the CE that the job could be send to.
-@type Pending No match found yet
- string reason why matching CE cannot be found
+@type Pending No matching CE found yet.
+ string reason Description why the matching CE for the job was not found (yet).
-@type RegJob New job registration
- string jdl job description
- string ns NetworkServer handling the job
- jobid parent jobid of parent job
+@type RegJob New job registration.
+ string jdl Job description of the job being registered.
+ string ns NetworkServer handling the newly registered job.
+ jobid parent Grid job id of the parent job registering this new one.
_optional_
- int jobtype job type
- _code_ SIMPLE simple job
- _code_ DAG dag (containing static set of subjobs)
- _code_ PARTITIONABLE partitionable (may become partitioned)
- _code_ PARTITIONED partitioned (dynamically created dag)
+ int jobtype Type of the job being registered (SIMPLE, DAG, PARTITIONABLE or PARTITIONED).
+ _code_ SIMPLE The job is simple job.
+ _code_ DAG The job is dag (containing static set of subjobs).
+ _code_ PARTITIONABLE The job is partitionable (may become partitioned).
+ _code_ PARTITIONED The job is partitioned (dynamically created dag).
- int nsubjobs number of subjobs
+ int nsubjobs Number of subjobs this job plans to spawn.
_optional_
- string seed seed for subjob id generation
+ string seed Seed for subjob id generation.
_optional_
-@type Chkpt Application-specific checkpoint record
- string tag checkpoint tag
- string classad checkpoint value
+@type Chkpt Application-specific checkpoint record.
+ string tag Application specific checkpoint tag.
+ string classad Application specific checkpoint value.
-@type Listener Listening network port for interactive control
- string svc_name port instance name
- string svc_host hostname
- port svc_port port number
+@type Listener Listening network port for interactive control.
+ string svc_name Name of the port instance for interactive job control.
+ string svc_host Hostname of the interactive job controller.
+ port svc_port Port number of the interactive job controller.
-@type CurDescr current state of job processing (optional event)
- string descr description of current job transformation (output of helper)
+@type CurDescr Current state of job processing (optional event).
+ string descr Description of the current job transformation (output of the helper).
-@type UserTag user tag -- arbitrary name=value pair
- string name tag name
- string value tag value
+@type UserTag User tag -- arbitrary name=value pair.
+ string name Arbitrary user tag name.
+ string value Arbitrary user tag value.
-@type ChangeACL Management of ACL stored on bookkepping server
- string user_id DN or VOMS parameter (in format VO:group)
- int user_id_type type of information given in user_id (DN or VOMS)
+@type ChangeACL Management of ACL stored on bookkepping server.
+ string user_id DN or VOMS parameter (in format VO:group).
+ int user_id_type Type of information given in user_id (DN or VOMS).
_null_ -1
- int permission ACL permission to change (currently only READ)
+ int permission ACL permission to change (currently only READ).
_null_ -1
- int permission_type type of permission requested ('allow', 'deny')
+ int permission_type Type of permission requested ('allow', 'deny').
_null_ -1
- int operation operation requested to perform with ACL (add, remove)
+ int operation Operation requested to perform with ACL (add, remove).
_null_ -1
-@type Notification Management of notification service
- notifid notifId notification id
- string owner owner
- string dest_host destination host
- port dest_port destination port
- string jobstat job status
+@type Notification Management of notification service.
+ notifid notifId Notification id.
+ string owner Identification of the job owner (certificate subject).
+ string dest_host Hostname the notification is sent to.
+ port dest_port Port number the notification is sent to.
+ string jobstat Status of the job (the notification content).
logsrc=>'"int"',
port=>'"int"',
int=>'"int"'
+ },
+ 'wsdl'=>{
+ bool=>'"xsd:boolean"',
+ string=>'"xsd:string"',
+ int=>'"xsd:int"',
+ jobid=>'"xsd:string"',
+ jobstat=>'"jobStatus"',
+ usertag=>'"tagValue"',
+ timeval=>'"timeval"',
}
);
+%baseTypes = (
+ intlist=>'int',
+ strlist=>'string',
+ stslist=>'jobstat',
+ taglist=>'usertag'
+);
+
%toString = (
C=>{
int=>'qq{asprintf(&$dst,"%d",$src);}',
-#Fri Dec 10 13:30:32 CET 2004
-module.version=0.3.0
-module.build=113
-module.age=2
+
+module.version = 1.0.2
+module.age = 1
+
glite_location=$PREFIX
globus_prefix=/opt/globus
-voms_prefix=/opt/glite
nothrflavour=gcc32
thrflavour=gcc32pthr
myproxy_prefix=$globus_prefix
DEBUG:=-g -O0
-# XXX: until VOMS is ready in SCM
-CFLAGS:= -DNOVOMS \
- ${DEBUG} \
- -DVOMS_INSTALL_PATH=\"${voms_prefix}\"\
+CFLAGS:= ${DEBUG} \
${MYPROXYINC} \
-I${top_srcdir}/src -I${top_srcdir}/interface \
-I${glite_location}/include
LINK:=libtool --mode=link ${CC} ${LDFLAGS}
INSTALL:=libtool --mode=install install
-DAEMONOBJ:=renewd.o renew.o common.o commands.o api.o
+DAEMONOBJ:=renewd.o renew.o common.o commands.o api.o voms.o
LIBOBJ:=api.o common.o
CLIENTOBJ:=client.o
${LINK} -o $@ ${THRLIBLOBJ} -rpath ${glite_location}/lib
${DAEMON}: ${DAEMONOBJ}
- ${LINK} -o $@ ${DAEMONOBJ} ${JOBIDLIB} ${MYPROXY_LIB} -lglobus_gss_assist_${nothrflavour} ${GLOBUS_LIBS}
+ ${LINK} -o $@ ${DAEMONOBJ} ${JOBIDLIB} ${MYPROXY_LIB} -lvomsc -lglobus_gss_assist_${nothrflavour} ${GLOBUS_LIBS}
${CLIENT}: ${CLIENTOBJ} ${LIB}
${LINK} -o $@ ${CLIENTOBJ} ${LIB} ${GLOBUS_LIBS}
${INSTALL} -m 644 ${top_srcdir}/LICENSE ${PREFIX}/share/doc/${package}-${version}
cd ${top_srcdir}/interface && ${INSTALL} -m 644 renewal.h ${PREFIX}/include/glite/security/proxyrenewal
- ${INSTALL} -m 755 ${top_srcdir}/config/startup ${PREFIX}/etc/init.d/${DAEMON}
+ ${INSTALL} -m 755 ${top_srcdir}/config/startup ${PREFIX}/etc/init.d/glite-proxy-renewald
clean:
Revision history:
$Log$
+ Revision 1.4 2004/11/02 15:10:43 dkouril
+ RPM description
+
Revision 1.3 2004/07/30 08:31:07 dimeglio
Changed default Ant target from compile to dist
Load version file
========================================= -->
<property file="${module.version.file}"/>
+ <property file="${module.build.file}"/>
+ <property file="${module.build.file}" />
<!-- ==============================================
Local private targets
PROXY_REPOSITORY="$GLITE_LOCATION_VAR/spool/glite-renewd"
+unset creds
+
start()
{
if test -z "$GLITE_USER" ;then
return 1
fi
- if [ -n "$GLITE_HOST_CERT" ]; then
- X509_USER_CERT="$GLITE_HOST_CERT"
- export X509_USER_CERT
+ [ -n "$GLITE_HOST_CERT" -a -n "$GLITE_HOST_KEY" ] &&
+ creds="-t $GLITE_HOST_CERT -k $GLITE_HOST_KEY"
+
+ if test -z "$creds"; then
+ if su - $GLITE_USER -c "test -r /etc/grid-security/hostkey.pem -a -r /etc/grid-security/hostcert.pem"; then
+ echo "$0: WARNING: /etc/grid-security/hostkey.pem readable by $GLITE_USER"
+ creds="-t /etc/grid-security/hostcert.pem -k /etc/grid-security/hostkey.pem"
+ fi
fi
- if [ -n "$GLITE_HOST_KEY" ]; then
- X509_USER_KEY="$GLITE_HOST_KEY"
- export X509_USER_KEY
+
+ [ -z "$creds" ] &&
+ echo $0: WARNING: No credentials specified. Using default lookup which is dangerous. >&2
+
+ # workaround for VOMS_FindByVO that seems to always require user's own VOMS config file (bug #7511)
+ user_voms_config=$HOME/.glite/vomses
+ if [ ! -f "$user_voms_config" ]; then
+ rm -f /tmp/renewal_vomses
+ su - $GLITE_USER -c "touch /tmp/renewal_vomses && chmod 644 /tmp/renewal_vomses"
+ user_voms_config=/tmp/renewal_vomses
fi
echo -n Starting ProxyRenewal Daemon: glite-proxy-renewd ...
chmod 0700 $PROXY_REPOSITORY
fi
- su - $GLITE_USER -c "$GLITE_LOCATION/bin/glite-proxy-renewd \
- -r $PROXY_REPOSITORY" && echo " done"
+ su - $GLITE_USER -c "VOMS_USERCONF=$user_voms_config \
+ $GLITE_LOCATION/bin/glite-proxy-renewd \
+ -r $PROXY_REPOSITORY $creds -A" && echo " done"
}
stop()
{
echo -n "Stopping ProxyRenewal Daemon: glite-proxy-renewd ..."
- PIDS=`ps -C glite-proxy-renewd -o pid --no-heading`
- if [ -z "$PIDS" ]; then
- echo " no process glite-proxy-renewd running"
- exit 1
- else
- kill $PIDS && echo " done"
- fi
+ killall glite-proxy-renewd
+ echo " done"
}
status()
{
- PIDS=`ps -C glite-proxy-renewd -o pid --no-heading`
- if ps p $PIDS >/dev/null 2>&1; then
- echo glite-proxy-renewd running \($PIDS\)
- return 0
+ if netstat -an --unix | grep "^unix .* LISTEN.* /tmp/dgpr_renew_" >/dev/null 2>&1 ;then
+ echo glite-proxy-renewd running
+ else
+ echo glite-proxy-renewd not running
+ return 1
fi
-
- echo glite-proxy-renewd not running
- return 1
}
case x$1 in
EDG_WLPR_PROXY_NOT_REGISTERED,
EDG_WLPR_PROXY_EXPIRED,
EDG_WLPR_ERROR_VOMS,
+ EDG_WLPR_ERROR_TIMEOUT,
+ EDG_WLPR_ERROR_ERRNO,
} edg_wlpr_ErrorCode;
/**
--- /dev/null
+#Fri Apr 08 04:14:02 CEST 2005
+module.build=224
-#Fri Dec 10 13:12:42 CET 2004
-module.version=0.1.1
-module.build=104
-module.age=1
+
+module.version = 1.0.13
+module.age = 1
+
--- /dev/null
+/*********************************************************************
+ *
+ * Authors: Vincenzo Ciaschini - Vincenzo.Ciaschini@cnaf.infn.it
+ *
+ * Copyright (c) 2002, 2003 INFN-CNAF on behalf of the EU DataGrid.
+ * For license conditions see LICENSE file or
+ * http://www.edg.org/license.html
+ *
+ * Parts of this code may be based upon or even include verbatim pieces,
+ * originally written by other people, in which case the original header
+ * follows.
+ *
+ *********************************************************************/
+#ifndef _ACSTACK_H
+#define _ACSTACK_H
+
+#include <openssl/asn1.h>
+#include <openssl/stack.h>
+#include <openssl/safestack.h>
+
+#define IMPL_STACK(type) \
+ DECLARE_STACK_OF(type) \
+ STACK_OF(type) *sk_##type##_new (int (*cmp)(const type * const *, const type * const *)) \
+ { return sk_new ( (int (*)(const char * const *, const char * const *))cmp);} \
+ STACK_OF(type) *sk_##type##_new_null () { return sk_new_null(); } \
+ void sk_##type##_free (STACK_OF(type) *st) { sk_free(st); } \
+ int sk_##type##_num (const STACK_OF(type) *st) { return sk_num(st); } \
+ type *sk_##type##_value (const STACK_OF(type) *st, int i) { return (type *)sk_value(st, i); } \
+ type *sk_##type##_set (STACK_OF(type) *st, int i, type *val) { return ((type *)sk_set(st, i, (char *)val)); } \
+ void sk_##type##_zero (STACK_OF(type) *st) { sk_zero(st);} \
+ int sk_##type##_push (STACK_OF(type) *st, type *val) { return sk_push(st, (char *)val); } \
+ int sk_##type##_unshift (STACK_OF(type) *st, type *val) { return sk_unshift(st, (char *)val); } \
+ int sk_##type##_find (STACK_OF(type) *st, type *val) { return sk_find(st, (char *)val); } \
+ type *sk_##type##_delete (STACK_OF(type) *st, int i) { return (type *)sk_delete(st, i); } \
+ type *sk_##type##_delete_ptr (STACK_OF(type) *st, type *ptr) { return (type *)sk_delete_ptr(st, (char *)ptr); } \
+ int sk_##type##_insert (STACK_OF(type) *st, type *val, int i) { return sk_insert(st, (char *)val, i); } \
+ int (*sk_##type##_set_cmp_func (STACK_OF(type) *st, int (*cmp)(const type * const *, const type * const *)))(const type * const *, const type * const *) \
+ { return (int ((*)(const type * const *, const type * const *)))sk_set_cmp_func (st, (int (*)(const char * const *, const char * const *))cmp); } \
+ STACK_OF(type) *sk_##type##_dup (STACK_OF(type) *st) { return sk_dup(st); } \
+ void sk_##type##_pop_free (STACK_OF(type) *st, void (*func)(type *)) { sk_pop_free(st, (void (*)(void *))func); } \
+ type *sk_##type##_shift (STACK_OF(type) *st) { return (type *)sk_shift(st); } \
+ type *sk_##type##_pop (STACK_OF(type) *st) { return (type *)sk_pop(st); } \
+ void sk_##type##_sort (STACK_OF(type) *st) { sk_sort(st); } \
+ STACK_OF(type) *d2i_ASN1_SET_OF_##type (STACK_OF(type) **st, unsigned char **pp, long length, type *(*d2ifunc)(), void (*freefunc)(type *), int ex_tag, int ex_class) \
+ { return d2i_ASN1_SET(st, pp, length, (char *(*)())d2ifunc, (void (*)(void *))freefunc, ex_tag, ex_class); } \
+ int i2d_ASN1_SET_OF_##type (STACK_OF(type) *st, unsigned char **pp, int (*i2dfunc)(), int ex_tag, int ex_class, int is_set) \
+ { return i2d_ASN1_SET(st, pp, i2dfunc, ex_tag, ex_class, is_set); } \
+ unsigned char *ASN1_seq_pack_##type (STACK_OF(type) *st, int (*i2d)(), unsigned char **buf, int *len) { return ASN1_seq_pack(st, i2d, buf, len); } \
+ STACK_OF(type) *ASN1_seq_unpack_##type (unsigned char *buf, int len, type *(*d2i)(), void (*freefunc)(type *)) \
+ { return ASN1_seq_unpack(buf, len, (char *(*)())d2i, (void (*)(void *))freefunc); }
+
+
+#define DECL_STACK(type) \
+ DECLARE_STACK_OF(type) \
+ extern STACK_OF(type) *sk_##type##_new (int (*)(const type * const *, const type * const *)); \
+ extern STACK_OF(type) *sk_##type##_new_null (); \
+ extern void sk_##type##_free (STACK_OF(type) *); \
+ extern int sk_##type##_num (const STACK_OF(type) *); \
+ extern type *sk_##type##_value (const STACK_OF(type) *, int); \
+ extern type *sk_##type##_set (STACK_OF(type) *, int, type *); \
+ extern void sk_##type##_zero (STACK_OF(type) *); \
+ extern int sk_##type##_push (STACK_OF(type) *, type *); \
+ extern int sk_##type##_unshift (STACK_OF(type) *, type *); \
+ extern int sk_##type##_find (STACK_OF(type) *, type *); \
+ extern type *sk_##type##_delete (STACK_OF(type) *, int); \
+ extern type *sk_##type##_delete_ptr (STACK_OF(type) *, type *); \
+ extern int sk_##type##_insert (STACK_OF(type) *, type *, int); \
+ extern int (*sk_##type##_set_cmp_func (STACK_OF(type) *, int (*)(const type * const *, const type * const *)))(const type * const *, const type * const *); \
+ extern STACK_OF(type) *sk_##type##_dup (STACK_OF(type) *); \
+ extern void sk_##type##_pop_free (STACK_OF(type) *, void (*)(type *)); \
+ extern type *sk_##type##_shift (STACK_OF(type) *); \
+ extern type *sk_##type##_pop (STACK_OF(type) *); \
+ extern void sk_##type##_sort (STACK_OF(type) *); \
+ extern STACK_OF(type) *d2i_ASN1_SET_OF_##type (STACK_OF(type) **, unsigned char **, long, type *(*)(), void (*)(type *), int, int); \
+ extern int i2d_ASN1_SET_OF_##type (STACK_OF(type) *, unsigned char **, int (*)(), int, int, int); \
+ extern unsigned char *ASN1_seq_pack_##type (STACK_OF(type) *, int (*)(), unsigned char **, int *); \
+ extern STACK_OF(type) *ASN1_seq_unpack_##type (unsigned char *, int, type *(*)(), void (*)(type *)) ;
+
+#endif
decode_response(const char *msg, const size_t msg_len, edg_wlpr_Response *response);
static int
-do_connect(char *socket_name, int *sock);
+do_connect(char *socket_name, struct timeval *timeout, int *sock);
static int
-send_request(int sock, edg_wlpr_Request *request, edg_wlpr_Response *response);
-
+send_request(int sock, struct timeval *timeout, edg_wlpr_Request *request, edg_wlpr_Response *response);
static int
encode_request(edg_wlpr_Request *request, char **msg)
}
static int
-do_connect(char *socket_name, int *sock)
+do_connect(char *socket_name, struct timeval *timeout, int *sock)
{
struct sockaddr_un my_addr;
int s;
int ret;
+ struct timeval before,after,to;
+ int sock_err;
+ socklen_t err_len;
assert(sock != NULL);
memset(&my_addr, 0, sizeof(my_addr));
return errno;
}
+ if (timeout) {
+ int flags = fcntl(s, F_GETFL, 0);
+ if (fcntl(s, F_SETFL, flags | O_NONBLOCK) < 0)
+ return errno;
+ }
+
my_addr.sun_family = AF_UNIX;
strncpy(my_addr.sun_path, socket_name, sizeof(my_addr.sun_path));
ret = connect(s, (struct sockaddr *) &my_addr, sizeof(my_addr));
if (ret == -1) {
- close(s);
- return errno;
+ if (errno == EINPROGRESS) {
+ fd_set fds;
+
+ FD_ZERO(&fds);
+ FD_SET(s, &fds);
+ memcpy(&to, timeout, sizeof(to));
+ gettimeofday(&before,NULL);
+ switch (select(s+1, NULL, &fds, NULL, &to)) {
+ case -1: close(s);
+ return errno;
+ case 0: close(s);
+ return EDG_WLPR_ERROR_TIMEOUT;
+ }
+ gettimeofday(&after,NULL);
+ if (edg_wlpr_DecrementTimeout(timeout, before, after)) {
+ close (s);
+ return EDG_WLPR_ERROR_TIMEOUT;
+ }
+
+ err_len = sizeof sock_err;
+ if (getsockopt(s,SOL_SOCKET,SO_ERROR,&sock_err,&err_len)) {
+ close(s);
+ return errno;
+ }
+ if (sock_err) {
+ close(s);
+ errno = sock_err;
+ return errno;
+ }
+ } else {
+ close(s);
+ return errno;
+ }
}
*sock = s;
}
static int
-send_request(int sock, edg_wlpr_Request *request, edg_wlpr_Response *response)
+send_request(int sock, struct timeval *timeout, edg_wlpr_Request *request, edg_wlpr_Response *response)
{
int ret;
char *buf = NULL;
if (ret)
return ret;
- ret = edg_wlpr_Write(sock, buf, strlen(buf) + 1);
+ ret = edg_wlpr_Write(sock, timeout, buf, strlen(buf) + 1);
free(buf);
if (ret)
return ret;
- ret = edg_wlpr_Read(sock, &buf, &buf_len);
+ ret = edg_wlpr_Read(sock, timeout, &buf, &buf_len);
if (ret)
return ret;
char sockname[1024];
int ret;
int sock;
+ struct timeval timeout;
+ const char *s = NULL;
+ double d;
+
+ s = getenv("GLITE_PR_TIMEOUT");
+ d = s ? atof(s) : GLITE_PR_TIMEOUT_DEFAULT;
+ timeout.tv_sec = (long) d;
+ timeout.tv_usec = (long) ((d-timeout.tv_sec) * 1e6);
snprintf(sockname, sizeof(sockname), "%s%d",
DGPR_REG_SOCKET_NAME_ROOT, getuid());
- ret = do_connect(sockname, &sock);
+ ret = do_connect(sockname, &timeout, &sock);
if (ret)
return ret;
- ret = send_request(sock, request, response);
+ ret = send_request(sock, &timeout, request, response);
close(sock);
return ret;
"Proxy not registered",
"Proxy expired",
"VOMS error",
+ "Operation timed out",
+ "System error"
};
const char *
#include "renewal_locl.h"
#include "renewd_locl.h"
-#ifndef NOVOMS
-#include <voms_apic.h>
-#endif
+#include "glite/security/voms/voms_apic.h"
#ident "$Header$"
#define SEPARATORS ",\n"
#define RENEWAL_START_FRACTION 0.75 /* XXX */
-#define RENEWAL_CLOCK_SKEW (5 * 60)
#define RENEWAL_MIN_LIFETIME (15 * 60)
extern char *repository;
static time_t
get_delta(time_t current_time, time_t start_time, time_t end_time)
{
- time_t length, lifetime;
+ time_t remaining_life;
+ time_t life_to_lose;
+ time_t limit;
time_t delta;
- int condor_tested = 0;
- lifetime = end_time - start_time;
- delta = 0;
- while (1) {
- if (end_time - current_time <= RENEWAL_MIN_LIFETIME)
- /* if the proxy is too short, renew it as soon as possible */
- return RENEWAL_CLOCK_SKEW;
-
- /* renewal starts at 3/4 of lifetime */
- length = end_time - (start_time + delta);
- delta += length * RENEWAL_START_FRACTION;
-
- if (!condor_tested && delta > lifetime - condor_limit) {
- /* Condor requires the proxies to be renewed a specified time interval
- before the proxies have expired (see the
- GRIDMANAGER_MINIMUM_PROXY_TIME variable). We must ensure that
- renewal takes place before Condor does this check */
- if (current_time > end_time - condor_limit) {
- edg_wlpr_Log(LOG_ERR, "Proxy lifetime exceeded value of the Condor limit!");
- }
- else
- delta = lifetime - condor_limit - RENEWAL_CLOCK_SKEW;
- condor_tested = 1;
- }
+ if (RENEWAL_MIN_LIFETIME > condor_limit) {
+ limit = RENEWAL_MIN_LIFETIME;
+ } else {
+ limit = condor_limit;
+ }
- if (abs(current_time - (start_time + delta)) < RENEWAL_CLOCK_SKEW)
- continue;
-
- return (start_time + delta) - current_time;
- };
+ limit += RENEWAL_CLOCK_SKEW;
- /* not reachable */
- return 0;
+ if (current_time + limit >= end_time) {
+ /* if the proxy is too short, renew it as soon as possible */
+
+ if (current_time + condor_limit > end_time ) {
+ edg_wlpr_Log(LOG_ERR, "Remaining proxy lifetime fell below the value of the Condor limit!");
+ }
+
+ return 0;
+ }
+
+ remaining_life = end_time - current_time;
+
+ /* renewal should gain the jobs an extra lifetime of
+ RENEWAL_START_FRACTION (default 3/4) of the new proxy's
+ lifetime. If the time remaining on the current proxy is already
+ small then the jobs may gain an extra lifetime of more than that.
+
+ In any case, a renewal will be scheduled to happen before the
+ lifetime limit.
+
+ 'life_to_lose' is the lifetime that will be lost, ie the time that
+ will still remain on the current proxy when it is renewed
+ */
+
+ life_to_lose = (1.0-RENEWAL_START_FRACTION)*60*60*DGPR_RETRIEVE_DEFAULT_HOURS;
+
+ if (life_to_lose < limit) {
+ life_to_lose = limit;
+ }
+
+ delta = life_to_lose - limit;
+
+ while( remaining_life < (limit + delta) ) {
+ delta *= (1.0-RENEWAL_START_FRACTION);
+ }
+
+ life_to_lose = limit + delta;
+
+ return (remaining_life - life_to_lose);
}
int
char *p;
proxy_record tmp_record;
time_t current_time;
+ int line_num = 0;
assert(record != NULL);
memset(&tmp_record, 0, sizeof(tmp_record));
current_time = time(NULL);
while (fgets(line, sizeof(line), fd) != NULL) {
+ line_num++;
free_record(&tmp_record);
p = strchr(line, '\n');
if (p)
*p = '\0';
ret = decode_record(line, &tmp_record);
- if (ret)
- return ret; /* XXX continue */
+ if (ret) {
+ edg_wlpr_Log(LOG_ERR, "Skipping invalid entry at line %d", line_num);
+ continue;
+ }
if (record->suffix >= 0) {
if (record->suffix == tmp_record.suffix) {
record->suffix = tmp_record.suffix;
if (tmp_record.jobids.len == 0) {
/* no jobs registered for this record, so use it initialized with the
* parameters (currently myproxy location) provided by user */
- char *server = record->myproxy_server;
-
- memset(record, sizeof(*record), 0);
record->suffix = tmp_record.suffix;
- if (record->myproxy_server)
- free(record->myproxy_server);
- record->myproxy_server = server;
+ record->next_renewal = record->end_time = 0;
free_record(&tmp_record);
return 0;
}
+ /* Proxies with VOMS attributes require a separate record, which is not
+ * shared with another proxies. The same applies it the unique flag was
+ * set by the caller */
+ if (record->voms_exts || record->unique)
+ continue;
+
if (tmp_record.jobids.len > 0 && record->myproxy_server &&
strcmp(record->myproxy_server, tmp_record.myproxy_server) != 0)
continue;
if (tmp_record.jobids.len > 0 &&
- tmp_record.end_time - current_time < condor_limit) {
- /* skip expired proxy (and that ones that are going to expire soon),
+ current_time + condor_limit + RENEWAL_CLOCK_SKEW > tmp_record.end_time) {
+
+ /* skip expired proxy (or ones that are going to expire soon),
leaving it untouched (it will be removed after next run of the
- renewal process */
+ renewal process) */
+
continue;
}
proxy_record tmp_record;
char tmp_file[FILENAME_MAX];
char meta_file[FILENAME_MAX];
+ int line_num = 0;
assert (record != NULL);
goto end;
}
while (fgets(line, sizeof(line), fd) != NULL) {
+ line_num++;
free_record(&tmp_record);
p = strchr(line, '\n');
if (p)
*p = '\0';
ret = decode_record(line, &tmp_record);
- if (ret)
- goto end;
+ if (ret) {
+ edg_wlpr_Log(LOG_ERR, "Removing invalid entry at line %d in %s", line_num, basename);
+ continue;
+ }
if (record->suffix == tmp_record.suffix &&
record->unique == tmp_record.unique) {
tmp_record.next_renewal = record->next_renewal;
return EDG_WLPR_ERROR_VOMS;
}
- ret = load_proxy(file, &cert, &privkey, &chain);
+ ret = load_proxy(file, &cert, &privkey, &chain, NULL);
if (ret) {
VOMS_Destroy(voms_info);
return ret;
free_record(&record);
record.suffix = suffix;
record.myproxy_server = server;
- edg_wlpr_Log(LOG_WARNING, "Removed expired proxy (suffix %d)",
- suffix);
+ edg_wlpr_Log(LOG_WARNING, "Removed expired proxy %s", cur_proxy);
} else
get_times(cur_proxy, &record);
} else {
#ident "$Header$"
/* nread() and nwrite() never return partial data */
-static size_t
-nread(int sock, char *buf, size_t buf_len)
+static int
+nread(int sock, struct timeval *to, char *buf, size_t buf_len, size_t *read_len)
{
size_t count;
size_t remain = buf_len;
char *cbuf = buf;
+ fd_set fds;
+ struct timeval timeout,before,after;
+ int ret;
+
+ if (to) {
+ memcpy(&timeout,to,sizeof(timeout));
+ gettimeofday(&before,NULL);
+ }
while (remain > 0) {
+ FD_ZERO(&fds);
+ FD_SET(sock,&fds);
+ switch (select(sock+1, &fds, NULL, NULL, to ? &timeout : NULL)) {
+ case 0:
+ ret = EDG_WLPR_ERROR_TIMEOUT;
+ goto end;
+ case -1:
+ ret = EDG_WLPR_ERROR_ERRNO;
+ goto end;
+ }
+
count = read(sock, cbuf, remain);
if (count < 0) {
if (errno == EINTR)
continue;
- else
- return count;
+ else {
+ ret = EDG_WLPR_ERROR_ERRNO;
+ goto end;
+ }
} else
if (count == 0) {
- return count;
+ *read_len = 0;
+ return 0;
}
cbuf += count;
remain -= count;
}
- return buf_len;
+ *read_len = buf_len;
+ ret = 0;
+
+end:
+ if (to) {
+ gettimeofday(&after,NULL);
+ edg_wlpr_DecrementTimeout(to, before, after);
+ if (to->tv_sec < 0) {
+ to->tv_sec = 0;
+ to->tv_usec = 0;
+ }
+ }
+
+ return ret;
}
static size_t
-nwrite(int sock, const char *buf, size_t buf_len)
+nwrite(int sock, struct timeval *to, const char *buf, size_t buf_len)
{
const char *cbuf = buf;
size_t count;
size_t remain = buf_len;
+ fd_set fds;
+ struct timeval timeout,before,after;
+ int ret;
+
+ if (to) {
+ memcpy(&timeout,to,sizeof(timeout));
+ gettimeofday(&before,NULL);
+ }
while (remain > 0) {
+ FD_ZERO(&fds);
+ FD_SET(sock,&fds);
+ switch (select(sock+1, NULL, &fds, NULL, to ? &timeout : NULL)) {
+ case 0: ret = EDG_WLPR_ERROR_TIMEOUT;
+ goto end;
+ case -1: ret = EDG_WLPR_ERROR_ERRNO;
+ goto end;
+ }
+
count = write(sock, cbuf, remain);
if (count < 0) {
if (errno == EINTR)
continue;
- else
- return count;
+ else {
+ ret = EDG_WLPR_ERROR_ERRNO;
+ goto end;
+ }
}
cbuf += count;
remain -= count;
}
- return buf_len;
+ ret = buf_len;
+
+end:
+ if (to) {
+ gettimeofday(&after,NULL);
+ edg_wlpr_DecrementTimeout(to, before, after);
+ if (to->tv_sec < 0) {
+ to->tv_sec = 0;
+ to->tv_usec = 0;
+ }
+ }
+
+ return ret;
}
int
-edg_wlpr_Read(int sock, char **buf, size_t *buf_len)
+edg_wlpr_Read(int sock, struct timeval *timeout, char **buf, size_t *buf_len)
{
int ret;
unsigned char length[4];
+ size_t len;
- ret = nread(sock, length, 4);
- if (ret == -1) {
+ ret = nread(sock, timeout, length, 4, &len);
+ if (ret) {
*buf_len = 0;
- return errno;
+ return ret;
}
- if (ret < 4) {
+ if (len != 4) {
*buf_len = 0;
return EDG_WLPR_ERROR_UNEXPECTED_EOF; /* XXX vraci i kdyz peer spadne a zavre trubku */
}
if (*buf == NULL)
return ENOMEM;
- ret = nread(sock, *buf, *buf_len);
- if (ret != *buf_len) {
+ ret = nread(sock, timeout, *buf, *buf_len, &len);
+ if (ret)
+ return ret;
+
+ if (len != *buf_len) {
free(*buf);
*buf_len = 0;
- return errno;
+ return EDG_WLPR_ERROR_UNEXPECTED_EOF; /* XXX */
}
return 0;
}
int
-edg_wlpr_Write(int sock, char *buf, size_t buf_len)
+edg_wlpr_Write(int sock, struct timeval *timeout, char *buf, size_t buf_len)
{
unsigned char length[4];
length[2] = (buf_len >> 8) & 0xFF;
length[3] = (buf_len >> 0) & 0xFF;
- if (nwrite(sock, length, 4) != 4 ||
- nwrite(sock, buf, buf_len) != buf_len)
+ if (nwrite(sock, timeout, length, 4) != 4 ||
+ nwrite(sock, timeout, buf, buf_len) != buf_len)
return errno;
return 0;
*num = atol(str); /* XXX */
return 0;
}
+
+int
+edg_wlpr_DecrementTimeout(struct timeval *timeout, struct timeval before, struct timeval after)
+{
+ (*timeout).tv_sec = (*timeout).tv_sec - (after.tv_sec - before.tv_sec);
+ (*timeout).tv_usec = (*timeout).tv_usec - (after.tv_usec - before.tv_usec);
+ while ( (*timeout).tv_usec < 0) {
+ (*timeout).tv_sec--;
+ (*timeout).tv_usec += 1000000;
+ }
+
+ if ( ((*timeout).tv_sec < 0) || (((*timeout).tv_sec == 0) && ((*timeout).tv_usec == 0)) ) return(1);
+ else return(0);
+}
--- /dev/null
+/*********************************************************************
+ *
+ * Authors: Vincenzo Ciaschini - Vincenzo.Ciaschini@cnaf.infn.it
+ *
+ * Copyright (c) 2002, 2003 INFN-CNAF on behalf of the EU DataGrid.
+ * For license conditions see LICENSE file or
+ * http://www.edg.org/license.html
+ *
+ * Parts of this code may be based upon or even include verbatim pieces,
+ * originally written by other people, in which case the original header
+ * follows.
+ *
+ *********************************************************************/
+#ifndef _NEW_FORMAT_H
+#define _NEW_FORMAT_H
+#include <openssl/evp.h>
+#include <openssl/asn1.h>
+#include <openssl/asn1_mac.h>
+#include <openssl/x509.h>
+#include <openssl/x509v3.h>
+#include <openssl/stack.h>
+#include <openssl/safestack.h>
+
+#include "acstack.h"
+#if 0
+static STACK_OF(CRYPT_EX_DATA_FUNS) *AC_meth = NULL;
+
+static AC_METHOD meth = {
+ (int (*)()) i2d_AC,
+ (char *(*)())d2i_AC,
+ (char *(*)())AC_new,
+ (void (*)()) AC_free};
+a
+ASN1_METHOD *AC_asn1_meth(void)
+{
+ return &meth;
+}
+#endif
+
+typedef struct ACDIGEST {
+ ASN1_ENUMERATED *type;
+ ASN1_OBJECT *oid;
+ X509_ALGOR *algor;
+ ASN1_BIT_STRING *digest;
+} AC_DIGEST;
+
+typedef struct ACIS {
+ STACK_OF(GENERAL_NAME) *issuer;
+ ASN1_INTEGER *serial;
+ ASN1_BIT_STRING *uid;
+} AC_IS;
+
+typedef struct ACFORM {
+ STACK_OF(GENERAL_NAME) *names;
+ AC_IS *is;
+ AC_DIGEST *digest;
+} AC_FORM;
+
+typedef struct ACACI {
+ STACK_OF(GENERAL_NAME) *names;
+ AC_FORM *form;
+} AC_ACI;
+
+typedef struct ACHOLDER {
+ AC_IS *baseid;
+ STACK_OF(GENERAL_NAMES) *name;
+ AC_DIGEST *digest;
+} AC_HOLDER;
+
+typedef struct ACVAL {
+ ASN1_GENERALIZEDTIME *notBefore;
+ ASN1_GENERALIZEDTIME *notAfter;
+} AC_VAL;
+
+typedef struct asn1_string_st AC_IETFATTRVAL;
+
+typedef struct ACIETFATTR {
+ STACK_OF(GENERAL_NAMES) *names;
+ STACK_OF(AC_IETFATTRVAL) *values;
+} AC_IETFATTR;
+
+typedef struct ACTARGET {
+ GENERAL_NAME *name;
+ GENERAL_NAME *group;
+ AC_IS *cert;
+} AC_TARGET;
+
+typedef struct ACTARGETS {
+ STACK_OF(AC_TARGET) *targets;
+} AC_TARGETS;
+
+typedef struct ACATTR {
+ ASN1_OBJECT *type;
+ STACK_OF(AC_IETFATTR) *ietfattr;
+} AC_ATTR;
+
+typedef struct ACINFO {
+ ASN1_INTEGER *version;
+ AC_HOLDER *holder;
+ AC_FORM *form;
+ X509_ALGOR *alg;
+ ASN1_INTEGER *serial;
+ AC_VAL *validity;
+ STACK_OF(AC_ATTR) *attrib;
+ ASN1_BIT_STRING *id;
+ STACK_OF(X509_EXTENSION) *exts;
+} AC_INFO;
+
+typedef struct ACC {
+ AC_INFO *acinfo;
+ X509_ALGOR *sig_alg;
+ ASN1_BIT_STRING *signature;
+} AC;
+
+typedef struct ACSEQ {
+ STACK_OF(AC) *acs;
+} AC_SEQ;
+
+DECL_STACK(AC_TARGET)
+DECL_STACK(AC_TARGETS)
+DECL_STACK(AC_IETFATTR)
+DECL_STACK(AC_IETFATTRVAL)
+DECL_STACK(AC_ATTR)
+DECL_STACK(AC);
+DECL_STACK(AC_INFO);
+DECL_STACK(AC_VAL);
+DECL_STACK(AC_HOLDER);
+DECL_STACK(AC_ACI);
+DECL_STACK(AC_FORM);
+DECL_STACK(AC_IS);
+DECL_STACK(AC_DIGEST);
+
+extern int i2d_AC_ATTR(AC_ATTR *a, unsigned char **pp);
+extern AC_ATTR *d2i_AC_ATTR(AC_ATTR **a, unsigned char **p, long length);
+extern AC_ATTR *AC_ATTR_new();
+extern void AC_ATTR_free(AC_ATTR *a);
+extern int i2d_AC_IETFATTR(AC_IETFATTR *a, unsigned char **pp);
+extern AC_IETFATTR *d2i_AC_IETFATTR(AC_IETFATTR **a, unsigned char **p, long length);
+extern AC_IETFATTR *AC_IETFATTR_new();
+extern void AC_IETFATTR_free (AC_IETFATTR *a);
+extern int i2d_AC_IETFATTRVAL(AC_IETFATTRVAL *a, unsigned char **pp);
+extern AC_IETFATTRVAL *d2i_AC_IETFATTRVAL(AC_IETFATTRVAL **a, unsigned char **pp, long length);
+extern AC_IETFATTRVAL *AC_IETFATTRVAL_new();
+extern void AC_IETFATTRVAL_free(AC_IETFATTRVAL *a);
+extern int i2d_AC_DIGEST(AC_DIGEST *a, unsigned char **pp);
+extern AC_DIGEST *d2i_AC_DIGEST(AC_DIGEST **a, unsigned char **pp, long length);;
+extern AC_DIGEST *AC_DIGEST_new(void);
+extern void AC_DIGEST_free(AC_DIGEST *a);
+extern int i2d_AC_IS(AC_IS *a, unsigned char **pp);
+extern AC_IS *d2i_AC_IS(AC_IS **a, unsigned char **pp, long length);
+extern AC_IS *AC_IS_new(void);
+extern void AC_IS_free(AC_IS *a);
+extern int i2d_AC_FORM(AC_FORM *a, unsigned char **pp);
+extern AC_FORM *d2i_AC_FORM(AC_FORM **a, unsigned char **pp, long length);
+extern AC_FORM *AC_FORM_new(void);
+extern void AC_FORM_free(AC_FORM *a);
+extern int i2d_AC_ACI(AC_ACI *a, unsigned char **pp);
+extern AC_ACI *d2i_AC_ACI(AC_ACI **a, unsigned char **pp, long length);
+extern AC_ACI *AC_ACI_new(void);
+extern void AC_ACI_free(AC_ACI *a);
+
+extern int i2d_AC_HOLDER(AC_HOLDER *a, unsigned char **pp);
+extern AC_HOLDER *d2i_AC_HOLDER(AC_HOLDER **a, unsigned char **pp, long length);
+extern AC_HOLDER *AC_HOLDER_new(void);
+extern void AC_HOLDER_free(AC_HOLDER *a);
+
+/* new AC_VAL functions by Valerio */
+extern int i2d_AC_VAL(AC_VAL *a, unsigned char **pp);
+extern AC_VAL *d2i_AC_VAL(AC_VAL **a, unsigned char **pp, long length);
+extern AC_VAL *AC_VAL_new(void);
+extern void AC_VAL_free(AC_VAL *a);
+/* end*/
+
+extern int i2d_AC_INFO(AC_INFO *a, unsigned char **pp);
+extern AC_INFO *d2i_AC_INFO(AC_INFO **a, unsigned char **p, long length);
+extern AC_INFO *AC_INFO_new(void);
+extern void AC_INFO_free(AC_INFO *a);
+extern int i2d_AC(AC *a, unsigned char **pp) ;
+extern AC *d2i_AC(AC **a, unsigned char **pp, long length);
+extern AC *AC_new(void);
+extern void AC_free(AC *a);
+extern int i2d_AC_TARGETS(AC_TARGETS *a, unsigned char **pp) ;
+extern AC_TARGETS *d2i_AC_TARGETS(AC_TARGETS **a, unsigned char **pp, long length);
+extern AC_TARGETS *AC_TARGETS_new(void);
+extern void AC_TARGETS_free(AC_TARGETS *a);
+extern int i2d_AC_TARGET(AC_TARGET *a, unsigned char **pp) ;
+extern AC_TARGET *d2i_AC_TARGET(AC_TARGET **a, unsigned char **pp, long length);
+extern AC_TARGET *AC_TARGET_new(void);
+extern void AC_TARGET_free(AC_TARGET *a);
+extern int i2d_AC_SEQ(AC_SEQ *a, unsigned char **pp) ;
+extern AC_SEQ *d2i_AC_SEQ(AC_SEQ **a, unsigned char **pp, long length);
+extern AC_SEQ *AC_SEQ_new(void);
+extern void AC_SEQ_free(AC_SEQ *a);
+
+#endif
#include "renewal_locl.h"
#include "renewd_locl.h"
-#ifndef NOVOMS
-#include <voms_apic.h>
-#endif
+#include "glite/security/voms/voms_apic.h"
#ident "$Header$"
+#define RENEWAL_COUNTS_MAX 1000 /* the slave daemon exits after that many attemtps */
+
extern char *repository;
extern char *cadir;
extern char *vomsdir;
extern int voms_enabled;
extern char *vomsconf;
-extern struct vomses_records vomses;
-static int received_signal = -1;
+static int received_signal = -1, die = 0;
static void
-check_renewal(char *datafile, int force_renew);
+check_renewal(char *datafile, int force_renew, int *num_renewed);
static int
renew_proxy(proxy_record *record, char *basename, char **new_proxy);
static void
register_signal(int signal);
-
-#define DGPR_RETRIEVE_DEFAULT_HOURS 10
-#define RENEWAL_CLOCK_SKEW 5 * 60
-
-static const char *
-get_ssl_err()
-{
- return "SSL failed";
-}
-
int
-load_proxy(const char *filename, X509 **cert, EVP_PKEY **privkey,
- STACK_OF(X509) **chain)
+load_proxy(const char *cur_file, X509 **cert, EVP_PKEY **priv_key,
+ STACK_OF(X509) **chain, globus_gsi_cred_handle_t *cur_proxy)
{
- X509 *my_cert = NULL;
- EVP_PKEY *my_key = NULL;
- STACK_OF(X509) *my_chain = NULL;
- FILE *fd = NULL;
+ globus_result_t result;
+ globus_gsi_cred_handle_t proxy = NULL;
int ret;
- fd = fopen(filename, "r");
- if (fd == NULL) {
- edg_wlpr_Log(LOG_ERR,
- "Cannot read VOMS certificate (fopen() failed on %s: %s)",
- filename, strerror(errno));
- return errno;
- }
-
- my_cert = PEM_read_X509(fd, NULL, NULL, NULL);
- if (my_cert == NULL) {
- edg_wlpr_Log(LOG_ERR,
- "Cannot read VOMS certificate (PEM_read_X509() failed: %s)",
- get_ssl_err());
- ret = EDG_WLPR_ERROR_SSL;
- goto end;
- }
-
- my_key = PEM_read_PrivateKey(fd, NULL, NULL, NULL);
- if (my_key == NULL) {
- edg_wlpr_Log(LOG_ERR,
- "Cannot read VOMS certificate (PEM_read_PrivateKey() failed: %s)",
- get_ssl_err());
- ret = EDG_WLPR_ERROR_SSL;
+ result = globus_gsi_cred_handle_init(&proxy, NULL);
+ if (result) {
+ fprintf(stderr, "globus_gsi_cred_handle_init() failed\n");
goto end;
}
- my_chain = sk_X509_new_null();
- if (my_chain == NULL) {
- edg_wlpr_Log(LOG_ERR,
- "Cannot read VOMS certificate (sk_X509_new_null() failed: %s)",
- get_ssl_err());
- ret = EDG_WLPR_ERROR_SSL;
+ result = globus_gsi_cred_read_proxy(proxy, cur_file);
+ if (result) {
+ fprintf(stderr, "globus_gsi_cred_read_proxy() failed\n");
goto end;
}
- while (1) {
- X509 *c;
-
- c = PEM_read_X509(fd, NULL, NULL, NULL);
- if (c == NULL) {
- if (ERR_GET_REASON(ERR_peek_error()) == PEM_R_NO_START_LINE) {
- /* End of file reached. no error */
- ERR_clear_error();
- break;
- }
- edg_wlpr_Log(LOG_ERR,
- "Cannot read VOMS certificate (PEM_read_X509() failed: %s)",
- get_ssl_err());
- ret = EDG_WLPR_ERROR_SSL;
+ if (cert) {
+ result = globus_gsi_cred_get_cert(proxy, cert);
+ if (result) {
+ fprintf(stderr, "globus_gsi_cred_get_cert() failed\n");
goto end;
}
- sk_X509_push(my_chain, c);
}
- *cert = my_cert;
- *privkey = my_key;
- *chain = my_chain;
- my_cert = NULL; my_key = NULL; my_chain = NULL;
- ret = 0;
-
-end:
- fclose(fd);
-
- if (my_cert)
- X509_free(my_cert);
- if (my_key)
- EVP_PKEY_free(my_key);
- if (my_chain)
- sk_X509_pop_free(my_chain, X509_free);
-
- return ret;
-}
-
-static int
-save_proxy(const char *filename, X509 *new_cert, EVP_PKEY *new_privkey,
- STACK_OF(X509) *chain)
-{
- FILE *fd = NULL;
- int ret, i;
- int retval = EDG_WLPR_ERROR_SSL;
-
- fd = fopen(filename, "w");
- if (fd == NULL) {
- edg_wlpr_Log(LOG_ERR,
- "Cannot store proxy (fopen() failed on %s: %s)",
- filename, strerror(errno));
- return errno;
- }
-
- ret = PEM_write_X509(fd, new_cert);
- if (ret == 0) {
- edg_wlpr_Log(LOG_ERR,
- "Cannot store proxy (PEM_write_X509() failed: %s)",
- get_ssl_err());
- goto end;
- }
-
- ret = PEM_write_PrivateKey(fd, new_privkey, NULL, NULL, 0, NULL, NULL);
- if (ret == 0) {
- edg_wlpr_Log(LOG_ERR,
- "Cannot store proxy (PEM_write_PrivateKey() failed: %s)",
- get_ssl_err());
- goto end;
- }
-
- for (i = 0; i < sk_X509_num(chain); i++) {
- X509 *cert = sk_X509_value(chain, i);
- ret = PEM_write_X509(fd, cert);
- if (ret == 0) {
- edg_wlpr_Log(LOG_ERR,
- "Cannot store proxy (PEM_write_X509() failed: %s)",
- get_ssl_err());
+ if (priv_key) {
+ result = globus_gsi_cred_get_key(proxy, priv_key);
+ if (result) {
+ fprintf(stderr, "globus_gsi_cred_get_key() failed\n");
goto end;
}
}
-
- retval = 0;
-
-end:
- fclose(fd);
-
- return retval;
-}
-
-static int
-gen_keypair(EVP_PKEY **keypair, int requested_bits)
-{
- RSA *rsa = NULL;
- EVP_PKEY *key;
-
- *keypair = NULL;
- rsa = RSA_generate_key(requested_bits,
- RSA_F4 /* public exponent */,
- NULL, NULL);
- if (rsa == NULL) {
- edg_wlpr_Log(LOG_ERR,
- "Cannot generate new proxy (RSA_generate_key() failed: %s)",
- get_ssl_err());
- return EDG_WLPR_ERROR_SSL;
- }
-
- key = EVP_PKEY_new();
- if (key == NULL) {
- edg_wlpr_Log(LOG_ERR,
- "Cannot generate new proxy (EVP_PKEY_new() failed: %s)",
- get_ssl_err());
- RSA_free(rsa);
- return EDG_WLPR_ERROR_SSL;
- }
-
- if (EVP_PKEY_assign_RSA(key, rsa) == 0) {
- edg_wlpr_Log(LOG_ERR,
- "Cannot generate new proxy (EVP_PKEY_assign_RSA() failed: %s)",
- get_ssl_err());
- RSA_free(rsa);
- EVP_PKEY_free(key);
- return EDG_WLPR_ERROR_SSL;
- }
-
- *keypair = key;
-
- return 0;
-}
-
-static int
-gen_subject_name(X509 *old_cert, X509 *new_cert)
-{
- X509_NAME *name = NULL;
- X509_NAME_ENTRY *name_entry = NULL;
- int ret = EDG_WLPR_ERROR_SSL;
-
- name = X509_NAME_dup(X509_get_subject_name(old_cert));
- if (name == NULL) {
- edg_wlpr_Log(LOG_ERR,
- "Cannot generate new proxy (X509_NAME_dup() failed: %s",
- get_ssl_err());
- goto end;
- }
-
- name_entry = X509_NAME_ENTRY_create_by_NID(NULL /* make new entry */,
- NID_commonName,
- V_ASN1_APP_CHOOSE,
- "proxy", -1);
- if (name_entry == NULL) {
- edg_wlpr_Log(LOG_ERR,
- "Cannot generate new proxy (X509_NAME_ENTRY_create_by_NID() failed: %s)",
- get_ssl_err());
- goto end;
- }
-
- if (X509_NAME_add_entry(name, name_entry, X509_NAME_entry_count(name), 0) == 0) {
- edg_wlpr_Log(LOG_ERR,
- "Cannot generate new proxy (X509_NAME_add_entry() failed: %s)",
- get_ssl_err());
- goto end;
- }
-
-
- if (X509_set_subject_name(new_cert, name) == 0) {
- edg_wlpr_Log(LOG_ERR,
- "Cannot generate new proxy (X509_set_subject_name() failed: %s)",
- get_ssl_err());
- goto end;
- }
-
- ret = 0;
-
-end:
- if (name)
- X509_NAME_free(name);
- if (name_entry != NULL)
- X509_NAME_ENTRY_free(name_entry);
-
- return ret;
-}
-
-static int
-create_proxy(X509 *old_cert, EVP_PKEY *old_privkey, X509_EXTENSION *extension,
- X509 **new_cert, EVP_PKEY **new_privkey)
-{
- /* Inspired by code from Myproxy */
- EVP_PKEY *key_pair = NULL;
- X509 *cert = NULL;
- int ret;
- int retval = EDG_WLPR_ERROR_SSL;
-
- ret = gen_keypair(&key_pair, 512);
- if (ret)
- return ret;
-
- cert = X509_new();
- if (cert == NULL) {
- edg_wlpr_Log(LOG_ERR, "Cannot generate new proxy (X509_new() failed: Not enough memory)");
- goto end;
- }
-
- ret = gen_subject_name(old_cert, cert);
- if (ret) {
- retval = ret;
- goto end;
- }
-
- if (X509_set_issuer_name(cert, X509_get_subject_name(old_cert)) == 0) {
- edg_wlpr_Log(LOG_ERR,
- "Cannot generate new proxy (X509_set_issuer_name() failed: %s)",
- get_ssl_err());
- goto end;
- }
-
- if (X509_set_serialNumber(cert, X509_get_serialNumber(old_cert)) == 0) {
- edg_wlpr_Log(LOG_ERR,
- "Cannot generate new proxy (X509_set_serialNumber() failed: %s)",
- get_ssl_err());
- goto end;
- }
-
- X509_gmtime_adj(X509_get_notBefore(cert), -(60 * 5));
- X509_set_notAfter(cert, X509_get_notAfter(old_cert));
-
- if (X509_set_pubkey(cert, key_pair) == 0) {
- edg_wlpr_Log(LOG_ERR,
- "Cannot generate new proxy (X509_set_pubkey() failed: %s)",
- get_ssl_err());
- goto end;
- }
-
- /* set v3 */
- if (X509_set_version(cert, 2L) == 0) {
- edg_wlpr_Log(LOG_ERR,
- "Cannot generate new proxy (X509_set_version() failed: %s)",
- get_ssl_err());
- goto end;
- }
-
- if (cert->cert_info->extensions != NULL)
- sk_X509_EXTENSION_pop_free(cert->cert_info->extensions,
- X509_EXTENSION_free);
- cert->cert_info->extensions = sk_X509_EXTENSION_new_null();
- sk_X509_EXTENSION_push(cert->cert_info->extensions, extension);
-
- if (X509_sign(cert, old_privkey, EVP_md5()) == 0) {
- edg_wlpr_Log(LOG_ERR,
- "Cannot generate new proxy (X509_sign() failed: %s)",
- get_ssl_err());
- goto end;
- }
-
- *new_privkey = key_pair;
- *new_cert = cert;
- key_pair = NULL;
- cert = NULL;
-
- retval = 0;
-
-end:
- if (key_pair)
- EVP_PKEY_free(key_pair);
- if (cert)
- X509_free(cert);
-
- return retval;
-}
-
-static int
-create_voms_extension(char *buf, size_t buf_len, X509_EXTENSION **extensions)
-{
- ASN1_OBJECT *voms_obj = NULL;
- ASN1_OCTET_STRING *voms_oct = NULL;
-
- *extensions = NULL;
-
- voms_oct = ASN1_OCTET_STRING_new();
- if (voms_oct == NULL) {
- edg_wlpr_Log(LOG_ERR,
- "Cannot generate new proxy (ASN1_OCTET_STRING_new() failed: %s)",
- get_ssl_err());
- return EDG_WLPR_ERROR_SSL;
- }
-
- voms_oct->data = buf;
- voms_oct->length = buf_len;
-
- voms_obj = OBJ_nid2obj(OBJ_txt2nid("VOMS"));
- if (voms_obj == NULL) {
- edg_wlpr_Log(LOG_ERR, "Cannot generate new proxy (OBJ_nid2obj() failed");
- goto end;
- }
-
- *extensions = X509_EXTENSION_create_by_OBJ(NULL, voms_obj, 0, voms_oct);
- if (*extensions == NULL) {
- edg_wlpr_Log(LOG_ERR, "Cannot generate new proxy (X509_EXTENSION_create_by_OBJ() failed");
- goto end;
- }
-
- return 0;
-
-end:
- if (voms_oct)
- ASN1_OCTET_STRING_free(voms_oct);
- if (voms_obj)
- ASN1_OBJECT_free(voms_obj);
- return EDG_WLPR_ERROR_SSL;
-}
-
-#ifndef NOVOMS
-static int
-export_std_data(struct data *voms_data, char **buf)
-{
- asprintf(buf, "GROUP: %s\n"
- "ROLE:%s\n" /* the space is missing intentionaly */
- "CAP: %s\n",
- (voms_data->group) ? voms_data->group : "NULL",
- (voms_data->role) ? voms_data->role : "NULL",
- (voms_data->cap) ? voms_data->cap : "NULL");
- return 0;
-}
-
-static int
-export_user_data(struct voms *voms_cert, char **buf, size_t *len)
-{
- struct data **voms_data;
- char *str = NULL;
- char *ptr;
-
- *buf = NULL;
-
- switch (voms_cert->type) {
- case TYPE_NODATA:
- *buf = strdup("NO DATA");
- break;
- case TYPE_CUSTOM:
- *buf = strdup(voms_cert->custom);
- break;
- case TYPE_STD:
- for (voms_data = voms_cert->std; voms_data && *voms_data; voms_data++) {
- export_std_data(*voms_data, &str);
- if (*buf == NULL)
- ptr = calloc(strlen(str) + 1, 1);
- else
- ptr = realloc(*buf, strlen(*buf) + strlen(str) + 1);
- if (ptr == NULL) {
- return ENOMEM;
- }
- *buf = ptr;
- strcat(*buf, str);
- free(str);
- }
-
- break;
- default:
- return -1;
- }
-
- *len = strlen(*buf);
- return 0;
-}
-
-#endif
-
-static int
-encode_voms_buf(const char *label, char *data, size_t data_len,
- char **buf, size_t *buf_len)
-{
- char *tmp;
-
- tmp = realloc(*buf, *buf_len + strlen(label) + data_len + 1);
- if (tmp == NULL)
- return ENOMEM;
-
- memcpy(tmp + *buf_len, label, strlen(label));
-
- memcpy(tmp + *buf_len + strlen(label), data, data_len);
- tmp[*buf_len + strlen(label) + data_len] = '\n';
- *buf = tmp;
- *buf_len = *buf_len + strlen(label) + data_len + 1;
- return 0;
-}
-
-static int
-encode_voms_int(const char *label, int value, char **buf, size_t *buf_len)
-{
- char tmp[16];
-
- snprintf(tmp, sizeof(tmp), "%d", value);
- return encode_voms_buf(label, tmp, strlen(tmp), buf, buf_len);
-}
-
-static int
-encode_voms_str(const char *label, char *value, char **buf, size_t *buf_len)
-{
- return encode_voms_buf(label, value, strlen(value), buf, buf_len);
-}
-
-#if 0
-static int
-VOMS_Export(struct vomsdata *voms_info, char **buf, size_t *len)
-{
- struct voms *vc;
- char *enc_voms = NULL;
- size_t enc_voms_len = 0;
- char *data_buf;
- size_t data_len;
- int ret;
-
- if (voms_info == NULL || voms_info->data == NULL || *voms_info->data == NULL)
- return EINVAL;
- vc = *voms_info->data;
-
- ret = export_user_data(vc, &data_buf, &data_len);
- if (ret)
- return ret;
-
- encode_voms_int("SIGLEN:", vc->siglen, &enc_voms, &enc_voms_len);
- encode_voms_buf("SIGNATURE:",vc->signature, vc->siglen,
- &enc_voms, &enc_voms_len);
- enc_voms_len--; /* Signature is not followed by '\n' */
- encode_voms_str("USER:", vc->user, &enc_voms, &enc_voms_len);
- encode_voms_str("UCA:", vc->userca, &enc_voms, &enc_voms_len);
- encode_voms_str("SERVER:", vc->server, &enc_voms, &enc_voms_len);
- encode_voms_str("SCA:", vc->serverca, &enc_voms, &enc_voms_len);
- encode_voms_str("VO:", vc->voname, &enc_voms, &enc_voms_len);
- encode_voms_str("URI:", vc->uri, &enc_voms, &enc_voms_len);
- encode_voms_str("TIME1:", vc->date1, &enc_voms, &enc_voms_len);
- encode_voms_str("TIME2:", vc->date2, &enc_voms, &enc_voms_len);
- encode_voms_int("DATALEN:", data_len, &enc_voms, &enc_voms_len);
- encode_voms_buf("", data_buf, data_len, &enc_voms, &enc_voms_len);
- enc_voms_len--; /* the data already contains endind '\n' */
-
- free(data_buf);
- if (enc_voms == NULL) {
- edg_wlpr_Log(LOG_ERR, "Cannot renew VOMS certificate (Not enough memory)");
- return ENOMEM;
- }
- *buf = enc_voms;
- *len = enc_voms_len;
- return 0;
-}
-
-static int
-voms_cert_renew(char *hostname, int port, char *voms_subject,
- char *proxy,
- struct voms **cur_voms_cert, struct vomsdata *voms_info)
-{
- int ret = 0;
- char *command = "A";
- int err = 0;
- char *old_env_proxy = getenv("X509_USER_PROXY");
-
- setenv("X509_USER_PROXY", proxy, 1);
-
- /* hack (suggested by Vincenzo Ciaschini) to work around problem with
- * unitialized VOMS struct */
- ret = VOMS_Ordering("zzz:zzz", voms_info, &err);
- if (ret == 0) {
- edg_wlpr_Log(LOG_ERR, "Cannot renew VOMS certificate (VOMS_Ordering() failed");
- ret = EDG_WLPR_ERROR_VOMS;
- goto end;
- }
-
- /* XXX only attributes which are in current certificate should be requested*/
- ret = VOMS_Contact(hostname, port, (*cur_voms_cert)->server, command,
- voms_info, &err);
- if (ret == 0) {
-#if 0
- if (err == 1) { /* XXX cannot connect voms server */
- ret = 0;
+ if (chain) {
+ result = globus_gsi_cred_get_cert_chain(proxy, chain);
+ if (result) {
+ fprintf(stderr, "globus_gsi_cred_get_cert_chain() failed\n");
goto end;
}
-#endif
- edg_wlpr_Log(LOG_ERR, "Cannot renew VOMS certificate (VOMS_Contact() failed: %d)", err);
- ret = EDG_WLPR_ERROR_VOMS;
- } else
- ret = 0;
-
-end:
- (old_env_proxy) ? setenv("X509_USER_PROXY", old_env_proxy, 1) :
- unsetenv("X509_USER_PROXY");
-
- return ret;
-}
-
-static int
-renew_voms_cert(struct voms **cur_voms_cert, char *proxy, char **buf, size_t *buf_len)
-{
- struct vomsdata *voms_info = NULL;
- char *hostname = NULL;
- char *p;
- int port, ret;
-
- hostname = strdup((*cur_voms_cert)->uri);
- p = strchr(hostname, ':');
- if (p)
- *p = '\0';
- port = (p) ? atoi(p+1) : 15000;
-
- voms_info = VOMS_Init(vomsdir, cadir);
- if (voms_info == NULL) {
- edg_wlpr_Log(LOG_ERR, "Cannot renew VOMS certificate (VOMS_Init() failed)");
- ret = EDG_WLPR_ERROR_VOMS;
- goto end;
}
- ret = voms_cert_renew(hostname, port, (*cur_voms_cert)->server, proxy, cur_voms_cert,
- voms_info);
- if (ret)
- goto end;
-
- ret = VOMS_Export(voms_info, buf, buf_len);
- if (ret) {
- edg_wlpr_Log(LOG_ERR, "Cannot renew VOMS certificate (VOMS_Export() failed)");
- ret = EDG_WLPR_ERROR_VOMS;
- goto end;
+ if (cur_proxy) {
+ *cur_proxy = proxy;
+ proxy = NULL;
}
ret = 0;
-
-end:
- if (hostname)
- free(hostname);
-#if 0
- if (voms_info)
- VOMS_Destroy(voms_info);
-#endif
-
- return ret;
-}
-#endif
-
-#ifndef NOVOMS
-static vomses_record *
-find_vomses_record(char *hostname, int port)
-{
- int i;
-
- for (i = 0; i < vomses.len; i++) {
- if (strcmp(vomses.val[i]->hostname, hostname) == 0 &&
- vomses.val[i]->port == port)
- return vomses.val[i];
- }
-
- return NULL;
-}
-
-static int
-set_vo_params(struct voms **voms_cert, char **arg)
-{
- vomses_record *r;
- char *tmp;
- int port;
- char *hostname;
- char *p;
-
- hostname = strdup((*voms_cert)->uri);
- p = strchr(hostname, ':');
- if (p)
- *p = '\0';
- port = (p) ? atoi(p+1) : 15000;
-
- r = find_vomses_record(hostname, port);
- if (r == NULL)
- return EINVAL;
-
- if (*arg == NULL) {
- asprintf(arg, " -voms %s", r->nick);
- } else {
- tmp = realloc(*arg,
- strlen(*arg) + strlen(" -voms ") + strlen(r->nick) + 1);
- if (tmp == NULL)
- return ENOMEM;
- *arg = tmp;
- *arg = strcat(*arg, " -voms ");
- *arg = strcat(*arg, r->nick);
- }
- return 0;
-}
-#endif
-
-static int
-exec_voms_proxy_init(char *arg, char *old_proxy, char *new_proxy)
-{
- char command[256];
- int ret;
- char *old_env_proxy = getenv("X509_USER_PROXY");
-
- setenv("X509_USER_PROXY", old_proxy, 1);
-
- snprintf(command, sizeof(command),
- "edg-voms-proxy-init -out %s -key %s -cert %s -confile %s -q %s",
- new_proxy, old_proxy, old_proxy, vomsconf, arg);
- ret = system(command);
-
- (old_env_proxy) ? setenv("X509_USER_PROXY", old_env_proxy, 1) :
- unsetenv("X509_USER_PROXY");
-
- return ret;
-}
-
-#if 0
-static int
-renew_voms_certs(const char *old_proxy, const char *new_proxy)
-{
- struct vomsdata *voms_info = NULL;
- struct voms **voms_cert = NULL;
- STACK_OF(X509) *chain = NULL;
- EVP_PKEY *privkey = NULL;
- X509 *cert = NULL;
- int ret, err;
- char *buf = NULL;
- size_t buf_len = 0;
- X509_EXTENSION *extension = NULL;
- X509 *new_cert = NULL;
- EVP_PKEY *new_privkey = NULL;
-
- voms_info = VOMS_Init(vomsdir, cadir);
- if (voms_info == NULL) {
- edg_wlpr_Log(LOG_ERR, "Cannot initialize VOMS context (VOMS_Init() failed)");
- return EDG_WLPR_ERROR_VOMS;
- }
-
- ret = load_proxy(old_proxy, &cert, &privkey, &chain);
- if (ret)
- goto end;
-
- ret = VOMS_Retrieve(cert, chain, RECURSE_CHAIN, voms_info, &err);
- if (ret == 0) {
- if (err == VERR_NOEXT) {
- /* no VOMS cred, no problem; continue */
- ret = 0;
- } else {
- edg_wlpr_Log(LOG_ERR, "Cannot get VOMS certificate(s) from proxy");
- ret = EDG_WLPR_ERROR_VOMS;
- }
- goto end;
- }
-
- for (voms_cert = voms_info->data; voms_cert && *voms_cert; voms_cert++) {
- char *tmp, *ptr;
- size_t tmp_len;
-
- ret = renew_voms_cert(voms_cert, old_proxy, &tmp, &tmp_len);
- if (ret)
- continue;
- ptr = realloc(buf, buf_len + tmp_len);
- if (ptr == NULL) {
- ret = ENOMEM;
- goto end;
- }
- buf = ptr;
- memcpy(buf + buf_len, tmp, tmp_len);
- buf_len += tmp_len;
- }
-
- if (buf == NULL) {
- /* no extension renewed, return */
- ret = 0;
- goto end;
- }
-
- ret = create_voms_extension(buf, buf_len, &extension);
- if (ret)
- goto end;
-
- X509_free(cert);
- EVP_PKEY_free(privkey);
- sk_X509_pop_free(chain, X509_free);
-
- ret = load_proxy(new_proxy, &cert, &privkey, &chain);
- if (ret)
- goto end;
-
- ret = create_proxy(cert, privkey, extension, &new_cert, &new_privkey);
- if (ret)
- goto end;
-
- sk_X509_insert(chain, cert, 0);
-
- ret = save_proxy(new_proxy, new_cert, new_privkey, chain);
- if (ret)
- goto end;
-
- ret = 0;
-
+
end:
- VOMS_Destroy(voms_info);
-
- return ret;
-}
-#else /* 0 */
-
-#ifdef NOVOMS
-static int
-renew_voms_certs(const char *old_proxy, char *myproxy_proxy, const char *new_proxy)
-{
- return 0;
-}
-
-#else
-static int
-renew_voms_certs(const char *old_proxy, char *myproxy_proxy, const char *new_proxy)
-{
- struct vomsdata *voms_info = NULL;
- struct voms **voms_cert = NULL;
- STACK_OF(X509) *chain = NULL;
- EVP_PKEY *privkey = NULL;
- X509 *cert = NULL;
- int ret, err;
- char *arg = NULL;
-
- voms_info = VOMS_Init(vomsdir, cadir);
- if (voms_info == NULL) {
- edg_wlpr_Log(LOG_ERR, "Cannot initialize VOMS context (VOMS_Init() failed)");
- return EDG_WLPR_ERROR_VOMS;
- }
-
- ret = load_proxy(old_proxy, &cert, &privkey, &chain);
- if (ret)
- goto end;
-
- ret = VOMS_Retrieve(cert, chain, RECURSE_CHAIN, voms_info, &err);
- if (ret == 0) {
- if (err == VERR_NOEXT) {
- /* no VOMS cred, no problem; continue */
- ret = 0;
- } else {
- edg_wlpr_Log(LOG_ERR, "Cannot get VOMS certificate(s) from proxy");
- ret = EDG_WLPR_ERROR_VOMS;
- }
- goto end;
- }
-
- for (voms_cert = voms_info->data; voms_cert && *voms_cert; voms_cert++) {
- ret = set_vo_params(voms_cert, &arg);
- if (ret)
- goto end;
- }
- ret = exec_voms_proxy_init(arg, myproxy_proxy, new_proxy);
+ if (proxy)
+ globus_gsi_cred_handle_destroy(proxy);
+ if (result)
+ ret = EDG_WLPR_ERROR_GENERIC;
-end:
- VOMS_Destroy(voms_info);
return ret;
}
-#endif /* NOVOMS */
-
-#endif /* 0 */
static void
register_signal(int signal)
{
received_signal = signal;
+ switch ((received_signal = signal)) {
+ case SIGINT:
+ case SIGTERM:
+ case SIGQUIT:
+ die = signal;
+ break;
+ default:
+ break;
+ }
}
static int
edg_wlpr_Log(LOG_DEBUG, "Trying to renew proxy in %s.%d",
basename, record->suffix);
- snprintf(tmp_proxy, sizeof(tmp_proxy), "%s.%d.renew.XXXXXX",
+ snprintf(tmp_proxy, sizeof(tmp_proxy), "%s.%d.myproxy.XXXXXX",
basename, record->suffix);
tmp_fd = mkstemp(tmp_proxy);
if (tmp_fd == -1) {
} else
socket_attrs->psport = MYPROXY_SERVER_PORT;
+ verror_clear();
ret = myproxy_get_delegation(socket_attrs, client_request,
server_response, tmp_proxy);
if (ret == 1) {
ret = EDG_WLPR_ERROR_MYPROXY;
- edg_wlpr_Log(LOG_ERR, "Cannot get renewed proxy from Myproxy server");
+ edg_wlpr_Log(LOG_ERR, "Error contacting MyProxy server for proxy %s: %s",
+ repository_file, verror_get_string());
+ verror_clear();
goto end;
}
renewed_proxy = tmp_proxy;
- if (voms_enabled) {
+ if (voms_enabled && record->voms_exts) {
char tmp_voms_proxy[FILENAME_MAX];
int tmp_voms_fd;
- snprintf(tmp_voms_proxy, sizeof(tmp_voms_proxy), "%s.%d.renew.XXXXXX",
+ snprintf(tmp_voms_proxy, sizeof(tmp_voms_proxy), "%s.%d.voms.XXXXXX",
basename, record->suffix);
tmp_voms_fd = mkstemp(tmp_voms_proxy);
if (tmp_voms_fd == -1) {
goto end;
}
- ret = renew_voms_certs(repository_file, tmp_proxy, tmp_voms_proxy);
- if (ret)
+ ret = renew_voms_creds(repository_file, renewed_proxy, tmp_voms_proxy);
+ close(tmp_voms_fd);
+ if (ret) {
+ unlink(tmp_voms_proxy);
goto end;
+ }
renewed_proxy = tmp_voms_proxy;
+ unlink(tmp_proxy);
}
if (new_proxy)
}
static void
-check_renewal(char *datafile, int force_renew)
+check_renewal(char *datafile, int force_renew, int *num_renewed)
{
char line[1024];
proxy_record record;
assert(datafile != NULL);
+ *num_renewed = 0;
+
memset(&record, 0, sizeof(record));
memset(basename, 0, sizeof(basename));
memset(&request, 0, sizeof(request));
continue; /* XXX exit? */
if (record.jobids.len == 0) /* no jobid registered for this proxy */
continue;
- if (record.end_time - current_time < RENEWAL_CLOCK_SKEW ||
- abs(record.next_renewal - current_time) < RENEWAL_CLOCK_SKEW ||
- record.next_renewal < current_time ||
- record.end_time < current_time ||
+ if (current_time + RENEWAL_CLOCK_SKEW >= record.end_time ||
+ record.next_renewal <= current_time ||
force_renew) {
ret = EDG_WLPR_PROXY_EXPIRED;
- if (record.end_time >= current_time)
+ if ( record.end_time + RENEWAL_CLOCK_SKEW >= current_time) {
/* only try renewal if the proxy hasn't already expired */
ret = renew_proxy(&record, basename, &new_proxy);
+ }
/* if the proxy wasn't renewed have the daemon planned another renewal */
asprintf(&entry, "%d:%s", record.suffix, (ret == 0) ? new_proxy : "");
edg_wlpr_CleanResponse(&response);
edg_wlpr_CleanRequest(&request);
+ *num_renewed = num;
+
return;
}
-int renewal(int force_renew)
+int renewal(int force_renew, int *num_renewed)
{
DIR *dir = NULL;
struct dirent *file;
FILE *fd;
+ int num = 0;
edg_wlpr_Log(LOG_DEBUG, "Starting renewal process");
+ *num_renewed = 0;
+
if (chdir(repository)) {
edg_wlpr_Log(LOG_ERR, "Cannot access repository directory %s (%s)",
repository, strerror(errno));
file->d_name, strerror(errno));
continue;
}
- check_renewal(file->d_name, force_renew);
+ check_renewal(file->d_name, force_renew, &num);
+ *num_renewed += num;
fclose(fd);
}
closedir(dir);
{
struct sigaction sa;
int force_renewal;
+ int count = 0, num;
memset(&sa,0,sizeof(sa));
sa.sa_handler = register_signal;
sigaction(SIGUSR1, &sa, NULL);
+ sigaction(SIGINT,&sa,NULL);
+ sigaction(SIGQUIT,&sa,NULL);
+ sigaction(SIGTERM,&sa,NULL);
+ sigaction(SIGPIPE,&sa,NULL);
- /* load_vomses(); */
-
- while (1) {
+ while (count < RENEWAL_COUNTS_MAX && !die) {
received_signal = -1;
sleep(60 * 5);
force_renewal = (received_signal == SIGUSR1) ? 1 : 0;
+ if (die)
+ break;
/* XXX uninstall signal handler ? */
- renewal(force_renewal);
+ renewal(force_renewal, &num);
+ count += num;
}
+ edg_wlpr_Log(LOG_DEBUG, "Terminating after %d renewal attempts", count);
+ exit(0);
}
#include <sys/socket.h>
#include <sys/stat.h>
#include <sys/file.h>
+#include <sys/wait.h>
#include <openssl/md5.h>
#include <openssl/x509.h>
#include <openssl/pem.h>
#define MAX_PROXIES 4 /* max. number of jobids sharing one proxy */
+#define RENEWAL_CLOCK_SKEW (5 * 60)
+
+#define DGPR_RETRIEVE_DEFAULT_HOURS 10
+
+#define GLITE_PR_TIMEOUT_DEFAULT 120
+
typedef struct {
char *version;
edg_wlpr_Command command;
char *value, const char *separator);
int
-edg_wlpr_Read(int sock, char **buf, size_t *buf_len);
+edg_wlpr_Read(int sock, struct timeval *timeout, char **buf, size_t *buf_len);
int
-edg_wlpr_Write(int sock, char *buf, size_t buf_len);
+edg_wlpr_Write(int sock, struct timeval *timeout, char *buf, size_t buf_len);
void
edg_wlpr_CleanRequest(edg_wlpr_Request *request);
int
edg_wlpr_RequestSend(edg_wlpr_Request *request, edg_wlpr_Response *response);
+int
+edg_wlpr_DecrementTimeout(struct timeval *timeout, struct timeval before, struct timeval after);
+
#endif /* RENEWAL_LOCL_H */
char *cadir = NULL;
char *vomsdir = NULL;
int voms_enabled = 0;
+char *cert = NULL;
+char *key = NULL;
+char *vomsconf = NULL;
-char *vomsconf = "/opt/edg/etc/vomses";
-#ifndef NOVOMS
-struct vomses_records vomses;
-#endif
+static volatile int die = 0, child_died = 0;
+double default_timeout = 0;
static struct option opts[] = {
{ "help", no_argument, NULL, 'h' },
{ "VOMSdir", required_argument, NULL, 'V' },
{ "enable-voms", no_argument, NULL, 'A' },
{ "voms-config", required_argument, NULL, 'G' },
+ { "cert", required_argument, NULL, 't' },
+ { "key", required_argument, NULL, 'k' },
{ NULL, 0, NULL, 0 }
};
static int
decode_request(const char *msg, const size_t msg_len, edg_wlpr_Request *request);
+int
+start_watchdog(pid_t *pid);
+
+static void
+catchsig(int sig)
+{
+ switch (sig) {
+ case SIGINT:
+ case SIGTERM:
+ case SIGQUIT:
+ die = sig;
+ break;
+ case SIGCHLD:
+ child_died = 1;
+ break;
+ default:
+ break;
+ }
+}
+
static command_table *
find_command(edg_wlpr_Command code)
{
edg_wlpr_Response response;
edg_wlpr_Request request;
command_table *command;
+ struct timeval timeout;
memset(&request, 0, sizeof(request));
memset(&response, 0, sizeof(response));
- ret = edg_wlpr_Read(sock, &buf, &buf_len);
+ timeout.tv_sec = (long) default_timeout;
+ timeout.tv_usec = (long) ((default_timeout - timeout.tv_sec) * 1e6);
+
+ ret = edg_wlpr_Read(sock, &timeout, &buf, &buf_len);
if (ret) {
edg_wlpr_Log(LOG_ERR, "Error reading from client: %s",
edg_wlpr_GetErrorString(ret));
goto end;
}
- edg_wlpr_Log(LOG_INFO, "Received command code %d for proxy %s",
+ edg_wlpr_Log(LOG_INFO, "Received command code %d for proxy %s and jobid %s",
request.command,
- request.proxy_filename ? request.proxy_filename : "(unspecified)");
+ request.proxy_filename ? request.proxy_filename : "(unspecified)",
+ request.jobid ? request.jobid : "(unspecified)");
command->handler(&request, &response);
if (ret)
goto end;
- ret = edg_wlpr_Write(sock, buf, strlen(buf) + 1);
+ ret = edg_wlpr_Write(sock, &timeout, buf, strlen(buf) + 1);
free(buf);
if (ret) {
edg_wlpr_Log(LOG_ERR, "Error sending response to client: %s",
int newsock;
struct sockaddr_un client_addr;
int client_addr_len = sizeof(client_addr);
-#if 0
- next_renewal = LONG_MAX;
- size_of_proxies = PROXIES_ALLOC_SIZE;
- proxies = malloc((size_of_proxies) * sizeof(struct guarded_proxy *));
- if (proxies == NULL) {
- return ENOMEM;
- }
- proxies[0] = NULL;
-#endif
+ int flags;
-#if 0
- sigemptyset(&sset);
- sigaddset(&sset,SIGTERM);
- sigaddset(&sset,SIGINT);
- sigaddset(&sset, SIGKILL);
- sigaddset(&sset, SIGUSR1);
- sigaddset(&sset, SIGALRM);
- sigprocmask(SIG_BLOCK,&sset,NULL);
-#endif
+ while (!die) {
- while (1) {
-#if 0
- sigprocmask(SIG_UNBLOCK,&sset,NULL);
- newsock = accept(sock, (struct sockaddr *) &client_addr, &client_addr_len);
- sigprocmask(SIG_BLOCK,&sset,NULL);
+ if (child_died) {
+ int pid, newpid, ret;
- if (newsock == -1) {
- if (errno == EINTR) /* ERESTARTSYS */
- proxy_renewal(received_signal);
- else
- log();
- continue;
+ while ((pid=waitpid(-1,NULL,WNOHANG))>0)
+ ;
+ ret = start_watchdog(&newpid);
+ if (ret)
+ return ret;
+ edg_wlpr_Log(LOG_DEBUG, "Renewal slave process re-started");
+ child_died = 0;
+ continue;
}
-#else
+
newsock = accept(sock, (struct sockaddr *) &client_addr, &client_addr_len);
if (newsock == -1) {
- edg_wlpr_Log(LOG_ERR, "accept() failed");
+ if (errno != EINTR)
+ edg_wlpr_Log(LOG_ERR, "accept() failed");
continue;
}
edg_wlpr_Log(LOG_DEBUG, "Got connection");
-#endif
-
+ flags = fcntl(newsock, F_GETFL, 0);
+ if (fcntl(newsock, F_SETFL, flags | O_NONBLOCK) < 0) {
+ edg_wlpr_Log(LOG_ERR, "Can't set O_NONBLOCK mode (%s), closing.\n",
+ strerror(errno));
+ close(newsock);
+ continue;
+ }
+
proto(newsock);
edg_wlpr_Log(LOG_DEBUG, "Connection closed");
close(newsock);
}
+ edg_wlpr_Log(LOG_DEBUG, "Terminating on signal %d\n",die);
+ return 0;
}
static int
return errno;
}
- ret = listen(s, 5); /* XXX enough ? */
+ ret = listen(s, 50);
if (ret == -1) {
edg_wlpr_Log(LOG_ERR, "listen(): %s", strerror(errno));
close(s);
exit(0);
}
-#ifdef NOVOMS
-static int
-load_vomses()
-{
- return ENOSYS;
-}
-
-#else
-static int
-load_vomses()
-{
- FILE *fd = NULL;
- char line[1024];
- char *nick, *hostname;
- int port;
- vomses_record *rec;
- vomses_record **tmp;
- char *p;
-
- fd = fopen(vomsconf, "r");
- if (fd == NULL) {
- edg_wlpr_Log(LOG_ERR, "Cannot open vomses configuration file (%s)",
- strerror(errno));
- return errno;
- }
- while (fgets(line, sizeof(line), fd) != NULL) {
- p = line;
- if (*p != '"') {
- edg_wlpr_Log(LOG_ERR, "Parsing error when reading vomses configuration file");
- return EINVAL;
- }
- nick = strdup(strtok(p+1, "\""));
-
- p = strtok(NULL, "\"");
- hostname = strdup(strtok(NULL, "\""));
-
- p = strtok(NULL, "\"");
- port = atoi(strdup(strtok(NULL, "\"")));
-
- if (nick == NULL || hostname == NULL) {
- edg_wlpr_Log(LOG_ERR, "Parsing error when reading vomses configuration file");
- return EINVAL;
- }
-
- rec = calloc(1, sizeof(*rec));
- if (rec == NULL) {
- edg_wlpr_Log(LOG_ERR, "Not enough memory");
- return ENOMEM;
- }
- rec->nick = nick;
- rec->hostname = hostname;
- rec->port = port;
-
- tmp = realloc(vomses.val, vomses.len + 1);
- if (tmp == NULL) {
- edg_wlpr_Log(LOG_ERR, "Not enough memory");
- return ENOMEM;
- }
- vomses.val = tmp;
- vomses.len++;
-
- vomses.val[vomses.len-1] = rec;
- }
- fclose(fd);
- return 0;
-}
-#endif
-
int main(int argc, char *argv[])
{
int sock;
char sockname[PATH_MAX];
int ret;
pid_t pid;
+ struct sigaction sa;
+ const char *s = NULL;
progname = strrchr(argv[0],'/');
if (progname) progname++;
repository = EDG_WLPR_REPOSITORY_ROOT;
debug = 0;
- while ((opt = getopt_long(argc, argv, "hvdr:c:C:V:AG:", opts, NULL)) != EOF)
+ while ((opt = getopt_long(argc, argv, "hvdr:c:C:V:AG:t:k:", opts, NULL)) != EOF)
switch (opt) {
case 'h': usage(progname); exit(0);
case 'v': fprintf(stdout, "%s:\t%s\n", progname, rcsid); exit(0);
case 'V': vomsdir = optarg; break;
case 'A': voms_enabled = 1; break;
case 'G': vomsconf = optarg; break;
+ case 't': cert = optarg; break;
+ case 'k': key = optarg; break;
case '?': usage(progname); return 1;
}
}
globus_module_activate(GLOBUS_GSI_CERT_UTILS_MODULE);
+ globus_module_activate(GLOBUS_GSI_PROXY_MODULE);
if (!debug)
for (fd = 3; fd < OPEN_MAX; fd++) close(fd);
openlog(progname, LOG_PID, LOG_DAEMON);
}
- if (voms_enabled) {
- char *path;
- char *new_path;
- ret = load_vomses();
- if (ret)
- return 1;
- setenv("GLOBUS_VERSION", "22", 0);
- if (VOMS_INSTALL_PATH != NULL && *VOMS_INSTALL_PATH != '\0') {
- path = getenv("PATH");
- asprintf(&new_path, "%s:%s/bin", path, VOMS_INSTALL_PATH);
- setenv("PATH", new_path, 1);
- }
- }
-
+ if (cert)
+ setenv("X509_USER_CERT", cert, 1);
+
+ if (key)
+ setenv("X509_USER_KEY", key, 1);
+
+ if (cadir)
+ setenv("X509_CERT_DIR", cadir, 1);
+
+ s = getenv("GLITE_PR_TIMEOUT");
+ default_timeout = s ? atof(s) : GLITE_PR_TIMEOUT_DEFAULT;
+
+ memset(&sa,0,sizeof(sa));
+ sa.sa_handler = catchsig;
+ sigaction(SIGINT,&sa,NULL);
+ sigaction(SIGQUIT,&sa,NULL);
+ sigaction(SIGTERM,&sa,NULL);
+ sigaction(SIGCHLD,&sa,NULL);
+ sigaction(SIGPIPE,&sa,NULL);
+
ret = start_watchdog(&pid);
if (ret)
return 1;
return 1;
edg_wlpr_Log(LOG_DEBUG, "Listening at %s", sockname);
-#if 0
- /* XXX ??? */
- install_handlers();
-#endif
-
-
-#if 0
- /* XXX this overrides setings done by install_handlers()? */
- signal(SIGTERM, cleanup);
- signal(SIGINT, cleanup);
- signal(SIGKILL, cleanup);
- signal(SIGPIPE, SIG_IGN);
-
- atexit(cleanup);
-#endif
-
ret = doit(sock);
close(sock);
X509_NAME *subject = NULL;
int ret;
- ret = load_proxy(file, &cert, &key, &chain);
+ ret = load_proxy(file, &cert, &key, &chain, NULL);
if (ret)
return ret;
#include <myproxy.h>
#include <myproxy_delegation.h>
-#include <globus_gsi_cert_utils.h>
+#include <globus_gsi_credential.h>
+#include <globus_gsi_proxy.h>
+#include <globus_gsi_cert_utils_constants.h>
#include "renewal.h"
time_t next_renewal;
} proxy_record;
-typedef struct vomses_record {
- char *nick;
- char *hostname;
- int port;
-} vomses_record;
-
-typedef struct vomses_records {
- unsigned int len;
- struct vomses_record **val;
-} vomses_records;
-
/* commands */
void
register_proxy(edg_wlpr_Request *request, edg_wlpr_Response *response);
int
load_proxy(const char *filename, X509 **cert, EVP_PKEY **privkey,
- STACK_OF(X509) **chain);
+ STACK_OF(X509) **chain, globus_gsi_cred_handle_t *proxy);
int
get_proxy_base_name(char *file, char **subject);
+int
+renew_voms_creds(const char *cur_file, const char *renewed_file, const char *new_file);
+
#endif /* RENEWALD_LOCL_H */
--- /dev/null
+#include "renewal_locl.h"
+#include "renewd_locl.h"
+
+#include <string.h>
+#include <openssl/x509.h>
+
+#include "glite/security/voms/voms_apic.h"
+
+#include "newformat.h"
+
+char * Decode(const char *, int, int *);
+char **listadd(char **, char *, int);
+
+extern char *vomsconf;
+
+static int
+generate_proxy(globus_gsi_cred_handle_t cur_proxy,
+ X509_EXTENSION *voms_extension, const char *new_file)
+{
+ globus_result_t result;
+ globus_gsi_proxy_handle_t proxy_handle = NULL;
+ globus_gsi_cred_handle_t proxy = NULL;
+ EVP_PKEY *cur_proxy_priv_key = NULL;
+ X509 *new_cert = NULL;
+ X509 *voms_cert = NULL;
+ globus_gsi_cert_utils_cert_type_t proxy_type;
+
+ result = globus_gsi_proxy_handle_init(&proxy_handle, NULL);
+ if (result) {
+ edg_wlpr_Log(LOG_ERR, "globus_gsi_proxy_handle_init() failed\n");
+ goto end;
+ }
+
+ result = globus_gsi_cred_get_key(cur_proxy, &cur_proxy_priv_key);
+ if (result) {
+ edg_wlpr_Log(LOG_ERR, "globus_gsi_cred_get_key() failed\n");
+ goto end;
+ }
+
+ /* Create and sign a new proxy */
+ result = globus_gsi_cred_get_cert_type(cur_proxy, &proxy_type);
+ if (result) {
+ edg_wlpr_Log(LOG_ERR, "globus_gsi_cred_get_cert_type() failed\n");
+ goto end;
+ }
+
+ result = globus_gsi_proxy_handle_set_type(proxy_handle, proxy_type);
+ if (result) {
+ edg_wlpr_Log(LOG_ERR, "globus_gsi_proxy_handle_set_type() failed\n");
+ goto end;
+ }
+
+ result = globus_gsi_proxy_create_signed(proxy_handle, cur_proxy, &proxy);
+ if (result) {
+ edg_wlpr_Log(LOG_ERR, "globus_gsi_proxy_handle_init() failed\n");
+ goto end;
+ }
+
+ /* Get the new proxy */
+ result = globus_gsi_cred_get_cert(proxy, &new_cert);
+ if (result) {
+ edg_wlpr_Log(LOG_ERR, "globus_gsi_cred_get_cert() failed\n");
+ goto end;
+ }
+
+ /* The Globus API doesn't allow to store custom X.509 extensions */
+ voms_cert = X509_dup(new_cert);
+ if (voms_cert->cert_info->extensions == NULL)
+ voms_cert->cert_info->extensions = sk_X509_EXTENSION_new_null();
+ sk_X509_EXTENSION_push(voms_cert->cert_info->extensions, voms_extension);
+
+ /* Openssl ensures that memory containing old signature structures is unallocated */
+#if 0
+ X509_sign(voms_cert, cur_proxy_priv_key, proxy_handle->attrs->signing_algorithm);
+#else
+ X509_sign(voms_cert, cur_proxy_priv_key, EVP_md5());
+#endif
+
+ /* And put the cert back, older one is unallocated by the function */
+ result = globus_gsi_cred_set_cert(proxy, voms_cert);
+ if (result) {
+ edg_wlpr_Log(LOG_ERR, "globus_gsi_cred_set_cert() failed\n");
+ goto end;
+ }
+
+ result = globus_gsi_cred_write_proxy(proxy, (char *)new_file);
+
+end:
+
+ return 0;
+}
+
+static int
+my_VOMS_Export(void *buf, int buf_len, X509_EXTENSION **extension)
+{
+ AC *ac = NULL;
+ unsigned char *p, *pp;
+ AC **voms_attrs = NULL;
+
+ p = pp = buf;
+ ac = d2i_AC(NULL, &p, buf_len+1);
+ if (ac == NULL) {
+ edg_wlpr_Log(LOG_ERR, "d2i_AC() failed\n");
+ return 1;
+ }
+
+ voms_attrs = (AC **)listadd((char **)voms_attrs, (char *)ac, sizeof(AC *));
+
+ *extension = X509V3_EXT_conf_nid(NULL, NULL, OBJ_txt2nid("acseq"),
+ (char*)voms_attrs);
+ return 0;
+}
+
+static int
+create_voms_command(struct vomsdata *vd, struct voms **voms_cert, char **command)
+{
+ int voms_error, ret;
+ struct data **attribs;
+
+#if 0
+ VOMS_ResetOrder(vd, &voms_error);
+ for (i = 2; i < argc; i++) {
+ ret = VOMS_Ordering(argv[i], vd, &voms_error);
+ if (ret == 0) {
+ edg_wlpr_Log(LOG_ERR, "VOMS_Ordering() failed\n");
+ return 1;
+ }
+ }
+#endif
+
+ if (voms_cert == NULL || *voms_cert == NULL || (*voms_cert)->std == NULL) {
+ edg_wlpr_Log(LOG_ERR, "Invalid VOMS certificate\n");
+ return 1;
+ }
+
+ attribs = (*voms_cert)->std;
+
+ if (strcmp (attribs[0]->role, "NULL") == 0 )
+ ret = asprintf(command, "G%s", attribs[0]->group);
+ else
+ ret = asprintf(command, "B%s:%s", attribs[0]->group, attribs[0]->role);
+
+end:
+
+ return 0;
+}
+
+static int
+renew_voms_cert(struct vomsdata *vd, struct voms **voms_cert,
+ char **buf, size_t *buf_len)
+{
+ int voms_error = 0, i, ret, voms_version;
+ struct contactdata **voms_contacts = NULL;
+ char *command = NULL;
+
+ voms_contacts = VOMS_FindByVO(vd, (*voms_cert)->voname, vomsconf, NULL, &voms_error);
+
+ if (voms_contacts == NULL) {
+ edg_wlpr_Log(LOG_ERR, "VOMS_FindByVO() failed\n");
+ return 1;
+ }
+
+ ret = create_voms_command(vd, voms_cert, &command);
+
+ /* XXX iterate over all servers on the list on errors */
+ ret = VOMS_ContactRaw(voms_contacts[0]->host, voms_contacts[0]->port,
+ voms_contacts[0]->contact, command,
+ (void**) buf, buf_len, &voms_version,
+ vd, &voms_error);
+ if (ret == 0) {
+ edg_wlpr_Log(LOG_ERR, "VOMS_Contact() failed\n");
+ return 1;
+ }
+
+ VOMS_DeleteContacts(voms_contacts);
+
+ if (command)
+ free(command);
+
+ return 0;
+}
+
+static int
+renew_voms_certs(const char *cur_file, const char *renewed_file, const char *new_file)
+{
+ globus_gsi_cred_handle_t cur_proxy = NULL;
+ globus_gsi_cred_handle_t new_proxy = NULL;
+ struct vomsdata *vd = NULL;
+ struct voms **voms_cert = NULL;
+ int voms_err, ret;
+ X509 *cert = NULL;
+ STACK_OF(X509) *chain = NULL;
+ char *buf = NULL;
+ size_t buf_len = 0;
+ X509_EXTENSION *extension = NULL;
+ char *old_env_proxy = getenv("X509_USER_PROXY");
+ char *old_env_cert = getenv("X509_USER_CERT");
+ char *old_env_key = getenv("X509_USER_KEY");
+
+ setenv("X509_USER_PROXY", cur_file, 1);
+ setenv("X509_USER_CERT", renewed_file, 1);
+ setenv("X509_USER_KEY", renewed_file, 1);
+
+ ret = load_proxy(cur_file, &cert, NULL, &chain, &cur_proxy);
+ if (ret)
+ goto end;
+
+ vd = VOMS_Init(NULL, NULL);
+ if (vd == NULL) {
+ edg_wlpr_Log(LOG_ERR, "VOMS_Init() failed\n");
+ return 1;
+ }
+
+ ret = VOMS_Retrieve(cert, chain, RECURSE_CHAIN, vd, &voms_err);
+ if (ret == 0) {
+ if (voms_err == VERR_NOEXT) {
+ /* no VOMS cred, no problem; continue */
+ /* XXX this part shouldn't be reachable, this call is only called
+ * if the proxy does contain VOMS attributes */
+ edg_wlpr_Log(LOG_ERR, "No VOMS attributes found in proxy %s\n", cur_file);
+ ret = 0;
+ goto end;
+ } else {
+ edg_wlpr_Log(LOG_ERR, "Cannot get VOMS certificate(s) from proxy");
+ ret = 1;
+ goto end;
+ }
+ }
+
+ /* XXX make sure this loop can really work for multiple voms certificates
+ * embedded in the proxy */
+ for (voms_cert = vd->data; voms_cert && *voms_cert; voms_cert++) {
+ char *tmp, *ptr;
+ size_t tmp_len;
+
+ ret = renew_voms_cert(vd, voms_cert, &tmp, &tmp_len);
+ if (ret)
+ goto end;
+ ptr = realloc(buf, buf_len + tmp_len);
+ if (ptr == NULL) {
+ ret = ENOMEM;
+ goto end;
+ }
+ buf = ptr;
+ memcpy(buf + buf_len, tmp, tmp_len);
+ buf_len += tmp_len;
+ }
+
+ if (buf == NULL) {
+ /* no extension renewed, return */
+ ret = 0;
+ goto end;
+ }
+
+ ret = my_VOMS_Export(buf, buf_len, &extension);
+ if (ret)
+ goto end;
+
+ ret = load_proxy(renewed_file, NULL, NULL, NULL, &new_proxy);
+ if (ret)
+ goto end;
+
+ ret = generate_proxy(new_proxy, extension, new_file);
+
+end:
+ (old_env_proxy) ? setenv("X509_USER_PROXY", old_env_proxy, 1) :
+ unsetenv("X509_USER_PROXY");
+ (old_env_cert) ? setenv("X509_USER_CERT", old_env_cert, 1) :
+ unsetenv("X509_USER_CERT");
+ (old_env_key) ? setenv("X509_USER_KEY", old_env_key, 1) :
+ unsetenv("X509_USER_KEY");
+
+ if (cert)
+ X509_free(cert);
+ if (chain)
+ sk_X509_pop_free(chain, X509_free);
+ if (vd)
+ VOMS_Destroy(vd);
+ if (cur_proxy)
+ globus_gsi_cred_handle_destroy(cur_proxy);
+ if (new_proxy)
+ globus_gsi_cred_handle_destroy(new_proxy);
+ if (buf)
+ free(buf);
+
+ return ret;
+}
+
+int
+renew_voms_creds(const char *cur_file, const char *renewed_file, const char *new_file)
+{
+ return renew_voms_certs(cur_file, renewed_file, new_file);
+}
+
+#if 0
+int
+main(int argc, char *argv[])
+{
+ int ret;
+ const char *current_proxy = "/tmp/x509up_u11930";
+ const char *renewed_proxy = "/tmp/proxy";
+
+ if (argc > 1)
+ current_proxy = argv[1];
+ if (argc > 2)
+ renewed_proxy = argv[2];
+
+ if (globus_module_activate(GLOBUS_GSI_PROXY_MODULE) != GLOBUS_SUCCESS ||
+ globus_module_activate(GLOBUS_GSI_CERT_UTILS_MODULE) != GLOBUS_SUCCESS) {
+ edg_wlpr_Log(LOG_ERR, "[%d]: Unable to initialize Globus modules\n", getpid());
+ return 1;
+ }
+
+ ret = renew_voms_certs(current_proxy, renewed_proxy);
+
+ return 0;
+}
+#endif
Revision history:
$Log$
+ Revision 1.1.1.1 2004/07/21 18:16:57 eronchie
+ Moved out exception from org.glite.wms.common/src/utilitiesY
+
-->
Load version file
========================================= -->
<property file="${module.version.file}"/>
+ <property file="${module.build.file}"/>
+ <property file="${module.build.file}" />
<!-- ==============================================
Local private targets
#
# Revision history:
# $Log$
+# Revision 1.10 2004/12/10 07:31:35 eronchie
+# Increased version
+#
# Revision 1.9 2004/11/16 15:31:13 eronchie
# Increased version
#
# Process this file with autoconf to produce a configure script.
AC_PREREQ(2.57)
-AC_INIT([GLite WMS Utils Exception], [1.0.0])
+AC_INIT([GLite WMS Utils Exception], [1.0.1])
AC_CONFIG_AUX_DIR([./project])
AM_INIT_AUTOMAKE([1.6.3 subdir-objects])
AC_CONFIG_SRCDIR([src/Exception.cpp])
* @param code the code representing the thrown exception
* @param exception the name of the thrown exception
* @param method the name of the method that raised the exception
- * @param source The source that raised the exception (could be the file path, the class Name, etc etc)
- * @param line_number the number of the line in the file that raised the exception(if the source has been given as a file) */
+ * @param source The source that raised the exception (could be the file path, the class Name, etc etc) */
Exception ( const std::string& source, const std::string& method, int code, const std::string& exception);
/**
*/
virtual void push_back ( const std::string& source, int line_number, const std::string& method ) ;
protected:
+ /** Empty constructor*/
Exception();
+ /** integer error code representing the cause of the error */
int error_code;
+ /** string exception message representation*/
std::string error_message ;
+ /** line number where the exception was raised */
int line;
+ /** The name of the file where the exception was raised */
std::string source_file;
+ /** the name of the exception */
std::string exception_name;
+ /** the name of the method where the expceiton was raised */
std::string method_name ;
+ /** a string representation of the stacktrace */
std::string stack;
+ /** the actual internal stacktrace representation */
std::vector< std::string> stack_strings ;
+ /** the name of the ancestor exception */
std::string ancestor ;
}; //End Exception Class
}}} // Closing namespace
--- /dev/null
+#Sun Apr 03 03:07:40 CEST 2005
+module.build=214
-#Fri Dec 10 12:18:50 CET 2004
-module.version=1.0.0
-module.build=105
-module.age=1
+
+module.version = 1.0.1
+module.age = 1
+
\ No newline at end of file
Exception::Exception () {
line = 0;
} ;
+
Exception::~Exception() throw(){ }
+
/**
* Exception chainig
*/
-void Exception::push_back ( const string& source, int line_number, const string& method ){
- stack_strings.push_back ( dbgMessage() ) ;
- ancestor = what() ;
- source_file = source ;
- line = line_number ;
- method_name = method;
- error_message = "" ;
- exception_name="" ;
+void Exception::push_back (const string& source, int line_number, const string& method){
+ stack_strings.push_back (dbgMessage());
+ ancestor = what();
+ source_file = source;
+ line = line_number;
+ method_name = method;
+ error_message = "";
+ exception_name = "";
}
+
Exception::Exception( const std::string& file, int line_number, const std::string& method, int code, const std::string& name)
: error_code(code), exception_name(name){
source_file = file;
line = line_number;
method_name = method;
};
+
Exception::Exception (const string& source, const string& method, int code, const string& exception)
: error_code(code), exception_name(exception){
source_file = source;
// stack= "";
line = 0;
};
+
int Exception::getCode(){
- if (error_code != 0)
- return error_code ;
+ if (error_code != 0) return error_code;
else
return WMS_COMMON_BASE;
};
-const char* Exception::what() const throw(){
- if (!ancestor.empty() )
- return ancestor.c_str() ;
- if ( error_message != "")
- return error_message.c_str() ;
- else return "" ;
+const char* Exception::what() const throw(){
+ if (!ancestor.empty()) return ancestor.c_str();
+
+ return error_message.c_str();
};
+
string Exception::getExceptionName(){
- if (exception_name!= "")
- return exception_name;
- else
- return "" ;
+ return exception_name;
};
+
void Exception::log(const std::string& logfile)
{
- if ( logfile == "")
- syslog ( LOG_PERROR, (char *) (dbgMessage()).c_str() );
+ if (logfile == "")
+ syslog (LOG_PERROR, (char *)(dbgMessage()).c_str());
else{
pthread_mutex_lock( &METHOD_MUTEX); // LOCK
//TBD : test if file exist-->>Create HEADER ??
pthread_mutex_unlock( &METHOD_MUTEX); // UNLOCK
}
};
+
string Exception::printStackTrace(){
string stack = "" ;
for (unsigned int i = 0 ; i < stack_strings.size() ; i++ ){
}
return stack +dbgMessage();
};
+
vector<string> Exception::getStackTrace(){
// make a copy of the stack
vector<string> 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] ;
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
+
-->
Load version file
========================================= -->
<property file="${module.version.file}"/>
+ <property file="${module.build.file}"/>
+ <property file="${module.build.file}" />
<!-- ==============================================
Local private targets
--- /dev/null
+#Sun Apr 03 03:12:33 CEST 2005
+module.build=213
-#Fri Dec 10 12:23:10 CET 2004
-module.version=1.0.0
-module.build=104
-module.age=1
+
+module.version = 1.0.0
+module.age = 1
+
\ No newline at end of file
+* Tue Feb 8 2005 Andrew McNab <Andrew.McNab@man.ac.uk>
+- Include GRSTx509MakeProxyFileName() and
+ GRSTx509StringToChain() (code to used hashes in cached
+ proxy file names.) Bug #6357
+- Change ordering of output proxy file produced by
+ GRSTx509CacheProxy so proxy private key is the 2nd PEM
+ encoded block (rather than at the end.) Bug #6365
+- Add libgridsite_globus[.so|.a] in preparation for
+ separate Globus OpenSSL and system OpenSSL versions
+* Tue Feb 8 2005 Andrew McNab <Andrew.McNab@man.ac.uk>
+- ==== GridSite version 1.1.5 ====
+* Tue Dec 14 2004 Andrew McNab <Andrew.McNab@man.ac.uk>
+- Patch from Daniel Kouril <kouril@ics.muni.cz> to allow
+ switching Globus vs system OpenSSL libraries/headers.
+* Tue Dec 14 2004 Andrew McNab <Andrew.McNab@man.ac.uk>
+- ==== GridSite version 1.1.4 ====
* Mon Nov 15 2004 Andrew McNab <Andrew.McNab@man.ac.uk>
- Back out of (most of) redone VOMS support for committing
to JRA1 CVS.
MAJOR_VERSION=1
MINOR_VERSION=1.1
-PATCH_VERSION=1.1.3
+PATCH_VERSION=1.1.5
VERSION=$(PATCH_VERSION)
Revision history:
$Log$
+ Revision 1.10 2004/12/17 09:11:43 dimeglio
+ Added local tag targets (because of special naming rules here)
+
+ Revision 1.9 2004/12/17 09:02:49 dimeglio
+ Removed redefinition of global.prefix
+
+ Revision 1.8 2004/12/17 00:32:50 dimeglio
+ Fixed global.prefix
+
+ Revision 1.7 2004/12/03 14:49:59 dimeglio
+ Added OPENSSL_FLAGS and _LIBS options
+
Revision 1.6 2004/11/13 10:55:44 glbuild
Added artifacts RPMS directory
Public common targets
=============================================== -->
- <var name="global.prefix" unset="true"/>
- <property name="global.prefix" value="gridsite"/>
-
<target name="localinit" depends="envcheck">
<mkdir dir="${stage.dir}" />
<mkdir dir="${dist.dir}" />
</target>
<target name="dist" depends="stage">
- <make target="rpm" dir="${module.src.dir}" failonerror="${failonerror}"/>
+ <make target="rpm" dir="${module.src.dir}" failonerror="${failonerror}" args="${build.make.arguments}"/>
<exec dir="${module.dir}/RPMTMP/BUILDROOT/usr" executable="tar">
<arg line="-czf ${module.dir}/gridsite-${module.version}_bin.tar.gz ." />
</exec>
Private targets
=============================================== -->
- <!-- ===============================================
+ <!-- ========================================================
+ tag: Tag module
+ ======================================================== -->
+ <target name="tag" description="Apply tag.">
+
+ <property name="tag.type" value="B"/>
+ <!-- Set module CVS Label -->
+ <exec executable="tr" inputstring="${module.version}" outputproperty="cvs.module.version">
+ <arg line=". _"/>
+ </exec>
+ <property name="cvs.label" value="gridsite-core_${tag.type}_${cvs.module.version}_${module.build}" />
+ <echo>New tag is ${cvs.label}</echo>
+
+ <!-- Apply tag -->
+ <property name="failonerror" value="true"/>
+ <property name="tag.switch" value="-FR"/>
+ <exec dir="${workspace.abs.dir}" executable="cvs" failonerror="${failonerror}">
+ <arg line="tag ${tag.switch} ${cvs.label} ${module.name}" />
+ </exec>
+
+ </target>
+
+ <target name="component_release_tag">
+
+ <!-- Set module CVS Label -->
+ <exec executable="tr" inputstring="${module.version}" outputproperty="cvs.module.version">
+ <arg line=". _"/>
+ </exec>
+ <property name="cvs.label" value="gridsite-core_R_${cvs.module.version}" />
+ <echo>New tag is ${cvs.label}</echo>
+
+ <!-- Apply tag -->
+ <exec dir="${workspace.abs.dir}" executable="cvs" failonerror="true">
+ <arg line="tag -R ${cvs.label} ${module.name}" />
+ </exec>
+
+ </target>
+
+ <!-- ===============================================
Modules proxy targets
=============================================== -->
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"
--- /dev/null
+#Thu Feb 17 03:27:29 CET 2005
+module.build=135
<project name="configure options">
<property name="build.make.arguments"
- value="prefix=${stage.abs.dir} GSOAPDIR=${with.gsoap.prefix} OPENSSL_FLAGS=-I${with.globus.prefix}/include/gcc32/openssl OPENSSL_LIBS=-L${with.globus.prefix}/lib/"/>
+ 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" />
</project>
-#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
#
# 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
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
#
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
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 \
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
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
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:
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
$(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)
$(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
Name: gridsite
Version: %(echo ${MYVERSION:-1.1.x})
-Release: 2
+Release: 1
Summary: GridSite
Copyright: Modified BSD
Group: System Environment/Daemons
%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
%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}
%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
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)
{
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];
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);
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
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);
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;